Merge pull request #7829 from owncloud/cachefolderlocation

Cache folder is now configurable
This commit is contained in:
Vincent Petry 2014-03-28 12:08:38 +01:00
commit 040f430f0c
5 changed files with 111 additions and 9 deletions

View File

@ -276,6 +276,15 @@ $CONFIG = array(
/* all css and js files will be served by the web server statically in one js file and ons css file*/
'asset-pipeline.enabled' => false,
/* where mount.json file should be stored, defaults to data/mount.json */
'mount_file' => '',
/* where mount.json file should be stored, defaults to data/mount.json */
'mount_file' => '',
/*
* Location of the cache folder, defaults to "data/$user/cache" where "$user" is the current user.
*
* When specified, the format will change to "$cache_path/$user" where "$cache_path" is the configured
* cache directory and "$user" is the user.
*
*/
'cache_path' => ''
);

View File

@ -1,6 +1,7 @@
<?php
/**
* Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
* Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
@ -10,22 +11,22 @@ namespace OC\Cache;
class File {
protected $storage;
/**
* Returns the cache storage for the logged in user
* @return cache storage
*/
protected function getStorage() {
if (isset($this->storage)) {
return $this->storage;
}
if(\OC_User::isLoggedIn()) {
\OC\Files\Filesystem::initMountPoints(\OC_User::getUser());
$subdir = 'cache';
$view = new \OC\Files\View('/' . \OC_User::getUser());
if(!$view->file_exists($subdir)) {
$view->mkdir($subdir);
}
$this->storage = new \OC\Files\View('/' . \OC_User::getUser().'/'.$subdir);
$this->storage = new \OC\Files\View('/' . \OC_User::getUser() . '/cache');
return $this->storage;
}else{
\OC_Log::write('core', 'Can\'t get cache storage, user not logged in', \OC_Log::ERROR);
return false;
throw new \OC\ForbiddenException('Can\t get cache storage, user not logged in');
}
}

View File

@ -321,10 +321,35 @@ class Filesystem {
self::mount('\OC\Files\Storage\Local', array('datadir' => $root), $user);
}
self::mountCacheDir($user);
// Chance to mount for other storages
\OC_Hook::emit('OC_Filesystem', 'post_initMountPoints', array('user' => $user, 'user_dir' => $root));
}
/**
* Mounts the cache directory
* @param string $user user name
*/
private static function mountCacheDir($user) {
$cacheBaseDir = \OC_Config::getValue('cache_path', '');
if ($cacheBaseDir === '') {
// use local cache dir relative to the user's home
$subdir = 'cache';
$view = new \OC\Files\View('/' . $user);
if(!$view->file_exists($subdir)) {
$view->mkdir($subdir);
}
} else {
$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
*

View File

@ -0,0 +1,16 @@
<?php
/**
* Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC;
/**
* Exception thrown whenever access to a resource has
* been forbidden or whenever a user isn't authenticated.
*/
class ForbiddenException extends \Exception {
}

View File

@ -226,4 +226,55 @@ class Filesystem extends \PHPUnit_Framework_TestCase {
$path = $arguments['path'];
$this->assertEquals($path, \OC\Files\Filesystem::normalizePath($path)); //the path passed to the hook should already be normalized
}
/**
* Test that the default cache dir is part of the user's home
*/
public function testMountDefaultCacheDir() {
$userId = uniqid('user_');
$oldCachePath = \OC_Config::getValue('cache_path', '');
// no cache path configured
\OC_Config::setValue('cache_path', '');
\OC_User::createUser($userId, $userId);
\OC\Files\Filesystem::initMountPoints($userId);
$this->assertEquals(
'/' . $userId . '/',
\OC\Files\Filesystem::getMountPoint('/' . $userId . '/cache')
);
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath('/' . $userId . '/cache');
$this->assertInstanceOf('\OC\Files\Storage\Home', $storage);
$this->assertEquals('cache', $internalPath);
\OC_User::deleteUser($userId);
\OC_Config::setValue('cache_path', $oldCachePath);
}
/**
* Test that an external cache is mounted into
* the user's home
*/
public function testMountExternalCacheDir() {
$userId = uniqid('user_');
$oldCachePath = \OC_Config::getValue('cache_path', '');
// set cache path to temp dir
$cachePath = \OC_Helper::tmpFolder() . '/extcache';
\OC_Config::setValue('cache_path', $cachePath);
\OC_User::createUser($userId, $userId);
\OC\Files\Filesystem::initMountPoints($userId);
$this->assertEquals(
'/' . $userId . '/cache/',
\OC\Files\Filesystem::getMountPoint('/' . $userId . '/cache')
);
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath('/' . $userId . '/cache');
$this->assertInstanceOf('\OC\Files\Storage\Local', $storage);
$this->assertEquals('', $internalPath);
\OC_User::deleteUser($userId);
\OC_Config::setValue('cache_path', $oldCachePath);
}
}