wiki.techinc.nl/tests/phpunit/integration/includes/user/ActorStoreTestBase.php
Thalia 6909b2016e Always allow local IP actors to be created when importing
Why:

* Following T345578, the ActorStore throws an error on
  attempting to create an actor whose name is their IP address
  if temporary accounts are enabled.
* For the specific case of importing old revisions, we need to
  be able to create new actors whose name is their IP address,
  while still generally disallowing it.

What:

* Add $allowCreateIpActors flag to ActorStore, and check for
  it during actor name validation.
* Set the flag from ActorStoreFactory::getActorStore depending
  on whether temporary users are enabled.
* Add ActorStoreFactory::getActorStoreForImport, which sets
  flag to true.
* Add RevisionStoreFactory::getRevisionStoreForImport, which
  uses getActorStoreForImport. Use this from classes handling
  imports, so that IP actors can always be created.
* Add $forImport flag on ActorMigration, since RevisionStore
  uses an actor store obtained via ActorMigration.

Bug: T354207
Change-Id: I0715bd0d23089fd8156e579913e6e823089809be
2024-01-29 19:35:14 +00:00

106 lines
3.5 KiB
PHP

<?php
namespace MediaWiki\Tests\User;
use MediaWiki\User\ActorStore;
use MediaWiki\User\UserIdentity;
use MediaWikiIntegrationTestCase;
use Psr\Log\NullLogger;
use Wikimedia\Rdbms\ILoadBalancer;
/**
* Base class with utilities for testing database access to actor table.
*
* @package MediaWiki\Tests\User
*/
abstract class ActorStoreTestBase extends MediaWikiIntegrationTestCase {
protected const IP = '2600:1004:B14A:5DDD:3EBE:BBA4:BFBA:F37E';
public function addDBData() {
$actors = [
'registered' => [ 'actor_id' => '42', 'actor_user' => '24', 'actor_name' => 'TestUser' ],
'anon' => [ 'actor_id' => '43', 'actor_user' => null, 'actor_name' => self::IP ],
'another registered' => [ 'actor_id' => '44', 'actor_user' => '25', 'actor_name' => 'TestUser1' ],
'external' => [ 'actor_id' => '45', 'actor_user' => null, 'actor_name' => 'acme>TestUser' ],
'user name 0' => [ 'actor_id' => '46', 'actor_user' => '26', 'actor_name' => '0' ],
];
foreach ( $actors as $description => $row ) {
$this->assertTrue( $this->db->insert(
'actor',
$row,
__METHOD__,
[ 'IGNORE' ]
), "Must create {$description} actor" );
}
}
/**
* @param string|false $wikiId
* @return ActorStore
*/
protected function getStore( $wikiId = UserIdentity::LOCAL ): ActorStore {
return $this->getServiceContainer()->getActorStoreFactory()->getActorStore( $wikiId );
}
/**
* @param string|false $wikiId
* @return ActorStore
*/
protected function getStoreForImport( $wikiId = UserIdentity::LOCAL ): ActorStore {
return $this->getServiceContainer()->getActorStoreFactory()->getActorStoreForImport( $wikiId );
}
/**
* Execute the $callback passing it an ActorStore for $wikiId,
* making sure no queries are made to local DB.
* @param string|false $wikiId
* @param callable $callback ( ActorStore $store, IDatababase $db )
*/
protected function executeWithForeignStore( $wikiId, callable $callback ) {
$dbLoadBalancer = $this->getServiceContainer()->getDBLoadBalancer();
$dbLoadBalancer->setDomainAliases( [ $wikiId => $dbLoadBalancer->getLocalDomainID() ] );
$foreignLB = $this->getServiceContainer()
->getDBLoadBalancerFactory()
->getMainLB( $wikiId );
$foreignLB->setDomainAliases( [ $wikiId => $dbLoadBalancer->getLocalDomainID() ] );
$foreignDB = $foreignLB->getConnectionRef( DB_PRIMARY );
$store = new ActorStore(
$dbLoadBalancer,
$this->getServiceContainer()->getUserNameUtils(),
$this->getServiceContainer()->getTempUserConfig(),
new NullLogger(),
$this->getServiceContainer()->getHideUserUtils(),
$wikiId
);
// Redefine the DBLoadBalancer service to verify we don't attempt to resolve its IDs via wfGetDB()
$localLoadBalancerMock = $this->createNoOpMock( ILoadBalancer::class );
try {
$this->setService( 'DBLoadBalancer', $localLoadBalancerMock );
$callback( $store, $foreignDB );
} finally {
// Restore the original loadBalancer.
$this->setService( 'DBLoadBalancer', $dbLoadBalancer );
}
}
/**
* Check whether two actors are the same in the context of $wikiId
* @param UserIdentity $expected
* @param UserIdentity $actor
* @param string|false $wikiId
*/
protected function assertSameActors(
UserIdentity $expected,
UserIdentity $actor,
$wikiId = UserIdentity::LOCAL
) {
$actor->assertWiki( $wikiId );
$this->assertSame( $expected->getId( $wikiId ), $actor->getId( $wikiId ) );
$this->assertSame( $expected->getName(), $actor->getName() );
$this->assertSame( $expected->getWikiId(), $actor->getWikiId() );
}
}