]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/User.php
removed memcache unit-test because lack of support in travis
[friendica.git] / src / Model / User.php
index 6178906aa278d5bdc0a192dba214139fbc01accb..dc5702b6055214cafd68241b196414845b430c73 100644 (file)
@@ -65,6 +65,21 @@ class User
                return $r;
        }
 
+       /**
+        * @brief Get owner data by nick name
+        *
+        * @param int $nick
+        * @return boolean|array
+        */
+       public static function getOwnerDataByNick($nick)
+       {
+               $user = dba::selectFirst('user', ['uid'], ['nickname' => $nick]);
+               if (!DBM::is_result($user)) {
+                       return false;
+               }
+               return self::getOwnerDataById($user['uid']);
+       }
+
        /**
         * @brief Returns the default group for a given user and network
         *
@@ -127,18 +142,28 @@ class User
        {
                $user = self::getAuthenticationInfo($user_info);
 
-               if (password_verify($password, $user['password'])) {
-                       if (password_needs_rehash($user['password'], PASSWORD_DEFAULT)) {
+               if (strpos($user['password'], '$') === false) {
+                       //Legacy hash that has not been replaced by a new hash yet
+                       if (self::hashPasswordLegacy($password) === $user['password']) {
                                self::updatePassword($user['uid'], $password);
-                       }
 
-                       return $user['uid'];
-               } elseif (strpos($user['password'], '$') === false) {
-                       if (self::hashPasswordLegacy($password) === $user['password']) {
+                               return $user['uid'];
+                       }
+               } elseif (!empty($user['legacy_password'])) {
+                       //Legacy hash that has been double-hashed and not replaced by a new hash yet
+                       //Warning: `legacy_password` is not necessary in sync with the content of `password`
+                       if (password_verify(self::hashPasswordLegacy($password), $user['password'])) {
                                self::updatePassword($user['uid'], $password);
 
                                return $user['uid'];
                        }
+               } elseif (password_verify($password, $user['password'])) {
+                       //New password hash
+                       if (password_needs_rehash($user['password'], PASSWORD_DEFAULT)) {
+                               self::updatePassword($user['uid'], $password);
+                       }
+
+                       return $user['uid'];
                }
 
                throw new Exception(L10n::t('Login failed'));
@@ -170,12 +195,13 @@ class User
 
                        if (!isset($user['uid'])
                                || !isset($user['password'])
+                               || !isset($user['legacy_password'])
                        ) {
                                throw new Exception(L10n::t('Not enough information to authenticate'));
                        }
                } elseif (is_int($user_info) || is_string($user_info)) {
                        if (is_int($user_info)) {
-                               $user = dba::selectFirst('user', ['uid', 'password'],
+                               $user = dba::selectFirst('user', ['uid', 'password', 'legacy_password'],
                                        [
                                                'uid' => $user_info,
                                                'blocked' => 0,
@@ -185,18 +211,11 @@ class User
                                        ]
                                );
                        } else {
-                               $user = dba::fetch_first('SELECT `uid`, `password`
-                                       FROM `user`
-                                       WHERE (`email` = ? OR `username` = ? OR `nickname` = ?)
-                                       AND `blocked` = 0
-                                       AND `account_expired` = 0
-                                       AND `account_removed` = 0
-                                       AND `verified` = 1
-                                       LIMIT 1',
-                                       $user_info,
-                                       $user_info,
-                                       $user_info
-                               );
+                               $fields = ['uid', 'password', 'legacy_password'];
+                               $condition = ["(`email` = ? OR `username` = ? OR `nickname` = ?)
+                                       AND NOT `blocked` AND NOT `account_expired` AND NOT `account_removed` AND `verified`",
+                                       $user_info, $user_info, $user_info];
+                               $user = dba::selectFirst('user', $fields, $condition);
                        }
 
                        if (!DBM::is_result($user)) {
@@ -247,6 +266,10 @@ class User
         */
        public static function hashPassword($password)
        {
+               if (!trim($password)) {
+                       throw new Exception(L10n::t('Password can\'t be empty'));
+               }
+
                return password_hash($password, PASSWORD_DEFAULT);
        }
 
@@ -276,10 +299,38 @@ class User
                        'password' => $pasword_hashed,
                        'pwdreset' => null,
                        'pwdreset_time' => null,
+                       'legacy_password' => false
                ];
                return dba::update('user', $fields, ['uid' => $uid]);
        }
 
+       /**
+        * @brief Checks if a nickname is in the list of the forbidden nicknames
+        *
+        * Check if a nickname is forbidden from registration on the node by the
+        * admin. Forbidden nicknames (e.g. role namess) can be configured in the
+        * admin panel.
+        *
+        * @param string $nickname The nickname that should be checked
+        * @return boolean True is the nickname is blocked on the node
+        */
+       public static function isNicknameBlocked($nickname)
+       {
+               $forbidden_nicknames = Config::get('system', 'forbidden_nicknames', '');
+               // if the config variable is empty return false
+               if (!x($forbidden_nicknames)) {
+                       return false;
+               }
+               // check if the nickname is in the list of blocked nicknames
+               $forbidden = explode(',', $forbidden_nicknames);
+               $forbidden = array_map('trim', $forbidden);
+               if (in_array(strtolower($nickname), $forbidden)) {
+                       return true;
+               }
+               // else return false
+               return false;
+       }
+
        /**
         * @brief Catch-all user creation function
         *
@@ -315,6 +366,7 @@ class User
                $confirm    = x($data, 'confirm')    ? trim($data['confirm'])            : '';
                $blocked    = x($data, 'blocked')    ? intval($data['blocked'])          : 0;
                $verified   = x($data, 'verified')   ? intval($data['verified'])         : 0;
+               $language   = x($data, 'language')   ? notags(trim($data['language'])) : 'en';
 
                $publish = x($data, 'profile_publish_reg') && intval($data['profile_publish_reg']) ? 1 : 0;
                $netpublish = strlen(Config::get('system', 'directory')) ? $publish : 0;
@@ -343,7 +395,7 @@ class User
                                $_SESSION['register'] = 1;
                                $_SESSION['openid'] = $openid_url;
 
-                               $openid = new LightOpenID;
+                               $openid = new LightOpenID($a->get_hostname());
                                $openid->identity = $openid_url;
                                $openid->returnUrl = System::baseUrl() . '/openid';
                                $openid->required = ['namePerson/friendly', 'contact/email', 'namePerson'];
@@ -392,6 +444,9 @@ class User
                if (!valid_email($email) || !Network::isEmailDomainValid($email)) {
                        throw new Exception(L10n::t('Not a valid email address.'));
                }
+               if (self::isNicknameBlocked($nickname)) {
+                       throw new Exception(L10n::t('The nickname was blocked from registration by the nodes admin.'));
+               }
 
                if (Config::get('system', 'block_extended_register', false) && dba::exists('user', ['email' => $email])) {
                        throw new Exception(L10n::t('Cannot use that email.'));
@@ -450,6 +505,7 @@ class User
                        'sprvkey'  => $sprvkey,
                        'verified' => $verified,
                        'blocked'  => $blocked,
+                       'language' => $language,
                        'timezone' => 'UTC',
                        'register_date' => DateTimeFormat::utcNow(),
                        'default-location' => ''