define( 'NS_UNITTEST', 5600 );
define( 'NS_UNITTEST_TALK', 5601 );
+use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\Block\CompositeBlock;
use MediaWiki\Block\Restriction\PageRestriction;
use MediaWiki\Block\Restriction\NamespaceRestriction;
use MediaWiki\Block\SystemBlock;
];
}
+ private function setSessionUser( User $user, WebRequest $request ) {
+ $this->setMwGlobals( 'wgUser', $user );
+ RequestContext::getMain()->setUser( $user );
+ RequestContext::getMain()->setRequest( $request );
+ TestingAccessWrapper::newFromObject( $user )->mRequest = $request;
+ $request->getSession()->setUser( $user );
+ $this->overrideMwServices();
+ }
+
/**
* @covers User::getGroupPermissions
*/
$request1 = new FauxRequest();
$request1->getSession()->setUser( $user1tmp );
$expiryFiveHours = wfTimestamp() + ( 5 * 60 * 60 );
- $block = new Block( [
+ $block = new DatabaseBlock( [
'enableAutoblock' => true,
'expiry' => wfTimestamp( TS_MW, $expiryFiveHours ),
] );
// Confirm that the block has been applied as required.
$this->assertTrue( $user1->isLoggedIn() );
- $this->assertInstanceOf( Block::class, $user1->getBlock() );
- $this->assertEquals( Block::TYPE_USER, $block->getType() );
+ $this->assertInstanceOf( DatabaseBlock::class, $user1->getBlock() );
+ $this->assertEquals( DatabaseBlock::TYPE_USER, $block->getType() );
$this->assertTrue( $block->isAutoblocking() );
$this->assertGreaterThanOrEqual( 1, $block->getId() );
$cookies = $request1->response()->getCookies();
$this->assertArrayHasKey( 'wmsitetitleBlockID', $cookies );
$this->assertEquals( $expiryFiveHours, $cookies['wmsitetitleBlockID']['expire'] );
- $cookieValue = Block::getIdFromCookieValue( $cookies['wmsitetitleBlockID']['value'] );
- $this->assertEquals( $block->getId(), $cookieValue );
+ $cookieId = MediaWikiServices::getInstance()->getBlockManager()->getIdFromCookieValue(
+ $cookies['wmsitetitleBlockID']['value']
+ );
+ $this->assertEquals( $block->getId(), $cookieId );
// 2. Create a new request, set the cookies, and see if the (anon) user is blocked.
$request2 = new FauxRequest();
$this->assertNotEquals( $user1->getToken(), $user2->getToken() );
$this->assertTrue( $user2->isAnon() );
$this->assertFalse( $user2->isLoggedIn() );
- $this->assertInstanceOf( Block::class, $user2->getBlock() );
+ $this->assertInstanceOf( DatabaseBlock::class, $user2->getBlock() );
// Non-strict type-check.
$this->assertEquals( true, $user2->getBlock()->isAutoblocking(), 'Autoblock does not work' );
// Can't directly compare the objects because of member type differences.
$user3 = User::newFromSession( $request3 );
$user3->load();
$this->assertTrue( $user3->isLoggedIn() );
- $this->assertInstanceOf( Block::class, $user3->getBlock() );
+ $this->assertInstanceOf( DatabaseBlock::class, $user3->getBlock() );
$this->assertEquals( true, $user3->getBlock()->isAutoblocking() ); // Non-strict type-check.
// Clean up.
$testUser = $this->getTestUser()->getUser();
$request1 = new FauxRequest();
$request1->getSession()->setUser( $testUser );
- $block = new Block( [ 'enableAutoblock' => true ] );
+ $block = new DatabaseBlock( [ 'enableAutoblock' => true ] );
$block->setBlocker( $this->getTestSysop()->getUser() );
$block->setTarget( $testUser );
$res = $block->insert();
// 2. Test that the cookie IS NOT present.
$this->assertTrue( $user->isLoggedIn() );
- $this->assertInstanceOf( Block::class, $user->getBlock() );
- $this->assertEquals( Block::TYPE_USER, $block->getType() );
+ $this->assertInstanceOf( DatabaseBlock::class, $user->getBlock() );
+ $this->assertEquals( DatabaseBlock::TYPE_USER, $block->getType() );
$this->assertTrue( $block->isAutoblocking() );
$this->assertGreaterThanOrEqual( 1, $user->getBlockId() );
$this->assertGreaterThanOrEqual( $block->getId(), $user->getBlockId() );
$user1Tmp = $this->getTestUser()->getUser();
$request1 = new FauxRequest();
$request1->getSession()->setUser( $user1Tmp );
- $block = new Block( [ 'enableAutoblock' => true, 'expiry' => 'infinity' ] );
+ $block = new DatabaseBlock( [ 'enableAutoblock' => true, 'expiry' => 'infinity' ] );
$block->setBlocker( $this->getTestSysop()->getUser() );
$block->setTarget( $user1Tmp );
$res = $block->insert();
// 2. Test the cookie's expiry timestamp.
$this->assertTrue( $user1->isLoggedIn() );
- $this->assertInstanceOf( Block::class, $user1->getBlock() );
- $this->assertEquals( Block::TYPE_USER, $block->getType() );
+ $this->assertInstanceOf( DatabaseBlock::class, $user1->getBlock() );
+ $this->assertEquals( DatabaseBlock::TYPE_USER, $block->getType() );
$this->assertTrue( $block->isAutoblocking() );
$this->assertGreaterThanOrEqual( 1, $user1->getBlockId() );
$cookies = $request1->response()->getCookies();
* @covers User::getBlockedStatus
*/
public function testSoftBlockRanges() {
- $setSessionUser = function ( User $user, WebRequest $request ) {
- $this->setMwGlobals( 'wgUser', $user );
- RequestContext::getMain()->setUser( $user );
- RequestContext::getMain()->setRequest( $request );
- TestingAccessWrapper::newFromObject( $user )->mRequest = $request;
- $request->getSession()->setUser( $user );
- $this->overrideMwServices();
- };
$this->setMwGlobals( 'wgSoftBlockRanges', [ '10.0.0.0/8' ] );
// IP isn't in $wgSoftBlockRanges
$wgUser = new User();
$request = new FauxRequest();
$request->setIP( '192.168.0.1' );
- $setSessionUser( $wgUser, $request );
+ $this->setSessionUser( $wgUser, $request );
$this->assertNull( $wgUser->getBlock() );
// IP is in $wgSoftBlockRanges
$wgUser = new User();
$request = new FauxRequest();
$request->setIP( '10.20.30.40' );
- $setSessionUser( $wgUser, $request );
+ $this->setSessionUser( $wgUser, $request );
$block = $wgUser->getBlock();
$this->assertInstanceOf( SystemBlock::class, $block );
$this->assertSame( 'wgSoftBlockRanges', $block->getSystemBlockType() );
$wgUser = $this->getTestUser()->getUser();
$request = new FauxRequest();
$request->setIP( '10.20.30.40' );
- $setSessionUser( $wgUser, $request );
+ $this->setSessionUser( $wgUser, $request );
$this->assertFalse( $wgUser->isAnon(), 'sanity check' );
$this->assertNull( $wgUser->getBlock() );
}
$user1tmp = $this->getTestUser()->getUser();
$request1 = new FauxRequest();
$request1->getSession()->setUser( $user1tmp );
- $block = new Block( [ 'enableAutoblock' => true ] );
+ $block = new DatabaseBlock( [ 'enableAutoblock' => true ] );
$block->setBlocker( $this->getTestSysop()->getUser() );
$block->setTarget( $user1tmp );
$res = $block->insert();
$user1tmp = $this->getTestUser()->getUser();
$request1 = new FauxRequest();
$request1->getSession()->setUser( $user1tmp );
- $block = new Block( [ 'enableAutoblock' => true ] );
+ $block = new DatabaseBlock( [ 'enableAutoblock' => true ] );
$block->setBlocker( $this->getTestSysop()->getUser() );
$block->setTarget( $user1tmp );
$res = $block->insert();
$user1 = User::newFromSession( $request1 );
$user1->mBlock = $block;
$user1->load();
- $this->assertInstanceOf( Block::class, $user1->getBlock() );
+ $this->assertInstanceOf( DatabaseBlock::class, $user1->getBlock() );
// 2. Create a new request, set the cookie to just the block ID, and the user should
// still get blocked when they log in again.
$this->assertNotEquals( $user1->getToken(), $user2->getToken() );
$this->assertTrue( $user2->isAnon() );
$this->assertFalse( $user2->isLoggedIn() );
- $this->assertInstanceOf( Block::class, $user2->getBlock() );
+ $this->assertInstanceOf( DatabaseBlock::class, $user2->getBlock() );
$this->assertEquals( true, $user2->getBlock()->isAutoblocking() ); // Non-strict type-check.
// Clean up.
// Block the user
$blocker = $this->getTestSysop()->getUser();
- $block = new Block( [
+ $block = new DatabaseBlock( [
'hideName' => true,
'allowUsertalk' => false,
'reason' => 'Because',
// Clear cache and confirm it loaded the block properly
$user->clearInstanceCache();
- $this->assertInstanceOf( Block::class, $user->getBlock( false ) );
+ $this->assertInstanceOf( DatabaseBlock::class, $user->getBlock( false ) );
$this->assertSame( $blocker->getName(), $user->blockedBy() );
$this->assertSame( 'Because', $user->blockedFor() );
$this->assertTrue( (bool)$user->isHidden() );
$this->assertFalse( $user->isBlockedFrom( $ut ) );
}
+ /**
+ * @covers User::getBlockedStatus
+ */
+ public function testCompositeBlocks() {
+ $user = $this->getMutableTestUser()->getUser();
+ $request = $user->getRequest();
+ $this->setSessionUser( $user, $request );
+
+ $ipBlock = new Block( [
+ 'address' => $user->getRequest()->getIP(),
+ 'by' => $this->getTestSysop()->getUser()->getId(),
+ 'createAccount' => true,
+ ] );
+ $ipBlock->insert();
+
+ $userBlock = new Block( [
+ 'address' => $user,
+ 'by' => $this->getTestSysop()->getUser()->getId(),
+ 'createAccount' => false,
+ ] );
+ $userBlock->insert();
+
+ $block = $user->getBlock();
+ $this->assertInstanceOf( CompositeBlock::class, $block );
+ $this->assertTrue( $block->isCreateAccountBlocked() );
+ $this->assertTrue( $block->appliesToPasswordReset() );
+ $this->assertTrue( $block->appliesToNamespace( NS_MAIN ) );
+ }
+
/**
* @covers User::isBlockedFrom
* @dataProvider provideIsBlockedFrom
* @param bool $expect Expected result from User::isBlockedFrom()
* @param array $options Additional test options:
* - 'blockAllowsUTEdit': (bool, default true) Value for $wgBlockAllowsUTEdit
- * - 'allowUsertalk': (bool, default false) Passed to Block::__construct()
+ * - 'allowUsertalk': (bool, default false) Passed to DatabaseBlock::__construct()
* - 'pageRestrictions': (array|null) If non-empty, page restriction titles for the block.
*/
public function testIsBlockedFrom( $title, $expect, array $options = [] ) {
$restrictions[] = new NamespaceRestriction( 0, $ns );
}
- $block = new Block( [
+ $block = new DatabaseBlock( [
'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 40 * 60 * 60 ) ),
'allowUsertalk' => $options['allowUsertalk'] ?? false,
'sitewide' => !$restrictions,
] );
// setup block
- $block = new Block( [
+ $block = new DatabaseBlock( [
'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 5 * 60 * 60 ) ),
] );
$block->setTarget( '1.2.3.4' );
// get user
$user = User::newFromSession( $request );
- $user->trackBlockWithCookie();
+ MediaWikiServices::getInstance()->getBlockManager()->trackBlockWithCookie( $user );
// test cookie was set
$cookies = $request->response()->getCookies();
] );
// setup block
- $block = new Block( [
+ $block = new DatabaseBlock( [
'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 5 * 60 * 60 ) ),
] );
$block->setTarget( '1.2.3.4' );
// get user
$user = User::newFromSession( $request );
- $user->trackBlockWithCookie();
+ MediaWikiServices::getInstance()->getBlockManager()->trackBlockWithCookie( $user );
// test cookie was not set
$cookies = $request->response()->getCookies();
] );
// setup block
- $block = new Block( [
+ $block = new DatabaseBlock( [
'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 40 * 60 * 60 ) ),
] );
$block->setTarget( '1.2.3.4' );