From 7ba9cbcac7f0d8650c3ed32b27b0aea025e53fe4 Mon Sep 17 00:00:00 2001 From: Petr Pchelko Date: Wed, 5 May 2021 14:34:14 -0700 Subject: [PATCH] DatabaseBlockStore: fetch correct ActorNormalization DatabaseBlockStore is capable of inserting cross-wiki DatabaseBlock, which works via passing non-local IDatabase. Ideally, we'd want to make Block a WikiAwareEntity, have cross-wiki DatabaseBlockStore, etc. But as a quick-fix for a regression we can just fetch correct ActorNormalization Bug: T281972 Change-Id: I796f54b7b7303b8c442d5b9ba1926b76d3805fb5 --- includes/ServiceWiring.php | 2 +- includes/block/DatabaseBlockStore.php | 23 +++++++++++-------- .../includes/block/DatabaseBlockStoreTest.php | 2 +- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index 8884949067c..ad03886c32e 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -372,7 +372,7 @@ return [ $services->getMainConfig() ), LoggerFactory::getInstance( 'DatabaseBlockStore' ), - $services->getActorNormalization(), + $services->getActorStoreFactory(), $services->getBlockRestrictionStore(), $services->getCommentStore(), $services->getHookContainer(), diff --git a/includes/block/DatabaseBlockStore.php b/includes/block/DatabaseBlockStore.php index 54657a26568..191579ca17c 100644 --- a/includes/block/DatabaseBlockStore.php +++ b/includes/block/DatabaseBlockStore.php @@ -28,7 +28,7 @@ use DeferredUpdates; use MediaWiki\Config\ServiceOptions; use MediaWiki\HookContainer\HookContainer; use MediaWiki\HookContainer\HookRunner; -use MediaWiki\User\ActorNormalization; +use MediaWiki\User\ActorStoreFactory; use MediaWiki\User\UserIdentity; use MWException; use Psr\Log\LoggerInterface; @@ -58,8 +58,8 @@ class DatabaseBlockStore { /** @var LoggerInterface */ private $logger; - /** @var ActorNormalization */ - private $actorNormalization; + /** @var ActorStoreFactory */ + private $actorStoreFactory; /** @var BlockRestrictionStore */ private $blockRestrictionStore; @@ -79,7 +79,7 @@ class DatabaseBlockStore { /** * @param ServiceOptions $options * @param LoggerInterface $logger - * @param ActorNormalization $actorNormalization + * @param ActorStoreFactory $actorStoreFactory * @param BlockRestrictionStore $blockRestrictionStore * @param CommentStore $commentStore * @param HookContainer $hookContainer @@ -89,7 +89,7 @@ class DatabaseBlockStore { public function __construct( ServiceOptions $options, LoggerInterface $logger, - ActorNormalization $actorNormalization, + ActorStoreFactory $actorStoreFactory, BlockRestrictionStore $blockRestrictionStore, CommentStore $commentStore, HookContainer $hookContainer, @@ -100,7 +100,7 @@ class DatabaseBlockStore { $this->options = $options; $this->logger = $logger; - $this->actorNormalization = $actorNormalization; + $this->actorStoreFactory = $actorStoreFactory; $this->blockRestrictionStore = $blockRestrictionStore; $this->commentStore = $commentStore; $this->hookRunner = new HookRunner( $hookContainer ); @@ -354,7 +354,10 @@ class DatabaseBlockStore { if ( !$block->getBlocker() ) { throw new \RuntimeException( __METHOD__ . ': this block does not have a blocker' ); } - $blockerActor = $this->actorNormalization->acquireActorId( $block->getBlocker(), $dbw ); + // DatabaseBlockStore supports inserting cross-wiki blocks by passing non-local IDatabase and blocker. + $blockerActor = $this->actorStoreFactory + ->getActorStore( $block->getBlocker()->getWikiId() ) + ->acquireActorId( $block->getBlocker(), $dbw ); $blockArray = [ 'ipb_address' => (string)$target, @@ -395,7 +398,9 @@ class DatabaseBlockStore { throw new \RuntimeException( __METHOD__ . ': this block does not have a blocker' ); } $dbw = $this->loadBalancer->getConnectionRef( DB_PRIMARY ); - $blockerActor = $this->actorNormalization->acquireActorId( $block->getBlocker(), $dbw ); + $blockerActor = $this->actorStoreFactory + ->getActorNormalization() + ->acquireActorId( $block->getBlocker(), $dbw ); $blockArray = [ 'ipb_by_actor' => $blockerActor, 'ipb_create_account' => $block->isCreateAccountBlocked(), @@ -472,7 +477,7 @@ class DatabaseBlockStore { 'LIMIT' => 1, ]; - $actor = $this->actorNormalization->findActorId( $target, $dbr ); + $actor = $this->actorStoreFactory->getActorNormalization()->findActorId( $target, $dbr ); if ( !$actor ) { $this->logger->debug( 'No actor found to retroactively autoblock' ); return []; diff --git a/tests/phpunit/integration/includes/block/DatabaseBlockStoreTest.php b/tests/phpunit/integration/includes/block/DatabaseBlockStoreTest.php index 4dc263ea0c0..a00f4b2f6e0 100644 --- a/tests/phpunit/integration/includes/block/DatabaseBlockStoreTest.php +++ b/tests/phpunit/integration/includes/block/DatabaseBlockStoreTest.php @@ -62,7 +62,7 @@ class DatabaseBlockStoreTest extends MediaWikiIntegrationTestCase { $config ), 'logger' => new NullLogger(), - 'actorNormalization' => $services->getActorNormalization(), + 'actorStoreFactory' => $services->getActorStoreFactory(), 'blockRestrictionStore' => $services->getBlockRestrictionStore(), 'commentStore' => $services->getCommentStore(), 'hookContainer' => $hookContainer,