Skip to content

Commit 4033882

Browse files
committed
Fixed #17716
1 parent a877c4d commit 4033882

File tree

3 files changed

+26
-29
lines changed

3 files changed

+26
-29
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
## Unreleased
44

5+
- Added `craft\services\UserPermissions::validatePermission()`.
56
- Fixed an error that occurred when saving an entry with a Lightswitch field. ([#17721](https://github.com/craftcms/cms/issues/17721))
67
- Fixed a bug where GraphiQL’s query input had a 550px max height. ([#17723](https://github.com/craftcms/cms/issues/17723))
8+
- Fixed an authorization error that occurred when non-admin users attempted to modify content on multi-site installs with SEOmatic installed. ([#17716](https://github.com/craftcms/cms/issues/17716))
79

810
## 5.8.13.1 - 2025-08-06
911

src/services/UserPermissions.php

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class UserPermissions extends Component
6767

6868
/**
6969
* @var string[]
70-
* @see filterInvalidPermissions()
70+
* @see allPermissionNames()
7171
*/
7272
private array|null $_allPermissionNames = null;
7373

@@ -103,25 +103,25 @@ class UserPermissions extends Component
103103
public function getAllPermissions(): array
104104
{
105105
if (!isset($this->_allPermissions)) {
106-
$permissions = [];
106+
$this->_allPermissions = [];
107107

108-
$this->_generalPermissions($permissions);
109-
$this->_userPermissions($permissions);
110-
$this->_sitePermissions($permissions);
111-
$this->_entryPermissions($permissions);
112-
$this->_globalSetPermissions($permissions);
113-
$this->_categoryPermissions($permissions);
114-
$this->_volumePermissions($permissions);
115-
$this->_utilityPermissions($permissions);
108+
$this->_generalPermissions($this->_allPermissions);
109+
$this->_userPermissions($this->_allPermissions);
110+
$this->_sitePermissions($this->_allPermissions);
111+
$this->_entryPermissions($this->_allPermissions);
112+
$this->_globalSetPermissions($this->_allPermissions);
113+
$this->_categoryPermissions($this->_allPermissions);
114+
$this->_volumePermissions($this->_allPermissions);
115+
$this->_utilityPermissions($this->_allPermissions);
116116

117117
// Fire a 'registerPermissions' event
118118
if ($this->hasEventHandlers(self::EVENT_REGISTER_PERMISSIONS)) {
119-
$event = new RegisterUserPermissionsEvent(['permissions' => $permissions]);
119+
$event = new RegisterUserPermissionsEvent([
120+
'permissions' => $this->_allPermissions,
121+
]);
120122
$this->trigger(self::EVENT_REGISTER_PERMISSIONS, $event);
121-
$permissions = $event->permissions;
123+
$this->_allPermissions = $event->permissions;
122124
}
123-
124-
$this->_allPermissions = $permissions;
125125
}
126126

127127
return $this->_allPermissions;
@@ -167,14 +167,10 @@ public function getAssignablePermissions(?User $user = null): array
167167
public function getPermissionsByGroupId(int $groupId): array
168168
{
169169
if (!isset($this->_permissionsByGroupId[$groupId])) {
170-
/** @var string[] $groupPermissions */
171-
$groupPermissions = $this->_createUserPermissionsQuery()
170+
$this->_permissionsByGroupId[$groupId] = $this->_createUserPermissionsQuery()
172171
->innerJoin(['p_g' => Table::USERPERMISSIONS_USERGROUPS], '[[p_g.permissionId]] = [[p.id]]')
173172
->where(['p_g.groupId' => $groupId])
174173
->column();
175-
176-
// filter out any invalid permissions
177-
$this->_permissionsByGroupId[$groupId] = $this->filterInvalidPermissions($groupPermissions);
178174
}
179175

180176
return $this->_permissionsByGroupId[$groupId];
@@ -193,14 +189,11 @@ public function getGroupPermissionsByUserId(int $userId): array
193189
return $this->getPermissionsByGroupId($group->id);
194190
}
195191

196-
$permissions = $this->_createUserPermissionsQuery()
192+
return $this->_createUserPermissionsQuery()
197193
->innerJoin(['p_g' => Table::USERPERMISSIONS_USERGROUPS], '[[p_g.permissionId]] = [[p.id]]')
198194
->innerJoin(['g_u' => Table::USERGROUPS_USERS], '[[g_u.groupId]] = [[p_g.groupId]]')
199195
->where(['g_u.userId' => $userId])
200196
->column();
201-
202-
// filter out any invalid permissions
203-
return $this->filterInvalidPermissions($permissions);
204197
}
205198

206199
/**
@@ -272,9 +265,6 @@ public function getPermissionsByUserId(int $userId): array
272265
->innerJoin(['p_u' => Table::USERPERMISSIONS_USERS], '[[p_u.permissionId]] = [[p.id]]')
273266
->where(['p_u.userId' => $userId])
274267
->column();
275-
276-
// filter out any invalid permissions
277-
$userPermissions = $this->filterInvalidPermissions($userPermissions);
278268
} else {
279269
$userPermissions = [];
280270
}
@@ -285,7 +275,12 @@ public function getPermissionsByUserId(int $userId): array
285275
return $this->_permissionsByUserId[$userId];
286276
}
287277

288-
private function filterInvalidPermissions(array $permissions): array
278+
/**
279+
* @param string $permission
280+
* @return bool
281+
* @since 5.8.13.2
282+
*/
283+
public function validatePermission(string $permission): bool
289284
{
290285
if (!isset($this->_allPermissionNames)) {
291286
$this->_allPermissionNames = [];
@@ -294,7 +289,7 @@ private function filterInvalidPermissions(array $permissions): array
294289
}
295290
}
296291

297-
return array_values(array_filter($permissions, fn($permission) => isset($this->_allPermissionNames[strtolower($permission)])));
292+
return isset($this->_allPermissionNames[strtolower($permission)]);
298293
}
299294

300295
private function collectPermissionNames(array &$permissions): void

src/services/Users.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1553,7 +1553,7 @@ public function canImpersonate(User $impersonator, User $impersonatee): bool
15531553
$impersonateePermissions = $permissionsService->getPermissionsByUserId($impersonatee->id);
15541554

15551555
foreach ($impersonateePermissions as $permission) {
1556-
if (!isset($impersonatorPermissions[$permission])) {
1556+
if (!isset($impersonatorPermissions[$permission]) && $permissionsService->validatePermission($permission)) {
15571557
return false;
15581558
}
15591559
}

0 commit comments

Comments
 (0)