Deprecate Sanitizer::setupAttributeWhitelist/attributeWhitelist
[lhc/web/wiklou.git] / tests / phpunit / includes / user / UserTest.php
index 48c8a95..79c6e96 100644 (file)
@@ -3,8 +3,11 @@
 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;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\User\UserIdentityValue;
 use Wikimedia\TestingAccessWrapper;
@@ -64,6 +67,15 @@ class UserTest extends MediaWikiTestCase {
                ];
        }
 
+       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
         */
@@ -365,7 +377,6 @@ class UserTest extends MediaWikiTestCase {
         *      - ensure the password is not the same as the username
         *      - ensure the username/password combo isn't forbidden
         * @covers User::checkPasswordValidity()
-        * @covers User::getPasswordValidity()
         * @covers User::isValidPassword()
         */
        public function testCheckPasswordValidity() {
@@ -393,7 +404,6 @@ class UserTest extends MediaWikiTestCase {
                                ],
                        ],
                ] );
-               $this->hideDeprecated( 'User::getPasswordValidity' );
 
                $user = static::getTestUser()->getUser();
 
@@ -404,24 +414,20 @@ class UserTest extends MediaWikiTestCase {
                $this->assertFalse( $user->isValidPassword( 'a' ) );
                $this->assertFalse( $user->checkPasswordValidity( 'a' )->isGood() );
                $this->assertTrue( $user->checkPasswordValidity( 'a' )->isOK() );
-               $this->assertEquals( 'passwordtooshort', $user->getPasswordValidity( 'a' ) );
 
                // Maximum length
                $longPass = str_repeat( 'a', 41 );
                $this->assertFalse( $user->isValidPassword( $longPass ) );
                $this->assertFalse( $user->checkPasswordValidity( $longPass )->isGood() );
                $this->assertFalse( $user->checkPasswordValidity( $longPass )->isOK() );
-               $this->assertEquals( 'passwordtoolong', $user->getPasswordValidity( $longPass ) );
 
                // Matches username
                $this->assertFalse( $user->checkPasswordValidity( $user->getName() )->isGood() );
                $this->assertTrue( $user->checkPasswordValidity( $user->getName() )->isOK() );
-               $this->assertEquals( 'password-name-match', $user->getPasswordValidity( $user->getName() ) );
 
                // On the forbidden list
                $user = User::newFromName( 'Useruser' );
                $this->assertFalse( $user->checkPasswordValidity( 'Passpass' )->isGood() );
-               $this->assertEquals( 'password-login-forbidden', $user->getPasswordValidity( 'Passpass' ) );
        }
 
        /**
@@ -607,7 +613,7 @@ class UserTest extends MediaWikiTestCase {
                $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 ),
                ] );
@@ -621,8 +627,8 @@ class UserTest extends MediaWikiTestCase {
 
                // 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() );
 
@@ -630,8 +636,10 @@ class UserTest extends MediaWikiTestCase {
                $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();
@@ -642,7 +650,7 @@ class UserTest extends MediaWikiTestCase {
                $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.
@@ -658,7 +666,7 @@ class UserTest extends MediaWikiTestCase {
                $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.
@@ -687,7 +695,7 @@ class UserTest extends MediaWikiTestCase {
                $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();
@@ -698,8 +706,8 @@ class UserTest extends MediaWikiTestCase {
 
                // 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() );
@@ -732,7 +740,7 @@ class UserTest extends MediaWikiTestCase {
                $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();
@@ -743,8 +751,8 @@ class UserTest extends MediaWikiTestCase {
 
                // 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();
@@ -781,37 +789,29 @@ class UserTest extends MediaWikiTestCase {
         * @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( Block::class, $block );
+               $this->assertInstanceOf( SystemBlock::class, $block );
                $this->assertSame( 'wgSoftBlockRanges', $block->getSystemBlockType() );
 
                // Make sure the block is really soft
                $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() );
        }
@@ -837,7 +837,7 @@ class UserTest extends MediaWikiTestCase {
                $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();
@@ -882,7 +882,7 @@ class UserTest extends MediaWikiTestCase {
                $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();
@@ -890,7 +890,7 @@ class UserTest extends MediaWikiTestCase {
                $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.
@@ -902,7 +902,7 @@ class UserTest extends MediaWikiTestCase {
                $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.
@@ -1288,7 +1288,7 @@ class UserTest extends MediaWikiTestCase {
 
                // Block the user
                $blocker = $this->getTestSysop()->getUser();
-               $block = new Block( [
+               $block = new DatabaseBlock( [
                        'hideName' => true,
                        'allowUsertalk' => false,
                        'reason' => 'Because',
@@ -1300,7 +1300,7 @@ class UserTest extends MediaWikiTestCase {
 
                // 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() );
@@ -1318,6 +1318,35 @@ class UserTest extends MediaWikiTestCase {
                $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
@@ -1325,7 +1354,7 @@ class UserTest extends MediaWikiTestCase {
         * @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 = [] ) {
@@ -1352,7 +1381,7 @@ class UserTest extends MediaWikiTestCase {
                        $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,
@@ -1461,7 +1490,7 @@ class UserTest extends MediaWikiTestCase {
                ] );
 
                // setup block
-               $block = new Block( [
+               $block = new DatabaseBlock( [
                        'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 5 * 60 * 60 ) ),
                ] );
                $block->setTarget( '1.2.3.4' );
@@ -1474,7 +1503,7 @@ class UserTest extends MediaWikiTestCase {
 
                // get user
                $user = User::newFromSession( $request );
-               $user->trackBlockWithCookie();
+               MediaWikiServices::getInstance()->getBlockManager()->trackBlockWithCookie( $user );
 
                // test cookie was set
                $cookies = $request->response()->getCookies();
@@ -1497,7 +1526,7 @@ class UserTest extends MediaWikiTestCase {
                ] );
 
                // setup block
-               $block = new Block( [
+               $block = new DatabaseBlock( [
                        'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 5 * 60 * 60 ) ),
                ] );
                $block->setTarget( '1.2.3.4' );
@@ -1510,7 +1539,7 @@ class UserTest extends MediaWikiTestCase {
 
                // get user
                $user = User::newFromSession( $request );
-               $user->trackBlockWithCookie();
+               MediaWikiServices::getInstance()->getBlockManager()->trackBlockWithCookie( $user );
 
                // test cookie was not set
                $cookies = $request->response()->getCookies();
@@ -1534,7 +1563,7 @@ class UserTest extends MediaWikiTestCase {
                ] );
 
                // setup block
-               $block = new Block( [
+               $block = new DatabaseBlock( [
                        'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 40 * 60 * 60 ) ),
                ] );
                $block->setTarget( '1.2.3.4' );