From 13cd49c67dcadd938e083940ae586ddfa6410967 Mon Sep 17 00:00:00 2001 From: hamza Date: Wed, 28 Oct 2026 16:50:00 +0100 Subject: [PATCH] fix(user): deduplicate users across backends in searchDisplayName Assisted-by: ClaudeCode:claude-fable-5-1 Signed-off-by: hamza --- lib/private/User/Manager.php | 3 ++- tests/lib/User/ManagerTest.php | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php index dc890d6764095..31681d3d060e6 100644 --- a/lib/private/User/Manager.php +++ b/lib/private/User/Manager.php @@ -306,7 +306,8 @@ public function searchDisplayName($pattern, $limit = null, $offset = null) { $backendUsers = $backend->getDisplayNames($pattern, $limit, $offset); if (is_array($backendUsers)) { foreach ($backendUsers as $uid => $displayName) { - $users[] = new LazyUser($uid, $this, $displayName, $backend); + // A user known to several backends is served by the first one, as in get() + $users[$uid] ??= new LazyUser($uid, $this, $displayName, $backend); } } } diff --git a/tests/lib/User/ManagerTest.php b/tests/lib/User/ManagerTest.php index 743a822019853..7bfffade620d0 100644 --- a/tests/lib/User/ManagerTest.php +++ b/tests/lib/User/ManagerTest.php @@ -258,6 +258,31 @@ public function testSearchTwoBackendLimitOffset(): void { $this->assertEquals('foo3', array_shift($result)->getUID()); } + public function testSearchDisplayNameTwoBackendsSameUser(): void { + $backend1 = $this->createMock(\Test\Util\User\Dummy::class); + $backend1->expects($this->once()) + ->method('getDisplayNames') + ->with($this->equalTo(''), $this->equalTo(3), $this->equalTo(0)) + ->willReturn(['foo1' => 'Foo One', 'foo2' => 'Foo Two']); + + $backend2 = $this->createMock(\Test\Util\User\Dummy::class); + $backend2->expects($this->once()) + ->method('getDisplayNames') + ->with($this->equalTo(''), $this->equalTo(3), $this->equalTo(0)) + ->willReturn(['foo2' => 'Foo Two (other)', 'foo3' => 'Foo Three']); + + $this->manager->registerBackend($backend1); + $this->manager->registerBackend($backend2); + + $result = $this->manager->searchDisplayName('', 3, 0); + $this->assertCount(3, $result); + $this->assertEquals('foo1', $result[0]->getUID()); + $this->assertEquals('foo3', $result[1]->getUID()); + $this->assertEquals('foo2', $result[2]->getUID()); + $this->assertEquals('Foo Two', $result[2]->getDisplayName()); + $this->assertSame($backend1, $result[2]->getBackend()); + } + public static function dataCreateUserInvalid(): array { return [ ['te?st', 'foo', 'Only the following characters are allowed in a username:'