diff --git a/security/Member.php b/security/Member.php index 6f8e59bfff1..2c3dd6df25b 100644 --- a/security/Member.php +++ b/security/Member.php @@ -702,9 +702,9 @@ function onAfterWrite() { * @return boolean */ function onChangeGroups($ids) { - // Filter out admin groups to avoid privilege escalation, - // unless the current user is an admin already - if(!Permission::checkMember($this, 'ADMIN')) { + // Filter out admin groups to avoid privilege escalation, + // unless the current user is an admin already OR the logged in user is an admin + if(!(Permission::check('ADMIN') || Permission::checkMember($this, 'ADMIN'))) { $adminGroups = Permission::get_groups_by_permission('ADMIN'); $adminGroupIDs = ($adminGroups) ? $adminGroups->column('ID') : array(); return count(array_intersect($ids, $adminGroupIDs)) == 0; diff --git a/tests/security/MemberTest.php b/tests/security/MemberTest.php index 6de3c7c500b..4e81c6e36c9 100644 --- a/tests/security/MemberTest.php +++ b/tests/security/MemberTest.php @@ -551,6 +551,14 @@ function testOnChangeGroups() { $staffMember->onChangeGroups(array($newAdminGroup->ID)), 'Adding new admin group relation is not allowed for non-admin members' ); + + $this->session()->inst_set('loggedInAs', $adminMember->ID); + $this->assertTrue( + $staffMember->onChangeGroups(array($newAdminGroup->ID)), + 'Adding new admin group relation is allowed for normal users, when granter is logged in as admin' + ); + $this->session()->inst_set('loggedInAs', null); + $this->assertTrue( $adminMember->onChangeGroups(array($newAdminGroup->ID)), 'Adding new admin group relation is allowed for admin members'