Cleanup r70571, more strict checks for getCookie() return values
[lhc/web/wiklou.git] / includes / User.php
index 364503b..522b49b 100644 (file)
@@ -66,7 +66,6 @@ class User {
                'watchdefault',
                'watchmoves',
                'watchdeletion',
-               'minordefault',
                'previewontop',
                'previewonfirst',
                'nocache',
@@ -167,6 +166,7 @@ class User {
                'reupload',
                'reupload-shared',
                'rollback',
+               'selenium',
                'sendemail',
                'siteadmin',
                'suppressionlog',
@@ -816,7 +816,7 @@ class User {
        function loadDefaults( $name = false ) {
                wfProfileIn( __METHOD__ );
 
-               global $wgCookiePrefix;
+               global $wgRequest;
 
                $this->mId = 0;
                $this->mName = $name;
@@ -827,8 +827,8 @@ class User {
                $this->mOptionOverrides = null;
                $this->mOptionsLoaded = false;
 
-               if ( isset( $_COOKIE[$wgCookiePrefix.'LoggedOut'] ) ) {
-                       $this->mTouched = wfTimestamp( TS_MW, $_COOKIE[$wgCookiePrefix.'LoggedOut'] );
+               if( $wgRequest->getCookie( 'LoggedOut' ) !== null ) {
+                       $this->mTouched = wfTimestamp( TS_MW, $wgRequest->getCookie( 'LoggedOut' ) );
                } else {
                        $this->mTouched = '0'; # Allow any pages to be cached
                }
@@ -859,7 +859,7 @@ class User {
         * @return \bool True if the user is logged in, false otherwise.
         */
        private function loadFromSession() {
-               global $wgMemc, $wgCookiePrefix, $wgExternalAuthType, $wgAutocreatePolicy;
+               global $wgRequest, $wgExternalAuthType, $wgAutocreatePolicy;
 
                $result = null;
                wfRunHooks( 'UserLoadFromSession', array( $this, &$result ) );
@@ -875,8 +875,8 @@ class User {
                        }
                }
 
-               if ( isset( $_COOKIE["{$wgCookiePrefix}UserID"] ) ) {
-                       $sId = intval( $_COOKIE["{$wgCookiePrefix}UserID"] );
+               if ( $wgRequest->getCookie( 'UserID' ) !== null ) {
+                       $sId = intval( $wgRequest->getCookie( 'UserID' ) );
                        if( isset( $_SESSION['wsUserID'] ) && $sId != $_SESSION['wsUserID'] ) {
                                $this->loadDefaults(); // Possible collision!
                                wfDebugLog( 'loginSessions', "Session user ID ({$_SESSION['wsUserID']}) and
@@ -898,8 +898,8 @@ class User {
 
                if ( isset( $_SESSION['wsUserName'] ) ) {
                        $sName = $_SESSION['wsUserName'];
-               } else if ( isset( $_COOKIE["{$wgCookiePrefix}UserName"] ) ) {
-                       $sName = $_COOKIE["{$wgCookiePrefix}UserName"];
+               } else if ( $wgRequest->getCookie('UserName') !== null ) {
+                       $sName = $wgRequest->getCookie('UserName');
                        $_SESSION['wsUserName'] = $sName;
                } else {
                        $this->loadDefaults();
@@ -923,8 +923,8 @@ class User {
                if ( isset( $_SESSION['wsToken'] ) ) {
                        $passwordCorrect = $_SESSION['wsToken'] == $this->mToken;
                        $from = 'session';
-               } else if ( isset( $_COOKIE["{$wgCookiePrefix}Token"] ) ) {
-                       $passwordCorrect = $this->mToken == $_COOKIE["{$wgCookiePrefix}Token"];
+               } else if ( $wgRequest->getCookie( 'Token' ) !== null ) {
+                       $passwordCorrect = $this->mToken == $wgRequest->getCookie( 'Token' );
                        $from = 'cookie';
                } else {
                        # No session or persistent login cookie
@@ -2078,6 +2078,20 @@ class User {
                return $this->mDatePreference;
        }
 
+       /**
+        * Get the user preferred stub threshold
+        */
+       function getStubThreshold() {
+               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 
+                       # so we can use the parser cache again.
+                       $threshold = 0;
+               }
+               return $threshold;
+       }
+
        /**
         * Get the permissions this user has.
         * @return \type{\arrayof{\string}} Array of permission names
@@ -2160,7 +2174,7 @@ class User {
                                        'ug_user'  => $this->getID(),
                                        'ug_group' => $group,
                                ),
-                               'User::addGroup',
+                               __METHOD__,
                                array( 'IGNORE' ) );
                }
 
@@ -2183,8 +2197,7 @@ class User {
                        array(
                                'ug_user'  => $this->getID(),
                                'ug_group' => $group,
-                       ),
-                       'User::removeGroup' );
+                       ), __METHOD__ );
 
                $this->loadGroups();
                $this->mGroups = array_diff( $this->mGroups, array( $group ) );
@@ -2278,7 +2291,7 @@ class User {
                                $userSkin = $wgDefaultSkin;
                        }
 
-                       $this->mSkin =& Skin::newFromKey( $userSkin );
+                       $this->mSkin = Skin::newFromKey( $userSkin );
                        wfProfileOut( __METHOD__ );
                }
                if( $t || !$this->mSkin->getTitle() ) {
@@ -2687,11 +2700,12 @@ class User {
                }
 
                // stubthreshold is only included below for completeness,
-               // it will always be 0 when this function is called by parsercache.
+               // since it disables the parser cache, its value will always 
+               // be 0 when this function is called by parsercache.
 
                $confstr =        $this->getOption( 'math' );
-               $confstr .= '!' . $this->getOption( 'stubthreshold' );
-               if ( $wgUseDynamicDates ) {
+               $confstr .= '!' . $this->getStubThreshold();
+               if ( $wgUseDynamicDates ) { # This is wrong (bug 24714)
                        $confstr .= '!' . $this->getDatePreference();
                }
                $confstr .= '!' . ( $this->getOption( 'numberheadings' ) ? '1' : '' );
@@ -2701,6 +2715,9 @@ class User {
                $extra = $wgContLang->getExtraHashOptions();
                $confstr .= $extra;
 
+               // Since the skin could be overloading link(), it should be
+               // included here but in practice, none of our skins do that.
+
                $confstr .= $wgRenderHashAppend;
 
                // Give a chance for extensions to modify the hash, if they have
@@ -2739,13 +2756,6 @@ class User {
                return $this->isAllowed( 'createaccount' ) && !$this->isBlockedFromCreateAccount();
        }
 
-       /**
-        * @deprecated
-        */
-       function setLoaded( $loaded ) {
-               wfDeprecated( __METHOD__ );
-       }
-
        /**
         * Get this user's personal page title.
         *
@@ -2777,7 +2787,7 @@ class User {
                        return $res;
                else {
                        $dbr = wfGetDB( DB_SLAVE );
-                       return $res = $dbr->selectField( 'user', 'max(user_id)', false, 'User::getMaxID' );
+                       return $res = $dbr->selectField( 'user', 'max(user_id)', false, __METHOD__ );
                }
        }
 
@@ -3208,8 +3218,6 @@ class User {
         * @return \string Localized descriptive group name
         */
        static function getGroupName( $group ) {
-               global $wgMessageCache;
-               $wgMessageCache->loadAllMessages();
                $key = "group-$group";
                $name = wfMsg( $key );
                return $name == '' || wfEmptyMsg( $key, $name )
@@ -3224,8 +3232,6 @@ class User {
         * @return \string Localized name for group member
         */
        static function getGroupMember( $group ) {
-               global $wgMessageCache;
-               $wgMessageCache->loadAllMessages();
                $key = "group-$group-member";
                $name = wfMsg( $key );
                return $name == '' || wfEmptyMsg( $key, $name )
@@ -3282,8 +3288,6 @@ class User {
         * @return \types{\type{Title},\bool} Title of the page if it exists, false otherwise
         */
        static function getGroupPage( $group ) {
-               global $wgMessageCache;
-               $wgMessageCache->loadAllMessages();
                $page = wfMsgForContent( 'grouppage-' . $group );
                if( !wfEmptyMsg( 'grouppage-' . $group, $page ) ) {
                        $title = Title::newFromText( $page );
@@ -3496,8 +3500,6 @@ class User {
         * @return \string Localized description of the right
         */
        static function getRightDescription( $right ) {
-               global $wgMessageCache;
-               $wgMessageCache->loadAllMessages();
                $key = "right-$right";
                $name = wfMsg( $key );
                return $name == '' || wfEmptyMsg( $key, $name )
@@ -3557,7 +3559,6 @@ class User {
         * @return \bool
         */
        static function comparePasswords( $hash, $password, $userId = false ) {
-               $m = false;
                $type = substr( $hash, 0, 3 );
 
                $result = false;
@@ -3580,28 +3581,34 @@ class User {
 
        /**
         * Add a newuser log entry for this user
+        *
         * @param $byEmail Boolean: account made by email?
+        * @param $reason String: user supplied reason
         */
-       public function addNewUserLogEntry( $byEmail = false ) {
-               global $wgUser, $wgNewUserLog;
+       public function addNewUserLogEntry( $byEmail = false, $reason = '' ) {
+               global $wgUser, $wgContLang, $wgNewUserLog;
                if( empty( $wgNewUserLog ) ) {
                        return true; // disabled
                }
 
                if( $this->getName() == $wgUser->getName() ) {
                        $action = 'create';
-                       $message = '';
                } else {
                        $action = 'create2';
-                       $message = $byEmail
-                               ? wfMsgForContent( 'newuserlog-byemail' )
-                               : '';
+                       if ( $byEmail ) {
+                               if ( $reason === '' ) {
+                                       $reason = wfMsgForContent( 'newuserlog-byemail' );
+                               } else {
+                                       $reason = $wgContLang->commaList( array(
+                                               $reason, wfMsgForContent( 'newuserlog-byemail' ) ) );
+                               }
+                       }
                }
                $log = new LogPage( 'newusers' );
                $log->addEntry(
                        $action,
                        $this->getUserPage(),
-                       $message,
+                       $reason,
                        array( $this->getId() )
                );
                return true;
@@ -3716,6 +3723,10 @@ class User {
         *
         * Obviously, you still need to do server-side checking.
         *
+        * NOTE: A combination of bugs in various browsers means that this function
+        * actually just returns array() unconditionally at the moment.  May as
+        * well keep it around for when the browser bugs get fixed, though.
+        *
         * @return array Array of HTML attributes suitable for feeding to
         *   Html::element(), directly or indirectly.  (Don't feed to Xml::*()!
         *   That will potentially output invalid XHTML 1.0 Transitional, and will
@@ -3730,7 +3741,14 @@ class User {
 
                # Note that the pattern requirement will always be satisfied if the
                # input is empty, so we need required in all cases.
-               $ret = array( 'required' );
+               #
+               # FIXME (bug 23769): This needs to not claim the password is required
+               # if e-mail confirmation is being used.  Since HTML5 input validation
+               # is b0rked anyway in some browsers, just return nothing.  When it's
+               # re-enabled, fix this code to not output required for e-mail
+               # registration.
+               #$ret = array( 'required' );
+               $ret = array();
 
                # We can't actually do this right now, because Opera 9.6 will print out
                # the entered password visibly in its error message!  When other
@@ -3761,11 +3779,11 @@ class User {
 
                        $signature = empty($signature) ? "~~~~~" : "{$signature} ~~~~~";
 
-                       $template = Title::newFromText( wfMsg( 'usermessage-template' ) );
+                       $template = Title::newFromText( wfMsgForContent( 'usermessage-template' ) );
                        if ( !$template
                                        || $template->getNamespace() !== NS_TEMPLATE
                                        || !$template->exists() ) {
-                               $text = "== $subject ==\n\n$text\n\n-- $signature";
+                               $text = "\n== $subject ==\n\n$text\n\n-- $signature";
                        } else {
                                $text = '{{'. $template->getText()
                                        . " | subject=$subject | body=$text | signature=$signature }}";
@@ -3782,8 +3800,6 @@ class User {
         * @param $signature String Text to leave in the signature
         * @param $summary String the summary for this change, defaults to
         *                        "Leave system message."
-        * @param $article Article The article to update, defaults to the
-        *                        user's talk page.
         * @param $editor User The user leaving the message, defaults to
         *                        "{{MediaWiki:usermessage-editor}}"
         * @param $flags Int default edit flags
@@ -3812,7 +3828,7 @@ class User {
                $flags = $article->checkFlags( $flags );
 
                if ( $flags & EDIT_UPDATE ) {
-                       $text .= $article->getContent();
+                       $text = $article->getContent() . $text;
                }
 
                $dbw = wfGetDB( DB_MASTER );