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'
);
}
}
|