Break PreferencesFormOOUI->PermissionManager dependency
authorPetr Pchelko <ppchelko@wikimedia.org>
Fri, 13 Sep 2019 15:26:11 +0000 (08:26 -0700)
committerPetr Pchelko <ppchelko@wikimedia.org>
Tue, 17 Sep 2019 15:34:53 +0000 (08:34 -0700)
Depends-On: Id0f0bdb39b9e0be4d7c38c229371be04bb5aec5c
Change-Id: I9209cf26a27ab66306f61937b620bfe05c2045b0

includes/preferences/DefaultPreferencesFactory.php
includes/specials/forms/PreferencesFormOOUI.php
tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php

index 56db812..a7c7a49 100644 (file)
@@ -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 );
                        }
                );
index 445f0c3..36e14f0 100644 (file)
@@ -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( [
index a459441..c7a3fe6 100644 (file)
@@ -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() );
        }