Skip to content

Commit

Permalink
#7391 Validation::getAdministrationLevel implementation updated
Browse files Browse the repository at this point in the history
  • Loading branch information
touhidurabir authored and asmecher committed Oct 24, 2022
1 parent a78c3fa commit 775bdea
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 34 deletions.
60 changes: 32 additions & 28 deletions classes/security/Validation.php
Original file line number Diff line number Diff line change
Expand Up @@ -490,7 +490,7 @@ public static function canAdminister($administeredUserId, $administratorUserId)
* @param int $administratorUserId User ID of user who wants to do the administrating
* @param int $contextId The journal/context Id
*
* @return int The authorized adminstration level
* @return int The authorized administration level
*/
public static function getAdministrationLevel(int $administeredUserId, int $administratorUserId, int $contextId = null): int
{
Expand All @@ -504,7 +504,7 @@ public static function getAdministrationLevel(int $administeredUserId, int $admi
->filterByContextIds([\PKP\core\PKPApplication::CONTEXT_SITE])
->filterByRoleIds([Role::ROLE_ID_SITE_ADMIN]);

// You cannot adminster administrators
// You cannot administer administrators
if ($filteredSiteAdminUserGroups->filterByUserIds([$administeredUserId])->getCount() > 0) {
return self::ADMINISTRATION_PROHIBITED;
}
Expand All @@ -514,26 +514,41 @@ public static function getAdministrationLevel(int $administeredUserId, int $admi
return self::ADMINISTRATION_FULL;
}

// Make sure the administering user has a manager role somewhere
$roleManagerCount = Repo::userGroup()
->getCollector()
->filterByUserIds([$administratorUserId])
->filterByRoleIds([Role::ROLE_ID_MANAGER])
->getCount();

if ( $roleManagerCount <= 0 ) {
return self::ADMINISTRATION_PROHIBITED;
}

$administeredUserAssignedGroupIds = Repo::userGroup()
->getCollector()
->filterByUserIds([$administeredUserId])
->getMany()
->map(fn($userGroup) => $userGroup->getContextId())
->sort()
->toArray();

$administratorUserAssignedGroupIds = Repo::userGroup()
->getCollector()
->filterByUserIds([$administratorUserId])
->filterByRoleIds([Role::ROLE_ID_MANAGER])
->getMany()
->map(fn($userGroup) => $userGroup->getContextId())
->sort()
->toArray();

// Check for administered user group assignments in other contexts
// that the administrator user doesn't have a manager role in.
$userGroupsCount = Repo::userGroup()
->userUserGroups($administeredUserId)
->filter(fn($userGroup) =>
$userGroup->getContextId() != \PKP\core\PKPApplication::CONTEXT_SITE &&
!Repo::userGroup()
->getCollector()
->filterByContextIds([$userGroup->getContextId()])
->filterByUserIds([$administratorUserId])
->filterByRoleIds([Role::ROLE_ID_MANAGER])
->getCount()
)
->count();

if ( $userGroupsCount > 0 ) {
if ( collect($administeredUserAssignedGroupIds)->diff($administratorUserAssignedGroupIds)->count() > 0 ) {
// Found an assignment: disqualified.
// But also determine if a partial administrate is allowed
// if the Administrator User is a Journal Manager in the current context
if ($contextId &&
if ($contextId !== null &&
Repo::userGroup()
->getCollector()
->filterByContextIds([$contextId])
Expand All @@ -545,17 +560,6 @@ public static function getAdministrationLevel(int $administeredUserId, int $admi
return self::ADMINISTRATION_PROHIBITED;
}

// Make sure the administering user has a manager role somewhere
$roleManagerCount = Repo::userGroup()
->getCollector()
->filterByUserIds([$administratorUserId])
->filterByRoleIds([Role::ROLE_ID_MANAGER])
->getCount();

if ( $roleManagerCount <= 0 ) {
return self::ADMINISTRATION_PROHIBITED;
}

// There were no conflicting roles. Permit administration.
return self::ADMINISTRATION_FULL;
}
Expand Down
10 changes: 5 additions & 5 deletions classes/userGroup/Repository.php
Original file line number Diff line number Diff line change
Expand Up @@ -247,11 +247,11 @@ public function userInGroup(int $userId, int $userGroupId): bool
*/
public function contextHasGroup(int $contextId, int $userGroupId): bool
{
return Repo::userGroup()
->getCollector()
->filterByContextIds([$contextId])
->filterByUserGroupIds([$userGroupId])
->getCount() > 0;
return Repo::userGroup()
->getCollector()
->filterByContextIds([$contextId])
->filterByUserGroupIds([$userGroupId])
->getCount() > 0;
}

public function assignUserToGroup(int $userId, int $userGroupId): UserUserGroup
Expand Down
2 changes: 1 addition & 1 deletion templates/common/userDetailsReadOnly.tpl
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{**
* common/userDetailsReadOnly.tpl
* templates/common/userDetailsReadOnly.tpl
*
* Copyright (c) 2014-2022 Simon Fraser University
* Copyright (c) 2003-2022 John Willinsky
Expand Down

0 comments on commit 775bdea

Please sign in to comment.