It's here! It's finally here! The skies are falling, pigs have sprouted wings, and...
[lhc/web/wiklou.git] / includes / User.php
index 22a506b..4bada32 100644 (file)
@@ -99,6 +99,7 @@ class User {
                'deletedhistory',
                'deletedtext',
                'deleterevision',
+               'disableaccount',
                'edit',
                'editinterface',
                'editusercssjs',
@@ -301,7 +302,7 @@ class User {
         *    User::getCanonicalName(), except that true is accepted as an alias
         *    for 'valid', for BC.
         *
-        * @return \type{User} The User object, or false if the username is invalid 
+        * @return User The User object, or false if the username is invalid
         *    (e.g. if it contains illegal characters or is an IP address). If the
         *    username is not present in the database, the result will be a user object
         *    with a name, zero user ID and default settings.
@@ -556,7 +557,7 @@ class User {
         * either by batch processes or by user accounts which have
         * already been created.
         *
-        * Additional blacklisting may be added here rather than in 
+        * Additional blacklisting may be added here rather than in
         * isValidUserName() to avoid disrupting existing accounts.
         *
         * @param $name \string String to match
@@ -601,22 +602,25 @@ class User {
         * @return mixed: true on success, string of error message on failure
         */
        function getPasswordValidity( $password ) {
-               global $wgMinimalPasswordLength, $wgWeakPasswords, $wgContLang;
+               global $wgMinimalPasswordLength, $wgContLang;
+               
+               static $blockedLogins = array(
+                       'Useruser' => 'Passpass', 'Useruser1' => 'Passpass1', # r75589
+                       'Apitestsysop' => 'testpass', 'Apitestuser' => 'testpass' # r75605
+               );
 
                $result = false; //init $result to false for the internal checks
 
                if( !wfRunHooks( 'isValidPassword', array( $password, &$result, $this ) ) )
                        return $result;
 
-               $lcPassword = $wgContLang->lc( $password );
-
                if ( $result === false ) {
                        if( strlen( $password ) < $wgMinimalPasswordLength ) {
                                return 'passwordtooshort';
-                       } elseif ( $lcPassword == $wgContLang->lc( $this->mName ) ) {
+                       } elseif ( $wgContLang->lc( $password ) == $wgContLang->lc( $this->mName ) ) {
                                return 'password-name-match';
-                       } elseif ( in_array( $lcPassword, $wgWeakPasswords ) ) {                        
-                               return 'password-too-weak';
+                       } elseif ( isset( $blockedLogins[ $this->getName() ] ) && $password == $blockedLogins[ $this->getName() ] ) {
+                               return 'password-login-forbidden';
                        } else {
                                //it seems weird returning true here, but this is because of the
                                //initialization of $result to false above. If the hook is never run or it
@@ -658,7 +662,7 @@ class User {
                [$rfc1034_ldh_str]+       # First domain part
                (\\.[$rfc1034_ldh_str]+)+  # Following part prefixed with a dot
                $                      # End of string
-               /ix" ; // case Insensitive, eXtended 
+               /ix" ; // case Insensitive, eXtended
 
                return (bool) preg_match( $HTML5_email_regexp, $addr );
        }
@@ -1073,7 +1077,6 @@ class User {
                global $wgProxyWhitelist, $wgUser;
 
                if ( -1 != $this->mBlockedby ) {
-                       wfDebug( "User::getBlockedStatus: already loaded.\n" );
                        return;
                }
 
@@ -1337,7 +1340,6 @@ class User {
         * @return \bool True if blocked, false otherwise
         */
        function isBlocked( $bFromSlave = true ) { // hacked from false due to horrible probs on site
-               wfDebug( "User::isBlocked: enter\n" );
                $this->getBlockedStatus( $bFromSlave );
                return $this->mBlockedby !== 0;
        }
@@ -1352,9 +1354,7 @@ class User {
        function isBlockedFrom( $title, $bFromSlave = false ) {
                global $wgBlockAllowsUTEdit;
                wfProfileIn( __METHOD__ );
-               wfDebug( __METHOD__ . ": enter\n" );
 
-               wfDebug( __METHOD__ . ": asking isBlocked()\n" );
                $blocked = $this->isBlocked( $bFromSlave );
                $allowUsertalk = ( $wgBlockAllowsUTEdit ? $this->mAllowUsertalk : false );
                # If a user's name is suppressed, they cannot make edits anywhere
@@ -1762,11 +1762,11 @@ class User {
                        }
 
                        if( !$this->isValidPassword( $str ) ) {
-                               global $wgMinimalPasswordLength;
+                               global $wgMinimalPasswordLength;
                                $valid = $this->getPasswordValidity( $str );
                                throw new PasswordError( wfMsgExt( $valid, array( 'parsemag' ),
                                        $wgMinimalPasswordLength ) );
-                       }
+                       }
                }
 
                if( !$wgAuth->setPassword( $this, $str ) ) {
@@ -2038,7 +2038,7 @@ class User {
                global $wgMaxArticleSize; # Maximum article size, in Kb
                $threshold = intval( $this->getOption( 'stubthreshold' ) );
                if ( $threshold > $wgMaxArticleSize * 1024 ) {
-                       # If they have set an impossible value, disable the preference 
+                       # If they have set an impossible value, disable the preference
                        # so we can use the parser cache again.
                        $threshold = 0;
                }
@@ -2248,7 +2248,7 @@ class User {
                        return $this->mSkin;
                }
        }
-       
+
        // Creates a Skin object, for getSkin()
        private function createSkinObject() {
                wfProfileIn( __METHOD__ );
@@ -2267,7 +2267,7 @@ class User {
 
                $skin = Skin::newFromKey( $userSkin );
                wfProfileOut( __METHOD__ );
-               
+
                return $skin;
        }
 
@@ -2402,7 +2402,7 @@ class User {
 
                // If an option is not set in $str, use the default value
                $this->mOptions = self::getDefaultOptions();
-               
+
                $a = explode( "\n", $str );
                foreach ( $a as $s ) {
                        $m = array();
@@ -2514,8 +2514,8 @@ class User {
                                'user_newpassword' => $this->mNewpassword,
                                'user_newpass_time' => $dbw->timestampOrNull( $this->mNewpassTime ),
                                'user_real_name' => $this->mRealName,
-                               'user_email' => $this->mEmail,
-                               'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
+                               'user_email' => $this->mEmail,
+                               'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
                                'user_options' => '',
                                'user_touched' => $dbw->timestamp( $this->mTouched ),
                                'user_token' => $this->mToken,
@@ -2573,12 +2573,13 @@ class User {
                }
                $dbw = wfGetDB( DB_MASTER );
                $seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
+
                $fields = array(
                        'user_id' => $seqVal,
                        'user_name' => $name,
                        'user_password' => $user->mPassword,
                        'user_newpassword' => $user->mNewpassword,
-                       'user_newpass_time' => $dbw->timestamp( $user->mNewpassTime ),
+                       'user_newpass_time' => $dbw->timestampOrNull( $user->mNewpassTime ),
                        'user_email' => $user->mEmail,
                        'user_email_authenticated' => $dbw->timestampOrNull( $user->mEmailAuthenticated ),
                        'user_real_name' => $user->mRealName,
@@ -2612,7 +2613,7 @@ class User {
                                'user_name' => $this->mName,
                                'user_password' => $this->mPassword,
                                'user_newpassword' => $this->mNewpassword,
-                               'user_newpass_time' => $dbw->timestamp( $this->mNewpassTime ),
+                               'user_newpass_time' => $dbw->timestampOrNull( $this->mNewpassTime ),
                                'user_email' => $this->mEmail,
                                'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
                                'user_real_name' => $this->mRealName,
@@ -2671,7 +2672,7 @@ class User {
                wfDeprecated( __METHOD__ );
 
                // stubthreshold is only included below for completeness,
-               // since it disables the parser cache, its value will always 
+               // since it disables the parser cache, its value will always
                // be 0 when this function is called by parsercache.
 
                $confstr =        $this->getOption( 'math' );
@@ -2780,6 +2781,15 @@ class User {
                global $wgAuth;
                $this->load();
 
+               // Even though we stop people from creating passwords that
+               // are shorter than this, doesn't mean people wont be able
+               // to. Certain authentication plugins do NOT want to save
+               // domain passwords in a mysql database, so we should
+               // check this (in case $wgAuth->strict() is false).
+               if( !$this->isValidPassword( $password ) ) {
+                       return false;
+               }
+
                if( $wgAuth->authenticate( $this->getName(), $password ) ) {
                        return true;
                } elseif( $wgAuth->strict() ) {
@@ -2810,7 +2820,9 @@ class User {
        function checkTemporaryPassword( $plaintext ) {
                global $wgNewPasswordExpiry;
                if( self::comparePasswords( $this->mNewpassword, $plaintext, $this->getId() ) ) {
-                       $this->load();
+                       if ( is_null( $this->mNewpassTime ) ) {
+                               return true;
+                       }
                        $expiry = wfTimestamp( TS_UNIX, $this->mNewpassTime ) + $wgNewPasswordExpiry;
                        return ( time() < $expiry );
                } else {
@@ -2891,7 +2903,7 @@ class User {
         * mail to the user's given address.
         *
         * @param $changed Boolean: whether the adress changed
-        * @return \types{\bool,\type{WikiError}} True on success, a WikiError object on failure.
+        * @return Status object
         */
        function sendConfirmationMail( $changed = false ) {
                global $wgLang;
@@ -2921,7 +2933,7 @@ class User {
         * @param $body \string Message body
         * @param $from \string Optional From address; if unspecified, default $wgPasswordSender will be used
         * @param $replyto \string Reply-To address
-        * @return \types{\bool,\type{WikiError}} True on success, a WikiError object on failure
+        * @return Status object
         */
        function sendMail( $subject, $body, $from = null, $replyto = null ) {
                if( is_null( $from ) ) {
@@ -3206,7 +3218,7 @@ class User {
         * Return the set of defined explicit groups.
         * The implicit groups (by default *, 'user' and 'autoconfirmed')
         * are not included, as they are defined automatically, not in the database.
-        * @return \type{\arrayof{\string}} Array of internal group names
+        * @return Array of internal group names
         */
        static function getAllGroups() {
                global $wgGroupPermissions, $wgRevokePermissions;
@@ -3218,7 +3230,7 @@ class User {
 
        /**
         * Get a list of all available permissions.
-        * @return \type{\arrayof{\string}} Array of permission names
+        * @return Array of permission names
         */
        static function getAllRights() {
                if ( self::$mAllRights === false ) {