From abe338f4335ad4a4f0b6211b032e48f80962292f Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Mon, 23 May 2016 21:03:25 +0200 Subject: [PATCH] Store user bucket in preferences --- .htaccess | 4 - .../Files/Mount/ObjectHomeMountProvider.php | 24 +++-- .../Mount/ObjectHomeMountProviderTest.php | 90 +++++++++++++++++-- 3 files changed, 98 insertions(+), 20 deletions(-) diff --git a/.htaccess b/.htaccess index d19162fd7147..5bf7b321f0cc 100644 --- a/.htaccess +++ b/.htaccess @@ -72,7 +72,3 @@ Options -Indexes ModPagespeed Off -#### DO NOT CHANGE ANYTHING ABOVE THIS LINE #### - -ErrorDocument 403 /core/templates/403.php -ErrorDocument 404 /core/templates/404.php diff --git a/lib/private/Files/Mount/ObjectHomeMountProvider.php b/lib/private/Files/Mount/ObjectHomeMountProvider.php index 6903a5fd101e..f82313879dcd 100644 --- a/lib/private/Files/Mount/ObjectHomeMountProvider.php +++ b/lib/private/Files/Mount/ObjectHomeMountProvider.php @@ -108,15 +108,23 @@ private function getMultiBucketObjectStoreConfig(IUser $user) { } $config['arguments']['user'] = $user; - /* - * Use any provided bucket argument as prefix - * and add the mapping from username => bucket - */ - if (!isset($config['arguments']['bucket'])) { - $config['arguments']['bucket'] = ''; + $bucket = $this->config->getUserValue($user->getUID(), 'homeobjectstore', 'bucket', null); + + if ($bucket === null) { + /* + * Use any provided bucket argument as prefix + * and add the mapping from username => bucket + */ + if (!isset($config['arguments']['bucket'])) { + $config['arguments']['bucket'] = ''; + } + $mapper = new \OC\Files\ObjectStore\Mapper($user); + $config['arguments']['bucket'] .= $mapper->getBucket(); + + $this->config->setUserValue($user->getUID(), 'homeobjectstore', 'bucket', $config['arguments']['bucket']); + } else { + $config['arguments']['bucket'] = $bucket; } - $mapper = new \OC\Files\ObjectStore\Mapper($user); - $config['arguments']['bucket'] .= $mapper->getBucket(); // instantiate object store implementation $config['arguments']['objectstore'] = new $config['class']($config['arguments']); diff --git a/tests/lib/Files/Mount/ObjectHomeMountProviderTest.php b/tests/lib/Files/Mount/ObjectHomeMountProviderTest.php index 202c2c02b987..5d987f0d059f 100644 --- a/tests/lib/Files/Mount/ObjectHomeMountProviderTest.php +++ b/tests/lib/Files/Mount/ObjectHomeMountProviderTest.php @@ -61,11 +61,29 @@ public function testMultiBucket() { 'class' => 'Test\Files\Mount\FakeObjectStore', ]); - $this->user->expects($this->once()) - ->method('getUID') + $this->user->method('getUID') ->willReturn('uid'); $this->loader->expects($this->never())->method($this->anything()); + $this->config->expects($this->once()) + ->method('getUserValue') + ->with( + $this->equalTo('uid'), + $this->equalTo('homeobjectstore'), + $this->equalTo('bucket'), + $this->equalTo(null) + )->willReturn(null); + + $this->config->expects($this->once()) + ->method('setUserValue') + ->with( + $this->equalTo('uid'), + $this->equalTo('homeobjectstore'), + $this->equalTo('bucket'), + $this->equalTo('987'), + $this->equalTo(null) + ); + $config = $this->invokePrivate($this->provider, 'getMultiBucketObjectStoreConfig', [$this->user, $this->loader]); $this->assertArrayHasKey('class', $config); @@ -90,11 +108,29 @@ public function testMultiBucketWithPrefix() { ], ]); - $this->user->expects($this->once()) - ->method('getUID') + $this->user->method('getUID') ->willReturn('uid'); $this->loader->expects($this->never())->method($this->anything()); + $this->config->expects($this->once()) + ->method('getUserValue') + ->with( + $this->equalTo('uid'), + $this->equalTo('homeobjectstore'), + $this->equalTo('bucket'), + $this->equalTo(null) + )->willReturn(null); + + $this->config->expects($this->once()) + ->method('setUserValue') + ->with( + $this->equalTo('uid'), + $this->equalTo('homeobjectstore'), + $this->equalTo('bucket'), + $this->equalTo('myBucketPrefix987'), + $this->equalTo(null) + ); + $config = $this->invokePrivate($this->provider, 'getMultiBucketObjectStoreConfig', [$this->user, $this->loader]); $this->assertArrayHasKey('class', $config); @@ -108,6 +144,46 @@ public function testMultiBucketWithPrefix() { $this->assertEquals('myBucketPrefix987', $config['arguments']['bucket']); } + public function testMultiBucketBucketAlreadySet() { + $this->config->expects($this->once()) + ->method('getSystemValue') + ->with($this->equalTo('objectstore_multibucket'), '') + ->willReturn([ + 'class' => 'Test\Files\Mount\FakeObjectStore', + 'arguments' => [ + 'bucket' => 'myBucketPrefix', + ], + ]); + + $this->user->method('getUID') + ->willReturn('uid'); + $this->loader->expects($this->never())->method($this->anything()); + + $this->config->expects($this->once()) + ->method('getUserValue') + ->with( + $this->equalTo('uid'), + $this->equalTo('homeobjectstore'), + $this->equalTo('bucket'), + $this->equalTo(null) + )->willReturn('awesomeBucket1'); + + $this->config->expects($this->never()) + ->method('setUserValue'); + + $config = $this->invokePrivate($this->provider, 'getMultiBucketObjectStoreConfig', [$this->user, $this->loader]); + + $this->assertArrayHasKey('class', $config); + $this->assertEquals($config['class'], 'Test\Files\Mount\FakeObjectStore'); + $this->assertArrayHasKey('arguments', $config); + $this->assertArrayHasKey('user', $config['arguments']); + $this->assertSame($this->user, $config['arguments']['user']); + $this->assertArrayHasKey('objectstore', $config['arguments']); + $this->assertInstanceOf('Test\Files\Mount\FakeObjectStore', $config['arguments']['objectstore']); + $this->assertArrayHasKey('bucket', $config['arguments']); + $this->assertEquals('awesomeBucket1', $config['arguments']['bucket']); + } + public function testMultiBucketConfigFirst() { $this->config->expects($this->once()) ->method('getSystemValue') @@ -116,8 +192,7 @@ public function testMultiBucketConfigFirst() { 'class' => 'Test\Files\Mount\FakeObjectStore', ]); - $this->user->expects($this->exactly(2)) - ->method('getUID') + $this->user->method('getUID') ->willReturn('uid'); $this->loader->expects($this->never())->method($this->anything()); @@ -138,8 +213,7 @@ public function testMultiBucketConfigFirstFallBackSingle() { 'class' => 'Test\Files\Mount\FakeObjectStore', ]); - $this->user->expects($this->once()) - ->method('getUID') + $this->user->method('getUID') ->willReturn('uid'); $this->loader->expects($this->never())->method($this->anything());