summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2016-07-06 17:54:18 +0200
committerVincent Petry <pvince81@owncloud.com>2016-07-12 08:47:07 +0200
commit9712c9db0f0b68d5aa0ac906a8403a17bdc84138 (patch)
tree2ef14e2b2b9a82de2e3433029a9ef93215c5679c /apps
parent0ddbf5c9812d869db7df4473637927edaa0da9b1 (diff)
downloadnextcloud-server-9712c9db0f0b68d5aa0ac906a8403a17bdc84138.tar.gz
nextcloud-server-9712c9db0f0b68d5aa0ac906a8403a17bdc84138.zip
Additional perm check in Webdav
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/lib/Connector/Sabre/ObjectTree.php5
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php82
2 files changed, 87 insertions, 0 deletions
diff --git a/apps/dav/lib/Connector/Sabre/ObjectTree.php b/apps/dav/lib/Connector/Sabre/ObjectTree.php
index 9e7d876187d..051272e862f 100644
--- a/apps/dav/lib/Connector/Sabre/ObjectTree.php
+++ b/apps/dav/lib/Connector/Sabre/ObjectTree.php
@@ -283,6 +283,11 @@ class ObjectTree extends \Sabre\DAV\Tree {
throw new InvalidPath($ex->getMessage());
}
+ // Webdav's copy will implicitly do a delete+create, so only create+delete permissions are required
+ if (!$this->fileView->isCreatable($destinationDir)) {
+ throw new \Sabre\DAV\Exception\Forbidden();
+ }
+
try {
$this->fileView->copy($source, $destination);
} catch (StorageNotAvailableException $e) {
diff --git a/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php b/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php
index 4a5e43376c0..b4f0b22dd70 100644
--- a/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php
@@ -142,6 +142,88 @@ class ObjectTreeTest extends \Test\TestCase {
$objectTree->move($source, $destination);
}
+ public function copyDataProvider() {
+ return [
+ // copy into same dir
+ ['a', 'b', ''],
+ // copy into same dir
+ ['a/a', 'a/b', 'a'],
+ // copy into another dir
+ ['a', 'sub/a', 'sub'],
+ ];
+ }
+
+ /**
+ * @dataProvider copyDataProvider
+ */
+ public function testCopy($sourcePath, $targetPath, $targetParent) {
+ $view = $this->getMock('\OC\Files\View');
+ $view->expects($this->once())
+ ->method('verifyPath')
+ ->with($targetParent)
+ ->will($this->returnValue(true));
+ $view->expects($this->once())
+ ->method('isCreatable')
+ ->with($targetParent)
+ ->will($this->returnValue(true));
+ $view->expects($this->once())
+ ->method('copy')
+ ->with($sourcePath, $targetPath)
+ ->will($this->returnValue(true));
+
+ $info = new FileInfo('', null, null, array(), null);
+
+ $rootDir = new \OCA\DAV\Connector\Sabre\Directory($view, $info);
+ $objectTree = $this->getMock('\OCA\DAV\Connector\Sabre\ObjectTree',
+ array('nodeExists', 'getNodeForPath'),
+ array($rootDir, $view));
+
+ $objectTree->expects($this->once())
+ ->method('getNodeForPath')
+ ->with($this->identicalTo($sourcePath))
+ ->will($this->returnValue(false));
+
+ /** @var $objectTree \OCA\DAV\Connector\Sabre\ObjectTree */
+ $mountManager = \OC\Files\Filesystem::getMountManager();
+ $objectTree->init($rootDir, $view, $mountManager);
+ $objectTree->copy($sourcePath, $targetPath);
+ }
+
+ /**
+ * @dataProvider copyDataProvider
+ * @expectedException \Sabre\DAV\Exception\Forbidden
+ */
+ public function testCopyFailNotCreatable($sourcePath, $targetPath, $targetParent) {
+ $view = $this->getMock('\OC\Files\View');
+ $view->expects($this->once())
+ ->method('verifyPath')
+ ->with($targetParent)
+ ->will($this->returnValue(true));
+ $view->expects($this->once())
+ ->method('isCreatable')
+ ->with($targetParent)
+ ->will($this->returnValue(false));
+ $view->expects($this->never())
+ ->method('copy');
+
+ $info = new FileInfo('', null, null, array(), null);
+
+ $rootDir = new \OCA\DAV\Connector\Sabre\Directory($view, $info);
+ $objectTree = $this->getMock('\OCA\DAV\Connector\Sabre\ObjectTree',
+ array('nodeExists', 'getNodeForPath'),
+ array($rootDir, $view));
+
+ $objectTree->expects($this->once())
+ ->method('getNodeForPath')
+ ->with($this->identicalTo($sourcePath))
+ ->will($this->returnValue(false));
+
+ /** @var $objectTree \OCA\DAV\Connector\Sabre\ObjectTree */
+ $mountManager = \OC\Files\Filesystem::getMountManager();
+ $objectTree->init($rootDir, $view, $mountManager);
+ $objectTree->copy($sourcePath, $targetPath);
+ }
+
/**
* @dataProvider nodeForPathProvider
*/