diff --git a/apps/files_external/appinfo/info.xml b/apps/files_external/appinfo/info.xml index c2ac25bcea..03a8845d3d 100644 --- a/apps/files_external/appinfo/info.xml +++ b/apps/files_external/appinfo/info.xml @@ -31,6 +31,10 @@ External storage can be configured using the GUI or at the command line. This se + + OCA\Files_External\BackgroundJob\CredentialsCleanup + + OCA\Files_External\Command\ListCommand OCA\Files_External\Command\Config diff --git a/apps/files_external/lib/BackgroundJob/CredentialsCleanup.php b/apps/files_external/lib/BackgroundJob/CredentialsCleanup.php new file mode 100644 index 0000000000..80cb51f157 --- /dev/null +++ b/apps/files_external/lib/BackgroundJob/CredentialsCleanup.php @@ -0,0 +1,69 @@ + + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCA\Files_External\BackgroundJob; + +use OCA\Files_External\Lib\Auth\Password\LoginCredentials; +use OCA\Files_External\Lib\StorageConfig; +use OCA\Files_External\Service\UserGlobalStoragesService; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\TimedJob; +use OCP\Security\ICredentialsManager; +use OCP\IUser; +use OCP\IUserManager; + +class CredentialsCleanup extends TimedJob { + private $credentialsManager; + private $userGlobalStoragesService; + private $userManager; + + public function __construct( + ITimeFactory $time, + ICredentialsManager $credentialsManager, + UserGlobalStoragesService $userGlobalStoragesService, + IUserManager $userManager + ) { + parent::__construct($time); + + $this->credentialsManager = $credentialsManager; + $this->userGlobalStoragesService = $userGlobalStoragesService; + $this->userManager = $userManager; + + // run every day + $this->setInterval(24 * 60 * 60); + } + + protected function run($argument) { + $this->userManager->callForSeenUsers(function (IUser $user) { + $storages = $this->userGlobalStoragesService->getAllStoragesForUser($user); + + $usesLoginCredentials = array_reduce($storages, function (bool $uses, StorageConfig $storage) { + return $uses || $storage->getAuthMechanism() instanceof LoginCredentials; + }, false); + + if (!$usesLoginCredentials) { + $this->credentialsManager->delete($user->getUID(), LoginCredentials::CREDENTIALS_IDENTIFIER); + } + }); + } +} diff --git a/apps/files_external/lib/Service/UserGlobalStoragesService.php b/apps/files_external/lib/Service/UserGlobalStoragesService.php index 7b9af77323..b8ea137428 100644 --- a/apps/files_external/lib/Service/UserGlobalStoragesService.php +++ b/apps/files_external/lib/Service/UserGlobalStoragesService.php @@ -27,6 +27,7 @@ namespace OCA\Files_External\Service; use OCA\Files_External\Lib\StorageConfig; use OCP\Files\Config\IUserMountCache; use OCP\IGroupManager; +use OCP\IUser; use OCP\IUserSession; /** @@ -177,14 +178,18 @@ class UserGlobalStoragesService extends GlobalStoragesService { /** * Gets all storages for the user, admin, personal, global, etc * + * @param IUser|null $user user to get the storages for, if not set the currently logged in user will be used * @return StorageConfig[] array of storage configs */ - public function getAllStoragesForUser() { - if (is_null($this->getUser())) { + public function getAllStoragesForUser(IUser $user = null) { + if (is_null($user)) { + $user = $this->getUser(); + } + if (is_null($user)) { return []; } - $groupIds = $this->groupManager->getUserGroupIds($this->getUser()); - $mounts = $this->dbConfig->getMountsForUser($this->getUser()->getUID(), $groupIds); + $groupIds = $this->groupManager->getUserGroupIds($user); + $mounts = $this->dbConfig->getMountsForUser($user->getUID(), $groupIds); $configs = array_map([$this, 'getStorageConfigFromDBMount'], $mounts); $configs = array_filter($configs, function ($config) { return $config instanceof StorageConfig;