From: pdontthink Date: Wed, 17 Jun 2015 23:18:37 +0000 (+0000) Subject: Add MD5 alternative to directory hash calculation X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=commitdiff_plain;h=36c59d842cfa1aadf349b367a9c1082ad58ac96b Add MD5 alternative to directory hash calculation git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@14506 7612ce4b-ef26-0410-bec9-ea0150e637f0 --- diff --git a/config/config_local.example.php b/config/config_local.example.php index 2e4019d2..773385eb 100644 --- a/config/config_local.example.php +++ b/config/config_local.example.php @@ -52,6 +52,15 @@ * (those that are displayed in a different color than other * "normal" mailboxes). * + * $hash_dirs_use_md5 (boolean) If set to TRUE, forces the + * hashed preferences directory calculation to use MD5 instead + * of CRC32. + * + * $hash_dirs_strip_domain (boolean) If set to TRUE, and if + * usernames are in full email address format, the domain + * part (beginning with "@") will be stripped before + * calculating the CRC or MD5. + * * $smtp_stream_options allows more control over the SSL context * used when connecting to the SMTP server over SSL/TLS. See: * http://www.php.net/manual/context.php and in particular diff --git a/doc/ChangeLog b/doc/ChangeLog index 8e3d5cde..03236eba 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -395,6 +395,7 @@ Version 1.5.2 - SVN - Configuration tool now shows the SquirrelMail version - Prevent session lock-up caused by filters plugin trying to move messages in an account that is over quota. + - Added MD5 alternative to directory hash calculation Version 1.5.1 (branched on 2006-02-12) -------------------------------------- diff --git a/functions/prefs.php b/functions/prefs.php index b78640a9..3ec58481 100644 --- a/functions/prefs.php +++ b/functions/prefs.php @@ -112,25 +112,69 @@ function getHashedDir($username, $dir, $hash_dirs = '') { /** * Helper function for getHashDir which does the actual hash calculation. * + * Uses a crc32 algorithm by default, but if you put + * the following in config/config_local.php, you can + * force md5 instead: + * $hash_dirs_use_md5 = TRUE; + * + * You may also specify that if usernames are in full + * email address format, the domain part (beginning + * with "@") be stripped before calculating the crc + * or md5. Do that by putting the following in + * config/config_local.php: + * $hash_dirs_strip_domain = TRUE; + * * @param string username the username to calculate the hash dir for + * * @return array a list of hash dirs for this username + * * @since 1.2.0 + * */ function computeHashDirs($username) { - /* Compute the hash for this user and extract the hash directories. */ - /* Note that the crc32() function result will be different on 32 and */ - /* 64 bit systems, thus the hack below. */ - $crc = crc32($username); - if ($crc & 0x80000000) { - $crc ^= 0xffffffff; - $crc += 1; + + global $hash_dirs_use_md5, $hash_dirs_strip_domain; + static $hash_dirs = array(); + + + // strip domain from username + if ($hash_dirs_strip_domain) + $user = substr($username, 0, strpos($username, '@')); + else + $user = $username; + + + // have we already calculated it? + if (!empty($hash_dirs[$user])) + return $hash_dirs[$user]; + + + if ($hash_dirs_use_md5) { + + $hash = md5($user); + //$hash = md5bin($user); + + } else { + + /* Compute the hash for this user and extract the hash directories. */ + /* Note that the crc32() function result will be different on 32 and */ + /* 64 bit systems, thus the hack below. */ + $crc = crc32($user); + if ($crc & 0x80000000) { + $crc ^= 0xffffffff; + $crc += 1; + } + $hash = base_convert($crc, 10, 16); } - $hash = base_convert($crc, 10, 16); - $hash_dirs = array(); + + + $my_hash_dirs = array(); for ($h = 0; $h < 4; ++ $h) { - $hash_dirs[] = substr($hash, $h, 1); + $my_hash_dirs[] = substr($hash, $h, 1); } - /* Return our array of hash directories. */ - return ($hash_dirs); + // Return our array of hash directories + $hash_dirs[$user] = $my_hash_dirs; + return ($my_hash_dirs); } +