$services->getContentLanguage(),
AuthManager::singleton(),
$services->getLinkRendererFactory()->create(),
- $services->getNamespaceInfo()
+ $services->getNamespaceInfo(),
+ $services->getPermissionManager()
);
$factory->setLogger( LoggerFactory::getInstance( 'preferences' ) );
namespace MediaWiki\Preferences;
-use Config;
use DateTime;
use DateTimeZone;
use Exception;
use MediaWiki\Config\ServiceOptions;
use MediaWiki\Linker\LinkRenderer;
use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\PermissionManager;
use MessageLocalizer;
use MWException;
use MWTimestamp;
/** @var NamespaceInfo */
protected $nsInfo;
+ /** @var PermissionManager */
+ protected $permissionManager;
+
/**
* TODO Make this a const when we drop HHVM support (T192166)
*
/**
* Do not call this directly. Get it from MediaWikiServices.
*
- * @param ServiceOptions|Config $options Config accepted for backwards compatibility
+ * @param ServiceOptions $options
* @param Language $contLang
* @param AuthManager $authManager
* @param LinkRenderer $linkRenderer
- * @param NamespaceInfo|null $nsInfo
+ * @param NamespaceInfo $nsInfo
+ * @param PermissionManager|null $permissionManager
*/
public function __construct(
- $options,
+ ServiceOptions $options,
Language $contLang,
AuthManager $authManager,
LinkRenderer $linkRenderer,
- NamespaceInfo $nsInfo = null
+ NamespaceInfo $nsInfo,
+ PermissionManager $permissionManager = null
) {
- if ( $options instanceof Config ) {
- wfDeprecated( __METHOD__ . ' with Config parameter', '1.34' );
- $options = new ServiceOptions( self::$constructorOptions, $options );
- }
-
$options->assertRequiredOptions( self::$constructorOptions );
- if ( !$nsInfo ) {
- wfDeprecated( __METHOD__ . ' with no NamespaceInfo argument', '1.34' );
- $nsInfo = MediaWikiServices::getInstance()->getNamespaceInfo();
+ if ( !$permissionManager ) {
+ // TODO: this is actually hard-deprecated, left for jenkins to pass
+ // together with GlobalPreferences extension. Will be removed in a followup.
+ $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
}
$this->options = $options;
$this->contLang = $contLang;
$this->authManager = $authManager;
$this->linkRenderer = $linkRenderer;
$this->nsInfo = $nsInfo;
+ $this->permissionManager = $permissionManager;
$this->logger = new NullLogger();
}
# # Make sure that form fields have their parent set. See T43337.
$dummyForm = new HTMLForm( [], $context );
- $disable = !$user->isAllowed( 'editmyoptions' );
+ $disable = !$this->permissionManager->userHasRight( $user, 'editmyoptions' );
$defaultOptions = User::getDefaultOptions();
$userOptions = $user->getOptions();
];
}
- $canViewPrivateInfo = $user->isAllowed( 'viewmyprivateinfo' );
- $canEditPrivateInfo = $user->isAllowed( 'editmyprivateinfo' );
+ $canViewPrivateInfo = $this->permissionManager->userHasRight( $user, 'viewmyprivateinfo' );
+ $canEditPrivateInfo = $this->permissionManager->userHasRight( $user, 'editmyprivateinfo' );
// Actually changeable stuff
$defaultPreferences['realname'] = [
];
}
- if ( $this->options->get( 'EnableUserEmail' ) && $user->isAllowed( 'sendemail' ) ) {
+ if ( $this->options->get( 'EnableUserEmail' ) &&
+ $this->permissionManager->userHasRight( $user, 'sendemail' )
+ ) {
$defaultPreferences['disablemail'] = [
'id' => 'wpAllowEmail',
'type' => 'toggle',
'label-message' => 'tog-numberheadings',
];
- if ( $user->isAllowed( 'rollback' ) ) {
+ if ( $this->permissionManager->userHasRight( $user, 'rollback' ) ) {
$defaultPreferences['showrollbackconfirmation'] = [
'type' => 'toggle',
'section' => 'rendering/advancedrendering',
];
}
- if ( $user->isAllowed( 'minoredit' ) ) {
+ if ( $this->permissionManager->userHasRight( $user, 'minoredit' ) ) {
$defaultPreferences['minordefault'] = [
'type' => 'toggle',
'section' => 'editing/editor',
$watchlistdaysMax = ceil( $this->options->get( 'RCMaxAge' ) / ( 3600 * 24 ) );
# # Watchlist #####################################
- if ( $user->isAllowed( 'editmywatchlist' ) ) {
+ if ( $this->permissionManager->userHasRight( $user, 'editmywatchlist' ) ) {
$editWatchlistLinks = '';
$editWatchlistModes = [
'edit' => [ 'subpage' => false, 'flags' => [] ],
];
// Kinda hacky
- if ( $user->isAllowed( 'createpage' ) || $user->isAllowed( 'createtalk' ) ) {
+ if ( $this->permissionManager->userHasAnyRight( $user, 'createpage', 'createtalk' ) ) {
$watchTypes['read'] = 'watchcreations';
}
- if ( $user->isAllowed( 'rollback' ) ) {
+ if ( $this->permissionManager->userHasRight( $user, 'rollback' ) ) {
$watchTypes['rollback'] = 'watchrollback';
}
- if ( $user->isAllowed( 'upload' ) ) {
+ if ( $this->permissionManager->userHasRight( $user, 'upload' ) ) {
$watchTypes['upload'] = 'watchuploads';
}
foreach ( $watchTypes as $action => $pref ) {
- if ( $user->isAllowed( $action ) ) {
+ if ( $this->permissionManager->userHasRight( $user, $action ) ) {
// Messages:
// tog-watchdefault, tog-watchmoves, tog-watchdeletion, tog-watchcreations, tog-watchuploads
// tog-watchrollback
$hiddenPrefs = $this->options->get( 'HiddenPrefs' );
$result = true;
- if ( !$user->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
+ if ( !$this->permissionManager
+ ->userHasAnyRight( $user, 'editmyprivateinfo', 'editmyoptions' )
+ ) {
return Status::newFatal( 'mypreferencesprotected' );
}
// (not really "private", but still shouldn't be edited without permission)
if ( !in_array( 'realname', $hiddenPrefs )
- && $user->isAllowed( 'editmyprivateinfo' )
+ && $this->permissionManager->userHasRight( $user, 'editmyprivateinfo' )
&& array_key_exists( 'realname', $formData )
) {
$realName = $formData['realname'];
$user->setRealName( $realName );
}
- if ( $user->isAllowed( 'editmyoptions' ) ) {
+ if ( $this->permissionManager->userHasRight( $user, 'editmyoptions' ) ) {
$oldUserOptions = $user->getOptions();
foreach ( $this->getSaveBlacklist() as $b ) {
use MediaWiki\Auth\AuthManager;
use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\PermissionManager;
use MediaWiki\Preferences\DefaultPreferencesFactory;
use Wikimedia\TestingAccessWrapper;
/**
* Get a basic PreferencesFactory for testing with.
+ * @param PermissionManager|null $manager
* @return DefaultPreferencesFactory
*/
- protected function getPreferencesFactory() {
+ protected function getPreferencesFactory( PermissionManager $manager = null ) {
$mockNsInfo = $this->createMock( NamespaceInfo::class );
$mockNsInfo->method( 'getValidNamespaces' )->willReturn( [
NS_MAIN, NS_TALK, NS_USER, NS_USER_TALK
$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 ),
new Language(),
AuthManager::singleton(),
MediaWikiServices::getInstance()->getLinkRenderer(),
- $mockNsInfo
+ $mockNsInfo,
+ $mockPermissionManager
);
}
* @dataProvider emailAuthenticationProvider
*/
public function testEmailAuthentication( $user, $cssClass ) {
- $prefs = $this->getPreferencesFactory()->getFormDescriptor( $user, $this->context );
+ $pm = $this->createMock( PermissionManager::class );
+ $pm->method( 'userHasRight' )->willReturn( true );
+ $prefs = $this->getPreferencesFactory( $pm )->getFormDescriptor( $user, $this->context );
$this->assertArrayHasKey( 'cssclass', $prefs['emailauthentication'] );
$this->assertEquals( $cssClass, $prefs['emailauthentication']['cssclass'] );
}
$userMock = $this->getMockBuilder( User::class )
->disableOriginalConstructor()
->getMock();
- $userMock->method( 'isAllowed' )
- ->willReturn( false );
$userMock->method( 'getEffectiveGroups' )
->willReturn( [] );
$userMock->method( 'getGroupMemberships' )
->willReturn( [] );
$userMock->method( 'getOptions' )
->willReturn( [ 'test' => 'yes' ] );
-
- $prefs = $this->getPreferencesFactory()->getFormDescriptor( $userMock, $this->context );
+ $pm = $this->createMock( PermissionManager::class );
+ $pm->method( 'userHasRight' )
+ ->will( $this->returnValueMap( [
+ [ $userMock, 'editmyoptions', true ]
+ ] ) );
+ $prefs = $this->getPreferencesFactory( $pm )->getFormDescriptor( $userMock, $this->context );
$this->assertArrayNotHasKey( 'showrollbackconfirmation', $prefs );
}
$userMock = $this->getMockBuilder( User::class )
->disableOriginalConstructor()
->getMock();
- $userMock->method( 'isAllowed' )
- ->willReturn( true );
$userMock->method( 'getEffectiveGroups' )
->willReturn( [] );
$userMock->method( 'getGroupMemberships' )
->willReturn( [] );
$userMock->method( 'getOptions' )
->willReturn( [ 'test' => 'yes' ] );
-
- $prefs = $this->getPreferencesFactory()->getFormDescriptor( $userMock, $this->context );
+ $pm = $this->createMock( PermissionManager::class );
+ $pm->method( 'userHasRight' )
+ ->will( $this->returnValueMap( [
+ [ $userMock, 'editmyoptions', true ],
+ [ $userMock, 'rollback', true ]
+ ] ) );
+ $prefs = $this->getPreferencesFactory( $pm )->getFormDescriptor( $userMock, $this->context );
$this->assertArrayHasKey( 'showrollbackconfirmation', $prefs );
$this->assertEquals(
'rendering/advancedrendering',
->getMock();
$userMock->method( 'getOptions' )
->willReturn( $oldOptions );
- $userMock->method( 'isAllowedAny' )
- ->willReturn( true );
- $userMock->method( 'isAllowed' )
- ->willReturn( true );
$userMock->expects( $this->exactly( 2 ) )
->method( 'setOption' )
[ $this->equalTo( 'option' ), $this->equalTo( $newOptions[ 'option' ] ) ]
);
- $form->expects( $this->any() )
- ->method( 'getModifiedUser' )
+ $form->method( 'getModifiedUser' )
->willReturn( $userMock );
- $form->expects( $this->any() )
- ->method( 'getContext' )
+ $form->method( 'getContext' )
->willReturn( $this->context );
- $form->expects( $this->any() )
- ->method( 'getConfig' )
+ $form->method( 'getConfig' )
->willReturn( $configMock );
+ $pm = $this->createMock( PermissionManager::class );
+ $pm->method( 'userHasAnyRight' )
+ ->will( $this->returnValueMap( [
+ [ $userMock, 'editmyprivateinfo', 'editmyoptions', true ]
+ ] ) );
+ $pm->method( 'userHasRight' )
+ ->will( $this->returnValueMap( [
+ [ $userMock, 'editmyoptions', true ]
+ ] ) );
+
$this->setTemporaryHook( 'PreferencesFormPreSave',
function ( $formData, $form, $user, &$result, $oldUserOptions )
use ( $newOptions, $oldOptions, $userMock ) {
);
/** @var DefaultPreferencesFactory $factory */
- $factory = TestingAccessWrapper::newFromObject( $this->getPreferencesFactory() );
+ $factory = TestingAccessWrapper::newFromObject( $this->getPreferencesFactory( $pm ) );
$factory->saveFormData( $newOptions, $form, [] );
}
// Test a string with leading zeros (i.e. not octal) and spaces.
$this->context->getRequest()->setVal( 'wprclimit', ' 0012 ' );
$user = new User;
- $form = $this->getPreferencesFactory()->getForm( $user, $this->context );
+ $pm = $this->createMock( PermissionManager::class );
+ $pm->method( 'userHasAnyRight' )
+ ->willReturn( true );
+ $pm->method( 'userHasRight' )
+ ->will( $this->returnValueMap( [
+ [ $user, 'editmyoptions', true ]
+ ] ) );
+ $form = $this->getPreferencesFactory( $pm )->getForm( $user, $this->context );
$form->show();
$form->trySubmit();
$this->assertEquals( 12, $user->getOption( 'rclimit' ) );