summaryrefslogtreecommitdiffstats
path: root/lib/private/connector/sabre/objecttree.php
diff options
context:
space:
mode:
authorMorris Jobke <morris.jobke@gmail.com>2013-10-01 09:15:24 -0700
committerMorris Jobke <morris.jobke@gmail.com>2013-10-01 09:15:24 -0700
commit5ade595911261cf47cdad17deb4d1a013f523245 (patch)
treea9bbcb7894d2902ed9965ddaf0e6ad7e893d7940 /lib/private/connector/sabre/objecttree.php
parentb66e492d6e79fc1bef1fc416ab06f751e0ede6d4 (diff)
parente2fe71b6e7d09477298cfdba3dd6a07695c26118 (diff)
downloadnextcloud-server-5ade595911261cf47cdad17deb4d1a013f523245.tar.gz
nextcloud-server-5ade595911261cf47cdad17deb4d1a013f523245.zip
Merge pull request #5039 from owncloud/lib-private-master-2
Public API OC6 - introduce lib/private
Diffstat (limited to 'lib/private/connector/sabre/objecttree.php')
-rw-r--r--lib/private/connector/sabre/objecttree.php142
1 files changed, 142 insertions, 0 deletions
diff --git a/lib/private/connector/sabre/objecttree.php b/lib/private/connector/sabre/objecttree.php
new file mode 100644
index 00000000000..80c3840b99d
--- /dev/null
+++ b/lib/private/connector/sabre/objecttree.php
@@ -0,0 +1,142 @@
+<?php
+/**
+ * Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OC\Connector\Sabre;
+
+use OC\Files\Filesystem;
+
+class ObjectTree extends \Sabre_DAV_ObjectTree {
+
+ /**
+ * keep this public to allow mock injection during unit test
+ *
+ * @var \OC\Files\View
+ */
+ public $fileView;
+
+ /**
+ * Returns the INode object for the requested path
+ *
+ * @param string $path
+ * @throws \Sabre_DAV_Exception_NotFound
+ * @return \Sabre_DAV_INode
+ */
+ public function getNodeForPath($path) {
+
+ $path = trim($path, '/');
+ if (isset($this->cache[$path])) {
+ return $this->cache[$path];
+ }
+
+ // Is it the root node?
+ if (!strlen($path)) {
+ return $this->rootNode;
+ }
+
+ $info = $this->getFileView()->getFileInfo($path);
+
+ if (!$info) {
+ throw new \Sabre_DAV_Exception_NotFound('File with name ' . $path . ' could not be located');
+ }
+
+ if ($info['mimetype'] === 'httpd/unix-directory') {
+ $node = new \OC_Connector_Sabre_Directory($path);
+ } else {
+ $node = new \OC_Connector_Sabre_File($path);
+ }
+
+ $node->setFileinfoCache($info);
+
+ $this->cache[$path] = $node;
+ return $node;
+
+ }
+
+ /**
+ * Moves a file from one location to another
+ *
+ * @param string $sourcePath The path to the file which should be moved
+ * @param string $destinationPath The full destination path, so not just the destination parent node
+ * @throws \Sabre_DAV_Exception_Forbidden
+ * @return int
+ */
+ public function move($sourcePath, $destinationPath) {
+
+ $sourceNode = $this->getNodeForPath($sourcePath);
+ if ($sourceNode instanceof \Sabre_DAV_ICollection and $this->nodeExists($destinationPath)) {
+ throw new \Sabre_DAV_Exception_Forbidden('Could not copy directory ' . $sourceNode . ', target exists');
+ }
+ list($sourceDir,) = \Sabre_DAV_URLUtil::splitPath($sourcePath);
+ list($destinationDir,) = \Sabre_DAV_URLUtil::splitPath($destinationPath);
+
+ // check update privileges
+ $fs = $this->getFileView();
+ if (!$fs->isUpdatable($sourcePath)) {
+ throw new \Sabre_DAV_Exception_Forbidden();
+ }
+ if ($sourceDir !== $destinationDir) {
+ // for a full move we need update privileges on sourcePath and sourceDir as well as destinationDir
+ if (!$fs->isUpdatable($sourceDir)) {
+ throw new \Sabre_DAV_Exception_Forbidden();
+ }
+ if (!$fs->isUpdatable($destinationDir)) {
+ throw new \Sabre_DAV_Exception_Forbidden();
+ }
+ }
+
+ $renameOkay = $fs->rename($sourcePath, $destinationPath);
+ if (!$renameOkay) {
+ throw new \Sabre_DAV_Exception_Forbidden('');
+ }
+
+ $this->markDirty($sourceDir);
+ $this->markDirty($destinationDir);
+
+ }
+
+ /**
+ * Copies a file or directory.
+ *
+ * This method must work recursively and delete the destination
+ * if it exists
+ *
+ * @param string $source
+ * @param string $destination
+ * @return void
+ */
+ public function copy($source, $destination) {
+
+ if (Filesystem::is_file($source)) {
+ Filesystem::copy($source, $destination);
+ } else {
+ Filesystem::mkdir($destination);
+ $dh = Filesystem::opendir($source);
+ if(is_resource($dh)) {
+ while (($subnode = readdir($dh)) !== false) {
+
+ if ($subnode == '.' || $subnode == '..') continue;
+ $this->copy($source . '/' . $subnode, $destination . '/' . $subnode);
+
+ }
+ }
+ }
+
+ list($destinationDir,) = \Sabre_DAV_URLUtil::splitPath($destination);
+ $this->markDirty($destinationDir);
+ }
+
+ /**
+ * @return \OC\Files\View
+ */
+ public function getFileView() {
+ if (is_null($this->fileView)) {
+ $this->fileView = \OC\Files\Filesystem::getView();
+ }
+ return $this->fileView;
+ }
+}