Browse Source

Now using HomeStorage for legacy home storage ids

Legacy home storage ids with the format "local://path/to/datadir/user1"
are now also wrapped by the HomeStorage.
tags/list
Vincent Petry 10 years ago
parent
commit
34c92f6656

+ 11
- 3
lib/private/files/filesystem.php View File

@@ -307,10 +307,18 @@ class Filesystem {
$root = \OC_User::getHome($user);

$userObject = \OC_User::getManager()->get($user);
if (\OC\Files\Cache\Storage::exists('local::' . $root . '/') or is_null($userObject)) {

if (!is_null($userObject)) {
// check for legacy home id (<= 5.0.12)
if (\OC\Files\Cache\Storage::exists('local::' . $root . '/')) {
self::mount('\OC\Files\Storage\Home', array('user' => $userObject, 'legacy' => true), $user);
}
else {
self::mount('\OC\Files\Storage\Home', array('user' => $userObject), $user);
}
}
else {
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");


+ 13
- 1
lib/private/files/storage/home.php View File

@@ -12,6 +12,11 @@ namespace OC\Files\Storage;
* Specialized version of Local storage for home directory usage
*/
class Home extends Local {
/**
* @var string
*/
protected $id;

/**
* @var \OC\User\User $user
*/
@@ -20,12 +25,19 @@ class Home extends Local {
public function __construct($arguments) {
$this->user = $arguments['user'];
$datadir = $this->user->getHome();
if (isset($arguments['legacy']) && $arguments['legacy']) {
// legacy home id (<= 5.0.12)
$this->id = 'local::' . $datadir . '/';
}
else {
$this->id = 'home::' . $this->user->getUID();
}

parent::__construct(array('datadir' => $datadir));
}

public function getId() {
return 'home::' . $this->user->getUID();
return $this->id;
}

public function getCache($path = '') {

+ 64
- 0
tests/lib/files/filesystem.php View File

@@ -41,9 +41,12 @@ class Filesystem extends \PHPUnit_Framework_TestCase {
foreach ($this->tmpDirs as $dir) {
\OC_Helper::rmdirr($dir);
}
\OC\Files\Filesystem::clearMounts();
\OC_User::setUserId('');
}

public function setUp() {
\OC_User::setUserId('');
\OC\Files\Filesystem::clearMounts();
}

@@ -103,6 +106,67 @@ class Filesystem extends \PHPUnit_Framework_TestCase {
// \OC\Files\Filesystem::file_put_contents('/bar//foo', $fh);
}

/**
* Tests that a local storage mount is used when passed user
* does not exist.
*/
public function testLocalMountWhenUserDoesNotExist() {
$datadir = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data");
$userId = uniqid('user_');

\OC\Files\Filesystem::initMountPoints($userId);

$homeMount = \OC\Files\Filesystem::getStorage('/' . $userId . '/');

$this->assertInstanceOf('\OC\Files\Storage\Local', $homeMount);
$this->assertEquals('local::' . $datadir . '/' . $userId . '/', $homeMount->getId());
}

/**
* Tests that the home storage is used for the user's mount point
*/
public function testHomeMount() {
$userId = uniqid('user_');

\OC_User::createUser($userId, $userId);

\OC\Files\Filesystem::initMountPoints($userId);

$homeMount = \OC\Files\Filesystem::getStorage('/' . $userId . '/');

$this->assertInstanceOf('\OC\Files\Storage\Home', $homeMount);
$this->assertEquals('home::' . $userId, $homeMount->getId());

\OC_User::deleteUser($userId);
}

/**
* Tests that the home storage is used in legacy mode
* for the user's mount point
*/
public function testLegacyHomeMount() {
$datadir = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data");
$userId = uniqid('user_');

// insert storage into DB by constructing it
// to make initMountsPoint find its existence
$localStorage = new \OC\Files\Storage\Local(array('datadir' => $datadir . '/' . $userId . '/'));
// this will trigger the insert
$cache = $localStorage->getCache();

\OC_User::createUser($userId, $userId);
\OC\Files\Filesystem::initMountPoints($userId);

$homeMount = \OC\Files\Filesystem::getStorage('/' . $userId . '/');

$this->assertInstanceOf('\OC\Files\Storage\Home', $homeMount);
$this->assertEquals('local::' . $datadir. '/' . $userId . '/', $homeMount->getId());

\OC_User::deleteUser($userId);
// delete storage entry
$cache->clear();
}

public function dummyHook($arguments) {
$path = $arguments['path'];
$this->assertEquals($path, \OC\Files\Filesystem::normalizePath($path)); //the path passed to the hook should already be normalized

+ 27
- 2
tests/lib/files/storage/home.php View File

@@ -56,8 +56,8 @@ class Home extends Storage {

public function setUp() {
$this->tmpDir = \OC_Helper::tmpFolder();
$userId = uniqid('user_');
$this->user = new DummyUser($userId, $this->tmpDir);
$this->userId = uniqid('user_');
$this->user = new DummyUser($this->userId, $this->tmpDir);
$this->instance = new \OC\Files\Storage\Home(array('user' => $this->user));
}

@@ -65,7 +65,32 @@ class Home extends Storage {
\OC_Helper::rmdirr($this->tmpDir);
}

/**
* Tests that the root path matches the data dir
*/
public function testRoot() {
$this->assertEquals($this->tmpDir, $this->instance->getLocalFolder(''));
}

/**
* Tests that the home id is in the format home::user1
*/
public function testId() {
$this->assertEquals('home::' . $this->userId, $this->instance->getId());
}

/**
* Tests that the legacy home id is in the format local::/path/to/datadir/user1/
*/
public function testLegacyId() {
$this->instance = new \OC\Files\Storage\Home(array('user' => $this->user, 'legacy' => true));
$this->assertEquals('local::' . $this->tmpDir . '/', $this->instance->getId());
}

/**
* Tests that getCache() returns an instance of HomeCache
*/
public function testGetCacheReturnsHomeCache() {
$this->assertInstanceOf('\OC\Files\Cache\HomeCache', $this->instance->getCache());
}
}

Loading…
Cancel
Save