diff options
author | Louis Chemineau <louis@chmn.me> | 2024-09-20 11:26:22 +0200 |
---|---|---|
committer | Louis Chemineau <louis@chmn.me> | 2024-09-23 18:08:17 +0200 |
commit | 1e870c02f5450c9103b1a4e13ea4e76fa3e74868 (patch) | |
tree | 664e75da9e150f58668118e3ac58047a558c9243 /lib | |
parent | 81216ed24955e9adf01d341368e198336f3e2438 (diff) | |
download | nextcloud-server-backport/48207/stable29.tar.gz nextcloud-server-backport/48207/stable29.zip |
fix(users): Don't crash if disabled user is missing in the databasebackport/48207/stable29
Signed-off-by: Louis Chemineau <louis@chmn.me>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/User/LazyUser.php | 9 | ||||
-rw-r--r-- | lib/private/User/Manager.php | 20 |
2 files changed, 19 insertions, 10 deletions
diff --git a/lib/private/User/LazyUser.php b/lib/private/User/LazyUser.php index 396d3c252f1..704075c1b92 100644 --- a/lib/private/User/LazyUser.php +++ b/lib/private/User/LazyUser.php @@ -51,9 +51,12 @@ class LazyUser implements IUser { $this->user = $this->userManager->get($this->uid); } } - /** @var IUser */ - $user = $this->user; - return $user; + + if ($this->user === null) { + throw new NoUserException('User not found in backend'); + } + + return $this->user; } public function getUID() { diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php index f0d5c7c1e4a..7067afc273b 100644 --- a/lib/private/User/Manager.php +++ b/lib/private/User/Manager.php @@ -99,7 +99,8 @@ class Manager extends PublicEmitter implements IUserManager { public function __construct(IConfig $config, ICacheFactory $cacheFactory, - IEventDispatcher $eventDispatcher) { + IEventDispatcher $eventDispatcher, + private LoggerInterface $logger) { $this->config = $config; $this->cache = new WithLocalCache($cacheFactory->createDistributed('user_backend_map')); $cachedUsers = &$this->cachedUsers; @@ -236,7 +237,7 @@ class Manager extends PublicEmitter implements IUserManager { $result = $this->checkPasswordNoLogging($loginName, $password); if ($result === false) { - \OCP\Server::get(LoggerInterface::class)->warning('Login failed: \''. $loginName .'\' (Remote IP: \''. \OC::$server->getRequest()->getRemoteAddress(). '\')', ['app' => 'core']); + $this->logger->warning('Login failed: \''. $loginName .'\' (Remote IP: \''. \OC::$server->getRequest()->getRemoteAddress(). '\')', ['app' => 'core']); } return $result; @@ -354,11 +355,16 @@ class Manager extends PublicEmitter implements IUserManager { if ($search !== '') { $users = array_filter( $users, - fn (IUser $user): bool => - mb_stripos($user->getUID(), $search) !== false || - mb_stripos($user->getDisplayName(), $search) !== false || - mb_stripos($user->getEMailAddress() ?? '', $search) !== false, - ); + function (IUser $user) use ($search): bool { + try { + return mb_stripos($user->getUID(), $search) !== false || + mb_stripos($user->getDisplayName(), $search) !== false || + mb_stripos($user->getEMailAddress() ?? '', $search) !== false; + } catch (NoUserException $ex) { + $this->logger->error('Error while filtering disabled users', ['exception' => $ex, 'userUID' => $user->getUID()]); + return false; + } + }); } $tempLimit = ($limit === null ? null : $limit + $offset); |