diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php index 73e801fd16b49..0de508b3a05a9 100644 --- a/lib/private/User/Manager.php +++ b/lib/private/User/Manager.php @@ -126,19 +126,25 @@ public function clearBackends() { * @param string $uid * @return \OC\User\User|null Either the user or null if the specified user does not exist */ - public function get($uid) { + public function get($uid, array $excludeBackends = []) { if (is_null($uid) || $uid === '' || $uid === false) { return null; } - if (isset($this->cachedUsers[$uid])) { //check the cache first to prevent having to loop over the backends - return $this->cachedUsers[$uid]; - } if (strlen($uid) > self::MAX_USERID_LENGTH) { return null; } + // check the cache first to prevent having to loop over the backends + if ($excludeBackends === [] && isset($this->cachedUsers[$uid])) { + return $this->cachedUsers[$uid]; + } + $cachedBackend = $this->cache->get(sha1($uid)); + if (in_array($cachedBackend, $excludeBackends)) { + $cachedBackend = null; + } + if ($cachedBackend !== null && isset($this->backends[$cachedBackend])) { // Cache has the info of the user backend already, so ask that one directly $backend = $this->backends[$cachedBackend]; @@ -153,6 +159,10 @@ public function get($uid) { continue; } + if (in_array($i, $excludeBackends)) { + continue; + } + if ($backend->userExists($uid)) { // Hash $uid to ensure that only valid characters are used for the cache key $this->cache->set(sha1($uid), $i, 300); @@ -196,12 +206,12 @@ public function getUserObject($uid, $backend, $cacheUser = true) { * @param string $uid * @return bool */ - public function userExists($uid) { + public function userExists($uid, array $excludeBackends = []) { if (strlen($uid) > self::MAX_USERID_LENGTH) { return false; } - $user = $this->get($uid); + $user = $this->get($uid, $excludeBackends); return ($user !== null); } diff --git a/lib/public/IUserManager.php b/lib/public/IUserManager.php index 28e0f7620e572..e484b47e718e2 100644 --- a/lib/public/IUserManager.php +++ b/lib/public/IUserManager.php @@ -77,13 +77,14 @@ public function get($uid); public function getDisplayName(string $uid): ?string; /** - * check if a user exists + * Check if a user exists. * * @param string $uid + * @param list $excludeBackends A list of IUserBackend::getBackendName() that need to be excluded from the search. * @return bool * @since 8.0.0 */ - public function userExists($uid); + public function userExists($uid, array $excludeBackends = []); /** * Check if the password is valid for the user diff --git a/tests/Core/Command/User/AddTest.php b/tests/Core/Command/User/AddTest.php index 7a956c173c1df..36b1548b9596d 100644 --- a/tests/Core/Command/User/AddTest.php +++ b/tests/Core/Command/User/AddTest.php @@ -110,6 +110,11 @@ public function testAddEmail( $this->mailHelper->expects($isEmailValid && $shouldSendEmail ? static::once() : static::never()) ->method('sendMail'); + $this->consoleInput->method('getArgument') + ->willReturnMap([ + ['uid', 'JohnDoe'], + ]); + $this->consoleInput->method('getOption') ->will(static::returnValueMap([ ['generate-password', 'true'], diff --git a/tests/lib/Share20/ManagerTest.php b/tests/lib/Share20/ManagerTest.php index 8e81a6a210fa4..202178214210f 100644 --- a/tests/lib/Share20/ManagerTest.php +++ b/tests/lib/Share20/ManagerTest.php @@ -993,10 +993,7 @@ public function dataGeneralChecks() { public function testGeneralChecks($share, $exceptionMessage, $exception): void { $thrown = null; - $this->userManager->method('userExists')->willReturnMap([ - ['user0', true], - ['user1', true], - ]); + $this->userManager->method('userExists')->willReturnCallBack(fn (?string $userId) => $userId === 'user0' || $userId === 'user1'); $this->groupManager->method('groupExists')->willReturnMap([ ['group0', true],