mirror of
https://github.com/nextcloud/server.git
synced 2026-02-15 16:59:47 -05:00
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 <blizzz@arthur-schiwon.de>
This commit is contained in:
parent
430b095897
commit
68af059ebe
2 changed files with 29 additions and 2 deletions
|
|
@ -683,7 +683,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I
|
|||
|
||||
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) ?? [];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -836,7 +836,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I
|
|||
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);
|
||||
|
|
|
|||
|
|
@ -901,6 +901,33 @@ class Group_LDAPTest extends TestCase {
|
|||
$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';
|
||||
|
|
|
|||
Loading…
Reference in a new issue