X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=functions%2Fprefs.php;h=bc85e1a75ddd85aee7be53e90183e943b7cd216f;hp=da8862ef223ba6ce75c2534faf0708960f2d477f;hb=c4faef335b2362c81b8ebf026d4066c12d70536c;hpb=701e7beed3baca980039f978c6d536dd91cae775 diff --git a/functions/prefs.php b/functions/prefs.php index da8862ef..bc85e1a7 100644 --- a/functions/prefs.php +++ b/functions/prefs.php @@ -5,7 +5,7 @@ * * This contains functions for filebased user prefs locations * - * @copyright 1999-2014 The SquirrelMail Project Team + * @copyright 1999-2020 The SquirrelMail Project Team * @license http://opensource.org/licenses/gpl-license.php GNU Public License * @version $Id$ * @package squirrelmail @@ -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); } +