remove saved credentails if the user no longer has any storage configured using them

Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
Robin Appelman 2020-05-15 17:09:57 +02:00 committed by Morris Jobke
parent 7ad0f66fc4
commit c864e5dfc2
No known key found for this signature in database
GPG Key ID: FE03C3A163FEDE68
3 changed files with 82 additions and 4 deletions

View File

@ -31,6 +31,10 @@ External storage can be configured using the GUI or at the command line. This se
<nextcloud min-version="20" max-version="20"/>
</dependencies>
<background-jobs>
<job>OCA\Files_External\BackgroundJob\CredentialsCleanup</job>
</background-jobs>
<commands>
<command>OCA\Files_External\Command\ListCommand</command>
<command>OCA\Files_External\Command\Config</command>

View File

@ -0,0 +1,69 @@
<?php
declare(strict_types=1);
/**
* @copyright Copyright (c) 2020 Robin Appelman <robin@icewind.nl>
*
* @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 <http://www.gnu.org/licenses/>.
*
*/
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);
}
});
}
}

View File

@ -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;