From 654fabd027b5d5862245f5dc5777ef0085e0cbcd Mon Sep 17 00:00:00 2001 From: Louis Chemineau Date: Fri, 20 Sep 2024 11:23:58 +0200 Subject: [PATCH] fix(users): Don't crash if disabled user is missing in the database Signed-off-by: Louis Chemineau --- lib/private/User/LazyUser.php | 9 ++++++--- lib/private/User/Manager.php | 33 ++++++++++++++++----------------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/lib/private/User/LazyUser.php b/lib/private/User/LazyUser.php index 396d3c252f11d..704075c1b9287 100644 --- a/lib/private/User/LazyUser.php +++ b/lib/private/User/LazyUser.php @@ -51,9 +51,12 @@ private function getUser(): 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 f0d5c7c1e4a96..2332741575028 100644 --- a/lib/private/User/Manager.php +++ b/lib/private/User/Manager.php @@ -38,7 +38,6 @@ use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\EventDispatcher\IEventDispatcher; use OCP\HintException; -use OCP\ICache; use OCP\ICacheFactory; use OCP\IConfig; use OCP\IGroup; @@ -86,28 +85,23 @@ class Manager extends PublicEmitter implements IUserManager { */ private $cachedUsers = []; - /** @var IConfig */ - private $config; - /** @var ICache */ private $cache; - /** @var IEventDispatcher */ - private $eventDispatcher; - private DisplayNameCache $displayNameCache; - public function __construct(IConfig $config, + public function __construct( + private IConfig $config, ICacheFactory $cacheFactory, - IEventDispatcher $eventDispatcher) { - $this->config = $config; + private IEventDispatcher $eventDispatcher, + private LoggerInterface $logger, + ) { $this->cache = new WithLocalCache($cacheFactory->createDistributed('user_backend_map')); $cachedUsers = &$this->cachedUsers; $this->listen('\OC\User', 'postDelete', function ($user) use (&$cachedUsers) { /** @var \OC\User\User $user */ unset($cachedUsers[$user->getUID()]); }); - $this->eventDispatcher = $eventDispatcher; $this->displayNameCache = new DisplayNameCache($cacheFactory, $this); } @@ -236,7 +230,7 @@ public function checkPassword($loginName, $password) { $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 +348,16 @@ public function getDisabledUsers(?int $limit = null, int $offset = 0, string $se 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);