From 7af32bc3097b4df5868f7cd9f6f1976c5d9962a6 Mon Sep 17 00:00:00 2001 From: Jan Drewniak Date: Thu, 23 May 2019 11:55:21 +0200 Subject: [PATCH] Treat anonymouse user IP pages as UserPages Ensure SkinUserPageHelper::isUserPage() returns true for user pages that are IP addresses. Also adds the page-action menu to all user pages. Bug: T220114 Change-Id: I3703899bc9ff0042c74260d36f48a388b78b0b6b --- includes/skins/SkinMinerva.php | 5 +-- includes/skins/SkinUserPageHelper.php | 35 +++++++++++++----- .../skins/SkinMinervaPageActionsTest.php | 24 ++++++++----- .../phpunit/skins/SkinUserPageHelperTest.php | 36 +++++++++++++++++++ 4 files changed, 78 insertions(+), 22 deletions(-) diff --git a/includes/skins/SkinMinerva.php b/includes/skins/SkinMinerva.php index 15d1dfe..4ec96fd 100644 --- a/includes/skins/SkinMinerva.php +++ b/includes/skins/SkinMinerva.php @@ -234,10 +234,7 @@ class SkinMinerva extends SkinTemplate { return $this->skinOptions->get( SkinOptions::OPTION_OVERFLOW_SUBMENU ); } - if ( - !in_array( $action, $config->get( 'MinervaPageActions' ) ) - || ( $this->getUserPageHelper()->isUserPage() && !$title->exists() ) - ) { + if ( !in_array( $action, $config->get( 'MinervaPageActions' ) ) ) { return false; } diff --git a/includes/skins/SkinUserPageHelper.php b/includes/skins/SkinUserPageHelper.php index 98a709e..7da2360 100644 --- a/includes/skins/SkinUserPageHelper.php +++ b/includes/skins/SkinUserPageHelper.php @@ -46,33 +46,50 @@ class SkinUserPageHelper { } /** - * Fetch user data and store locally for perfomance improvement + * Fetch user data and store locally for performance improvement + * @return User|null */ private function fetchData() { if ( $this->fetchedData === false ) { if ( $this->title->inNamespace( NS_USER ) && !$this->title->isSubpage() ) { - $pageUserId = User::idFromName( $this->title->getText() ); - if ( $pageUserId ) { - $this->pageUser = User::newFromId( $pageUserId ); - } + $this->pageUser = $this->buildPageUserObject( $this->title ); } $this->fetchedData = true; } + return $this->pageUser; + } + + /** + * Return new User object based on username or IP address. + * @param Title $title + * @return User|null + */ + private function buildPageUserObject( Title $title ) { + $titleText = $title->getText(); + + if ( User::isIP( $titleText ) ) { + return User::newFromAnyId( null, $titleText, null ); + } + + $pageUserId = User::idFromName( $titleText ); + if ( $pageUserId ) { + return User::newFromId( $pageUserId ); + } + + return null; } /** * @return User|null */ public function getPageUser() { - $this->fetchData(); - return $this->pageUser; + return $this->fetchData(); } /** * @return bool */ public function isUserPage() { - $this->fetchData(); - return $this->pageUser !== null; + return $this->fetchData() !== null; } } diff --git a/tests/phpunit/skins/SkinMinervaPageActionsTest.php b/tests/phpunit/skins/SkinMinervaPageActionsTest.php index 2940779..3c2db8d 100644 --- a/tests/phpunit/skins/SkinMinervaPageActionsTest.php +++ b/tests/phpunit/skins/SkinMinervaPageActionsTest.php @@ -128,15 +128,11 @@ class SkinMinervaPageActionsTest extends MediaWikiTestCase { ->disableOriginalConstructor() ->getMock(); - $userPageHelper->expects( $this->once() ) - ->method( 'isUserPage' ) - ->willReturn( true ); - $skin = $this->getSkin( Title::newFromText( 'User:Admin' ) ); $this->setService( 'Minerva.SkinUserPageHelper', $userPageHelper ); - $this->assertFalse( $skin->isAllowedPageAction( 'talk' ) ); + $this->assertTrue( $skin->isAllowedPageAction( 'talk' ) ); } /** @@ -147,11 +143,21 @@ class SkinMinervaPageActionsTest extends MediaWikiTestCase { ->disableOriginalConstructor() ->getMock(); - $userPageHelper->expects( $this->once() ) - ->method( 'isUserPage' ) - ->willReturn( false ); + $skin = $this->getSkin( Title::newFromText( 'A_test_page' ) ); + $this->setService( 'Minerva.SkinUserPageHelper', $userPageHelper ); - $skin = $this->getSkin( Title::newFromText( 'User:Admin' ) ); + $this->assertTrue( $skin->isAllowedPageAction( 'talk' ) ); + } + + /** + * @covers SkinMinerva::isAllowedPageAction + */ + public function testPageActionsWhenOnAnonUserPage() { + $userPageHelper = $this->getMockBuilder( SkinUserPageHelper::class ) + ->disableOriginalConstructor() + ->getMock(); + + $skin = $this->getSkin( Title::newFromText( 'User:1.1.1.1' ) ); $this->setService( 'Minerva.SkinUserPageHelper', $userPageHelper ); $this->assertTrue( $skin->isAllowedPageAction( 'talk' ) ); diff --git a/tests/phpunit/skins/SkinUserPageHelperTest.php b/tests/phpunit/skins/SkinUserPageHelperTest.php index c8c0e42..778085c 100644 --- a/tests/phpunit/skins/SkinUserPageHelperTest.php +++ b/tests/phpunit/skins/SkinUserPageHelperTest.php @@ -35,6 +35,42 @@ class SkinUserPageHelperTest extends MediaWikiTestCase { $this->assertEquals( false, $helper->isUserPage() ); } + /** + * @covers ::isUserPage + * @covers ::fetchData + * @covers ::buildPageUserObject + */ + public function testTitleisAnIP() { + $title = Title::newFromText( 'User:127.0.0.1' ); + + $helper = new SkinUserPageHelper( $title ); + $this->assertEquals( true, $helper->isUserPage() ); + } + + /** + * @covers ::isUserPage + * @covers ::fetchData + * @covers ::buildPageUserObject + */ + public function testTitleIsIPRange() { + $title = Title::newFromText( 'User:127.0.0.1/24' ); + + $helper = new SkinUserPageHelper( $title ); + $this->assertEquals( false, $helper->isUserPage() ); + } + + /** + * @covers ::isUserPage + * @covers ::fetchData + * @covers ::buildPageUserObject + */ + public function testTitleIsFakeUserPage() { + $title = Title::newFromText( 'User:Fake user' ); + + $helper = new SkinUserPageHelper( $title ); + $this->assertEquals( false, $helper->isUserPage() ); + } + /** * @covers ::fetchData */