Skip to content

Commit

Permalink
Merge pull request #42448 from nextcloud/backport/42405/stable26
Browse files Browse the repository at this point in the history
[stable26] fix(LDAP): ensure stored groups are formatted as simple list
  • Loading branch information
artonge authored Jan 2, 2024
2 parents b912b47 + 1d1d5e1 commit 6169753
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 2 deletions.
4 changes: 2 additions & 2 deletions apps/user_ldap/lib/Group_LDAP.php
Original file line number Diff line number Diff line change
Expand Up @@ -681,7 +681,7 @@ private function isUserOnLDAP(string $uid): bool {

protected function getCachedGroupsForUserId(string $uid): array {
$groupStr = $this->config->getUserValue($uid, 'user_ldap', 'cached-group-memberships-' . $this->access->connection->getConfigPrefix(), '[]');
return json_decode($groupStr) ?? [];
return json_decode($groupStr, true) ?? [];
}

/**
Expand Down Expand Up @@ -834,7 +834,7 @@ public function getUserGroups($uid): array {
return $groups;
}

$groups = array_unique($groups, SORT_LOCALE_STRING);
$groups = array_values(array_unique($groups, SORT_LOCALE_STRING));
$this->access->connection->writeToCache($cacheKey, $groups);

$groupStr = \json_encode($groups);
Expand Down
27 changes: 27 additions & 0 deletions apps/user_ldap/tests/Group_LDAPTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -901,6 +901,33 @@ public function testGetUserGroupsOfflineUser() {
$this->assertTrue(in_array('groupF', $returnedGroups));
}

/**
* regression tests against a case where a json object was stored instead of expected list
* @see https://github.com/nextcloud/server/issues/42374
*/
public function testGetUserGroupsOfflineUserUnexpectedJson() {
$this->enableGroups();

$offlineUser = $this->createMock(OfflineUser::class);

$this->config->expects($this->any())
->method('getUserValue')
->with('userX', 'user_ldap', 'cached-group-memberships-', $this->anything())
// results in a json object: {"0":"groupB","2":"groupF"}
->willReturn(\json_encode([0 => 'groupB', 2 => 'groupF']));

$this->access->userManager->expects($this->any())
->method('get')
->with('userX')
->willReturn($offlineUser);

$this->initBackend();
$returnedGroups = $this->groupBackend->getUserGroups('userX');
$this->assertCount(2, $returnedGroups);
$this->assertTrue(in_array('groupB', $returnedGroups));
$this->assertTrue(in_array('groupF', $returnedGroups));
}

public function testGetUserGroupsUnrecognizedOfflineUser() {
$this->enableGroups();
$dn = 'cn=userX,dc=foobar';
Expand Down

0 comments on commit 6169753

Please sign in to comment.