Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorArthur Schiwon <blizzz@arthur-schiwon.de>2019-11-13 01:53:33 +0300
committerArthur Schiwon <blizzz@arthur-schiwon.de>2020-01-22 14:01:00 +0300
commit0172fb7aadfde7b808c8c149ec5949451bc6aa89 (patch)
tree02f9e72bdb7a0090ceb422b2d0829a48a55c3783 /apps
parent86df25ebd38b70a8c93b556a0dde0d86ea676c4d (diff)
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>
Diffstat (limited to 'apps')
-rw-r--r--apps/files_external/appinfo/app.php2
-rw-r--r--apps/files_external/lib/AppInfo/Application.php17
-rw-r--r--apps/files_external/lib/Service/DBConfigService.php24
3 files changed, 43 insertions, 0 deletions
diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php
index 3f7094f4dca..2b5ce1fdee0 100644
--- a/apps/files_external/appinfo/app.php
+++ b/apps/files_external/appinfo/app.php
@@ -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 () {
diff --git a/apps/files_external/lib/AppInfo/Application.php b/apps/files_external/lib/AppInfo/Application.php
index 7a9325414d8..07a669fcd94 100644
--- a/apps/files_external/lib/AppInfo/Application.php
+++ b/apps/files_external/lib/AppInfo/Application.php
@@ -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}
*/
diff --git a/apps/files_external/lib/Service/DBConfigService.php b/apps/files_external/lib/Service/DBConfigService.php
index 65995b21cc4..0d8d048fc1d 100644
--- a/apps/files_external/lib/Service/DBConfigService.php
+++ b/apps/files_external/lib/Service/DBConfigService.php
@@ -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
*