1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
<?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->getConfVar( 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 exists,
* 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 exists,
* 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 ) {
if ( str_starts_with( $message, $prefix ) ) {
$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'
);
}
}
|