Commit 356eef07 authored by Vincent Petry's avatar Vincent Petry
Browse files

Quota storage wrapper is now used for all users in sharing mode

When accessing a shared folder, the folder's owner appears as mountpoint
but wasn't wrapped by a quota storage wrapper.

This fix makes sure that all home storages are wrapped by a quota
storage wrapper, if applicable, to make sure quotas are respected when
uploading into shared folders.
parent 391f267d
...@@ -22,9 +22,18 @@ ...@@ -22,9 +22,18 @@
*/ */
class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase { class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
private static $user;
function setUp() { function setUp() {
// mock OC_L10n // mock OC_L10n
if (!self::$user) {
self::$user = uniqid();
}
\OC_User::createUser(self::$user, 'password');
\OC_User::setUserId(self::$user);
\OC\Files\Filesystem::init(self::$user, '/' . self::$user . '/files');
$l10nMock = $this->getMock('\OC_L10N', array('t'), array(), '', false); $l10nMock = $this->getMock('\OC_L10N', array('t'), array(), '', false);
$l10nMock->expects($this->any()) $l10nMock->expects($this->any())
->method('t') ->method('t')
...@@ -39,6 +48,12 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase { ...@@ -39,6 +48,12 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase {
$this->files = new \OCA\Files\App($viewMock, $l10nMock); $this->files = new \OCA\Files\App($viewMock, $l10nMock);
} }
function tearDown() {
$result = \OC_User::deleteUser(self::$user);
$this->assertTrue($result);
\OC\Files\Filesystem::tearDown();
}
/** /**
* @brief test rename of file/folder named "Shared" * @brief test rename of file/folder named "Shared"
*/ */
......
...@@ -53,16 +53,31 @@ class OC_Util { ...@@ -53,16 +53,31 @@ class OC_Util {
//if we aren't logged in, there is no use to set up the filesystem //if we aren't logged in, there is no use to set up the filesystem
if( $user != "" ) { if( $user != "" ) {
$quota = self::getUserQuota($user); \OC\Files\Filesystem::addStorageWrapper(function($mountPoint, $storage){
if ($quota !== \OC\Files\SPACE_UNLIMITED) { // set up quota for home storages, even for other users
\OC\Files\Filesystem::addStorageWrapper(function($mountPoint, $storage) use ($quota, $user) { // which can happen when using sharing
if ($mountPoint === '/' . $user . '/'){
return new \OC\Files\Storage\Wrapper\Quota(array('storage' => $storage, 'quota' => $quota)); if (strlen($mountPoint) > 1) {
} else { // the user name will be extracted from the mountpoint
return $storage; // with the format '/username/' (no suffix)
$user = null;
// find second separator
$nextSepPos = strpos($mountPoint, '/', 1);
// next separator is the last one, format matches
if ($nextSepPos === strlen($mountPoint) - 1) {
$user = substr($mountPoint, 1, $nextSepPos - 1);
} }
}); if ($user) {
} $quota = OC_Util::getUserQuota($user);
if ($quota !== \OC\Files\SPACE_UNLIMITED) {
return new \OC\Files\Storage\Wrapper\Quota(array('storage' => $storage, 'quota' => $quota));
}
}
}
return $storage;
});
$userDir = '/'.$user.'/files'; $userDir = '/'.$user.'/files';
$userRoot = OC_User::getHome($user); $userRoot = OC_User::getHome($user);
$userDirectory = $userRoot . '/files'; $userDirectory = $userRoot . '/files';
......
...@@ -93,6 +93,55 @@ class Test_Util extends PHPUnit_Framework_TestCase { ...@@ -93,6 +93,55 @@ class Test_Util extends PHPUnit_Framework_TestCase {
$this->assertStringStartsWith('oc', OC_Util::getInstanceId()); $this->assertStringStartsWith('oc', OC_Util::getInstanceId());
} }
/**
* Tests that the home storage is not wrapped when no quota exists.
*/
function testHomeStorageWrapperWithoutQuota() {
$user1 = uniqid();
\OC_User::createUser($user1, 'test');
OC_Preferences::setValue($user1, 'files', 'quota', 'none');
\OC_User::setUserId($user1);
\OC_Util::setupFS($user1);
$userMount = \OC\Files\Filesystem::getMountManager()->find('/' . $user1 . '/');
$this->assertNotNull($userMount);
$this->assertNotInstanceOf('\OC\Files\Storage\Wrapper\Quota', $userMount->getStorage());
// clean up
\OC_User::setUserId('');
\OC_User::deleteUser($user1);
OC_Preferences::deleteUser($user1);
\OC_Util::tearDownFS();
}
/**
* Tests that the home storage is not wrapped when no quota exists.
*/
function testHomeStorageWrapperWithQuota() {
$user1 = uniqid();
\OC_User::createUser($user1, 'test');
OC_Preferences::setValue($user1, 'files', 'quota', '1024');
\OC_User::setUserId($user1);
\OC_Util::setupFS($user1);
$userMount = \OC\Files\Filesystem::getMountManager()->find('/' . $user1 . '/');
$this->assertNotNull($userMount);
$this->assertInstanceOf('\OC\Files\Storage\Wrapper\Quota', $userMount->getStorage());
// ensure that root wasn't wrapped
$rootMount = \OC\Files\Filesystem::getMountManager()->find('/');
$this->assertNotNull($rootMount);
$this->assertNotInstanceOf('\OC\Files\Storage\Wrapper\Quota', $rootMount->getStorage());
// clean up
\OC_User::setUserId('');
\OC_User::deleteUser($user1);
OC_Preferences::deleteUser($user1);
\OC_Util::tearDownFS();
}
/** /**
* @dataProvider baseNameProvider * @dataProvider baseNameProvider
*/ */
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment