Merge "mw.Upload.BookletLayout: Don't explode when the API call fails with 'exception'"
[lhc/web/wiklou.git] / includes / changetags / ChangeTags.php
index 5531245..a8c9f7b 100644 (file)
@@ -212,6 +212,22 @@ class ChangeTags {
                        );
                }
 
+               if ( $log_id && !$rev_id ) {
+                       $rev_id = $dbw->selectField(
+                               'log_search',
+                               'ls_value',
+                               array( 'ls_field' => 'associated_rev_id', 'ls_log_id' => $log_id ),
+                               __METHOD__
+                       );
+               } elseif ( !$log_id && $rev_id ) {
+                       $log_id = $dbw->selectField(
+                               'log_search',
+                               'ls_log_id',
+                               array( 'ls_field' => 'associated_rev_id', 'ls_value' => $rev_id ),
+                               __METHOD__
+                       );
+               }
+
                // update the tag_summary row
                $prevTags = array();
                if ( !self::updateTagSummaryRow( $tagsToAdd, $tagsToRemove, $rc_id, $rev_id,
@@ -358,8 +374,12 @@ class ChangeTags {
        public static function canAddTagsAccompanyingChange( array $tags,
                User $user = null ) {
 
-               if ( !is_null( $user ) && !$user->isAllowed( 'applychangetags' ) ) {
-                       return Status::newFatal( 'tags-apply-no-permission' );
+               if ( !is_null( $user ) ) {
+                       if ( !$user->isAllowed( 'applychangetags' ) ) {
+                               return Status::newFatal( 'tags-apply-no-permission' );
+                       } elseif ( $user->isBlocked() ) {
+                               return Status::newFatal( 'tags-apply-blocked' );
+                       }
                }
 
                // to be applied, a tag has to be explicitly defined
@@ -425,8 +445,12 @@ class ChangeTags {
        public static function canUpdateTags( array $tagsToAdd, array $tagsToRemove,
                User $user = null ) {
 
-               if ( !is_null( $user ) && !$user->isAllowed( 'changetags' ) ) {
-                       return Status::newFatal( 'tags-update-no-permission' );
+               if ( !is_null( $user ) ) {
+                       if ( !$user->isAllowed( 'changetags' ) ) {
+                               return Status::newFatal( 'tags-update-no-permission' );
+                       } elseif ( $user->isBlocked() ) {
+                               return Status::newFatal( 'tags-update-blocked' );
+                       }
                }
 
                if ( $tagsToAdd ) {
@@ -766,8 +790,12 @@ class ChangeTags {
         * @since 1.25
         */
        public static function canActivateTag( $tag, User $user = null ) {
-               if ( !is_null( $user ) && !$user->isAllowed( 'managechangetags' ) ) {
-                       return Status::newFatal( 'tags-manage-no-permission' );
+               if ( !is_null( $user ) ) {
+                       if ( !$user->isAllowed( 'managechangetags' ) ) {
+                               return Status::newFatal( 'tags-manage-no-permission' );
+                       } elseif ( $user->isBlocked() ) {
+                               return Status::newFatal( 'tags-manage-blocked' );
+                       }
                }
 
                // defined tags cannot be activated (a defined tag is either extension-
@@ -830,8 +858,12 @@ class ChangeTags {
         * @since 1.25
         */
        public static function canDeactivateTag( $tag, User $user = null ) {
-               if ( !is_null( $user ) && !$user->isAllowed( 'managechangetags' ) ) {
-                       return Status::newFatal( 'tags-manage-no-permission' );
+               if ( !is_null( $user ) ) {
+                       if ( !$user->isAllowed( 'managechangetags' ) ) {
+                               return Status::newFatal( 'tags-manage-no-permission' );
+                       } elseif ( $user->isBlocked() ) {
+                               return Status::newFatal( 'tags-manage-blocked' );
+                       }
                }
 
                // only explicitly-defined tags can be deactivated
@@ -885,8 +917,12 @@ class ChangeTags {
         * @since 1.25
         */
        public static function canCreateTag( $tag, User $user = null ) {
-               if ( !is_null( $user ) && !$user->isAllowed( 'managechangetags' ) ) {
-                       return Status::newFatal( 'tags-manage-no-permission' );
+               if ( !is_null( $user ) ) {
+                       if ( !$user->isAllowed( 'managechangetags' ) ) {
+                               return Status::newFatal( 'tags-manage-no-permission' );
+                       } elseif ( $user->isBlocked() ) {
+                               return Status::newFatal( 'tags-manage-blocked' );
+                       }
                }
 
                // no empty tags
@@ -1014,8 +1050,12 @@ class ChangeTags {
        public static function canDeleteTag( $tag, User $user = null ) {
                $tagUsage = self::tagUsageStatistics();
 
-               if ( !is_null( $user ) && !$user->isAllowed( 'managechangetags' ) ) {
-                       return Status::newFatal( 'tags-manage-no-permission' );
+               if ( !is_null( $user ) ) {
+                       if ( !$user->isAllowed( 'managechangetags' ) ) {
+                               return Status::newFatal( 'tags-manage-no-permission' );
+                       } elseif ( $user->isBlocked() ) {
+                               return Status::newFatal( 'tags-manage-blocked' );
+                       }
                }
 
                if ( !isset( $tagUsage[$tag] ) && !in_array( $tag, self::listDefinedTags() ) ) {
@@ -1090,6 +1130,7 @@ class ChangeTags {
        public static function listExtensionActivatedTags() {
                return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'active-tags' ),
+                       300,
                        function ( $oldValue, &$ttl, array &$setOpts ) {
                                $setOpts += Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
 
@@ -1098,9 +1139,11 @@ class ChangeTags {
                                Hooks::run( 'ChangeTagsListActive', array( &$extensionActive ) );
                                return $extensionActive;
                        },
-                       300,
-                       array( wfMemcKey( 'active-tags' ) ),
-                       array( 'lockTSE' => INF )
+                       array(
+                               'checkKeys' => array( wfMemcKey( 'active-tags' ) ),
+                               'lockTSE' => 300,
+                               'pcTTL' => 30
+                       )
                );
        }
 
@@ -1132,6 +1175,7 @@ class ChangeTags {
 
                return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'valid-tags-db' ),
+                       300,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                $dbr = wfGetDB( DB_SLAVE );
 
@@ -1141,9 +1185,11 @@ class ChangeTags {
 
                                return array_filter( array_unique( $tags ) );
                        },
-                       300,
-                       array( wfMemcKey( 'valid-tags-db' ) ),
-                       array( 'lockTSE' => INF )
+                       array(
+                               'checkKeys' => array( wfMemcKey( 'valid-tags-db' ) ),
+                               'lockTSE' => 300,
+                               'pcTTL' => 30
+                       )
                );
        }
 
@@ -1159,6 +1205,7 @@ class ChangeTags {
        public static function listExtensionDefinedTags() {
                return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'valid-tags-hook' ),
+                       300,
                        function ( $oldValue, &$ttl, array &$setOpts ) {
                                $setOpts += Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
 
@@ -1166,9 +1213,11 @@ class ChangeTags {
                                Hooks::run( 'ListDefinedTags', array( &$tags ) );
                                return array_filter( array_unique( $tags ) );
                        },
-                       300,
-                       array( wfMemcKey( 'valid-tags-hook' ) ),
-                       array( 'lockTSE' => INF )
+                       array(
+                               'checkKeys' => array( wfMemcKey( 'valid-tags-hook' ) ),
+                               'lockTSE' => 300,
+                               'pcTTL' => 30
+                       )
                );
        }
 
@@ -1208,16 +1257,10 @@ class ChangeTags {
         * @return array Array of string => int
         */
        public static function tagUsageStatistics() {
-               static $cachedStats = null;
-
-               // Process cache to avoid I/O and repeated regens during holdoff
-               if ( $cachedStats !== null ) {
-                       return $cachedStats;
-               }
-
                $fname = __METHOD__;
-               $cachedStats = ObjectCache::getMainWANInstance()->getWithSetCallback(
+               return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'change-tag-statistics' ),
+                       300,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                $dbr = wfGetDB( DB_SLAVE, 'vslow' );
 
@@ -1238,12 +1281,12 @@ class ChangeTags {
 
                                return $out;
                        },
-                       300,
-                       array( wfMemcKey( 'change-tag-statistics' ) ),
-                       array( 'lockTSE' => INF )
+                       array(
+                               'checkKeys' => array( wfMemcKey( 'change-tag-statistics' ) ),
+                               'lockTSE' => 300,
+                               'pcTTL' => 30
+                       )
                );
-
-               return $cachedStats;
        }
 
        /**