summaryrefslogtreecommitdiffstats
path: root/lib/connector/sabre
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2013-09-25 13:36:30 +0200
committerThomas Müller <thomas.mueller@tmit.eu>2013-09-30 16:36:59 +0200
commit9c9dc276b7a1d2592c4fb0a887888632dc1f1e29 (patch)
treebbe3aed3e09c31c68806bdb8acffef70ba08f51c /lib/connector/sabre
parenta711399e62d5a9f14d4b748efe4354ee37e61f13 (diff)
downloadnextcloud-server-9c9dc276b7a1d2592c4fb0a887888632dc1f1e29.tar.gz
nextcloud-server-9c9dc276b7a1d2592c4fb0a887888632dc1f1e29.zip
move the private namespace OC into lib/private - OCP will stay in lib/public
Conflicts: lib/private/vcategories.php
Diffstat (limited to 'lib/connector/sabre')
-rw-r--r--lib/connector/sabre/ServiceUnavailable.php22
-rw-r--r--lib/connector/sabre/auth.php84
-rw-r--r--lib/connector/sabre/directory.php256
-rw-r--r--lib/connector/sabre/file.php176
-rw-r--r--lib/connector/sabre/locks.php189
-rw-r--r--lib/connector/sabre/maintenanceplugin.php59
-rw-r--r--lib/connector/sabre/node.php238
-rw-r--r--lib/connector/sabre/objecttree.php142
-rw-r--r--lib/connector/sabre/principal.php128
-rw-r--r--lib/connector/sabre/quotaplugin.php97
-rw-r--r--lib/connector/sabre/request.php50
11 files changed, 0 insertions, 1441 deletions
diff --git a/lib/connector/sabre/ServiceUnavailable.php b/lib/connector/sabre/ServiceUnavailable.php
deleted file mode 100644
index c1cc815c989..00000000000
--- a/lib/connector/sabre/ServiceUnavailable.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-/**
- * ownCloud
- *
- * @author Thomas Müller
- * @copyright 2013 Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @license AGPL3
- */
-
-class Sabre_DAV_Exception_ServiceUnavailable extends Sabre_DAV_Exception {
-
- /**
- * Returns the HTTP statuscode for this exception
- *
- * @return int
- */
- public function getHTTPCode() {
-
- return 503;
- }
-}
diff --git a/lib/connector/sabre/auth.php b/lib/connector/sabre/auth.php
deleted file mode 100644
index bf3a49593cb..00000000000
--- a/lib/connector/sabre/auth.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/**
- * ownCloud
- *
- * @author Jakob Sack
- * @copyright 2011 Jakob Sack kde@jakobsack.de
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-class OC_Connector_Sabre_Auth extends Sabre_DAV_Auth_Backend_AbstractBasic {
- /**
- * Validates a username and password
- *
- * This method should return true or false depending on if login
- * succeeded.
- *
- * @return bool
- */
- protected function validateUserPass($username, $password) {
- if (OC_User::isLoggedIn()) {
- OC_Util::setupFS(OC_User::getUser());
- return true;
- } else {
- OC_Util::setUpFS();//login hooks may need early access to the filesystem
- if(OC_User::login($username, $password)) {
- OC_Util::setUpFS(OC_User::getUser());
- return true;
- }
- else{
- return false;
- }
- }
- }
-
- /**
- * Returns information about the currently logged in username.
- *
- * If nobody is currently logged in, this method should return null.
- *
- * @return string|null
- */
- public function getCurrentUser() {
- $user = OC_User::getUser();
- if(!$user) {
- return null;
- }
- return $user;
- }
-
- /**
- * Override function here. We want to cache authentication cookies
- * in the syncing client to avoid HTTP-401 roundtrips.
- * If the sync client supplies the cookies, then OC_User::isLoggedIn()
- * will return true and we can see this WebDAV request as already authenticated,
- * even if there are no HTTP Basic Auth headers.
- * In other case, just fallback to the parent implementation.
- *
- * @return bool
- */
- public function authenticate(Sabre_DAV_Server $server, $realm) {
- if (OC_User::isLoggedIn()) {
- $user = OC_User::getUser();
- OC_Util::setupFS($user);
- $this->currentUser = $user;
- return true;
- }
-
- return parent::authenticate($server, $realm);
- }
-}
diff --git a/lib/connector/sabre/directory.php b/lib/connector/sabre/directory.php
deleted file mode 100644
index 382bdf06df1..00000000000
--- a/lib/connector/sabre/directory.php
+++ /dev/null
@@ -1,256 +0,0 @@
-<?php
-
-/**
- * ownCloud
- *
- * @author Jakob Sack
- * @copyright 2011 Jakob Sack kde@jakobsack.de
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sabre_DAV_ICollection, Sabre_DAV_IQuota {
-
- /**
- * Creates a new file in the directory
- *
- * Data will either be supplied as a stream resource, or in certain cases
- * as a string. Keep in mind that you may have to support either.
- *
- * After succesful creation of the file, you may choose to return the ETag
- * of the new file here.
- *
- * The returned ETag must be surrounded by double-quotes (The quotes should
- * be part of the actual string).
- *
- * If you cannot accurately determine the ETag, you should not return it.
- * If you don't store the file exactly as-is (you're transforming it
- * somehow) you should also not return an ETag.
- *
- * This means that if a subsequent GET to this new file does not exactly
- * return the same contents of what was submitted here, you are strongly
- * recommended to omit the ETag.
- *
- * @param string $name Name of the file
- * @param resource|string $data Initial payload
- * @throws Sabre_DAV_Exception_Forbidden
- * @return null|string
- */
- public function createFile($name, $data = null) {
-
- if (!\OC\Files\Filesystem::isCreatable($this->path)) {
- throw new \Sabre_DAV_Exception_Forbidden();
- }
-
- if (isset($_SERVER['HTTP_OC_CHUNKED'])) {
- $info = OC_FileChunking::decodeName($name);
- if (empty($info)) {
- throw new Sabre_DAV_Exception_NotImplemented();
- }
- $chunk_handler = new OC_FileChunking($info);
- $chunk_handler->store($info['index'], $data);
- if ($chunk_handler->isComplete()) {
- $newPath = $this->path . '/' . $info['name'];
- $chunk_handler->file_assemble($newPath);
- return OC_Connector_Sabre_Node::getETagPropertyForPath($newPath);
- }
- } else {
- $newPath = $this->path . '/' . $name;
-
- // mark file as partial while uploading (ignored by the scanner)
- $partpath = $newPath . '.part';
-
- \OC\Files\Filesystem::file_put_contents($partpath, $data);
-
- // rename to correct path
- $renameOkay = \OC\Files\Filesystem::rename($partpath, $newPath);
- $fileExists = \OC\Files\Filesystem::file_exists($newPath);
- if ($renameOkay === false || $fileExists === false) {
- \OC_Log::write('webdav', '\OC\Files\Filesystem::rename() failed', \OC_Log::ERROR);
- \OC\Files\Filesystem::unlink($partpath);
- throw new Sabre_DAV_Exception();
- }
-
- // allow sync clients to send the mtime along in a header
- $mtime = OC_Request::hasModificationTime();
- if ($mtime !== false) {
- if(\OC\Files\Filesystem::touch($newPath, $mtime)) {
- header('X-OC-MTime: accepted');
- }
- }
-
- return OC_Connector_Sabre_Node::getETagPropertyForPath($newPath);
- }
-
- return null;
- }
-
- /**
- * Creates a new subdirectory
- *
- * @param string $name
- * @throws Sabre_DAV_Exception_Forbidden
- * @return void
- */
- public function createDirectory($name) {
-
- if (!\OC\Files\Filesystem::isCreatable($this->path)) {
- throw new \Sabre_DAV_Exception_Forbidden();
- }
-
- $newPath = $this->path . '/' . $name;
- if(!\OC\Files\Filesystem::mkdir($newPath)) {
- throw new Sabre_DAV_Exception_Forbidden('Could not create directory '.$newPath);
- }
-
- }
-
- /**
- * Returns a specific child node, referenced by its name
- *
- * @param string $name
- * @throws Sabre_DAV_Exception_FileNotFound
- * @return Sabre_DAV_INode
- */
- public function getChild($name, $info = null) {
-
- $path = $this->path . '/' . $name;
- if (is_null($info)) {
- $info = \OC\Files\Filesystem::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);
- return $node;
- }
-
- /**
- * Returns an array with all the child nodes
- *
- * @return Sabre_DAV_INode[]
- */
- public function getChildren() {
-
- $folder_content = \OC\Files\Filesystem::getDirectoryContent($this->path);
- $paths = array();
- foreach($folder_content as $info) {
- $paths[] = $this->path.'/'.$info['name'];
- $properties[$this->path.'/'.$info['name']][self::GETETAG_PROPERTYNAME] = '"' . $info['etag'] . '"';
- }
- if(count($paths)>0) {
- //
- // the number of arguments within IN conditions are limited in most databases
- // we chunk $paths into arrays of 200 items each to meet this criteria
- //
- $chunks = array_chunk($paths, 200, false);
- foreach ($chunks as $pack) {
- $placeholders = join(',', array_fill(0, count($pack), '?'));
- $query = OC_DB::prepare( 'SELECT * FROM `*PREFIX*properties`'
- .' WHERE `userid` = ?' . ' AND `propertypath` IN ('.$placeholders.')' );
- array_unshift($pack, OC_User::getUser()); // prepend userid
- $result = $query->execute( $pack );
- while($row = $result->fetchRow()) {
- $propertypath = $row['propertypath'];
- $propertyname = $row['propertyname'];
- $propertyvalue = $row['propertyvalue'];
- if($propertyname !== self::GETETAG_PROPERTYNAME) {
- $properties[$propertypath][$propertyname] = $propertyvalue;
- }
- }
- }
- }
-
- $nodes = array();
- foreach($folder_content as $info) {
- $node = $this->getChild($info['name'], $info);
- $node->setPropertyCache($properties[$this->path.'/'.$info['name']]);
- $nodes[] = $node;
- }
- return $nodes;
- }
-
- /**
- * Checks if a child exists.
- *
- * @param string $name
- * @return bool
- */
- public function childExists($name) {
-
- $path = $this->path . '/' . $name;
- return \OC\Files\Filesystem::file_exists($path);
-
- }
-
- /**
- * Deletes all files in this directory, and then itself
- *
- * @return void
- * @throws Sabre_DAV_Exception_Forbidden
- */
- public function delete() {
-
- if (!\OC\Files\Filesystem::isDeletable($this->path)) {
- throw new \Sabre_DAV_Exception_Forbidden();
- }
- if ($this->path != "/Shared") {
- \OC\Files\Filesystem::rmdir($this->path);
- }
-
- }
-
- /**
- * Returns available diskspace information
- *
- * @return array
- */
- public function getQuotaInfo() {
- $storageInfo = OC_Helper::getStorageInfo($this->path);
- return array(
- $storageInfo['used'],
- $storageInfo['free']
- );
-
- }
-
- /**
- * Returns a list of properties for this nodes.;
- *
- * The properties list is a list of propertynames the client requested,
- * encoded as xmlnamespace#tagName, for example:
- * http://www.example.org/namespace#author
- * If the array is empty, all properties should be returned
- *
- * @param array $properties
- * @return void
- */
- public function getProperties($properties) {
- $props = parent::getProperties($properties);
- if (in_array(self::GETETAG_PROPERTYNAME, $properties) && !isset($props[self::GETETAG_PROPERTYNAME])) {
- $props[self::GETETAG_PROPERTYNAME]
- = OC_Connector_Sabre_Node::getETagPropertyForPath($this->path);
- }
- return $props;
- }
-}
diff --git a/lib/connector/sabre/file.php b/lib/connector/sabre/file.php
deleted file mode 100644
index 433b1148552..00000000000
--- a/lib/connector/sabre/file.php
+++ /dev/null
@@ -1,176 +0,0 @@
-<?php
-
-/**
- * ownCloud
- *
- * @author Jakob Sack
- * @copyright 2011 Jakob Sack kde@jakobsack.de
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_DAV_IFile {
-
- /**
- * Updates the data
- *
- * The data argument is a readable stream resource.
- *
- * After a succesful put operation, you may choose to return an ETag. The
- * etag must always be surrounded by double-quotes. These quotes must
- * appear in the actual string you're returning.
- *
- * Clients may use the ETag from a PUT request to later on make sure that
- * when they update the file, the contents haven't changed in the mean
- * time.
- *
- * If you don't plan to store the file byte-by-byte, and you return a
- * different object on a subsequent GET you are strongly recommended to not
- * return an ETag, and just return null.
- *
- * @param resource $data
- * @throws Sabre_DAV_Exception_Forbidden
- * @return string|null
- */
- public function put($data) {
-
- if (!\OC\Files\Filesystem::isUpdatable($this->path)) {
- throw new \Sabre_DAV_Exception_Forbidden();
- }
-
- // throw an exception if encryption was disabled but the files are still encrypted
- if (\OC_Util::encryptedFiles()) {
- throw new \Sabre_DAV_Exception_ServiceUnavailable();
- }
-
- // mark file as partial while uploading (ignored by the scanner)
- $partpath = $this->path . '.part';
-
- \OC\Files\Filesystem::file_put_contents($partpath, $data);
-
- //detect aborted upload
- if (isset ($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'PUT') {
- if (isset($_SERVER['CONTENT_LENGTH'])) {
- $expected = $_SERVER['CONTENT_LENGTH'];
- $actual = \OC\Files\Filesystem::filesize($partpath);
- if ($actual != $expected) {
- \OC\Files\Filesystem::unlink($partpath);
- throw new Sabre_DAV_Exception_BadRequest(
- 'expected filesize ' . $expected . ' got ' . $actual);
- }
- }
- }
-
- // rename to correct path
- $renameOkay = \OC\Files\Filesystem::rename($partpath, $this->path);
- $fileExists = \OC\Files\Filesystem::file_exists($this->path);
- if ($renameOkay === false || $fileExists === false) {
- \OC_Log::write('webdav', '\OC\Files\Filesystem::rename() failed', \OC_Log::ERROR);
- \OC\Files\Filesystem::unlink($partpath);
- throw new Sabre_DAV_Exception();
- }
-
-
- //allow sync clients to send the mtime along in a header
- $mtime = OC_Request::hasModificationTime();
- if ($mtime !== false) {
- if (\OC\Files\Filesystem::touch($this->path, $mtime)) {
- header('X-OC-MTime: accepted');
- }
- }
-
- return OC_Connector_Sabre_Node::getETagPropertyForPath($this->path);
- }
-
- /**
- * Returns the data
- *
- * @return string
- */
- public function get() {
-
- //throw execption if encryption is disabled but files are still encrypted
- if (\OC_Util::encryptedFiles()) {
- throw new \Sabre_DAV_Exception_ServiceUnavailable();
- } else {
- return \OC\Files\Filesystem::fopen($this->path, 'rb');
- }
-
- }
-
- /**
- * Delete the current file
- *
- * @return void
- * @throws Sabre_DAV_Exception_Forbidden
- */
- public function delete() {
-
- if (!\OC\Files\Filesystem::isDeletable($this->path)) {
- throw new \Sabre_DAV_Exception_Forbidden();
- }
- \OC\Files\Filesystem::unlink($this->path);
-
- }
-
- /**
- * Returns the size of the node, in bytes
- *
- * @return int
- */
- public function getSize() {
- $this->getFileinfoCache();
- if ($this->fileinfo_cache['size'] > -1) {
- return $this->fileinfo_cache['size'];
- } else {
- return null;
- }
- }
-
- /**
- * Returns the ETag for a file
- *
- * An ETag is a unique identifier representing the current version of the
- * file. If the file changes, the ETag MUST change. The ETag is an
- * arbritrary string, but MUST be surrounded by double-quotes.
- *
- * Return null if the ETag can not effectively be determined
- *
- * @return mixed
- */
- public function getETag() {
- $properties = $this->getProperties(array(self::GETETAG_PROPERTYNAME));
- if (isset($properties[self::GETETAG_PROPERTYNAME])) {
- return $properties[self::GETETAG_PROPERTYNAME];
- }
- return null;
- }
-
- /**
- * Returns the mime-type for a file
- *
- * If null is returned, we'll assume application/octet-stream
- *
- * @return mixed
- */
- public function getContentType() {
- if (isset($this->fileinfo_cache['mimetype'])) {
- return $this->fileinfo_cache['mimetype'];
- }
-
- return \OC\Files\Filesystem::getMimeType($this->path);
-
- }
-}
diff --git a/lib/connector/sabre/locks.php b/lib/connector/sabre/locks.php
deleted file mode 100644
index 69496c15ada..00000000000
--- a/lib/connector/sabre/locks.php
+++ /dev/null
@@ -1,189 +0,0 @@
-<?php
-
-/**
- * ownCloud
- *
- * @author Jakob Sack
- * @copyright 2011 Jakob Sack kde@jakobsack.de
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-class OC_Connector_Sabre_Locks extends Sabre_DAV_Locks_Backend_Abstract {
-
- /**
- * Returns a list of Sabre_DAV_Locks_LockInfo objects
- *
- * This method should return all the locks for a particular uri, including
- * locks that might be set on a parent uri.
- *
- * If returnChildLocks is set to true, this method should also look for
- * any locks in the subtree of the uri for locks.
- *
- * @param string $uri
- * @param bool $returnChildLocks
- * @return array
- */
- public function getLocks($uri, $returnChildLocks) {
-
- // NOTE: the following 10 lines or so could be easily replaced by
- // pure sql. MySQL's non-standard string concatination prevents us
- // from doing this though.
- // NOTE: SQLite requires time() to be inserted directly. That's ugly
- // but otherwise reading locks from SQLite Databases will return
- // nothing
- $query = 'SELECT * FROM `*PREFIX*locks`'
- .' WHERE `userid` = ? AND (`created` + `timeout`) > '.time().' AND (( `uri` = ?)';
- if (OC_Config::getValue( "dbtype") === 'oci') {
- //FIXME oracle hack: need to explicitly cast CLOB to CHAR for comparison
- $query = 'SELECT * FROM `*PREFIX*locks`'
- .' WHERE `userid` = ? AND (`created` + `timeout`) > '.time().' AND (( to_char(`uri`) = ?)';
- }
- $params = array(OC_User::getUser(), $uri);
-
- // We need to check locks for every part in the uri.
- $uriParts = explode('/', $uri);
-
- // We already covered the last part of the uri
- array_pop($uriParts);
-
- $currentPath='';
-
- foreach($uriParts as $part) {
-
- if ($currentPath) $currentPath.='/';
- $currentPath.=$part;
- //FIXME oracle hack: need to explicitly cast CLOB to CHAR for comparison
- if (OC_Config::getValue( "dbtype") === 'oci') {
- $query.=' OR (`depth` != 0 AND to_char(`uri`) = ?)';
- } else {
- $query.=' OR (`depth` != 0 AND `uri` = ?)';
- }
- $params[] = $currentPath;
-
- }
-
- if ($returnChildLocks) {
-
- //FIXME oracle hack: need to explicitly cast CLOB to CHAR for comparison
- if (OC_Config::getValue( "dbtype") === 'oci') {
- $query.=' OR (to_char(`uri`) LIKE ?)';
- } else {
- $query.=' OR (`uri` LIKE ?)';
- }
- $params[] = $uri . '/%';
-
- }
- $query.=')';
-
- $result = OC_DB::executeAudited( $query, $params );
-
- $lockList = array();
- while( $row = $result->fetchRow()) {
-
- $lockInfo = new Sabre_DAV_Locks_LockInfo();
- $lockInfo->owner = $row['owner'];
- $lockInfo->token = $row['token'];
- $lockInfo->timeout = $row['timeout'];
- $lockInfo->created = $row['created'];
- $lockInfo->scope = $row['scope'];
- $lockInfo->depth = $row['depth'];
- $lockInfo->uri = $row['uri'];
- $lockList[] = $lockInfo;
-
- }
-
- return $lockList;
-
- }
-
- /**
- * Locks a uri
- *
- * @param string $uri
- * @param Sabre_DAV_Locks_LockInfo $lockInfo
- * @return bool
- */
- public function lock($uri, Sabre_DAV_Locks_LockInfo $lockInfo) {
-
- // We're making the lock timeout 5 minutes
- $lockInfo->timeout = 300;
- $lockInfo->created = time();
- $lockInfo->uri = $uri;
-
- $locks = $this->getLocks($uri, false);
- $exists = false;
- foreach($locks as $lock) {
- if ($lock->token == $lockInfo->token) {
- $exists = true;
- break;
- }
- }
-
- if ($exists) {
- $sql = 'UPDATE `*PREFIX*locks`'
- .' SET `owner` = ?, `timeout` = ?, `scope` = ?, `depth` = ?, `uri` = ?, `created` = ?'
- .' WHERE `userid` = ? AND `token` = ?';
- $result = OC_DB::executeAudited( $sql, array(
- $lockInfo->owner,
- $lockInfo->timeout,
- $lockInfo->scope,
- $lockInfo->depth,
- $uri,
- $lockInfo->created,
- OC_User::getUser(),
- $lockInfo->token)
- );
- } else {
- $sql = 'INSERT INTO `*PREFIX*locks`'
- .' (`userid`,`owner`,`timeout`,`scope`,`depth`,`uri`,`created`,`token`)'
- .' VALUES (?,?,?,?,?,?,?,?)';
- $result = OC_DB::executeAudited( $sql, array(
- OC_User::getUser(),
- $lockInfo->owner,
- $lockInfo->timeout,
- $lockInfo->scope,
- $lockInfo->depth,
- $uri,
- $lockInfo->created,
- $lockInfo->token)
- );
- }
-
- return true;
-
- }
-
- /**
- * Removes a lock from a uri
- *
- * @param string $uri
- * @param Sabre_DAV_Locks_LockInfo $lockInfo
- * @return bool
- */
- public function unlock($uri, Sabre_DAV_Locks_LockInfo $lockInfo) {
-
- $sql = 'DELETE FROM `*PREFIX*locks` WHERE `userid` = ? AND `uri` = ? AND `token` = ?';
- if (OC_Config::getValue( "dbtype") === 'oci') {
- //FIXME oracle hack: need to explicitly cast CLOB to CHAR for comparison
- $sql = 'DELETE FROM `*PREFIX*locks` WHERE `userid` = ? AND to_char(`uri`) = ? AND `token` = ?';
- }
- $result = OC_DB::executeAudited( $sql, array(OC_User::getUser(), $uri, $lockInfo->token));
-
- return $result === 1;
-
- }
-
-}
diff --git a/lib/connector/sabre/maintenanceplugin.php b/lib/connector/sabre/maintenanceplugin.php
deleted file mode 100644
index 2eda269afc2..00000000000
--- a/lib/connector/sabre/maintenanceplugin.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-/**
- * ownCloud
- *
- * @author Thomas Müller
- * @copyright 2013 Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @license AGPL3
- */
-
-require 'ServiceUnavailable.php';
-
-class OC_Connector_Sabre_MaintenancePlugin extends Sabre_DAV_ServerPlugin
-{
-
- /**
- * Reference to main server object
- *
- * @var Sabre_DAV_Server
- */
- private $server;
-
- /**
- * This initializes the plugin.
- *
- * This function is called by Sabre_DAV_Server, after
- * addPlugin is called.
- *
- * This method should set up the required event subscriptions.
- *
- * @param Sabre_DAV_Server $server
- * @return void
- */
- public function initialize(Sabre_DAV_Server $server) {
-
- $this->server = $server;
- $this->server->subscribeEvent('beforeMethod', array($this, 'checkMaintenanceMode'), 10);
- }
-
- /**
- * This method is called before any HTTP method and returns http status code 503
- * in case the system is in maintenance mode.
- *
- * @throws Sabre_DAV_Exception_ServiceUnavailable
- * @internal param string $method
- * @return bool
- */
- public function checkMaintenanceMode() {
- if (OC_Config::getValue('maintenance', false)) {
- throw new Sabre_DAV_Exception_ServiceUnavailable();
- }
- if (OC::checkUpgrade(false)) {
- throw new Sabre_DAV_Exception_ServiceUnavailable('Upgrade needed');
- }
-
- return true;
- }
-}
diff --git a/lib/connector/sabre/node.php b/lib/connector/sabre/node.php
deleted file mode 100644
index 29b7f9e53a5..00000000000
--- a/lib/connector/sabre/node.php
+++ /dev/null
@@ -1,238 +0,0 @@
-<?php
-
-/**
- * ownCloud
- *
- * @author Jakob Sack
- * @copyright 2011 Jakob Sack kde@jakobsack.de
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IProperties {
- const GETETAG_PROPERTYNAME = '{DAV:}getetag';
- const LASTMODIFIED_PROPERTYNAME = '{DAV:}lastmodified';
-
- /**
- * Allow configuring the method used to generate Etags
- *
- * @var array(class_name, function_name)
- */
- public static $ETagFunction = null;
-
- /**
- * The path to the current node
- *
- * @var string
- */
- protected $path;
- /**
- * node fileinfo cache
- * @var array
- */
- protected $fileinfo_cache;
- /**
- * node properties cache
- * @var array
- */
- protected $property_cache = null;
-
- /**
- * @brief Sets up the node, expects a full path name
- * @param string $path
- * @return void
- */
- public function __construct($path) {
- $this->path = $path;
- }
-
-
-
- /**
- * @brief Returns the name of the node
- * @return string
- */
- public function getName() {
-
- list(, $name) = Sabre_DAV_URLUtil::splitPath($this->path);
- return $name;
-
- }
-
- /**
- * @brief Renames the node
- * @param string $name The new name
- * @return void
- */
- public function setName($name) {
-
- // rename is only allowed if the update privilege is granted
- if (!\OC\Files\Filesystem::isUpdatable($this->path)) {
- throw new \Sabre_DAV_Exception_Forbidden();
- }
-
- list($parentPath, ) = Sabre_DAV_URLUtil::splitPath($this->path);
- list(, $newName) = Sabre_DAV_URLUtil::splitPath($name);
-
- $newPath = $parentPath . '/' . $newName;
- $oldPath = $this->path;
-
- \OC\Files\Filesystem::rename($this->path, $newPath);
-
- $this->path = $newPath;
-
- $query = OC_DB::prepare( 'UPDATE `*PREFIX*properties` SET `propertypath` = ?'
- .' WHERE `userid` = ? AND `propertypath` = ?' );
- $query->execute( array( $newPath, OC_User::getUser(), $oldPath ));
-
- }
-
- public function setFileinfoCache($fileinfo_cache)
- {
- $this->fileinfo_cache = $fileinfo_cache;
- }
-
- /**
- * @brief Ensure that the fileinfo cache is filled
- * @note Uses OC_FileCache or a direct stat
- */
- protected function getFileinfoCache() {
- if (!isset($this->fileinfo_cache)) {
- if ($fileinfo_cache = \OC\Files\Filesystem::getFileInfo($this->path)) {
- } else {
- $fileinfo_cache = \OC\Files\Filesystem::stat($this->path);
- }
-
- $this->fileinfo_cache = $fileinfo_cache;
- }
- }
-
- public function setPropertyCache($property_cache)
- {
- $this->property_cache = $property_cache;
- }
-
- /**
- * @brief Returns the last modification time, as a unix timestamp
- * @return int
- */
- public function getLastModified() {
- $this->getFileinfoCache();
- return $this->fileinfo_cache['mtime'];
-
- }
-
- /**
- * sets the last modification time of the file (mtime) to the value given
- * in the second parameter or to now if the second param is empty.
- * Even if the modification time is set to a custom value the access time is set to now.
- */
- public function touch($mtime) {
-
- // touch is only allowed if the update privilege is granted
- if (!\OC\Files\Filesystem::isUpdatable($this->path)) {
- throw new \Sabre_DAV_Exception_Forbidden();
- }
-
- \OC\Files\Filesystem::touch($this->path, $mtime);
- }
-
- /**
- * @brief Updates properties on this node,
- * @param array $mutations
- * @see Sabre_DAV_IProperties::updateProperties
- * @return bool|array
- */
- public function updateProperties($properties) {
- $existing = $this->getProperties(array());
- foreach($properties as $propertyName => $propertyValue) {
- // If it was null, we need to delete the property
- if (is_null($propertyValue)) {
- if(array_key_exists( $propertyName, $existing )) {
- $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*properties`'
- .' WHERE `userid` = ? AND `propertypath` = ? AND `propertyname` = ?' );
- $query->execute( array( OC_User::getUser(), $this->path, $propertyName ));
- }
- }
- else {
- if( strcmp( $propertyName, self::GETETAG_PROPERTYNAME) === 0 ) {
- \OC\Files\Filesystem::putFileInfo($this->path, array('etag'=> $propertyValue));
- } elseif( strcmp( $propertyName, self::LASTMODIFIED_PROPERTYNAME) === 0 ) {
- $this->touch($propertyValue);
- } else {
- if(!array_key_exists( $propertyName, $existing )) {
- $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*properties`'
- .' (`userid`,`propertypath`,`propertyname`,`propertyvalue`) VALUES(?,?,?,?)' );
- $query->execute( array( OC_User::getUser(), $this->path, $propertyName,$propertyValue ));
- } else {
- $query = OC_DB::prepare( 'UPDATE `*PREFIX*properties` SET `propertyvalue` = ?'
- .' WHERE `userid` = ? AND `propertypath` = ? AND `propertyname` = ?' );
- $query->execute( array( $propertyValue,OC_User::getUser(), $this->path, $propertyName ));
- }
- }
- }
-
- }
- $this->setPropertyCache(null);
- return true;
- }
-
- /**
- * @brief Returns a list of properties for this nodes.;
- * @param array $properties
- * @return array
- * @note The properties list is a list of propertynames the client
- * requested, encoded as xmlnamespace#tagName, for example:
- * http://www.example.org/namespace#author If the array is empty, all
- * properties should be returned
- */
- public function getProperties($properties) {
- if (is_null($this->property_cache)) {
- $sql = 'SELECT * FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ?';
- $result = OC_DB::executeAudited( $sql, array( OC_User::getUser(), $this->path ) );
-
- $this->property_cache = array();
- while( $row = $result->fetchRow()) {
- $this->property_cache[$row['propertyname']] = $row['propertyvalue'];
- }
- $this->property_cache[self::GETETAG_PROPERTYNAME] = $this->getETagPropertyForPath($this->path);
- }
-
- // if the array was empty, we need to return everything
- if(count($properties) == 0) {
- return $this->property_cache;
- }
-
- $props = array();
- foreach($properties as $property) {
- if (isset($this->property_cache[$property])) $props[$property] = $this->property_cache[$property];
- }
- return $props;
- }
-
- /**
- * Returns the ETag surrounded by double-quotes for this path.
- * @param string $path Path of the file
- * @return string|null Returns null if the ETag can not effectively be determined
- */
- static public function getETagPropertyForPath($path) {
- $data = \OC\Files\Filesystem::getFileInfo($path);
- if (isset($data['etag'])) {
- return '"'.$data['etag'].'"';
- }
- return null;
- }
-
-}
diff --git a/lib/connector/sabre/objecttree.php b/lib/connector/sabre/objecttree.php
deleted file mode 100644
index 80c3840b99d..00000000000
--- a/lib/connector/sabre/objecttree.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?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;
- }
-}
diff --git a/lib/connector/sabre/principal.php b/lib/connector/sabre/principal.php
deleted file mode 100644
index 59a96797c16..00000000000
--- a/lib/connector/sabre/principal.php
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-/**
- * Copyright (c) 2011 Jakob Sack mail@jakobsack.de
- * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-
-class OC_Connector_Sabre_Principal implements Sabre_DAVACL_IPrincipalBackend {
- /**
- * Returns a list of principals based on a prefix.
- *
- * This prefix will often contain something like 'principals'. You are only
- * expected to return principals that are in this base path.
- *
- * You are expected to return at least a 'uri' for every user, you can
- * return any additional properties if you wish so. Common properties are:
- * {DAV:}displayname
- *
- * @param string $prefixPath
- * @return array
- */
- public function getPrincipalsByPrefix( $prefixPath ) {
- $principals = array();
-
- if ($prefixPath == 'principals') {
- foreach(OC_User::getUsers() as $user) {
- $user_uri = 'principals/'.$user;
- $principals[] = array(
- 'uri' => $user_uri,
- '{DAV:}displayname' => $user,
- );
- }
- }
-
- return $principals;
- }
-
- /**
- * Returns a specific principal, specified by it's path.
- * The returned structure should be the exact same as from
- * getPrincipalsByPrefix.
- *
- * @param string $path
- * @return array
- */
- public function getPrincipalByPath($path) {
- list($prefix, $name) = explode('/', $path);
-
- if ($prefix == 'principals' && OC_User::userExists($name)) {
- return array(
- 'uri' => 'principals/'.$name,
- '{DAV:}displayname' => $name,
- );
- }
-
- return null;
- }
-
- /**
- * Returns the list of members for a group-principal
- *
- * @param string $principal
- * @return array
- */
- public function getGroupMemberSet($principal) {
- // TODO: for now the group principal has only one member, the user itself
- $principal = $this->getPrincipalByPath($principal);
- if (!$principal) {
- throw new Sabre_DAV_Exception('Principal not found');
- }
-
- return array(
- $principal['uri']
- );
- }
-
- /**
- * Returns the list of groups a principal is a member of
- *
- * @param string $principal
- * @return array
- */
- public function getGroupMembership($principal) {
- list($prefix, $name) = Sabre_DAV_URLUtil::splitPath($principal);
-
- $group_membership = array();
- if ($prefix == 'principals') {
- $principal = $this->getPrincipalByPath($principal);
- if (!$principal) {
- throw new Sabre_DAV_Exception('Principal not found');
- }
-
- // TODO: for now the user principal has only its own groups
- return array(
- 'principals/'.$name.'/calendar-proxy-read',
- 'principals/'.$name.'/calendar-proxy-write',
- // The addressbook groups are not supported in Sabre,
- // see http://groups.google.com/group/sabredav-discuss/browse_thread/thread/ef2fa9759d55f8c#msg_5720afc11602e753
- //'principals/'.$name.'/addressbook-proxy-read',
- //'principals/'.$name.'/addressbook-proxy-write',
- );
- }
- return $group_membership;
- }
-
- /**
- * Updates the list of group members for a group principal.
- *
- * The principals should be passed as a list of uri's.
- *
- * @param string $principal
- * @param array $members
- * @return void
- */
- public function setGroupMemberSet($principal, array $members) {
- throw new Sabre_DAV_Exception('Setting members of the group is not supported yet');
- }
-
- function updatePrincipal($path, $mutations) {
- return 0;
- }
-
- function searchPrincipals($prefixPath, array $searchProperties) {
- return array();
- }
-}
diff --git a/lib/connector/sabre/quotaplugin.php b/lib/connector/sabre/quotaplugin.php
deleted file mode 100644
index ea2cb81d1f7..00000000000
--- a/lib/connector/sabre/quotaplugin.php
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-
-/**
- * This plugin check user quota and deny creating files when they exceeds the quota.
- *
- * @author Sergio Cambra
- * @copyright Copyright (C) 2012 entreCables S.L. All rights reserved.
- * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
- */
-class OC_Connector_Sabre_QuotaPlugin extends Sabre_DAV_ServerPlugin {
-
- /**
- * Reference to main server object
- *
- * @var Sabre_DAV_Server
- */
- private $server;
-
- /**
- * is kept public to allow overwrite for unit testing
- *
- * @var \OC\Files\View
- */
- public $fileView;
-
- /**
- * This initializes the plugin.
- *
- * This function is called by Sabre_DAV_Server, after
- * addPlugin is called.
- *
- * This method should set up the requires event subscriptions.
- *
- * @param Sabre_DAV_Server $server
- * @return void
- */
- public function initialize(Sabre_DAV_Server $server) {
-
- $this->server = $server;
-
- $server->subscribeEvent('beforeWriteContent', array($this, 'checkQuota'), 10);
- $server->subscribeEvent('beforeCreateFile', array($this, 'checkQuota'), 10);
- }
-
- /**
- * This method is called before any HTTP method and validates there is enough free space to store the file
- *
- * @param string $method
- * @throws Sabre_DAV_Exception
- * @return bool
- */
- public function checkQuota($uri, $data = null) {
- $length = $this->getLength();
- if ($length) {
- if (substr($uri, 0, 1)!=='/') {
- $uri='/'.$uri;
- }
- list($parentUri, $newName) = Sabre_DAV_URLUtil::splitPath($uri);
- $freeSpace = $this->getFreeSpace($parentUri);
- if ($freeSpace !== \OC\Files\SPACE_UNKNOWN && $length > $freeSpace) {
- throw new Sabre_DAV_Exception_InsufficientStorage();
- }
- }
- return true;
- }
-
- public function getLength()
- {
- $req = $this->server->httpRequest;
- $length = $req->getHeader('X-Expected-Entity-Length');
- if (!$length) {
- $length = $req->getHeader('Content-Length');
- }
-
- $ocLength = $req->getHeader('OC-Total-Length');
- if ($length && $ocLength) {
- return max($length, $ocLength);
- }
-
- return $length;
- }
-
- /**
- * @param $parentUri
- * @return mixed
- */
- public function getFreeSpace($parentUri)
- {
- if (is_null($this->fileView)) {
- // initialize fileView
- $this->fileView = \OC\Files\Filesystem::getView();
- }
-
- $freeSpace = $this->fileView->free_space($parentUri);
- return $freeSpace;
- }
-}
diff --git a/lib/connector/sabre/request.php b/lib/connector/sabre/request.php
deleted file mode 100644
index d70c25c4e70..00000000000
--- a/lib/connector/sabre/request.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-/**
- * ownCloud
- *
- * @author Stefan Herbrechtsmeier
- * @copyright 2012 Stefan Herbrechtsmeier <stefan@herbrechtsmeier.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-class OC_Connector_Sabre_Request extends Sabre_HTTP_Request {
- /**
- * Returns the requested uri
- *
- * @return string
- */
- public function getUri() {
- return OC_Request::requestUri();
- }
-
- /**
- * Returns a specific item from the _SERVER array.
- *
- * Do not rely on this feature, it is for internal use only.
- *
- * @param string $field
- * @return string
- */
- public function getRawServerValue($field) {
- if($field == 'REQUEST_URI') {
- return $this->getUri();
- }
- else{
- return isset($this->_SERVER[$field])?$this->_SERVER[$field]:null;
- }
- }
-}