Aleksander Machniak
2012-09-13 d7439260770eb1f70cdc5abf5df13e6c62ff3991
Merge pull request #21 from defa/crypt_hash_branch

SQL driver of Password plugis supports more hash-functions for crypt() now.
2 files modified
45 ■■■■ changed files
plugins/password/config.inc.php.dist 10 ●●●●● patch | view | raw | blame | history
plugins/password/drivers/sql.php 35 ●●●● patch | view | raw | blame | history
plugins/password/config.inc.php.dist
@@ -36,7 +36,8 @@
// The query can contain the following macros that will be expanded as follows:
//      %p is replaced with the plaintext new password
//      %c is replaced with the crypt version of the new password, MD5 if available
//         otherwise DES.
//         otherwise DES. More hash function can be enabled using the password_crypt_hash
//         configuration parameter.
//      %D is replaced with the dovecotpw-crypted version of the new password
//      %o is replaced with the password before the change
//      %n is replaced with the hashed version of the new password
@@ -51,6 +52,13 @@
// Default: "SELECT update_passwd(%c, %u)"
$rcmail_config['password_query'] = 'SELECT update_passwd(%c, %u)';
// By default the crypt() function which is used to create the '%c'
// parameter uses the md5 algorithm. To use different algorithms
// you can choose between: des, md5, blowfish, sha256, sha512.
// Before using other hash functions than des or md5 please make sure
// your operating system supports the other hash functions.
$rcmail_config['password_crypt_hash'] = 'md5';
// By default domains in variables are using unicode.
// Enable this option to use punycoded names
$rcmail_config['password_idn_ascii'] = false;
plugins/password/drivers/sql.php
@@ -40,12 +40,37 @@
        // crypted password
        if (strpos($sql, '%c') !== FALSE) {
            $salt = '';
            if (CRYPT_MD5) {
                // Always use eight salt characters for MD5 (#1488136)
            if (!($crypt_hash = $rcmail->config->get('password_crypt_hash')))
            {
                if (CRYPT_MD5)
                    $crypt_hash = 'md5';
                else if (CRYPT_STD_DES)
                    $crypt_hash = 'des';
            }
            switch ($crypt_hash)
            {
            case 'md5':
                $len = 8;
            } else if (CRYPT_STD_DES) {
                $salt_hashindicator = '$1$';
                break;
            case 'des':
                $len = 2;
            } else {
                break;
            case 'blowfish':
                $len = 22;
                $salt_hashindicator = '$2a$';
                break;
            case 'sha256':
                $len = 16;
                $salt_hashindicator = '$5$';
                break;
            case 'sha512':
                $len = 16;
                $salt_hashindicator = '$6$';
                break;
            default:
                return PASSWORD_CRYPT_ERROR;
            }
@@ -55,7 +80,7 @@
                $salt .= $seedchars[rand(0, 63)];
            }
            $sql = str_replace('%c',  $db->quote(crypt($passwd, CRYPT_MD5 ? '$1$'.$salt.'$' : $salt)), $sql);
            $sql = str_replace('%c',  $db->quote(crypt($passwd, $salt_hashindicator ? $salt_hashindicator .$salt.'$' : $salt)), $sql);
        }
        // dovecotpw