Merge "Re-apply: Factors out permissions check from User into PermissionManager service"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 28 Jun 2019 23:44:38 +0000 (23:44 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 28 Jun 2019 23:44:38 +0000 (23:44 +0000)
1  2 
includes/Revision/RevisionRecord.php
includes/ServiceWiring.php

@@@ -94,16 -94,17 +94,16 @@@ abstract class RevisionRecord 
         *
         * @param Title $title The title of the page this Revision is associated with.
         * @param RevisionSlots $slots The slots of this revision.
 -       * @param bool|string $wikiId the wiki ID of the site this Revision belongs to,
 -       *        or false for the local site.
 +       * @param bool|string $dbDomain DB domain of the relevant wiki or false for the current one.
         *
         * @throws MWException
         */
 -      function __construct( Title $title, RevisionSlots $slots, $wikiId = false ) {
 -              Assert::parameterType( 'string|boolean', $wikiId, '$wikiId' );
 +      function __construct( Title $title, RevisionSlots $slots, $dbDomain = false ) {
 +              Assert::parameterType( 'string|boolean', $dbDomain, '$dbDomain' );
  
                $this->mTitle = $title;
                $this->mSlots = $slots;
 -              $this->mWiki = $wikiId;
 +              $this->mWiki = $dbDomain;
  
                // XXX: this is a sensible default, but we may not have a Title object here in the future.
                $this->mPageId = $title->getArticleID();
                        } else {
                                $permissions = [ 'deletedhistory' ];
                        }
+                       // XXX: How can we avoid global scope here?
+                       //      Perhaps the audience check should be done in a callback.
+                       $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                        $permissionlist = implode( ', ', $permissions );
                        if ( $title === null ) {
                                wfDebug( "Checking for $permissionlist due to $field match on $bitfield\n" );
-                               return $user->isAllowedAny( ...$permissions );
+                               foreach ( $permissions as $perm ) {
+                                       if ( $permissionManager->userHasRight( $user, $perm ) ) {
+                                               return true;
+                                       }
+                               }
+                               return false;
                        } else {
                                $text = $title->getPrefixedText();
                                wfDebug( "Checking for $permissionlist on $text due to $field match on $bitfield\n" );
@@@ -82,7 -82,6 +82,7 @@@ return 
        'BlobStoreFactory' => function ( MediaWikiServices $services ) : BlobStoreFactory {
                return new BlobStoreFactory(
                        $services->getDBLoadBalancerFactory(),
 +                      $services->getExternalStoreAccess(),
                        $services->getMainWANObjectCache(),
                        new ServiceOptions( BlobStoreFactory::$constructorOptions,
                                $services->getMainConfig() ),
                return new EventRelayerGroup( $services->getMainConfig()->get( 'EventRelayerConfig' ) );
        },
  
 +      'ExternalStoreAccess' => function ( MediaWikiServices $services ) : ExternalStoreAccess {
 +              return new ExternalStoreAccess(
 +                      $services->getExternalStoreFactory(),
 +                      LoggerFactory::getInstance( 'ExternalStore' )
 +              );
 +      },
 +
        'ExternalStoreFactory' => function ( MediaWikiServices $services ) : ExternalStoreFactory {
                $config = $services->getMainConfig();
 +              $writeStores = $config->get( 'DefaultExternalStore' );
  
                return new ExternalStoreFactory(
 -                      $config->get( 'ExternalStores' )
 +                      $config->get( 'ExternalStores' ),
 +                      ( $writeStores !== false ) ? (array)$writeStores : [],
 +                      $services->getDBLoadBalancer()->getLocalDomainID(),
 +                      LoggerFactory::getInstance( 'ExternalStore' )
                );
        },
  
                        $config->get( 'WhitelistReadRegexp' ),
                        $config->get( 'EmailConfirmToEdit' ),
                        $config->get( 'BlockDisablesLogin' ),
+                       $config->get( 'GroupPermissions' ),
+                       $config->get( 'RevokePermissions' ),
+                       $config->get( 'AvailableRights' ),
                        $services->getNamespaceInfo()
                );
        },