From e51467689d29ad68b7562d4b729ad5435f2ba54b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 21 Apr 2016 14:48:08 +0200 Subject: [PATCH] mount custom cache folder using mount providers --- lib/private/Files/Filesystem.php | 19 ----- lib/private/Server.php | 10 ++- .../files/mount/cachemountprovider.php | 69 +++++++++++++++++++ 3 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 lib/private/files/mount/cachemountprovider.php diff --git a/lib/private/Files/Filesystem.php b/lib/private/Files/Filesystem.php index 7cd1f56071..d1162324cb 100644 --- a/lib/private/Files/Filesystem.php +++ b/lib/private/Files/Filesystem.php @@ -423,8 +423,6 @@ class Filesystem { $home = \OC\Files\Filesystem::getStorage($user); - self::mountCacheDir($user); - // Chance to mount for other storages /** @var \OC\Files\Config\MountProviderCollection $mountConfigManager */ $mountConfigManager = \OC::$server->getMountProviderCollection(); @@ -460,23 +458,6 @@ class Filesystem { } } - /** - * Mounts the cache directory - * - * @param string $user user name - */ - private static function mountCacheDir($user) { - $cacheBaseDir = \OC::$server->getConfig()->getSystemValue('cache_path', ''); - if ($cacheBaseDir !== '') { - $cacheDir = rtrim($cacheBaseDir, '/') . '/' . $user; - if (!file_exists($cacheDir)) { - mkdir($cacheDir, 0770, true); - } - // mount external cache dir to "/$user/cache" mount point - self::mount('\OC\Files\Storage\Local', array('datadir' => $cacheDir), '/' . $user . '/cache'); - } - } - /** * get the default filesystem view * diff --git a/lib/private/Server.php b/lib/private/Server.php index d37edc4f45..11cce49441 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -47,6 +47,7 @@ use OC\Diagnostics\NullQueryLogger; use OC\Diagnostics\QueryLogger; use OC\Files\Config\UserMountCache; use OC\Files\Config\UserMountCacheListener; +use OC\Files\Mount\CacheMountProvider; use OC\Files\Node\HookConnector; use OC\Files\Node\LazyRoot; use OC\Files\Node\Root; @@ -444,7 +445,14 @@ class Server extends ServerContainer implements IServerContainer { $this->registerService('MountConfigManager', function (Server $c) { $loader = \OC\Files\Filesystem::getLoader(); $mountCache = $c->query('UserMountCache'); - return new \OC\Files\Config\MountProviderCollection($loader, $mountCache); + $manager = new \OC\Files\Config\MountProviderCollection($loader, $mountCache); + + // builtin providers + + $config = $c->getConfig(); + $manager->registerProvider(new CacheMountProvider($config)); + + return $manager; }); $this->registerService('IniWrapper', function ($c) { return new IniGetWrapper(); diff --git a/lib/private/files/mount/cachemountprovider.php b/lib/private/files/mount/cachemountprovider.php new file mode 100644 index 0000000000..c8422c4a50 --- /dev/null +++ b/lib/private/files/mount/cachemountprovider.php @@ -0,0 +1,69 @@ + + * + * @copyright Copyright (c) 2016, 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\Mount; + +use OCP\Files\Config\IMountProvider; +use OCP\Files\Storage\IStorageFactory; +use OCP\IConfig; +use OCP\IUser; + +/** + * Mount provider for custom cache storages + */ +class CacheMountProvider implements IMountProvider { + /** + * @var IConfig + */ + private $config; + + /** + * ObjectStoreHomeMountProvider constructor. + * + * @param IConfig $config + */ + public function __construct(IConfig $config) { + $this->config = $config; + } + + /** + * Get the cache mount for a user + * + * @param IUser $user + * @param IStorageFactory $loader + * @return \OCP\Files\Mount\IMountPoint[] + */ + public function getMountsForUser(IUser $user, IStorageFactory $loader) { + $cacheBaseDir = $this->config->getSystemValue('cache_path', ''); + if ($cacheBaseDir !== '') { + $cacheDir = rtrim($cacheBaseDir, '/') . '/' . $user->getUID(); + if (!file_exists($cacheDir)) { + mkdir($cacheDir, 0770, true); + } + + return [ + new MountPoint('\OC\Files\Storage\Local', '/' . $user->getUID() . '/cache', ['datadir' => $cacheDir, $loader]) + ]; + } else { + return []; + } + } +}