Made loadFromFileCache() always disable $wgOut regardless of whether compression...
[lhc/web/wiklou.git] / includes / User.php
index 074eeec..0eead0e 100644 (file)
@@ -115,7 +115,6 @@ class User {
                'deletedhistory',
                'deletedtext',
                'deleterevision',
-               'disableaccount',
                'edit',
                'editinterface',
                'editusercssjs', #deprecated
@@ -148,7 +147,6 @@ class User {
                'suppressionlog',
                'suppressredirect',
                'suppressrevision',
-               'trackback',
                'unblockself',
                'undelete',
                'unwatchedpages',
@@ -199,7 +197,7 @@ class User {
         */
        var $mNewtalk, $mDatePreference, $mBlockedby, $mHash, $mRights,
                $mBlockreason, $mEffectiveGroups, $mImplicitGroups, $mFormerGroups, $mBlockedGlobally,
-               $mLocked, $mHideName, $mOptions, $mDisplayName;
+               $mLocked, $mHideName, $mOptions;
 
        /**
         * @var WebRequest
@@ -393,7 +391,7 @@ class User {
         * If the code is invalid or has expired, returns NULL.
         *
         * @param $code String Confirmation code
-        * @return User
+        * @return User object, or null
         */
        public static function newFromConfirmationCode( $code ) {
                $dbr = wfGetDB( DB_SLAVE );
@@ -414,7 +412,7 @@ class User {
         *
         * @param $request WebRequest object to use; $wgRequest will be used if
         *        ommited.
-        * @return User
+        * @return User object
         */
        public static function newFromSession( WebRequest $request = null ) {
                $user = new User;
@@ -447,7 +445,7 @@ class User {
        /**
         * Get the username corresponding to a given user ID
         * @param $id Int User ID
-        * @return String|false The corresponding username
+        * @return String|bool The corresponding username
         */
        public static function whoIs( $id ) {
                $dbr = wfGetDB( DB_SLAVE );
@@ -458,7 +456,7 @@ class User {
         * Get the real name of a user given their user ID
         *
         * @param $id Int User ID
-        * @return String|false The corresponding user's real name
+        * @return String|bool The corresponding user's real name
         */
        public static function whoIsReal( $id ) {
                $dbr = wfGetDB( DB_SLAVE );
@@ -550,6 +548,7 @@ class User {
                        return false;
                }
 
+
                // Ensure that the name can't be misresolved as a different title,
                // such as with extra namespace keys at the start.
                $parsed = Title::newFromText( $name );
@@ -731,6 +730,7 @@ class User {
         * @deprecated since 1.18 call Sanitizer::isValidEmail() directly
         */
        public static function isValidEmailAddr( $addr ) {
+               wfDeprecated( __METHOD__, '1.18' );
                return Sanitizer::validateEmail( $addr );
        }
 
@@ -1191,7 +1191,6 @@ class User {
                $this->mEffectiveGroups = null;
                $this->mImplicitGroups = null;
                $this->mOptions = null;
-               $this->mDisplayName = null;
 
                if ( $reloadFrom ) {
                        $this->mLoadedItems = array();
@@ -2111,7 +2110,11 @@ class User {
         */
        public function setEmail( $str ) {
                $this->load();
+               if( $str == $this->mEmail ) {
+                       return;
+               }
                $this->mEmail = $str;
+               $this->invalidateEmail();
                wfRunHooks( 'UserSetEmail', array( $this, &$this->mEmail ) );
        }
 
@@ -2136,32 +2139,6 @@ class User {
                $this->mRealName = $str;
        }
 
-       /**
-        * Return the name of this user we should used to display in the user interface
-        * @return String The user's display name
-        */
-       public function getDisplayName() {
-               global $wgRealNameInInterface;
-               if ( is_null( $this->mDisplayName ) ) {
-                       $displayName = null;
-                       
-                       // Allow hooks to set a display name
-                       wfRunHooks( 'UserDisplayName', array( $this, &$displayName ) );
-
-                       if ( is_null( $displayName ) && $wgRealNameInInterface && $this->getRealName() ) {
-                               // If $wgRealNameInInterface is true use the real name as the display name if it's set
-                               $displayName = $this->getRealName();
-                       }
-                       
-                       if ( is_null( $displayName ) ) {
-                               $displayName = $this->getName();
-                       }
-
-                       $this->mDisplayName = $displayName;
-               }
-               return $this->mDisplayName;
-       }
-
        /**
         * Get the user's current setting for a given option.
         *
@@ -2313,29 +2290,16 @@ class User {
 
        /**
         * Get the permissions this user has.
-        * @param $ns int If numeric, get permissions for this namespace
         * @return Array of String permission names
         */
-       public function getRights( $ns = null ) {
-               $key = is_null( $ns ) ? '*' : intval( $ns );
-
+       public function getRights() {
                if ( is_null( $this->mRights ) ) {
-                       $this->mRights = array();
-               }
-
-               if ( !isset( $this->mRights[$key] ) ) {
-                       $this->mRights[$key] = self::getGroupPermissions( $this->getEffectiveGroups(), $ns );
-                       wfRunHooks( 'UserGetRights', array( $this, &$this->mRights[$key], $ns ) );
+                       $this->mRights = self::getGroupPermissions( $this->getEffectiveGroups() );
+                       wfRunHooks( 'UserGetRights', array( $this, &$this->mRights ) );
                        // Force reindexation of rights when a hook has unset one of them
-                       $this->mRights[$key] = array_values( $this->mRights[$key] );
+                       $this->mRights = array_values( $this->mRights );
                }
-               if ( is_null( $ns ) ) {
-                       return $this->mRights[$key];
-               } else {
-                       // Merge non namespace specific rights
-                       return array_merge( $this->mRights[$key], $this->getRights() );
-               }
-
+               return $this->mRights;
        }
 
        /**
@@ -2460,7 +2424,7 @@ class User {
                }
                $this->loadGroups();
                $this->mGroups[] = $group;
-               $this->mRights = null;
+               $this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
 
                $this->invalidateCache();
        }
@@ -2490,7 +2454,7 @@ class User {
                }
                $this->loadGroups();
                $this->mGroups = array_diff( $this->mGroups, array( $group ) );
-               $this->mRights = null;
+               $this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
 
                $this->invalidateCache();
        }
@@ -2547,10 +2511,9 @@ class User {
        /**
         * Internal mechanics of testing a permission
         * @param $action String
-        * @param $ns int|null Namespace optional
         * @return bool
         */
-       public function isAllowed( $action = '', $ns = null ) {
+       public function isAllowed( $action = '' ) {
                if ( $action === '' ) {
                        return true; // In the spirit of DWIM
                }
@@ -2562,7 +2525,7 @@ class User {
                }
                # Use strict parameter to avoid matching numeric 0 accidentally inserted
                # by misconfiguration: 0 == 'foo'
-               return in_array( $action, $this->getRights( $ns ), true );
+               return in_array( $action, $this->getRights(), true );
        }
 
        /**
@@ -2604,6 +2567,7 @@ class User {
         * @deprecated since 1.18 Use ->getSkin() in the most relevant outputting context you have
         */
        public function getSkin() {
+               wfDeprecated( __METHOD__, '1.18' );
                return RequestContext::getMain()->getSkin();
        }
 
@@ -2736,6 +2700,7 @@ class User {
         * @deprecated in 1.19 due to removal of user_options from the user table
         */
        private function decodeOptions( $str ) {
+               wfDeprecated( __METHOD__, '1.19' );
                if( !$str )
                        return;
 
@@ -2788,6 +2753,14 @@ class User {
 
                $this->load();
                if ( 0 == $this->mId ) return;
+               if ( !$this->mToken ) {
+                       // When token is empty or NULL generate a new one and then save it to the database
+                       // This allows a wiki to re-secure itself after a leak of it's user table or $wgSecretKey
+                       // Simply by setting every cell in the user_token column to NULL and letting them be
+                       // regenerated as users log back into the wiki.
+                       $this->setToken();
+                       $this->saveSettings();
+               }
                $session = array(
                        'wsUserID' => $this->mId,
                        'wsToken' => $this->mToken,
@@ -3023,11 +2996,12 @@ class User {
         * @return String Page rendering hash
         */
        public function getPageRenderingHash() {
+               wfDeprecated( __METHOD__, '1.17' );
+               
                global $wgUseDynamicDates, $wgRenderHashAppend, $wgLang, $wgContLang;
                if( $this->mHash ){
                        return $this->mHash;
                }
-               wfDeprecated( __METHOD__ );
 
                // stubthreshold is only included below for completeness,
                // since it disables the parser cache, its value will always
@@ -3193,16 +3167,17 @@ class User {
 
        /**
         * Alias for getEditToken.
-        * @deprecated since 1.19, use getEditToken instead. 
-        * 
+        * @deprecated since 1.19, use getEditToken instead.
+        *
         * @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
         */
        public function editToken( $salt = '', $request = null ) {
+               wfDeprecated( __METHOD__, '1.19' );
                return $this->getEditToken( $salt, $request );
        }
-       
+
        /**
         * Initialize (if necessary) and return a session token value
         * which can be used in edit forms to show that the user's
@@ -3258,7 +3233,7 @@ class User {
         * @return Boolean: Whether the token matches
         */
        public function matchEditToken( $val, $salt = '', $request = null ) {
-               $sessionToken = $this->editToken( $salt, $request );
+               $sessionToken = $this->getEditToken( $salt, $request );
                if ( $val != $sessionToken ) {
                        wfDebug( "User::matchEditToken: broken session data\n" );
                }
@@ -3275,7 +3250,7 @@ class User {
         * @return Boolean: Whether the token matches
         */
        public function matchEditTokenNoSuffix( $val, $salt = '', $request = null ) {
-               $sessionToken = $this->editToken( $salt, $request );
+               $sessionToken = $this->getEditToken( $salt, $request );
                return substr( $sessionToken, 0, 32 ) == substr( $val, 0, 32 );
        }
 
@@ -3401,7 +3376,7 @@ class User {
         *
         * @note Call saveSettings() after calling this function to commit the change.
         *
-        * @return true
+        * @return bool
         */
        public function confirmEmail() {
                $this->setEmailAuthenticationTimestamp( wfTimestampNow() );
@@ -3414,7 +3389,7 @@ class User {
         * address if it was already confirmed.
         *
         * @note Call saveSettings() after calling this function to commit the change.
-        * @return true
+        * @return bool
         */
        function invalidateEmail() {
                $this->load();
@@ -3541,70 +3516,40 @@ class User {
         * Get the permissions associated with a given list of groups
         *
         * @param $groups Array of Strings List of internal group names
-        * @param $ns int
-        *
         * @return Array of Strings List of permission key names for given groups combined
         */
-       public static function getGroupPermissions( array $groups, $ns = null ) {
+       public static function getGroupPermissions( $groups ) {
                global $wgGroupPermissions, $wgRevokePermissions;
                $rights = array();
-
-               // Grant every granted permission first
+               // grant every granted permission first
                foreach( $groups as $group ) {
                        if( isset( $wgGroupPermissions[$group] ) ) {
-                               $rights = array_merge( $rights, self::extractRights(
-                                       $wgGroupPermissions[$group], $ns ) );
+                               $rights = array_merge( $rights,
+                                       // array_filter removes empty items
+                                       array_keys( array_filter( $wgGroupPermissions[$group] ) ) );
                        }
                }
-
-               // Revoke the revoked permissions
+               // now revoke the revoked permissions
                foreach( $groups as $group ) {
                        if( isset( $wgRevokePermissions[$group] ) ) {
-                               $rights = array_diff( $rights, self::extractRights(
-                                       $wgRevokePermissions[$group], $ns ) );
+                               $rights = array_diff( $rights,
+                                       array_keys( array_filter( $wgRevokePermissions[$group] ) ) );
                        }
                }
                return array_unique( $rights );
        }
 
-       /**
-        * Helper for User::getGroupPermissions
-        * @param $list array
-        * @param $ns int
-        * @return array
-        */
-       private static function extractRights( $list, $ns ) {
-               $rights = array();
-               foreach( $list as $right => $value ) {
-                       if ( is_array( $value ) ) {
-                               # This is a list of namespaces where the permission applies
-                               if ( !is_null( $ns ) && !empty( $value[$ns] ) ) {
-                                       $rights[] = $right;
-                               }
-                       } else {
-                               # This is a boolean indicating that the permission applies
-                               if ( $value ) {
-                                       $rights[] = $right;
-                               }
-                       }
-               }
-               return $rights;
-       }
-
        /**
         * Get all the groups who have a given permission
         *
         * @param $role String Role to check
-        * @param $ns int
-        *
-        *
         * @return Array of Strings List of internal group names with the given permission
         */
-       public static function getGroupsWithPermission( $role, $ns = null ) {
+       public static function getGroupsWithPermission( $role ) {
                global $wgGroupPermissions;
                $allowedGroups = array();
                foreach ( $wgGroupPermissions as $group => $rights ) {
-                       if ( in_array( $role, self::getGroupPermissions( array( $group ), $ns ), true ) ) {
+                       if ( isset( $rights[$role] ) && $rights[$role] ) {
                                $allowedGroups[] = $group;
                        }
                }
@@ -3973,7 +3918,7 @@ class User {
        }
 
        /**
-        * Add a newuser log entry for this user
+        * Add a newuser log entry for this user. Before 1.19 the return value was always true.
         *
         * @param $byEmail Boolean: account made by email?
         * @param $reason String: user supplied reason
@@ -4012,7 +3957,7 @@ class User {
         * Add an autocreate newuser log entry for this user
         * Used by things like CentralAuth and perhaps other authplugins.
         *
-        * @return true
+        * @return bool
         */
        public function addNewUserLogEntryAutoCreate() {
                global $wgNewUserLog;
@@ -4052,6 +3997,7 @@ class User {
                                __METHOD__
                        );
 
+                       $this->mOptionOverrides = array();
                        foreach ( $res as $row ) {
                                $this->mOptionOverrides[$row->up_property] = $row->up_value;
                                $this->mOptions[$row->up_property] = $row->up_value;
@@ -4107,10 +4053,8 @@ class User {
                        }
                }
 
-               $dbw->begin();
                $dbw->delete( 'user_properties', array( 'up_user' => $this->getId() ), __METHOD__ );
                $dbw->insert( 'user_properties', $insert_rows, __METHOD__ );
-               $dbw->commit();
        }
 
        /**