Respect $wgScriptExtension in SearchEngine::getOpenSearchTemplate() and SearchEngine...
[lhc/web/wiklou.git] / includes / User.php
index 2ef85d2..631babc 100644 (file)
@@ -102,12 +102,15 @@ class User {
                'disableaccount',
                'edit',
                'editinterface',
-               'editusercssjs',
+               'editusercssjs', #deprecated
+               'editusercss',
+               'edituserjs',
                'hideuser',
                'import',
                'importupload',
                'ipblock-exempt',
                'markbotedits',
+               'mergehistory',
                'minoredit',
                'move',
                'movefile',
@@ -170,10 +173,20 @@ class User {
        /**
         * Lazy-initialized variables, invalidated with clearInstanceCache
         */
-       var $mNewtalk, $mDatePreference, $mBlockedby, $mHash, $mSkin, $mRights,
-               $mBlockreason, $mBlock, $mEffectiveGroups, $mBlockedGlobally,
+       var $mNewtalk, $mDatePreference, $mBlockedby, $mHash, $mRights,
+               $mBlockreason, $mEffectiveGroups, $mBlockedGlobally,
                $mLocked, $mHideName, $mOptions;
 
+       /**
+        * @var Skin
+        */
+       var $mSkin;
+
+       /**
+        * @var Block
+        */
+       var $mBlock;
+
        static $idCacheByName = array();
 
        /**
@@ -190,6 +203,10 @@ class User {
                $this->clearInstanceCache( 'defaults' );
        }
 
+       function __toString(){
+               return $this->getName();
+       }
+
        /**
         * Load the user table data for this object from the source given by mFrom.
         */
@@ -582,10 +599,13 @@ class User {
                        return false;
                }
 
-               if( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
-                       wfDebugLog( 'username', __METHOD__ .
-                               ": '$name' invalid due to wgInvalidUsernameCharacters" );
-                       return false;
+               // Preg yells if you try to give it an empty string
+               if( $wgInvalidUsernameCharacters !== '' ) {
+                       if( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
+                               wfDebugLog( 'username', __METHOD__ .
+                                       ": '$name' invalid due to wgInvalidUsernameCharacters" );
+                               return false;
+                       }
                }
 
                return self::isUsableName( $name );
@@ -867,32 +887,30 @@ class User {
                        }
                }
 
-               if ( $wgRequest->getCookie( 'UserID' ) !== null ) {
-                       $sId = intval( $wgRequest->getCookie( 'UserID' ) );
-                       if( isset( $_SESSION['wsUserID'] ) && $sId != $_SESSION['wsUserID'] ) {
+               $cookieId = $wgRequest->getCookie( 'UserID' );
+               $sessId = $wgRequest->getSessionData( 'wsUserID' );
+
+               if ( $cookieId !== null ) {
+                       $sId = intval( $cookieId );
+                       if( $sessId !== null && $cookieId != $sessId ) {
                                $this->loadDefaults(); // Possible collision!
-                               wfDebugLog( 'loginSessions', "Session user ID ({$_SESSION['wsUserID']}) and
+                               wfDebugLog( 'loginSessions', "Session user ID ($sessId) and
                                        cookie user ID ($sId) don't match!" );
                                return false;
                        }
-                       $_SESSION['wsUserID'] = $sId;
-               } else if ( isset( $_SESSION['wsUserID'] ) ) {
-                       if ( $_SESSION['wsUserID'] != 0 ) {
-                               $sId = $_SESSION['wsUserID'];
-                       } else {
-                               $this->loadDefaults();
-                               return false;
-                       }
+                       $wgRequest->setSessionData( 'wsUserID', $sId );
+               } else if ( $sessId !== null && $sessId != 0 ) {
+                       $sId = $sessId;
                } else {
                        $this->loadDefaults();
                        return false;
                }
 
-               if ( isset( $_SESSION['wsUserName'] ) ) {
-                       $sName = $_SESSION['wsUserName'];
-               } else if ( $wgRequest->getCookie('UserName') !== null ) {
-                       $sName = $wgRequest->getCookie('UserName');
-                       $_SESSION['wsUserName'] = $sName;
+               if ( $wgRequest->getSessionData( 'wsUserName' ) !== null ) {
+                       $sName = $wgRequest->getSessionData( 'wsUserName' );
+               } else if ( $wgRequest->getCookie( 'UserName' ) !== null ) {
+                       $sName = $wgRequest->getCookie( 'UserName' );
+                       $wgRequest->setSessionData( 'wsUserName', $sName );
                } else {
                        $this->loadDefaults();
                        return false;
@@ -911,8 +929,8 @@ class User {
                        return false;
                }
 
-               if ( isset( $_SESSION['wsToken'] ) ) {
-                       $passwordCorrect = $_SESSION['wsToken'] == $this->mToken;
+               if ( $wgRequest->getSessionData( 'wsToken' ) !== null ) {
+                       $passwordCorrect = $this->mToken == $wgRequest->getSessionData( 'wsToken' );
                        $from = 'session';
                } else if ( $wgRequest->getCookie( 'Token' ) !== null ) {
                        $passwordCorrect = $this->mToken == $wgRequest->getCookie( 'Token' );
@@ -924,7 +942,7 @@ class User {
                }
 
                if ( ( $sName == $this->mName ) && $passwordCorrect ) {
-                       $_SESSION['wsToken'] = $this->mToken;
+                       $wgRequest->setSessionData( 'wsToken', $this->mToken );
                        wfDebug( "User: logged in from $from\n" );
                        return true;
                } else {
@@ -1111,44 +1129,26 @@ class User {
                $this->mHideName = 0;
                $this->mAllowUsertalk = 0;
 
-               # Check if we are looking at an IP or a logged-in user
-               if ( $this->isIP( $this->getName() ) ) {
-                       $ip = $this->getName();
+               # We only need to worry about passing the IP address to the Block generator if the
+               # user is not immune to autoblocks/hardblocks, and they are the current user so we
+               # know which IP address they're actually coming from
+               if ( !$this->isAllowed( 'ipblock-exempt' ) && $this->getID() == $wgUser->getID() ) {
+                       $ip = wfGetIP();
                } else {
-                       # Check if we are looking at the current user
-                       # If we don't, and the user is logged in, we don't know about
-                       # his IP / autoblock status, so ignore autoblock of current user's IP
-                       if ( $this->getID() != $wgUser->getID() ) {
-                               $ip = '';
-                       } else {
-                               # Get IP of current user
-                               $ip = wfGetIP();
-                       }
-               }
-
-               if ( $this->isAllowed( 'ipblock-exempt' ) ) {
-                       # Exempt from all types of IP-block
-                       $ip = '';
+                       $ip = null;
                }
 
                # User/IP blocking
-               $this->mBlock = new Block();
-               $this->mBlock->fromMaster( !$bFromSlave );
-               if ( $this->mBlock->load( $ip , $this->mId ) ) {
+               $this->mBlock = Block::newFromTarget( $this->getName(), $ip, !$bFromSlave );
+               if ( $this->mBlock instanceof Block ) {
                        wfDebug( __METHOD__ . ": Found block.\n" );
-                       $this->mBlockedby = $this->mBlock->mBy;
-                       if( $this->mBlockedby == 0 )
-                               $this->mBlockedby = $this->mBlock->mByName;
+                       $this->mBlockedby = $this->mBlock->getBlocker()->getName();
                        $this->mBlockreason = $this->mBlock->mReason;
                        $this->mHideName = $this->mBlock->mHideName;
-                       $this->mAllowUsertalk = $this->mBlock->mAllowUsertalk;
+                       $this->mAllowUsertalk = !$this->mBlock->prevents( 'editownusertalk' );
                        if ( $this->isLoggedIn() && $wgUser->getID() == $this->getID() ) {
                                $this->spreadBlock();
                        }
-               } else {
-                       // Bug 13611: don't remove mBlock here, to allow account creation blocks to
-                       // apply to users. Note that the existence of $this->mBlock is not used to
-                       // check for edit blocks, $this->mBlockedby is instead.
                }
 
                # Proxy blocking
@@ -1358,7 +1358,7 @@ class User {
         */
        function isBlocked( $bFromSlave = true ) { // hacked from false due to horrible probs on site
                $this->getBlockedStatus( $bFromSlave );
-               return $this->mBlockedby !== 0;
+               return $this->mBlock instanceof Block && $this->mBlock->prevents( 'edit' );
        }
 
        /**
@@ -1411,7 +1411,7 @@ class User {
         */
        function getBlockId() {
                $this->getBlockedStatus();
-               return ( $this->mBlock ? $this->mBlock->mId : false );
+               return ( $this->mBlock ? $this->mBlock->getId() : false );
        }
 
        /**
@@ -1476,8 +1476,8 @@ class User {
         * @return Int The user's ID; 0 if the user is anonymous or nonexistent
         */
        function getId() {
-               if( $this->mId === null and $this->mName !== null
-               and User::isIP( $this->mName ) ) {
+               if( $this->mId === null && $this->mName !== null
+               && User::isIP( $this->mName ) ) {
                        // Special case, we know the user is anonymous
                        return 0;
                } elseif( $this->mId === null ) {
@@ -1947,11 +1947,13 @@ class User {
         *
         * @param $oname String The option to check
         * @param $defaultOverride String A default value returned if the option does not exist
+        * @param $ignoreHidden Bool = whether to ignore the effects of $wgHiddenPrefs
         * @return String User's current value for the option
         * @see getBoolOption()
         * @see getIntOption()
         */
-       function getOption( $oname, $defaultOverride = null ) {
+       function getOption( $oname, $defaultOverride = null, $ignoreHidden = false ) {
+               global $wgHiddenPrefs;
                $this->loadOptions();
 
                if ( is_null( $this->mOptions ) ) {
@@ -1961,6 +1963,15 @@ class User {
                        $this->mOptions = User::getDefaultOptions();
                }
 
+               # We want 'disabled' preferences to always behave as the default value for
+               # users, even if they have set the option explicitly in their settings (ie they
+               # set it, and then it was disabled removing their ability to change it).  But
+               # we don't want to erase the preferences in the database in case the preference
+               # is re-enabled again.  So don't touch $mOptions, just override the returned value
+               if( in_array( $oname, $wgHiddenPrefs ) && !$ignoreHidden ){
+                       return self::getDefaultOption( $oname );
+               }
+
                if ( array_key_exists( $oname, $this->mOptions ) ) {
                        return $this->mOptions[$oname];
                } else {
@@ -1974,8 +1985,23 @@ class User {
         * @return array
         */
        public function getOptions() {
+               global $wgHiddenPrefs;
                $this->loadOptions();
-               return $this->mOptions;
+               $options = $this->mOptions;
+
+               # We want 'disabled' preferences to always behave as the default value for
+               # users, even if they have set the option explicitly in their settings (ie they
+               # set it, and then it was disabled removing their ability to change it).  But
+               # we don't want to erase the preferences in the database in case the preference
+               # is re-enabled again.  So don't touch $mOptions, just override the returned value
+               foreach( $wgHiddenPrefs as $pref ){
+                       $default = self::getDefaultOption( $pref );
+                       if( $default !== null ){
+                               $options[$pref] = $default;
+                       }
+               }
+
+               return $options;
        }
 
        /**
@@ -2034,7 +2060,7 @@ class User {
         * Reset all options to the site defaults
         */
        function resetOptions() {
-               $this->mOptions = User::getDefaultOptions();
+               $this->mOptions = self::getDefaultOptions();
        }
 
        /**
@@ -2144,17 +2170,18 @@ class User {
         * @param $group String Name of the group to add
         */
        function addGroup( $group ) {
-               $dbw = wfGetDB( DB_MASTER );
-               if( $this->getId() ) {
-                       $dbw->insert( 'user_groups',
-                               array(
-                                       'ug_user'  => $this->getID(),
-                                       'ug_group' => $group,
-                               ),
-                               __METHOD__,
-                               array( 'IGNORE' ) );
+               if( wfRunHooks( 'UserAddGroup', array( &$this, &$group ) ) ) {
+                       $dbw = wfGetDB( DB_MASTER );
+                       if( $this->getId() ) {
+                               $dbw->insert( 'user_groups',
+                                       array(
+                                               'ug_user'  => $this->getID(),
+                                               'ug_group' => $group,
+                                       ),
+                                       __METHOD__,
+                                       array( 'IGNORE' ) );
+                       }
                }
-
                $this->loadGroups();
                $this->mGroups[] = $group;
                $this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
@@ -2169,13 +2196,14 @@ class User {
         */
        function removeGroup( $group ) {
                $this->load();
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'user_groups',
-                       array(
-                               'ug_user'  => $this->getID(),
-                               'ug_group' => $group,
-                       ), __METHOD__ );
-
+               if( wfRunHooks( 'UserRemoveGroup', array( &$this, &$group ) ) ) {
+                       $dbw = wfGetDB( DB_MASTER );
+                       $dbw->delete( 'user_groups',
+                               array(
+                                       'ug_user'  => $this->getID(),
+                                       'ug_group' => $group,
+                               ), __METHOD__ );
+               }
                $this->loadGroups();
                $this->mGroups = array_diff( $this->mGroups, array( $group ) );
                $this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
@@ -2201,10 +2229,39 @@ class User {
 
        /**
         * Check if user is allowed to access a feature / make an action
-        * @param $action String action to be checked
-        * @return Boolean: True if action is allowed, else false
+        * @param varargs String permissions to test
+        * @return Boolean: True if user is allowed to perform *any* of the given actions
         */
-       function isAllowed( $action = '' ) {
+       public function isAllowedAny( /*...*/ ){
+               $permissions = func_get_args();
+               foreach( $permissions as $permission ){
+                       if( $this->isAllowed( $permission ) ){
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * @param varargs String
+        * @return bool True if the user is allowed to perform *all* of the given actions
+        */
+       public function isAllowedAll( /*...*/ ){
+               $permissions = func_get_args();
+               foreach( $permissions as $permission ){
+                       if( !$this->isAllowed( $permission ) ){
+                               return false;
+                       }
+               }
+               return true;
+       }
+
+       /**
+        * Internal mechanics of testing a permission
+        * @param $action String
+        * @return bool
+        */
+       public function isAllowed( $action = '' ) {
                if ( $action === '' ) {
                        return true; // In the spirit of DWIM
                }
@@ -2225,7 +2282,7 @@ class User {
         */
        public function useRCPatrol() {
                global $wgUseRCPatrol;
-               return( $wgUseRCPatrol && ( $this->isAllowed( 'patrol' ) || $this->isAllowed( 'patrolmarks' ) ) );
+               return $wgUseRCPatrol && $this->isAllowedAny( 'patrol', 'patrolmarks' );
        }
 
        /**
@@ -2234,7 +2291,7 @@ class User {
         */
        public function useNPPatrol() {
                global $wgUseRCPatrol, $wgUseNPPatrol;
-               return( ( $wgUseRCPatrol || $wgUseNPPatrol ) && ( $this->isAllowed( 'patrol' ) || $this->isAllowed( 'patrolmarks' ) ) );
+               return( ( $wgUseRCPatrol || $wgUseNPPatrol ) && ( $this->isAllowedAny( 'patrol', 'patrolmarks' ) ) );
        }
 
        /**
@@ -2244,21 +2301,16 @@ class User {
         * @todo: FIXME : need to check the old failback system [AV]
         */
        function getSkin( $t = null ) {
-               if ( $t ) {
+               if( !$this->mSkin ) {
+                       global $wgOut;
+                       $this->mSkin = $this->createSkinObject();
+                       $this->mSkin->setTitle( $wgOut->getTitle() );
+               }
+               if ( $t && ( !$this->mSkin->getTitle() || !$t->equals( $this->mSkin->getTitle() ) ) ) {
                        $skin = $this->createSkinObject();
                        $skin->setTitle( $t );
                        return $skin;
                } else {
-                       if ( !$this->mSkin ) {
-                               $this->mSkin = $this->createSkinObject();
-                       }
-
-                       if ( !$this->mSkin->getTitle() ) {
-                               global $wgOut;
-                               $t = $wgOut->getTitle();
-                               $this->mSkin->setTitle($t);
-                       }
-
                        return $this->mSkin;
                }
        }
@@ -2450,8 +2502,16 @@ class User {
 
        /**
         * Set the default cookies for this session on the user's client.
+        *
+        * @param $request WebRequest object to use; $wgRequest will be used if null
+        *        is passed.
         */
-       function setCookies() {
+       function setCookies( $request = null ) {
+               if ( $request === null ) {
+                       global $wgRequest;
+                       $request = $wgRequest;
+               }
+
                $this->load();
                if ( 0 == $this->mId ) return;
                $session = array(
@@ -2470,9 +2530,9 @@ class User {
                }
 
                wfRunHooks( 'UserSetCookies', array( $this, &$session, &$cookies ) );
-               #check for null, since the hook could cause a null value
-               if ( !is_null( $session ) && isset( $_SESSION ) ){
-                       $_SESSION = $session + $_SESSION;
+
+               foreach ( $session as $name => $value ) {
+                       $request->setSessionData( $name, $value );
                }
                foreach ( $cookies as $name => $value ) {
                        if ( $value === false ) {
@@ -2498,9 +2558,11 @@ class User {
         * @see logout()
         */
        function doLogout() {
+               global $wgRequest;
+
                $this->clearInstanceCache( 'defaults' );
 
-               $_SESSION['wsUserID'] = 0;
+               $wgRequest->setSessionData( 'wsUserID', 0 );
 
                $this->clearCookie( 'UserID' );
                $this->clearCookie( 'Token' );
@@ -2567,9 +2629,9 @@ class User {
         * Add a user to the database, return the user object
         *
         * @param $name String Username to add
-        * @param $params Array of Strings Non-default parameters to save to the database:
-        *   - password             The user's password. Password logins will be disabled if this is omitted.
-        *   - newpassword          A temporary password mailed to the user
+        * @param $params Array of Strings Non-default parameters to save to the database as user_* fields:
+        *   - password             The user's password hash. Password logins will be disabled if this is omitted.
+        *   - newpassword          Hash for a temporary password that has been mailed to the user
         *   - email                The user's email address
         *   - email_authenticated  The email authentication timestamp
         *   - real_name            The user's real name
@@ -2657,7 +2719,7 @@ class User {
                        return;
                }
 
-               $userblock = Block::newFromDB( '', $this->mId );
+               $userblock = Block::newFromTarget( $this->getName() );
                if ( !$userblock ) {
                        return;
                }
@@ -2676,7 +2738,7 @@ class User {
         * which will give them a chance to modify this key based on their own
         * settings.
         *
-        * @deprecated @since 1.17 use the ParserOptions object to get the relevant options
+        * @deprecated since 1.17 use the ParserOptions object to get the relevant options
         * @return String Page rendering hash
         */
        function getPageRenderingHash() {
@@ -2719,11 +2781,24 @@ class User {
 
        /**
         * Get whether the user is explicitly blocked from account creation.
-        * @return Bool
+        * @return Bool|Block
         */
        function isBlockedFromCreateAccount() {
                $this->getBlockedStatus();
-               return $this->mBlock && $this->mBlock->mCreateAccount;
+               if( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ){
+                       return $this->mBlock;
+               }
+
+               # bug 13611: if the IP address the user is trying to create an account from is
+               # blocked with createaccount disabled, prevent new account creation there even
+               # when the user is logged in
+               static $accBlock = false;
+               if( $accBlock === false ){
+                       $accBlock = Block::newFromTarget( null, wfGetIP() );
+               }
+               return $accBlock instanceof Block && $accBlock->prevents( 'createaccount' )
+                       ? $accBlock
+                       : false;
        }
 
        /**
@@ -2732,7 +2807,7 @@ class User {
         */
        function isBlockedFromEmailuser() {
                $this->getBlockedStatus();
-               return $this->mBlock && $this->mBlock->mBlockEmail;
+               return $this->mBlock && $this->mBlock->prevents( 'sendemail' );
        }
 
        /**
@@ -2793,7 +2868,7 @@ class User {
         * @return Boolean: True if the given password is correct, otherwise False.
         */
        function checkPassword( $password ) {
-               global $wgAuth;
+               global $wgAuth, $wgLegacyEncoding;
                $this->load();
 
                // Even though we stop people from creating passwords that
@@ -2816,11 +2891,13 @@ class User {
                }
                if ( self::comparePasswords( $this->mPassword, $password, $this->mId ) ) {
                        return true;
-               } elseif ( function_exists( 'iconv' ) ) {
+               } elseif ( $wgLegacyEncoding ) {
                        # Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
                        # Check for this with iconv
                        $cp1252Password = iconv( 'UTF-8', 'WINDOWS-1252//TRANSLIT', $password );
-                       if ( self::comparePasswords( $this->mPassword, $cp1252Password, $this->mId ) ) {
+                       if ( $cp1252Password != $password &&
+                               self::comparePasswords( $this->mPassword, $cp1252Password, $this->mId ) )
+                       {
                                return true;
                        }
                }
@@ -2852,17 +2929,22 @@ class User {
         * submission.
         *
         * @param $salt String|Array of Strings Optional function-specific data for hashing
+        * @param $request WebRequest object to use or null to use $wgRequest
         * @return String The new edit token
         */
-       function editToken( $salt = '' ) {
+       function editToken( $salt = '', $request = null ) {
+               if ( $request == null ) {
+                       global $wgRequest;
+                       $request = $wgRequest;
+               }
+
                if ( $this->isAnon() ) {
                        return EDIT_TOKEN_SUFFIX;
                } else {
-                       if( !isset( $_SESSION['wsEditToken'] ) ) {
+                       $token = $request->getSessionData( 'wsEditToken' );
+                       if ( $token === null ) {
                                $token = self::generateToken();
-                               $_SESSION['wsEditToken'] = $token;
-                       } else {
-                               $token = $_SESSION['wsEditToken'];
+                               $request->setSessionData( 'wsEditToken', $token );
                        }
                        if( is_array( $salt ) ) {
                                $salt = implode( '|', $salt );
@@ -2890,10 +2972,11 @@ class User {
         *
         * @param $val String Input value to compare
         * @param $salt String Optional function-specific data for hashing
+        * @param $request WebRequest object to use or null to use $wgRequest
         * @return Boolean: Whether the token matches
         */
-       function matchEditToken( $val, $salt = '' ) {
-               $sessionToken = $this->editToken( $salt );
+       function matchEditToken( $val, $salt = '', $request = null ) {
+               $sessionToken = $this->editToken( $salt, $request );
                if ( $val != $sessionToken ) {
                        wfDebug( "User::matchEditToken: broken session data\n" );
                }
@@ -2906,10 +2989,11 @@ class User {
         *
         * @param $val String Input value to compare
         * @param $salt String Optional function-specific data for hashing
+        * @param $request WebRequest object to use or null to use $wgRequest
         * @return Boolean: Whether the token matches
         */
-       function matchEditTokenNoSuffix( $val, $salt = '' ) {
-               $sessionToken = $this->editToken( $salt );
+       function matchEditTokenNoSuffix( $val, $salt = '', $request = null ) {
+               $sessionToken = $this->editToken( $salt, $request );
                return substr( $sessionToken, 0, 32 ) == substr( $val, 0, 32 );
        }
 
@@ -2917,10 +3001,10 @@ class User {
         * Generate a new e-mail confirmation token and send a confirmation/invalidation
         * mail to the user's given address.
         *
-        * @param $changed Boolean: whether the adress changed
+        * @param $type String: message to send, either "created", "changed" or "set"
         * @return Status object
         */
-       function sendConfirmationMail( $changed = false ) {
+       function sendConfirmationMail( $type = 'created' ) {
                global $wgLang;
                $expiration = null; // gets passed-by-ref and defined in next line.
                $token = $this->confirmationToken( $expiration );
@@ -2928,7 +3012,14 @@ class User {
                $invalidateURL = $this->invalidationTokenUrl( $token );
                $this->saveSettings();
 
-               $message = $changed ? 'confirmemail_body_changed' : 'confirmemail_body';
+               if ( $type == 'created' || $type === false ) {
+                       $message = 'confirmemail_body';
+               } elseif ( $type === true ) {
+                       $message = 'confirmemail_body_changed';
+               } else {
+                       $message = 'confirmemail_body_' . $type;
+               }
+
                return $this->sendMail( wfMsg( 'confirmemail_subject' ),
                        wfMsg( $message,
                                wfGetIP(),
@@ -2974,8 +3065,9 @@ class User {
         * @private
         */
        function confirmationToken( &$expiration ) {
+               global $wgUserEmailConfirmationTokenExpiry;
                $now = time();
-               $expires = $now + 7 * 24 * 60 * 60;
+               $expires = $now + $wgUserEmailConfirmationTokenExpiry;
                $expiration = wfTimestamp( TS_MW, $expires );
                $token = self::generateToken( $this->mId . $this->mEmail . $expires );
                $hash = md5( $token );
@@ -3490,7 +3582,7 @@ class User {
        static function getRightDescription( $right ) {
                $key = "right-$right";
                $name = wfMsg( $key );
-               return $name == '' || wfEmptyMsg( $key, $name )
+               return $name == '' || wfEmptyMsg( $key )
                        ? $right
                        : $name;
        }
@@ -3607,8 +3699,8 @@ class User {
         * Used by things like CentralAuth and perhaps other authplugins.
         */
        public function addNewUserLogEntryAutoCreate() {
-               global $wgNewUserLog, $wgLogAutocreatedAccounts;
-               if( !$wgNewUserLog || !$wgLogAutocreatedAccounts ) {
+               global $wgNewUserLog;
+               if( !$wgNewUserLog ) {
                        return true; // disabled
                }
                $log = new LogPage( 'newusers', false );
@@ -3756,92 +3848,4 @@ class User {
 
                return $ret;
        }
-
-       /**
-        * Format the user message using a hook, a template, or, failing these, a static format.
-        * @param $subject   String the subject of the message
-        * @param $text      String the content of the message
-        * @param $signature String the signature, if provided.
-        */
-       static protected function formatUserMessage( $subject, $text, $signature ) {
-               if ( wfRunHooks( 'FormatUserMessage',
-                               array( $subject, &$text, $signature ) ) ) {
-
-                       $signature = empty($signature) ? "~~~~~" : "{$signature} ~~~~~";
-
-                       $template = Title::newFromText( wfMsgForContent( 'usermessage-template' ) );
-                       if ( !$template
-                                       || $template->getNamespace() !== NS_TEMPLATE
-                                       || !$template->exists() ) {
-                               $text = "\n== $subject ==\n\n$text\n\n-- $signature";
-                       } else {
-                               $text = '{{'. $template->getText()
-                                       . " | subject=$subject | body=$text | signature=$signature }}";
-                       }
-               }
-
-               return $text;
-       }
-
-       /**
-        * Leave a user a message
-        * @param $subject String the subject of the message
-        * @param $text String the message to leave
-        * @param $signature String Text to leave in the signature
-        * @param $summary String the summary for this change, defaults to
-        *                        "Leave system message."
-        * @param $editor User The user leaving the message, defaults to
-        *                        "{{MediaWiki:usermessage-editor}}"
-        * @param $flags Int default edit flags
-        *
-        * @return boolean true if it was successful
-        */
-       public function leaveUserMessage( $subject, $text, $signature = "",
-                       $summary = null, $editor = null, $flags = 0 ) {
-               if ( !isset( $summary ) ) {
-                       $summary = wfMsgForContent( 'usermessage-summary' );
-               }
-
-               if ( !isset( $editor ) ) {
-                       $editor = User::newFromName( wfMsgForContent( 'usermessage-editor' ) );
-                       if ( !$editor->isLoggedIn() ) {
-                               $editor->addToDatabase();
-                       }
-               }
-
-               $article = new Article( $this->getTalkPage() );
-               wfRunHooks( 'SetupUserMessageArticle',
-                       array( $this, &$article, $subject, $text, $signature, $summary, $editor ) );
-
-
-               $text = self::formatUserMessage( $subject, $text, $signature );
-               $flags = $article->checkFlags( $flags );
-
-               if ( $flags & EDIT_UPDATE ) {
-                       $text = $article->getContent() . $text;
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin();
-
-               try {
-                       $status = $article->doEdit( $text, $summary, $flags, false, $editor );
-               } catch ( DBQueryError $e ) {
-                       $status = Status::newFatal("DB Error");
-               }
-
-               if ( $status->isGood() ) {
-                       // Set newtalk with the right user ID
-                       $this->setNewtalk( true );
-                       wfRunHooks( 'AfterUserMessage',
-                               array( $this, $article, $subject, $text, $signature, $summary, $editor ) );
-                       $dbw->commit();
-               } else {
-                       // The article was concurrently created
-                       wfDebug( __METHOD__ . ": Error ".$status->getWikiText() );
-                       $dbw->rollback();
-               }
-
-               return $status->isGood();
-       }
 }