wiki.techinc.nl/tests/phpunit/structure/AvailableRightsTest.php
daniel 9143649f48 Make all limits function as user rights.
In order to check all existing rate limits through Authority, the limit
keys must function as user rights. However, we do not want them to be
"normal" permissions, since they cannot sensibly be revoked, and they
should not clutter the user interface.

To solve this, we introduce the concept of "implicit rights", which are
always granted, but limitable.

Change-Id: I0ea6f29130da1d68d022d47d9221fe878bc9beae
2023-09-11 12:03:57 +00:00

142 lines
4.1 KiB
PHP

<?php
use MediaWiki\MainConfigNames;
/**
* Try to make sure that extensions register all rights in $wgAvailableRights
* or via the 'UserGetAllRights' hook.
*
* @author Marius Hoch < hoo@online.de >
* @coversNothing
*/
class AvailableRightsTest extends MediaWikiIntegrationTestCase {
use MediaWikiCoversValidator;
/**
* Returns all rights that should be in $wgAvailableRights + all rights
* registered via the 'UserGetAllRights' hook + all "core" rights.
*
* @return string[]
*/
private function getAllVisibleRights() {
global $wgGroupPermissions, $wgRevokePermissions;
$rights = $this->getServiceContainer()->getPermissionManager()->getAllPermissions();
foreach ( $wgGroupPermissions as $permissions ) {
$rights = array_merge( $rights, array_keys( $permissions ) );
}
foreach ( $wgRevokePermissions as $permissions ) {
$rights = array_merge( $rights, array_keys( $permissions ) );
}
$rights = array_unique( $rights );
sort( $rights );
return $rights;
}
public function testAvailableRights() {
$missingRights = array_diff(
$this->getAllVisibleRights(),
$this->getServiceContainer()->getPermissionManager()->getAllPermissions()
);
$this->assertEquals(
[],
// Re-index to produce nicer output, keys are meaningless.
array_values( $missingRights ),
'Additional user rights need to be added to $wgAvailableRights or ' .
'via the "UserGetAllRights" hook. See the instructions at: ' .
'https://www.mediawiki.org/wiki/Manual:User_rights#Adding_new_rights'
);
}
public function testAvailableRightsShouldNotBeImplicitRights() {
$intersection = array_intersect(
$this->getServiceContainer()->getPermissionManager()->getImplicitRights(),
$this->getServiceContainer()->getPermissionManager()->getAllPermissions()
);
$this->assertEquals(
[],
// Re-index to produce nicer output, keys are meaningless.
array_values( $intersection ),
'Additional user rights can be added to $wgAvailableRights or $wgImplicitRights, ' .
'but not both!'
);
}
public function testLimitsAreRights() {
$knownRights = array_merge(
$this->getServiceContainer()->getPermissionManager()->getImplicitRights(),
$this->getServiceContainer()->getPermissionManager()->getAllPermissions()
);
$missingRights = array_diff(
array_keys( $this->getServiceContainer()->getMainConfig()->get( MainConfigNames::RateLimits ) ),
$knownRights
);
$this->assertEquals(
[],
// Re-index to produce nicer output, keys are meaningless.
array_values( $missingRights ),
'All keys in $wgRateLimits must be listed in $wgAvailableRights or $wgImplicitRights, ' .
'unless the keys are defined as rights by MediaWiki core.'
);
}
/**
* Test, if for all rights an action- message exist,
* which is used on Special:ListGroupRights as help text
* Extensions and core
*
* @coversNothing
*/
public function testAllActionsWithMessages() {
$this->checkMessagesExist( 'action-' );
}
/**
* Test, if for all rights a right- message exist,
* which is used on Special:ListGroupRights as help text
* Extensions and core
*/
public function testAllRightsWithMessage() {
$this->checkMessagesExist( 'right-' );
}
/**
* @param string $prefix
*/
private function checkMessagesExist( $prefix ) {
// Getting all user rights, for core: User::$mCoreRights, for extensions: $wgAvailableRights
$services = $this->getServiceContainer();
$allRights = $services->getPermissionManager()->getAllPermissions();
$allMessageKeys = $services->getLocalisationCache()->getSubitemList( 'en', 'messages' );
$messagesToCheck = [];
foreach ( $allMessageKeys as $message ) {
// === 0: must be at beginning of string (position 0)
if ( strpos( $message, $prefix ) === 0 ) {
$messagesToCheck[] = substr( $message, strlen( $prefix ) );
}
}
$missing = array_diff(
$allRights,
$messagesToCheck
);
$this->assertEquals(
[],
$missing,
"Each user right (core/extensions) has a corresponding $prefix message."
. ' See the instructions at: '
. 'https://www.mediawiki.org/wiki/Manual:User_rights#Adding_new_rights'
);
}
}