diff options
author | Jörn Friedrich Dreyer <jfd@butonic.de> | 2013-10-31 10:20:03 -0700 |
---|---|---|
committer | Jörn Friedrich Dreyer <jfd@butonic.de> | 2013-10-31 10:20:03 -0700 |
commit | b4cdac0a603c8912b55a5950570ab22ab17f4219 (patch) | |
tree | 54864cc8026a2803bdfd7ce9d7dcf8442cfe8d14 | |
parent | be07e828ef67f7cc5ac576c9ebaea83693825c34 (diff) | |
parent | 261cd87efa5623b51bbfa466f94d243bb7b49336 (diff) | |
download | nextcloud-server-b4cdac0a603c8912b55a5950570ab22ab17f4219.tar.gz nextcloud-server-b4cdac0a603c8912b55a5950570ab22ab17f4219.zip |
Merge pull request #5591 from owncloud/home-storage
Make home folders movable without requiring rescans
-rw-r--r-- | lib/private/files/cache/storage.php | 15 | ||||
-rw-r--r-- | lib/private/files/filesystem.php | 8 | ||||
-rw-r--r-- | lib/private/files/storage/home.php | 31 | ||||
-rw-r--r-- | tests/lib/files/storage/home.php | 71 |
4 files changed, 123 insertions, 2 deletions
diff --git a/lib/private/files/cache/storage.php b/lib/private/files/cache/storage.php index 8a9e47ca36d..5657cf06e12 100644 --- a/lib/private/files/cache/storage.php +++ b/lib/private/files/cache/storage.php @@ -48,7 +48,7 @@ class Storage { } public static function getStorageId($numericId) { - + $sql = 'SELECT `id` FROM `*PREFIX*storages` WHERE `numeric_id` = ?'; $result = \OC_DB::executeAudited($sql, array($numericId)); if ($row = $result->fetchRow()) { @@ -57,4 +57,17 @@ class Storage { return null; } } + + public static function exists($storageId) { + if (strlen($storageId) > 64) { + $storageId = md5($storageId); + } + $sql = 'SELECT `numeric_id` FROM `*PREFIX*storages` WHERE `id` = ?'; + $result = \OC_DB::executeAudited($sql, array($storageId)); + if ($row = $result->fetchRow()) { + return true; + } else { + return false; + } + } } diff --git a/lib/private/files/filesystem.php b/lib/private/files/filesystem.php index 10ec5c41d11..e40502bbe64 100644 --- a/lib/private/files/filesystem.php +++ b/lib/private/files/filesystem.php @@ -305,7 +305,13 @@ class Filesystem { $parser = new \OC\ArrayParser(); $root = \OC_User::getHome($user); - self::mount('\OC\Files\Storage\Local', array('datadir' => $root), $user); + + $userObject = \OC_User::getManager()->get($user); + if (\OC\Files\Cache\Storage::exists('local::' . $root . '/') or is_null($userObject)) { + self::mount('\OC\Files\Storage\Local', array('datadir' => $root), $user); + } else { + self::mount('\OC\Files\Storage\Home', array('user' => $userObject), $user); + } $datadir = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data"); //move config file to it's new position diff --git a/lib/private/files/storage/home.php b/lib/private/files/storage/home.php new file mode 100644 index 00000000000..47a76c1b840 --- /dev/null +++ b/lib/private/files/storage/home.php @@ -0,0 +1,31 @@ +<?php +/** + * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Files\Storage; + +/** + * Specialized version of Local storage for home directory usage + */ +class Home extends Local { + /** + * @var \OC\User\User $user + */ + protected $user; + + public function __construct($arguments) { + $this->user = $arguments['user']; + $this->datadir = $this->user->getHome(); + if (substr($this->datadir, -1) !== '/') { + $this->datadir .= '/'; + } + } + + public function getId() { + return 'home::' . $this->user->getUID(); + } +} diff --git a/tests/lib/files/storage/home.php b/tests/lib/files/storage/home.php new file mode 100644 index 00000000000..b01e07f7457 --- /dev/null +++ b/tests/lib/files/storage/home.php @@ -0,0 +1,71 @@ +<?php +/** + * ownCloud + * + * @author Robin Appelman + * @copyright 2012 Robin Appelman icewind@owncloud.com + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library 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 along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test\Files\Storage; + +use OC\User\User; + +class DummyUser extends User { + private $home; + + private $uid; + + public function __construct($uid, $home) { + $this->uid = $uid; + $this->home = $home; + } + + public function getHome() { + return $this->home; + } + + public function getUID() { + return $this->uid; + } +} + +class Home extends Storage { + /** + * @var string tmpDir + */ + private $tmpDir; + + /** + * @var \OC\User\User $user + */ + private $user; + + public function setUp() { + $this->tmpDir = \OC_Helper::tmpFolder(); + $userId = uniqid('user_'); + $this->user = new DummyUser($userId, $this->tmpDir); + $this->instance = new \OC\Files\Storage\Home(array('user' => $this->user)); + } + + public function tearDown() { + \OC_Helper::rmdirr($this->tmpDir); + } + + public function testRoot() { + $this->assertEquals($this->tmpDir, $this->instance->getLocalFolder('')); + } +} |