]> git.mxchange.org Git - friendica.git/commitdiff
Centralize password hashing in Model\User
authorHypolite Petovan <mrpetovan@gmail.com>
Sat, 20 Jan 2018 03:49:06 +0000 (22:49 -0500)
committerHypolite Petovan <mrpetovan@gmail.com>
Sat, 20 Jan 2018 22:32:24 +0000 (17:32 -0500)
mod/lostpass.php
mod/settings.php
src/Model/User.php

index 5934556a8e123e11f5b165bf66fd614ad72688c8..abe67f2de2c54dcaf129baebe1cd3e7856529239 100644 (file)
@@ -7,6 +7,7 @@
 use Friendica\App;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
+use Friendica\Model\User;
 
 require_once 'include/boot.php';
 require_once 'include/enotify.php';
@@ -84,10 +85,8 @@ function lostpass_content(App $a)
                        return $o;
                }
 
-               $new_password = autoname(6) . mt_rand(100, 9999);
-               $new_password_encoded = hash('whirlpool', $new_password);
-
-               $result = dba::update('user', ['password' => $new_password_encoded, 'pwdreset' => ''], ['uid' => $user['uid']]);
+               $new_password = User::generateNewPassword();
+               $result = User::updatePassword($user['uid'], $new_password);
                if (DBM::is_result($result)) {
                        $tpl = get_markup_template('pwdreset.tpl');
                        $o .= replace_macros($tpl,
index a5a4d4ad50781d341b25b47eeb6b34a619bfa938..5193c4a0461b096e92052f2465a85c87559b7b93 100644 (file)
@@ -2,14 +2,15 @@
 /**
  * @file mod/settings.php
  */
+
 use Friendica\App;
 use Friendica\Content\Feature;
 use Friendica\Content\Nav;
 use Friendica\Core\Addon;
-use Friendica\Core\System;
-use Friendica\Core\Worker;
 use Friendica\Core\Config;
 use Friendica\Core\PConfig;
+use Friendica\Core\System;
+use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Model\GContact;
 use Friendica\Model\Group;
@@ -391,12 +392,8 @@ function settings_post(App $a)
         }
 
                if (!$err) {
-                       $password = hash('whirlpool', $newpass);
-                       $r = q("UPDATE `user` SET `password` = '%s' WHERE `uid` = %d",
-                               dbesc($password),
-                               intval(local_user())
-                       );
-                       if (DBM::is_result($r)) {
+                       $result = User::updatePassword(local_user(), $newpass);
+                       if (DBM::is_result($result)) {
                                info(t('Password changed.') . EOL);
                        } else {
                                notice(t('Password update failed. Please try again.') . EOL);
index 862a9d408428535f5cf85a5e841ff87636314865..0979c2275d15475d714bd92d2a9f15076331577e 100644 (file)
@@ -142,7 +142,7 @@ class User
                        return false;
                }
 
-               $password_hashed = hash('whirlpool', $password);
+               $password_hashed = self::hashPassword($password);
 
                if ($password_hashed !== $user['password']) {
                        return false;
@@ -151,6 +151,52 @@ class User
                return $user['uid'];
        }
 
+       /**
+        * Generates a human-readable random password
+        *
+        * @return string
+        */
+       public static function generateNewPassword()
+       {
+               return autoname(6) . mt_rand(100, 9999);
+       }
+
+       /**
+        * Global user password hashing function
+        *
+        * @param string $password
+        * @return string
+        */
+       private static function hashPassword($password)
+       {
+               return hash('whirlpool', $password);
+       }
+
+       /**
+        * Updates a user row with a new plaintext password
+        *
+        * @param int    $uid
+        * @param string $password
+        * @return bool
+        */
+       public static function updatePassword($uid, $password)
+       {
+               return self::updatePasswordHashed($uid, self::hashPassword($password));
+       }
+
+       /**
+        * Updates a user row with a new hashed password.
+        * Empties the password reset token field just in case.
+        *
+        * @param int    $uid
+        * @param string $pasword_hashed
+        * @return bool
+        */
+       private static function updatePasswordHashed($uid, $pasword_hashed)
+       {
+               return dba::update('user', ['password' => $pasword_hashed, 'pwdreset' => ''], ['uid' => $uid]);
+       }
+
        /**
         * @brief Catch-all user creation function
         *
@@ -290,8 +336,8 @@ class User
                        throw new Exception(t('Nickname is already registered. Please choose another.'));
                }
 
-               $new_password = strlen($password) ? $password : autoname(6) . mt_rand(100, 9999);
-               $new_password_encoded = hash('whirlpool', $new_password);
+               $new_password = strlen($password) ? $password : User::generateNewPassword();
+               $new_password_encoded = self::hashPassword($new_password);
 
                $return['password'] = $new_password;