when a user was delete remove them from applicable list, unless

it is the only user, then remove the mount

Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This commit is contained in:
Arthur Schiwon 2019-11-12 23:53:33 +01:00
parent 86df25ebd3
commit 0172fb7aad
No known key found for this signature in database
GPG Key ID: 7424F1874854DF23
3 changed files with 43 additions and 0 deletions

View File

@ -34,6 +34,8 @@ require_once __DIR__ . '/../3rdparty/autoload.php';
// register Application object singleton
\OC_Mount_Config::$app = new \OCA\Files_External\AppInfo\Application();
\OC_Mount_Config::$app->registerListeners();
$appContainer = \OC_Mount_Config::$app->getContainer();
\OCA\Files\App::getNavigationManager()->add(function () {

View File

@ -32,6 +32,7 @@ namespace OCA\Files_External\AppInfo;
use OCA\Files_External\Config\UserPlaceholderHandler;
use OCA\Files_External\Lib\Auth\PublicKey\RSAPrivateKey;
use OCA\Files_External\Lib\Auth\SMB\KerberosAuth;
use OCA\Files_External\Service\DBConfigService;
use \OCP\AppFramework\App;
use OCP\AppFramework\IAppContainer;
use \OCA\Files_External\Service\BackendService;
@ -62,6 +63,8 @@ use OCA\Files_External\Lib\Backend\DAV;
use OCA\Files_External\Lib\Backend\FTP;
use OCA\Files_External\Lib\Backend\Local;
use OCP\Files\Config\IUserMountCache;
use OCP\IUser;
use Symfony\Component\EventDispatcher\GenericEvent;
/**
* @package OCA\Files_External\AppInfo
@ -95,6 +98,20 @@ class Application extends App implements IBackendProvider, IAuthMechanismProvide
$this->getAuthMechanisms();
}
public function registerListeners() {
$dispatcher = $this->getContainer()->getServer()->getEventDispatcher();
$dispatcher->addListener(
IUser::class . '::postDelete',
function (GenericEvent $event) {
/** @var IUser $user */
$user = $event->getSubject();
/** @var DBConfigService $config */
$config = $this->getContainer()->query(DBConfigService::class);
$config->modifyMountsOnUserDelete($user->getUID());
}
);
}
/**
* @{inheritdoc}
*/

View File

@ -114,6 +114,30 @@ class DBConfigService {
return $this->getMountsFromQuery($query);
}
public function modifyMountsOnUserDelete(string $uid) {
$builder = $this->connection->getQueryBuilder();
$query = $builder->select(['a.mount_id', $builder->func()->count('a.mount_id', 'count')])
->from('external_applicable', 'a')
->rightJoin('a', 'external_applicable', 'b', $builder->expr()->eq('a.mount_id', 'b.mount_id'))
->where($builder->expr()->andX( // mounts for user
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_USER, IQueryBuilder::PARAM_INT)),
$builder->expr()->eq('a.value', $builder->createNamedParameter($uid))
)
)
->groupBy(['a.mount_id']);
$stmt = $query->execute();
$result = $stmt->fetchAll();
$stmt->closeCursor();
foreach ($result as $row) {
if((int)$row['count'] > 1) {
$this->removeApplicable($row['mount_id'], self::APPLICABLE_TYPE_USER, $uid);
} else {
$this->removeMount($row['mount_id']);
}
}
}
/**
* Get admin defined mounts
*