Skip to content

Commit

Permalink
Merge pull request #48967 from nextcloud/backport/48766/stable28
Browse files Browse the repository at this point in the history
[stable28] Fix disabled user list for subadmins
  • Loading branch information
susnux authored Oct 30, 2024
2 parents 56296ef + 90fe35d commit 7a3f45b
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 4 deletions.
8 changes: 4 additions & 4 deletions apps/provisioning_api/lib/Controller/UsersController.php
Original file line number Diff line number Diff line change
Expand Up @@ -277,21 +277,21 @@ public function getDisabledUsersDetails(string $search = '', ?int $limit = null,
/* We have to handle offset ourselve for correctness */
$tempLimit = ($limit === null ? null : $limit + $offset);
foreach ($subAdminOfGroups as $group) {
$users = array_merge(
$users = array_unique(array_merge(
$users,
array_map(
fn (IUser $user): string => $user->getUID(),
array_filter(
$group->searchUsers($search, ($tempLimit === null ? null : $tempLimit - count($users))),
$group->searchUsers($search),
fn (IUser $user): bool => !$user->isEnabled()
)
)
);
));
if (($tempLimit !== null) && (count($users) >= $tempLimit)) {
break;
}
}
$users = array_slice($users, $offset);
$users = array_slice($users, $offset, $limit);
}

$usersDetails = [];
Expand Down
125 changes: 125 additions & 0 deletions apps/provisioning_api/tests/Controller/UsersControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,131 @@ public function testGetUsersAsSubAdmin() {
$this->assertEquals($expected, $this->api->getUsers('MyCustomSearch')->getData());
}

private function createUserMock(string $uid, bool $enabled): MockObject|IUser {
$mockUser = $this->getMockBuilder(IUser::class)
->disableOriginalConstructor()
->getMock();
$mockUser
->method('getUID')
->willReturn($uid);
$mockUser
->method('isEnabled')
->willReturn($enabled);
return $mockUser;
}

public function testGetDisabledUsersAsAdmin(): void {
$loggedInUser = $this->getMockBuilder(IUser::class)
->disableOriginalConstructor()
->getMock();
$loggedInUser
->expects($this->once())
->method('getUID')
->willReturn('admin');
$this->userSession
->expects($this->atLeastOnce())
->method('getUser')
->willReturn($loggedInUser);
$this->groupManager
->expects($this->once())
->method('isAdmin')
->willReturn(true);
$this->userManager
->expects($this->once())
->method('getDisabledUsers')
->with(3, 0, 'MyCustomSearch')
->willReturn([
$this->createUserMock('admin', false),
$this->createUserMock('foo', false),
$this->createUserMock('bar', false),
]);

$expected = [
'users' => [
'admin' => ['id' => 'admin'],
'foo' => ['id' => 'foo'],
'bar' => ['id' => 'bar'],
],
];
$this->assertEquals($expected, $this->api->getDisabledUsersDetails('MyCustomSearch', 3)->getData());
}

public function testGetDisabledUsersAsSubAdmin(): void {
$loggedInUser = $this->getMockBuilder(IUser::class)
->disableOriginalConstructor()
->getMock();
$loggedInUser
->expects($this->once())
->method('getUID')
->willReturn('subadmin');
$this->userSession
->expects($this->atLeastOnce())
->method('getUser')
->willReturn($loggedInUser);
$this->groupManager
->expects($this->once())
->method('isAdmin')
->willReturn(false);
$firstGroup = $this->getMockBuilder('OCP\IGroup')
->disableOriginalConstructor()
->getMock();
$secondGroup = $this->getMockBuilder('OCP\IGroup')
->disableOriginalConstructor()
->getMock();
$subAdminManager = $this->getMockBuilder('OC\SubAdmin')
->disableOriginalConstructor()->getMock();
$subAdminManager
->expects($this->once())
->method('isSubAdmin')
->with($loggedInUser)
->willReturn(true);
$subAdminManager
->expects($this->once())
->method('getSubAdminsGroups')
->with($loggedInUser)
->willReturn([$firstGroup, $secondGroup]);
$this->groupManager
->expects($this->once())
->method('getSubAdmin')
->willReturn($subAdminManager);
$this->groupManager
->expects($this->never())
->method('displayNamesInGroup');

$firstGroup
->expects($this->once())
->method('searchUsers')
->with('MyCustomSearch')
->willReturn([
$this->createUserMock('user1', false),
$this->createUserMock('bob', true),
$this->createUserMock('user2', false),
$this->createUserMock('alice', true),
]);

$secondGroup
->expects($this->once())
->method('searchUsers')
->with('MyCustomSearch')
->willReturn([
$this->createUserMock('user2', false),
$this->createUserMock('joe', true),
$this->createUserMock('user3', false),
$this->createUserMock('jim', true),
$this->createUserMock('john', true),
]);


$expected = [
'users' => [
'user1' => ['id' => 'user1'],
'user2' => ['id' => 'user2'],
'user3' => ['id' => 'user3'],
],
];
$this->assertEquals($expected, $this->api->getDisabledUsersDetails('MyCustomSearch', 3)->getData());
}


public function testAddUserAlreadyExisting() {
$this->expectException(\OCP\AppFramework\OCS\OCSException::class);
Expand Down

0 comments on commit 7a3f45b

Please sign in to comment.