From 57cffc9e57535f199db550447f3248a84b6b9aaf Mon Sep 17 00:00:00 2001 From: Petr Pchelko Date: Fri, 13 Sep 2019 08:26:11 -0700 Subject: [PATCH] Break PreferencesFormOOUI->PermissionManager dependency Depends-On: Id0f0bdb39b9e0be4d7c38c229371be04bb5aec5c Change-Id: I9209cf26a27ab66306f61937b620bfe05c2045b0 --- .../preferences/DefaultPreferencesFactory.php | 8 +++- .../specials/forms/PreferencesFormOOUI.php | 47 +++++++++++++++---- .../DefaultPreferencesFactoryTest.php | 12 ++--- 3 files changed, 50 insertions(+), 17 deletions(-) diff --git a/includes/preferences/DefaultPreferencesFactory.php b/includes/preferences/DefaultPreferencesFactory.php index 56db81222e..a7c7a492be 100644 --- a/includes/preferences/DefaultPreferencesFactory.php +++ b/includes/preferences/DefaultPreferencesFactory.php @@ -1525,7 +1525,7 @@ class DefaultPreferencesFactory implements PreferencesFactory { } /** - * @var HTMLForm $htmlForm + * @var PreferencesFormOOUI $htmlForm */ $htmlForm = new $formClass( $formDescriptor, $context, 'prefs' ); @@ -1538,6 +1538,10 @@ class DefaultPreferencesFactory implements PreferencesFactory { ] ) ); $htmlForm->setModifiedUser( $user ); + $htmlForm->setOptionsEditable( $this->permissionManager + ->userHasRight( $user, 'editmyoptions' ) ); + $htmlForm->setPrivateInfoEditable( $this->permissionManager + ->userHasRight( $user, 'editmyprivateinfo' ) ); $htmlForm->setId( 'mw-prefs-form' ); $htmlForm->setAutocomplete( 'off' ); $htmlForm->setSubmitText( $context->msg( 'saveprefs' )->text() ); @@ -1545,7 +1549,7 @@ class DefaultPreferencesFactory implements PreferencesFactory { $htmlForm->setSubmitTooltip( 'preferences-save' ); $htmlForm->setSubmitID( 'prefcontrol' ); $htmlForm->setSubmitCallback( - function ( array $formData, HTMLForm $form ) use ( $formDescriptor ) { + function ( array $formData, PreferencesFormOOUI $form ) use ( $formDescriptor ) { return $this->submitForm( $formData, $form, $formDescriptor ); } ); diff --git a/includes/specials/forms/PreferencesFormOOUI.php b/includes/specials/forms/PreferencesFormOOUI.php index 445f0c36eb..36e14f0dfd 100644 --- a/includes/specials/forms/PreferencesFormOOUI.php +++ b/includes/specials/forms/PreferencesFormOOUI.php @@ -18,8 +18,6 @@ * @file */ -use MediaWiki\MediaWikiServices; - /** * Form to edit user preferences. * @@ -29,8 +27,15 @@ class PreferencesFormOOUI extends OOUIHTMLForm { // Override default value from HTMLForm protected $mSubSectionBeforeFields = false; + /** @var User|null */ private $modifiedUser; + /** @var bool */ + private $privateInfoEditable = true; + + /** @var bool */ + private $optionsEditable = true; + /** * @param User $user */ @@ -49,6 +54,35 @@ class PreferencesFormOOUI extends OOUIHTMLForm { } } + /** + * @return bool + */ + public function isPrivateInfoEditable() { + return $this->privateInfoEditable; + } + + /** + * Whether the + * @param bool $editable + */ + public function setPrivateInfoEditable( $editable ) { + $this->privateInfoEditable = $editable; + } + + /** + * @return bool + */ + public function areOptionsEditable() { + return $this->optionsEditable; + } + + /** + * @param bool $optionsEditable + */ + public function setOptionsEditable( $optionsEditable ) { + $this->optionsEditable = $optionsEditable; + } + /** * Get extra parameters for the query string when redirecting after * successful save. @@ -73,18 +107,13 @@ class PreferencesFormOOUI extends OOUIHTMLForm { * @return string */ function getButtons() { - $permissionManager = MediaWikiServices::getInstance()->getPermissionManager(); - if ( !$permissionManager->userHasAnyRight( - $this->getModifiedUser(), - 'editmyprivateinfo', - 'editmyoptions' - ) ) { + if ( !$this->areOptionsEditable() && !$this->isPrivateInfoEditable() ) { return ''; } $html = parent::getButtons(); - if ( $permissionManager->userHasRight( $this->getModifiedUser(), 'editmyoptions' ) ) { + if ( $this->areOptionsEditable() ) { $t = $this->getTitle()->getSubpage( 'reset' ); $html .= new OOUI\ButtonWidget( [ diff --git a/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php b/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php index a45944167a..c7a3fe6045 100644 --- a/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php +++ b/tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php @@ -50,10 +50,10 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase { /** * Get a basic PreferencesFactory for testing with. - * @param PermissionManager|null $manager + * @param PermissionManager $mockPM * @return DefaultPreferencesFactory */ - protected function getPreferencesFactory( PermissionManager $manager = null ) { + protected function getPreferencesFactory( PermissionManager $mockPM ) { $mockNsInfo = $this->createMock( NamespaceInfo::class ); $mockNsInfo->method( 'getValidNamespaces' )->willReturn( [ NS_MAIN, NS_TALK, NS_USER, NS_USER_TALK @@ -61,8 +61,6 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase { $mockNsInfo->expects( $this->never() ) ->method( $this->anythingBut( 'getValidNamespaces', '__destruct' ) ); - $mockPermissionManager = $manager ?? $this->createMock( PermissionManager::class ); - return new DefaultPreferencesFactory( new LoggedServiceOptions( self::$serviceOptionsAccessLog, DefaultPreferencesFactory::$constructorOptions, $this->config ), @@ -70,7 +68,7 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase { AuthManager::singleton(), MediaWikiServices::getInstance()->getLinkRenderer(), $mockNsInfo, - $mockPermissionManager + $mockPM ); } @@ -81,7 +79,9 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase { $this->setTemporaryHook( 'GetPreferences', null ); $testUser = $this->getTestUser(); - $form = $this->getPreferencesFactory()->getForm( $testUser->getUser(), $this->context ); + $pm = $this->createMock( PermissionManager::class ); + $pm->method( 'userHasRight' )->willReturn( true ); + $form = $this->getPreferencesFactory( $pm )->getForm( $testUser->getUser(), $this->context ); $this->assertInstanceOf( PreferencesFormOOUI::class, $form ); $this->assertCount( 5, $form->getPreferenceSections() ); } -- 2.20.1