summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorThomas Müller <DeepDiver1975@users.noreply.github.com>2016-09-23 19:57:07 +0200
committerLukas Reschke <lukas@statuscode.ch>2016-09-28 21:12:50 +0200
commitbd96c6aa38618dd7533ffbb0b6148c7e1522c1a6 (patch)
treef6de7a031bbc7cf7d0f0965b08f7d3d947e5b643 /apps
parent2eaa2791b75f7c2c8c7892a5354f6e93fedaf396 (diff)
downloadnextcloud-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.php26
-rw-r--r--apps/dav/lib/Server.php17
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/CopyEtagHeaderPluginTest.php37
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'));
+ }
}