From 62bb63a70d35feb4517afa29f83cf2f5d7fd4be9 Mon Sep 17 00:00:00 2001 From: Tim Almdal Date: Tue, 11 Nov 2008 04:57:49 +0000 Subject: New user module with password support. This supports the same password mechanism as g1 and g2 to facilitate a migration. --- modules/user/helpers/user_installer.php | 2 +- modules/user/helpers/user_password.php | 83 +++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 modules/user/helpers/user_password.php (limited to 'modules/user/helpers') diff --git a/modules/user/helpers/user_installer.php b/modules/user/helpers/user_installer.php index bb6f1ceb..e0f7312e 100644 --- a/modules/user/helpers/user_installer.php +++ b/modules/user/helpers/user_installer.php @@ -69,7 +69,7 @@ class user_installer { $user->name = "admin"; $user->display_name = "Gallery Administrator"; // @todo create a helper function to encrypt the password. - $user->password = "admin"; + $user->password = user_password::hash_password("admin"); $user->save(); $id = $user->id; $db->query("UPDATE `items` SET `owner_id` = $id WHERE `owner_id` IS NULL"); diff --git a/modules/user/helpers/user_password.php b/modules/user/helpers/user_password.php new file mode 100644 index 00000000..45de5bef --- /dev/null +++ b/modules/user/helpers/user_password.php @@ -0,0 +1,83 @@ +password; + + $salt = substr($valid, 0, 4); + /* Support both old (G1 thru 1.4.0; G2 thru alpha-4) and new password schemes: */ + $guess = (strlen($valid) == 32) ? md5($password) : ($salt . md5($salt . $password)); + if (!strcmp($guess, $valid)) { + return true; + } + + /* Passwords with <&"> created by G2 prior to 2.1 were hashed with entities */ + $sanitizedPassword = html::specialchars($password, false); + $guess = (strlen($valid) == 32) ? md5($sanitizedPassword) + : ($salt . md5($salt . $sanitizedPassword)); + if (!strcmp($guess, $valid)) { + return true; + } + + /* Also support hashes generated by phpass for interoperability with other applications */ + if (strlen($valid) == 34) { + $hashGenerator = new PasswordHash(10, true); + return $hashGenerator->CheckPassword($password, $valid); + } + + return false; + } + + /** + * Create the hashed passwords. + * @param string $password a plaintext password + * @return string hashed password + */ + public static function hash_password($password) { + return user_password::_md5Salt($password); + } + + /** + * Create a hashed password using md5 plus salt. + * @param string $password plaintext password + * @param string $salt (optional) salt or hash containing salt (randomly generated if omitted) + * @return string hashed password + */ + private static function _md5Salt($password, $salt='') { + if (empty($salt)) { + for ($i = 0; $i < 4; $i++) { + $char = mt_rand(48, 109); + $char += ($char > 90) ? 13 : ($char > 57) ? 7 : 0; + $salt .= chr($char); + } + } else { + $salt = substr($salt, 0, 4); + } + return $salt . md5($salt . $password); + } +} -- cgit v1.2.3