Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
fix(LDAP): ensure stored groups are formatted as simple list
With array_unique it is possible that the keys are not in sequential order
but have gaps. json_encode then would store them as associative array,
which later on json_decode would result in a stdClass by default. This is
unexpected and would also contradict the return type hint.

Signed-off-by: Arthur Schiwon <[email protected]>
  • Loading branch information
blizzz authored and artonge committed Jan 2, 2024
commit 1d1d5e1e7c72572901e1cff346531b4d6605615d
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