Don't loop over all groups to check for subadmins

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2020-04-27 08:37:53 +02:00
parent 6ffde74928
commit e24e9ec0a9
No known key found for this signature in database
GPG Key ID: 7076EA9751AACDDA
1 changed files with 24 additions and 11 deletions

View File

@ -110,6 +110,25 @@ class SubAdmin extends PublicEmitter implements ISubAdmin {
* @return IGroup[]
*/
public function getSubAdminsGroups(IUser $user): array {
$groupIds = $this->getSubAdminsGroupIds($user);
$groups = [];
foreach ($groupIds as $groupId) {
$group = $this->groupManager->get($groupId);
if ($group !== null) {
$groups[$group->getGID()] = $group;
}
}
return $groups;
}
/**
* Get group ids of a SubAdmin
* @param IUser $user the SubAdmin
* @return string[]
*/
public function getSubAdminsGroupIds(IUser $user): array {
$qb = $this->dbConn->getQueryBuilder();
$result = $qb->select('gid')
@ -119,10 +138,7 @@ class SubAdmin extends PublicEmitter implements ISubAdmin {
$groups = [];
while ($row = $result->fetch()) {
$group = $this->groupManager->get($row['gid']);
if (!is_null($group)) {
$groups[$group->getGID()] = $group;
}
$groups[] = $row['gid'];
}
$result->closeCursor();
@ -256,13 +272,10 @@ class SubAdmin extends PublicEmitter implements ISubAdmin {
return false;
}
$accessibleGroups = $this->getSubAdminsGroups($subadmin);
foreach ($accessibleGroups as $accessibleGroup) {
if ($accessibleGroup->inGroup($user)) {
return true;
}
}
return false;
$accessibleGroups = $this->getSubAdminsGroupIds($subadmin);
$userGroups = $this->groupManager->getUserGroupIds($user);
return !empty(array_intersect($accessibleGroups, $userGroups));
}
/**