diff options
author | Thomas Müller <DeepDiver1975@users.noreply.github.com> | 2016-09-23 19:57:07 +0200 |
---|---|---|
committer | Lukas Reschke <lukas@statuscode.ch> | 2016-09-28 21:12:50 +0200 |
commit | bd96c6aa38618dd7533ffbb0b6148c7e1522c1a6 (patch) | |
tree | f6de7a031bbc7cf7d0f0965b08f7d3d947e5b643 /apps | |
parent | 2eaa2791b75f7c2c8c7892a5354f6e93fedaf396 (diff) | |
download | nextcloud-server-bd96c6aa38618dd7533ffbb0b6148c7e1522c1a6.tar.gz nextcloud-server-bd96c6aa38618dd7533ffbb0b6148c7e1522c1a6.zip |
Return ETag and OC-ETag in case of a move (#25683)
Downstreaming of https://github.com/owncloud/core/pull/25683
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
Diffstat (limited to 'apps')
-rw-r--r-- | apps/dav/lib/Connector/Sabre/CopyEtagHeaderPlugin.php | 26 | ||||
-rw-r--r-- | apps/dav/lib/Server.php | 17 | ||||
-rw-r--r-- | apps/dav/tests/unit/Connector/Sabre/CopyEtagHeaderPluginTest.php | 37 |
3 files changed, 69 insertions, 11 deletions
diff --git a/apps/dav/lib/Connector/Sabre/CopyEtagHeaderPlugin.php b/apps/dav/lib/Connector/Sabre/CopyEtagHeaderPlugin.php index b8f55d9e213..a39a3d29779 100644 --- a/apps/dav/lib/Connector/Sabre/CopyEtagHeaderPlugin.php +++ b/apps/dav/lib/Connector/Sabre/CopyEtagHeaderPlugin.php @@ -32,6 +32,9 @@ use \Sabre\HTTP\ResponseInterface; * or mangle Etag headers. */ class CopyEtagHeaderPlugin extends \Sabre\DAV\ServerPlugin { + + /** @var \Sabre\DAV\Server */ + private $server; /** * This initializes the plugin. * @@ -40,7 +43,10 @@ class CopyEtagHeaderPlugin extends \Sabre\DAV\ServerPlugin { * @return void */ public function initialize(\Sabre\DAV\Server $server) { - $server->on('afterMethod', array($this, 'afterMethod')); + $this->server = $server; + + $server->on('afterMethod', [$this, 'afterMethod']); + $server->on('afterMove', [$this, 'afterMove']); } /** @@ -55,4 +61,22 @@ class CopyEtagHeaderPlugin extends \Sabre\DAV\ServerPlugin { $response->setHeader('OC-ETag', $eTag); } } + + /** + * Called after a node is moved. + * + * This allows the backend to move all the associated properties. + * + * @param string $source + * @param string $destination + * @return void + */ + function afterMove($source, $destination) { + $node = $this->server->tree->getNodeForPath($destination); + if ($node instanceof File) { + $eTag = $node->getETag(); + $this->server->httpResponse->setHeader('OC-ETag', $eTag); + $this->server->httpResponse->setHeader('ETag', $eTag); + } + } } diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index d67417a10d5..c49df197a89 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -30,14 +30,19 @@ namespace OCA\DAV; use OCA\DAV\CalDAV\Schedule\IMipPlugin; use OCA\DAV\CardDAV\ImageExportPlugin; +use OCA\DAV\Comments\CommentsPlugin; use OCA\DAV\Connector\Sabre\Auth; use OCA\DAV\Connector\Sabre\BlockLegacyClientPlugin; +use OCA\DAV\Connector\Sabre\CopyEtagHeaderPlugin; use OCA\DAV\Connector\Sabre\DavAclPlugin; use OCA\DAV\Connector\Sabre\DummyGetResponsePlugin; +use OCA\DAV\Connector\Sabre\FakeLockerPlugin; use OCA\DAV\Connector\Sabre\FilesPlugin; use OCA\DAV\DAV\PublicAuth; +use OCA\DAV\Connector\Sabre\QuotaPlugin; use OCA\DAV\Files\BrowserErrorPagePlugin; use OCA\DAV\Files\CustomPropertiesBackend; +use OCA\DAV\SystemTag\SystemTagPlugin; use OCP\IRequest; use OCP\SabrePluginEvent; use Sabre\CardDAV\VCFExportPlugin; @@ -128,25 +133,27 @@ class Server { $this->server->addPlugin(new ImageExportPlugin(\OC::$server->getLogger())); // system tags plugins - $this->server->addPlugin(new \OCA\DAV\SystemTag\SystemTagPlugin( + $this->server->addPlugin(new SystemTagPlugin( \OC::$server->getSystemTagManager(), \OC::$server->getGroupManager(), \OC::$server->getUserSession() )); // comments plugin - $this->server->addPlugin(new \OCA\DAV\Comments\CommentsPlugin( + $this->server->addPlugin(new CommentsPlugin( \OC::$server->getCommentsManager(), \OC::$server->getUserSession() )); + $this->server->addPlugin(new CopyEtagHeaderPlugin()); + // Some WebDAV clients do require Class 2 WebDAV support (locking), since // we do not provide locking we emulate it using a fake locking plugin. if($request->isUserAgent([ '/WebDAVFS/', '/Microsoft Office OneNote 2013/', ])) { - $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\FakeLockerPlugin()); + $this->server->addPlugin(new FakeLockerPlugin()); } if (BrowserErrorPagePlugin::isBrowserRequest($request)) { @@ -181,8 +188,8 @@ class Server { ) ); $this->server->addPlugin( - new \OCA\DAV\Connector\Sabre\QuotaPlugin($view)); - + new QuotaPlugin($view) + ); } }); } diff --git a/apps/dav/tests/unit/Connector/Sabre/CopyEtagHeaderPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/CopyEtagHeaderPluginTest.php index 0ee1b9591f3..773d5d7f98b 100644 --- a/apps/dav/tests/unit/Connector/Sabre/CopyEtagHeaderPluginTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/CopyEtagHeaderPluginTest.php @@ -23,23 +23,28 @@ */ namespace OCA\DAV\Tests\unit\Connector\Sabre; +use OCA\DAV\Connector\Sabre\CopyEtagHeaderPlugin; +use Sabre\DAV\Server; +use Test\TestCase; + /** * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> * This file is licensed under the Affero General Public License version 3 or * later. * See the COPYING-README file. */ -class CopyEtagHeaderPluginTest extends \Test\TestCase { +class CopyEtagHeaderPluginTest extends TestCase { - /** - * @var \OCA\DAV\Connector\Sabre\CopyEtagHeaderPlugin - */ + /** @var CopyEtagHeaderPlugin */ private $plugin; + /** @var Server */ + private $server; + public function setUp() { parent::setUp(); $this->server = new \Sabre\DAV\Server(); - $this->plugin = new \OCA\DAV\Connector\Sabre\CopyEtagHeaderPlugin(); + $this->plugin = new CopyEtagHeaderPlugin(); $this->plugin->initialize($this->server); } @@ -61,4 +66,26 @@ class CopyEtagHeaderPluginTest extends \Test\TestCase { $this->assertNull($response->getHeader('OC-Etag')); } + + public function testAfterMove() { + $node = $this->getMockBuilder('OCA\DAV\Connector\Sabre\File') + ->disableOriginalConstructor() + ->getMock(); + $node->expects($this->once()) + ->method('getETag') + ->willReturn('123456'); + $tree = $this->getMockBuilder('Sabre\DAV\Tree') + ->disableOriginalConstructor() + ->getMock(); + $tree->expects($this->once()) + ->method('getNodeForPath') + ->with('test.txt') + ->willReturn($node); + + $this->server->tree = $tree; + $this->plugin->afterMove('', 'test.txt'); + + $this->assertEquals('123456', $this->server->httpResponse->getHeader('OC-Etag')); + $this->assertEquals('123456', $this->server->httpResponse->getHeader('Etag')); + } } |