diff options
author | Joas Schilling <213943+nickvergessen@users.noreply.github.com> | 2019-12-04 15:28:57 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-12-04 15:28:57 +0100 |
commit | 254d4e096427bf6c8219247b1e1186e626478914 (patch) | |
tree | fc14f199d6436bec611232f1b3aa7f85a1c9df61 /apps/files_external | |
parent | 81b919ed9f497c975d1b8158abdcdabb0712f39e (diff) | |
parent | 4baab51f4ccdf44399f656e5a5acf89d1f6b779b (diff) | |
download | nextcloud-server-254d4e096427bf6c8219247b1e1186e626478914.tar.gz nextcloud-server-254d4e096427bf6c8219247b1e1186e626478914.zip |
Merge pull request #17920 from nextcloud/fix/15258/ext-storage-respect-deletion
when a user was deleted remove them from applicable list, unless...
Diffstat (limited to 'apps/files_external')
-rw-r--r-- | apps/files_external/appinfo/app.php | 2 | ||||
-rw-r--r-- | apps/files_external/lib/AppInfo/Application.php | 28 | ||||
-rw-r--r-- | apps/files_external/lib/Service/DBConfigService.php | 32 |
3 files changed, 62 insertions, 0 deletions
diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php index 856b04fde15..7d0301dd588 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 = \OC::$server->query(\OCA\Files_External\AppInfo\Application::class); +\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 1ee7cb08ccf..47c88a67d20 100644 --- a/apps/files_external/lib/AppInfo/Application.php +++ b/apps/files_external/lib/AppInfo/Application.php @@ -30,6 +30,7 @@ namespace OCA\Files_External\AppInfo; use OCA\Files_External\Config\UserPlaceholderHandler; +use OCA\Files_External\Service\DBConfigService; use OCA\Files_External\Lib\Auth\AmazonS3\AccessKey; use OCA\Files_External\Lib\Auth\Builtin; use OCA\Files_External\Lib\Auth\NullMechanism; @@ -63,6 +64,9 @@ use OCA\Files_External\Service\BackendService; use OCP\AppFramework\App; use OCP\AppFramework\IAppContainer; use OCP\Files\Config\IUserMountCache; +use OCP\IGroup; +use OCP\IUser; +use Symfony\Component\EventDispatcher\GenericEvent; /** * @package OCA\Files_External\AppInfo @@ -96,6 +100,30 @@ 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()); + } + ); + $dispatcher->addListener( + IGroup::class . '::postDelete', + function (GenericEvent $event) { + /** @var IGroup $group */ + $group = $event->getSubject(); + /** @var DBConfigService $config */ + $config = $this->getContainer()->query(DBConfigService::class); + $config->modifyMountsOnGroupDelete($group->getGID()); + } + ); + } + /** * @{inheritdoc} */ diff --git a/apps/files_external/lib/Service/DBConfigService.php b/apps/files_external/lib/Service/DBConfigService.php index 65995b21cc4..9394924d396 100644 --- a/apps/files_external/lib/Service/DBConfigService.php +++ b/apps/files_external/lib/Service/DBConfigService.php @@ -114,6 +114,38 @@ class DBConfigService { return $this->getMountsFromQuery($query); } + public function modifyMountsOnUserDelete(string $uid): void { + $this->modifyMountsOnDelete($uid, self::APPLICABLE_TYPE_USER); + } + + public function modifyMountsOnGroupDelete(string $gid): void { + $this->modifyMountsOnDelete($gid, self::APPLICABLE_TYPE_GROUP); + } + + protected function modifyMountsOnDelete(string $applicableId, int $applicableType): void { + $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( + $builder->expr()->eq('a.type', $builder->createNamedParameter($applicableType, IQueryBuilder::PARAM_INT)), + $builder->expr()->eq('a.value', $builder->createNamedParameter($applicableId)) + ) + ) + ->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'], $applicableType, $applicableId); + } else { + $this->removeMount($row['mount_id']); + } + } + } + /** * Get admin defined mounts * |