userManager->get($userId); if ($user === null) { throw new \Exception('user does not exist'); } if (!$user->isEnabled()) { return $this->getGuestAvatar($userId); } // sanitize userID - fixes casing issue (needed for the filesystem stuff that is done below) $userId = $user->getUID(); $requestingUser = $this->userSession->getUser(); try { $folder = $this->appData->getFolder($userId); } catch (NotFoundException $e) { $folder = $this->appData->newFolder($userId); } try { $account = $this->accountManager->getAccount($user); $avatarProperties = $account->getProperty(IAccountManager::PROPERTY_AVATAR); $avatarScope = $avatarProperties->getScope(); } catch (PropertyDoesNotExistException $e) { $avatarScope = ''; } switch ($avatarScope) { // v2-private scope hides the avatar from public access and from unknown users case IAccountManager::SCOPE_PRIVATE: if ($requestingUser !== null && $this->knownUserService->isKnownToUser($requestingUser->getUID(), $userId)) { return new UserAvatar($folder, $this->l, $user, $this->logger, $this->config); } break; case IAccountManager::SCOPE_LOCAL: case IAccountManager::SCOPE_FEDERATED: case IAccountManager::SCOPE_PUBLISHED: return new UserAvatar($folder, $this->l, $user, $this->logger, $this->config); default: // use a placeholder avatar which caches the generated images return new PlaceholderAvatar($folder, $user, $this->logger); } return new PlaceholderAvatar($folder, $user, $this->logger); } /** * Clear generated avatars */ public function clearCachedAvatars(): void { $users = $this->config->getUsersForUserValue('avatar', 'generated', 'true'); foreach ($users as $userId) { // This also bumps the avatar version leading to cache invalidation in browsers $this->getAvatar($userId)->remove(); } } public function deleteUserAvatar(string $userId): void { try { $folder = $this->appData->getFolder($userId); $folder->delete(); } catch (NotFoundException $e) { $this->logger->debug("No cache for the user $userId. Ignoring avatar deletion"); } catch (NotPermittedException | StorageNotAvailableException $e) { $this->logger->error("Unable to delete user avatars for $userId. gnoring avatar deletion"); } catch (NoUserException $e) { $this->logger->debug("Account $userId not found. Ignoring avatar deletion"); } $this->config->deleteUserValue($userId, 'avatar', 'generated'); } /** * Returns a GuestAvatar. * * @param string $name The guest name, e.g. "Albert". */ public function getGuestAvatar(string $name): IAvatar { return new GuestAvatar($name, $this->logger); } }