require_once('../lib/base.php');
require_once('Sabre/autoload.php');
-require_once('Sabre/DAV/Auth/Backend/Owncloud.php');
-require_once('Sabre/DAV/FS/OwncloudNode.php');
-require_once('Sabre/DAV/FS/OwncloudFile.php');
-require_once('Sabre/DAV/FS/OwncloudDirectory.php');
+require_once('Connector/Sabre/auth.php');
+require_once('Connector/Sabre/node.php');
+require_once('Connector/Sabre/file.php');
+require_once('Connector/Sabre/directory.php');
+require_once('Connector/Sabre/locks.php');
// Create ownCloud Dir
-$publicDir = new OC_Sabre_DAV_FS_OwncloudDirectory('');
+$publicDir = new OC_Connector_Sabre_Directory('');
$server = new Sabre_DAV_Server($publicDir);
// Path to our script
$server->setBaseUri($WEBROOT.'/files/webdav.php');
// Auth backend
-$authBackend = new OC_Sabre_DAV_Auth_Backend_Owncloud();
+$authBackend = new OC_Connector_Sabre_Auth();
$authPlugin = new Sabre_DAV_Auth_Plugin($authBackend,'ownCloud');
$server->addPlugin($authPlugin);
+// Also make sure there is a 'data' directory, writable by the server. This directory is used to store information about locks
+$lockBackend = new OC_Connector_Sabre_Locks();
+$lockPlugin = new Sabre_DAV_Locks_Plugin($lockBackend);
+$server->addPlugin($lockPlugin);
+
// And off we go!
$server->exec();
--- /dev/null
+<?php
+require_once("lib/base.php");
+/**
+ * HTTP Basic authentication backend class
+ *
+ * This class can be used by authentication objects wishing to use HTTP Basic
+ * Most of the digest logic is handled, implementors just need to worry about
+ * the validateUserPass method.
+ *
+ * @package Sabre
+ * @subpackage DAV
+ * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved.
+ * @author James David Low (http://jameslow.com/)
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+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::login($username,$password)){
+ OC_UTIL::setUpFS();
+ return true;
+ }
+ else{
+ return false;
+ }
+ }
+}
--- /dev/null
+<?php
+
+require_once("lib/base.php");
+
+/**
+ * Directory class
+ *
+ * @package Sabre
+ * @subpackage DAV
+ * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+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 is a readable stream resource
+ *
+ * @param string $name Name of the file
+ * @param resource $data Initial payload
+ * @return void
+ */
+ public function createFile($name, $data = null) {
+
+ $newPath = $this->path . '/' . $name;
+ OC_FILESYSTEM::file_put_contents($newPath,$data);
+
+ }
+
+ /**
+ * Creates a new subdirectory
+ *
+ * @param string $name
+ * @return void
+ */
+ public function createDirectory($name) {
+
+ $newPath = $this->path . '/' . $name;
+ OC_FILESYSTEM::mkdir($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) {
+
+ $path = $this->path . '/' . $name;
+
+ if (!OC_FILESYSTEM::file_exists($path)) throw new Sabre_DAV_Exception_FileNotFound('File with name ' . $path . ' could not be located');
+
+ if (OC_FILESYSTEM::is_dir($path)) {
+
+ return new OC_Connector_Sabre_Directory($path);
+
+ } else {
+
+ return new OC_Connector_Sabre_File($path);
+
+ }
+
+ }
+
+ /**
+ * Returns an array with all the child nodes
+ *
+ * @return Sabre_DAV_INode[]
+ */
+ public function getChildren() {
+
+ $nodes = array();
+ // foreach(scandir($this->path) as $node) if($node!='.' && $node!='..') $nodes[] = $this->getChild($node);
+ if( OC_FILESYSTEM::is_dir($this->path)){
+ $dh = OC_FILESYSTEM::opendir($this->path);
+ while(( $node = readdir($dh)) !== false ){
+ if($node!='.' && $node!='..'){
+ $nodes[] = $this->getChild($node);
+ }
+ }
+ }
+ return $nodes;
+
+ }
+
+ /**
+ * Checks if a child exists.
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function childExists($name) {
+
+ $path = $this->path . '/' . $name;
+ return OC_FILESYSTEM::file_exists($path);
+
+ }
+
+ /**
+ * Deletes all files in this directory, and then itself
+ *
+ * @return void
+ */
+ public function delete() {
+
+ foreach($this->getChildren() as $child) $child->delete();
+ OC_FILESYSTEM::rmdir($this->path);
+
+ }
+
+ /**
+ * Returns available diskspace information
+ *
+ * @return array
+ */
+ public function getQuotaInfo() {
+
+ return array(
+ OC_FILESYSTEM::filesize('/'),
+ OC_FILESYSTEM::free_space()
+ );
+
+ }
+
+}
+
--- /dev/null
+<?php
+
+require_once("lib/base.php");
+/**
+ * File class
+ *
+ * @package Sabre
+ * @subpackage DAV
+ * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_DAV_IFile {
+
+ /**
+ * Updates the data
+ *
+ * @param resource $data
+ * @return void
+ */
+ public function put($data) {
+
+ OC_FILESYSTEM::file_put_contents($this->path,$data);
+
+ }
+
+ /**
+ * Returns the data
+ *
+ * @return string
+ */
+ public function get() {
+
+ return OC_FILESYSTEM::file_get_contents($this->path);
+
+ }
+
+ /**
+ * Delete the current file
+ *
+ * @return void
+ */
+ public function delete() {
+
+ OC_FILESYSTEM::unlink($this->path);
+
+ }
+
+ /**
+ * Returns the size of the node, in bytes
+ *
+ * @return int
+ */
+ public function getSize() {
+
+ return OC_FILESYSTEM::filesize($this->path);
+
+ }
+
+ /**
+ * 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() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns the mime-type for a file
+ *
+ * If null is returned, we'll assume application/octet-stream
+ *
+ * @return mixed
+ */
+ public function getContentType() {
+
+ return OC_FILESYSTEM::getMimeType($this->path);
+
+ }
+}
+
--- /dev/null
+<?php
+require_once("lib/base.php");
+
+/**
+ * The Lock manager allows you to handle all file-locks centrally.
+ *
+ * This Lock Manager stores all its data in a database. You must pass a PDO
+ * connection object in the constructor.
+ *
+ * @package Sabre
+ * @subpackage DAV
+ * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+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.
+ $query = 'SELECT owner, token, timeout, created, scope, depth, uri FROM *PREFIX*locks WHERE ((created + timeout) > CAST(? AS UNSIGNED INTEGER)) AND ((uri = ?)';
+ $params = array(time(),$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;
+
+ $query.=' OR (depth!=0 AND uri = ?)';
+ $params[] = $currentPath;
+
+ }
+
+ if ($returnChildLocks) {
+
+ $query.=' OR (uri LIKE ?)';
+ $params[] = $uri . '/%';
+
+ }
+ $query.=')';
+
+ $stmt = OC_DB::prepare($query);
+ $result = $stmt->execute($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 $k=>$lock) {
+ if ($lock->token == $lockInfo->token) $exists = true;
+ }
+
+ if ($exists) {
+ $query = OC_DB::prepare( 'UPDATE *PREFIX*locks SET owner = ?, timeout = ?, scope = ?, depth = ?, uri = ?, created = ? WHERE token = ?' );
+ $result = $query->execute( array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token));
+ } else {
+ $query = OC_DB::prepare( 'INSERT INTO *PREFIX*locks (owner,timeout,scope,depth,uri,created,token) VALUES (?,?,?,?,?,?,?)' );
+ $result = $query->execute( array($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) {
+
+ $query = OC_DB::prepare( 'DELETE FROM *PREFIX*locks WHERE path=? AND token=?' );
+ $result = $query->execute( array($uri,$lockInfo->token));
+
+ return $result->numRows() === 1;
+
+ }
+
+}
+
--- /dev/null
+<?php
+
+require_once("lib/base.php");
+
+/**
+ * Base node-class
+ *
+ * The node class implements the method used by both the File and the Directory classes
+ *
+ * @package Sabre
+ * @subpackage DAV
+ * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode {
+
+ /**
+ * The path to the current node
+ *
+ * @var string
+ */
+ protected $path;
+
+ /**
+ * Sets up the node, expects a full path name
+ *
+ * @param string $path
+ * @return void
+ */
+ public function __construct($path) {
+ $this->path = $path;
+ }
+
+
+
+ /**
+ * Returns the name of the node
+ *
+ * @return string
+ */
+ public function getName() {
+
+ list(, $name) = Sabre_DAV_URLUtil::splitPath($this->path);
+ return $name;
+
+ }
+
+ /**
+ * Renames the node
+ *
+ * @param string $name The new name
+ * @return void
+ */
+ public function setName($name) {
+
+ list($parentPath, ) = Sabre_DAV_URLUtil::splitPath($this->path);
+ list(, $newName) = Sabre_DAV_URLUtil::splitPath($name);
+
+ $newPath = $parentPath . '/' . $newName;
+ OC_FILESYSTEM::rename($this->path,$newPath);
+
+ $this->path = $newPath;
+
+ }
+
+
+
+ /**
+ * Returns the last modification time, as a unix timestamp
+ *
+ * @return int
+ */
+ public function getLastModified() {
+
+ return OC_FILESYSTEM::filemtime($this->path);
+
+ }
+
+}
+
+++ /dev/null
-<?php
-require_once("lib/base.php");
-/**
- * HTTP Basic authentication backend class
- *
- * This class can be used by authentication objects wishing to use HTTP Basic
- * Most of the digest logic is handled, implementors just need to worry about
- * the validateUserPass method.
- *
- * @package Sabre
- * @subpackage DAV
- * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved.
- * @author James David Low (http://jameslow.com/)
- * @author Evert Pot (http://www.rooftopsolutions.nl/)
- * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
- */
-class OC_Sabre_DAV_Auth_Backend_Owncloud 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::login($username,$password)){
- OC_UTIL::setUpFS();
- return true;
- }
- else{
- return false;
- }
- }
-}
+++ /dev/null
-<?php
-
-require_once("lib/base.php");
-
-/**
- * Directory class
- *
- * @package Sabre
- * @subpackage DAV
- * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved.
- * @author Evert Pot (http://www.rooftopsolutions.nl/)
- * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
- */
-class OC_Sabre_DAV_FS_OwncloudDirectory extends OC_Sabre_DAV_FS_OwncloudNode implements Sabre_DAV_ICollection, Sabre_DAV_IQuota {
-
- /**
- * Creates a new file in the directory
- *
- * data is a readable stream resource
- *
- * @param string $name Name of the file
- * @param resource $data Initial payload
- * @return void
- */
- public function createFile($name, $data = null) {
-
- $newPath = $this->path . '/' . $name;
- OC_FILESYSTEM::file_put_contents($newPath,$data);
-
- }
-
- /**
- * Creates a new subdirectory
- *
- * @param string $name
- * @return void
- */
- public function createDirectory($name) {
-
- $newPath = $this->path . '/' . $name;
- OC_FILESYSTEM::mkdir($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) {
-
- $path = $this->path . '/' . $name;
-
- if (!OC_FILESYSTEM::file_exists($path)) throw new Sabre_DAV_Exception_FileNotFound('File with name ' . $path . ' could not be located');
-
- if (OC_FILESYSTEM::is_dir($path)) {
-
- return new OC_Sabre_DAV_FS_OwncloudDirectory($path);
-
- } else {
-
- return new OC_Sabre_DAV_FS_OwncloudFile($path);
-
- }
-
- }
-
- /**
- * Returns an array with all the child nodes
- *
- * @return Sabre_DAV_INode[]
- */
- public function getChildren() {
-
- $nodes = array();
- // foreach(scandir($this->path) as $node) if($node!='.' && $node!='..') $nodes[] = $this->getChild($node);
- if( OC_FILESYSTEM::is_dir($this->path)){
- $dh = OC_FILESYSTEM::opendir($this->path);
- while(( $node = readdir($dh)) !== false ){
- if($node!='.' && $node!='..'){
- $nodes[] = $this->getChild($node);
- }
- }
- }
- return $nodes;
-
- }
-
- /**
- * Checks if a child exists.
- *
- * @param string $name
- * @return bool
- */
- public function childExists($name) {
-
- $path = $this->path . '/' . $name;
- return OC_FILESYSTEM::file_exists($path);
-
- }
-
- /**
- * Deletes all files in this directory, and then itself
- *
- * @return void
- */
- public function delete() {
-
- foreach($this->getChildren() as $child) $child->delete();
- OC_FILESYSTEM::rmdir($this->path);
-
- }
-
- /**
- * Returns available diskspace information
- *
- * @return array
- */
- public function getQuotaInfo() {
-
- return array(
- OC_FILESYSTEM::filesize('/'),
- OC_FILESYSTEM::free_space()
- );
-
- }
-
-}
-
+++ /dev/null
-<?php
-
-require_once("lib/base.php");
-/**
- * File class
- *
- * @package Sabre
- * @subpackage DAV
- * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved.
- * @author Evert Pot (http://www.rooftopsolutions.nl/)
- * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
- */
-class OC_Sabre_DAV_FS_OwncloudFile extends OC_Sabre_DAV_FS_OwncloudNode implements Sabre_DAV_IFile {
-
- /**
- * Updates the data
- *
- * @param resource $data
- * @return void
- */
- public function put($data) {
-
- OC_FILESYSTEM::file_put_contents($this->path,$data);
-
- }
-
- /**
- * Returns the data
- *
- * @return string
- */
- public function get() {
-
- return OC_FILESYSTEM::file_get_contents($this->path);
-
- }
-
- /**
- * Delete the current file
- *
- * @return void
- */
- public function delete() {
-
- OC_FILESYSTEM::unlink($this->path);
-
- }
-
- /**
- * Returns the size of the node, in bytes
- *
- * @return int
- */
- public function getSize() {
-
- return OC_FILESYSTEM::filesize($this->path);
-
- }
-
- /**
- * 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() {
-
- return null;
-
- }
-
- /**
- * Returns the mime-type for a file
- *
- * If null is returned, we'll assume application/octet-stream
- *
- * @return mixed
- */
- public function getContentType() {
-
- return OC_FILESYSTEM::getMimeType($this->path);
-
- }
-}
-
+++ /dev/null
-<?php
-
-require_once("lib/base.php");
-
-/**
- * Base node-class
- *
- * The node class implements the method used by both the File and the Directory classes
- *
- * @package Sabre
- * @subpackage DAV
- * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved.
- * @author Evert Pot (http://www.rooftopsolutions.nl/)
- * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
- */
-abstract class OC_Sabre_DAV_FS_OwncloudNode implements Sabre_DAV_INode {
-
- /**
- * The path to the current node
- *
- * @var string
- */
- protected $path;
-
- /**
- * Sets up the node, expects a full path name
- *
- * @param string $path
- * @return void
- */
- public function __construct($path) {
- $this->path = $path;
- }
-
-
-
- /**
- * Returns the name of the node
- *
- * @return string
- */
- public function getName() {
-
- list(, $name) = Sabre_DAV_URLUtil::splitPath($this->path);
- return $name;
-
- }
-
- /**
- * Renames the node
- *
- * @param string $name The new name
- * @return void
- */
- public function setName($name) {
-
- list($parentPath, ) = Sabre_DAV_URLUtil::splitPath($this->path);
- list(, $newName) = Sabre_DAV_URLUtil::splitPath($name);
-
- $newPath = $parentPath . '/' . $newName;
- OC_FILESYSTEM::rename($this->path,$newPath);
-
- $this->path = $newPath;
-
- }
-
-
-
- /**
- * Returns the last modification time, as a unix timestamp
- *
- * @return int
- */
- public function getLastModified() {
-
- return OC_FILESYSTEM::filemtime($this->path);
-
- }
-
-}
-