From be380accb90d0a4f72a56a1166072b20731b0083 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 3 Dec 2015 14:10:05 +0100 Subject: [PATCH] clear mount cache when deleting user --- lib/private/files/config/usermountcache.php | 13 +++++ .../files/config/usermountcachelistener.php | 48 +++++++++++++++++++ lib/private/server.php | 48 ++++++++++++------- lib/public/files/config/iusermountcache.php | 10 +++- 4 files changed, 101 insertions(+), 18 deletions(-) create mode 100644 lib/private/files/config/usermountcachelistener.php diff --git a/lib/private/files/config/usermountcache.php b/lib/private/files/config/usermountcache.php index 15eefd4376..fb46e70fa5 100644 --- a/lib/private/files/config/usermountcache.php +++ b/lib/private/files/config/usermountcache.php @@ -195,4 +195,17 @@ class UserMountCache implements IUserMountCache { return array_map([$this, 'dbRowToMountInfo'], $rows); } + + /** + * Remove all cached mounts for a user + * + * @param IUser $user + */ + public function removeUserMounts(IUser $user) { + $builder = $this->connection->getQueryBuilder(); + + $query = $builder->delete('mounts') + ->where($builder->expr()->eq('user_id', $builder->createNamedParameter($user->getUID()))); + $query->execute(); + } } diff --git a/lib/private/files/config/usermountcachelistener.php b/lib/private/files/config/usermountcachelistener.php new file mode 100644 index 0000000000..344bebe342 --- /dev/null +++ b/lib/private/files/config/usermountcachelistener.php @@ -0,0 +1,48 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see + * + */ + +namespace OC\Files\Config; + +use OC\User\Manager; +use OCP\Files\Config\IUserMountCache; + +/** + * Listen to hooks and update the mount cache as needed + */ +class UserMountCacheListener { + /** + * @var IUserMountCache + */ + private $userMountCache; + + /** + * UserMountCacheListener constructor. + * + * @param IUserMountCache $userMountCache + */ + public function __construct(IUserMountCache $userMountCache) { + $this->userMountCache = $userMountCache; + } + + public function listen(Manager $manager) { + $manager->listen('\OC\User', 'postDelete', [$this->userMountCache, 'removeUserMounts']); + } +} diff --git a/lib/private/server.php b/lib/private/server.php index e3a303b84e..9a1f8548b9 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -48,6 +48,7 @@ use OC\Diagnostics\NullEventLogger; use OC\Diagnostics\NullQueryLogger; use OC\Diagnostics\QueryLogger; use OC\Files\Config\UserMountCache; +use OC\Files\Config\UserMountCacheListener; use OC\Files\Node\HookConnector; use OC\Files\Node\Root; use OC\Files\View; @@ -137,7 +138,7 @@ class Server extends ServerContainer implements IServerContainer { return new Encryption\Keys\Storage($view, $util); }); - $this->registerService('TagMapper', function(Server $c) { + $this->registerService('TagMapper', function (Server $c) { return new TagMapper($c->getDatabaseConnection()); }); $this->registerService('TagManager', function (Server $c) { @@ -266,13 +267,13 @@ class Server extends ServerContainer implements IServerContainer { $this->registerService('MemCacheFactory', function (Server $c) { $config = $c->getConfig(); - if($config->getSystemValue('installed', false) && !(defined('PHPUNIT_RUN') && PHPUNIT_RUN)) { + if ($config->getSystemValue('installed', false) && !(defined('PHPUNIT_RUN') && PHPUNIT_RUN)) { $v = \OC_App::getAppVersions(); $v['core'] = md5(file_get_contents(\OC::$SERVERROOT . '/version.php')); $version = implode(',', $v); $instanceId = \OC_Util::getInstanceId(); $path = \OC::$SERVERROOT; - $prefix = md5($instanceId.'-'.$version.'-'.$path); + $prefix = md5($instanceId . '-' . $version . '-' . $path); return new \OC\Memcache\Factory($prefix, $c->getLogger(), $config->getSystemValue('memcache.local', null), $config->getSystemValue('memcache.distributed', null), @@ -383,7 +384,7 @@ class Server extends ServerContainer implements IServerContainer { $c->getConfig() ); }); - $this->registerService('AppManager', function(Server $c) { + $this->registerService('AppManager', function (Server $c) { return new \OC\App\AppManager( $c->getUserSession(), $c->getAppConfig(), @@ -391,13 +392,13 @@ class Server extends ServerContainer implements IServerContainer { $c->getMemCacheFactory() ); }); - $this->registerService('DateTimeZone', function(Server $c) { + $this->registerService('DateTimeZone', function (Server $c) { return new DateTimeZone( $c->getConfig(), $c->getSession() ); }); - $this->registerService('DateTimeFormatter', function(Server $c) { + $this->registerService('DateTimeFormatter', function (Server $c) { $language = $c->getConfig()->getUserValue($c->getSession()->get('user_id'), 'core', 'lang', null); return new DateTimeFormatter( @@ -405,9 +406,15 @@ class Server extends ServerContainer implements IServerContainer { $c->getL10N('lib', $language) ); }); + $this->registerService('UserMountCache', function (Server $c) { + $mountCache = new UserMountCache($c->getDatabaseConnection(), $c->getUserManager(), $c->getLogger()); + $listener = new UserMountCacheListener($mountCache); + $listener->listen($c->getUserManager()); + return $mountCache; + }); $this->registerService('MountConfigManager', function (Server $c) { $loader = \OC\Files\Filesystem::getLoader(); - $mountCache = new UserMountCache($c->getDatabaseConnection(), $c->getUserManager(), $c->getLogger()); + $mountCache = $c->query('UserMountCache'); return new \OC\Files\Config\MountProviderCollection($loader, $mountCache); }); $this->registerService('IniWrapper', function ($c) { @@ -480,14 +487,14 @@ class Server extends ServerContainer implements IServerContainer { $stream ); }); - $this->registerService('Mailer', function(Server $c) { + $this->registerService('Mailer', function (Server $c) { return new Mailer( $c->getConfig(), $c->getLogger(), new \OC_Defaults() ); }); - $this->registerService('OcsClient', function(Server $c) { + $this->registerService('OcsClient', function (Server $c) { return new OCSClient( $this->getHTTPClientService(), $this->getConfig(), @@ -509,24 +516,24 @@ class Server extends ServerContainer implements IServerContainer { $this->registerService('MountManager', function () { return new \OC\Files\Mount\Manager(); }); - $this->registerService('MimeTypeDetector', function(Server $c) { + $this->registerService('MimeTypeDetector', function (Server $c) { return new \OC\Files\Type\Detection( $c->getURLGenerator(), \OC::$SERVERROOT . '/config/', \OC::$SERVERROOT . '/resources/config/' - ); + ); }); - $this->registerService('MimeTypeLoader', function(Server $c) { + $this->registerService('MimeTypeLoader', function (Server $c) { return new \OC\Files\Type\Loader( $c->getDatabaseConnection() ); }); - $this->registerService('NotificationManager', function() { + $this->registerService('NotificationManager', function () { return new Manager(); }); $this->registerService('CapabilitiesManager', function (Server $c) { $manager = new \OC\CapabilitiesManager(); - $manager->registerCapability(function() use ($c) { + $manager->registerCapability(function () use ($c) { return new \OC\OCS\CoreCapabilities($c->getConfig()); }); return $manager; @@ -538,7 +545,7 @@ class Server extends ServerContainer implements IServerContainer { $factory = new $factoryClass(); return $factory->getManager(); }); - $this->registerService('EventDispatcher', function() { + $this->registerService('EventDispatcher', function () { return new EventDispatcher(); }); $this->registerService('CryptoWrapper', function (Server $c) { @@ -923,6 +930,7 @@ class Server extends ServerContainer implements IServerContainer { /** * Returns an instance of the db facade + * * @deprecated use getDatabaseConnection, will be removed in ownCloud 10 * @return \OCP\IDb */ @@ -932,6 +940,7 @@ class Server extends ServerContainer implements IServerContainer { /** * Returns an instance of the HTTP helper class + * * @deprecated Use getHTTPClientService() * @return \OC\HTTPHelper */ @@ -1057,7 +1066,7 @@ class Server extends ServerContainer implements IServerContainer { /** * @return \OCP\Files\Config\IMountProviderCollection */ - public function getMountProviderCollection(){ + public function getMountProviderCollection() { return $this->query('MountConfigManager'); } @@ -1073,7 +1082,7 @@ class Server extends ServerContainer implements IServerContainer { /** * @return \OCP\Command\IBus */ - public function getCommandBus(){ + public function getCommandBus() { return $this->query('AsyncCommandBus'); } @@ -1173,6 +1182,7 @@ class Server extends ServerContainer implements IServerContainer { /** * Not a public API as of 8.2, wait for 9.0 + * * @return \OCA\Files_External\Service\BackendService */ public function getStoragesBackendService() { @@ -1181,6 +1191,7 @@ class Server extends ServerContainer implements IServerContainer { /** * Not a public API as of 8.2, wait for 9.0 + * * @return \OCA\Files_External\Service\GlobalStoragesService */ public function getGlobalStoragesService() { @@ -1189,6 +1200,7 @@ class Server extends ServerContainer implements IServerContainer { /** * Not a public API as of 8.2, wait for 9.0 + * * @return \OCA\Files_External\Service\UserGlobalStoragesService */ public function getUserGlobalStoragesService() { @@ -1197,6 +1209,7 @@ class Server extends ServerContainer implements IServerContainer { /** * Not a public API as of 8.2, wait for 9.0 + * * @return \OCA\Files_External\Service\UserStoragesService */ public function getUserStoragesService() { @@ -1210,4 +1223,5 @@ class Server extends ServerContainer implements IServerContainer { public function getShareManager() { return $this->query('ShareManager'); } + } diff --git a/lib/public/files/config/iusermountcache.php b/lib/public/files/config/iusermountcache.php index 156ebbf448..888e5d41e2 100644 --- a/lib/public/files/config/iusermountcache.php +++ b/lib/public/files/config/iusermountcache.php @@ -31,7 +31,7 @@ use OCP\IUser; */ interface IUserMountCache { /** - * Register a mount for a user to the cache + * Register mounts for a user to the cache * * @param IUser $user * @param IMountPoint[] $mounts @@ -59,4 +59,12 @@ interface IUserMountCache { * @since 9.0.0 */ public function getMountsForRootId($rootFileId); + + /** + * Remove all cached mounts for a user + * + * @param IUser $user + * @since 9.0.0 + */ + public function removeUserMounts(IUser $user); }