From 7c9f356abeaaa9348332908bfcced21be88011ac Mon Sep 17 00:00:00 2001 From: Jakob Sack Date: Fri, 22 Jul 2011 14:38:42 +0200 Subject: [PATCH] Support for locks, minor changes --- files/webdav.php | 18 ++- .../Owncloud.php => Connector/Sabre/auth.php} | 2 +- .../Sabre/directory.php} | 6 +- .../Sabre/file.php} | 2 +- lib/Connector/Sabre/locks.php | 138 ++++++++++++++++++ .../Sabre/node.php} | 2 +- 6 files changed, 156 insertions(+), 12 deletions(-) rename lib/{Sabre/DAV/Auth/Backend/Owncloud.php => Connector/Sabre/auth.php} (91%) rename lib/{Sabre/DAV/FS/OwncloudDirectory.php => Connector/Sabre/directory.php} (91%) rename lib/{Sabre/DAV/FS/OwncloudFile.php => Connector/Sabre/file.php} (93%) create mode 100644 lib/Connector/Sabre/locks.php rename lib/{Sabre/DAV/FS/OwncloudNode.php => Connector/Sabre/node.php} (95%) diff --git a/files/webdav.php b/files/webdav.php index 7d5855672a..7dce0b4819 100644 --- a/files/webdav.php +++ b/files/webdav.php @@ -28,23 +28,29 @@ $RUNTIME_NOSETUPFS = true; 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(); diff --git a/lib/Sabre/DAV/Auth/Backend/Owncloud.php b/lib/Connector/Sabre/auth.php similarity index 91% rename from lib/Sabre/DAV/Auth/Backend/Owncloud.php rename to lib/Connector/Sabre/auth.php index 8c8556f9f2..cfe7723e76 100644 --- a/lib/Sabre/DAV/Auth/Backend/Owncloud.php +++ b/lib/Connector/Sabre/auth.php @@ -14,7 +14,7 @@ require_once("lib/base.php"); * @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 { +class OC_Connector_Sabre_Auth extends Sabre_DAV_Auth_Backend_AbstractBasic { /** * Validates a username and password * diff --git a/lib/Sabre/DAV/FS/OwncloudDirectory.php b/lib/Connector/Sabre/directory.php similarity index 91% rename from lib/Sabre/DAV/FS/OwncloudDirectory.php rename to lib/Connector/Sabre/directory.php index 5a5e9fcabf..d0ff87f9b1 100644 --- a/lib/Sabre/DAV/FS/OwncloudDirectory.php +++ b/lib/Connector/Sabre/directory.php @@ -11,7 +11,7 @@ require_once("lib/base.php"); * @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 { +class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sabre_DAV_ICollection, Sabre_DAV_IQuota { /** * Creates a new file in the directory @@ -57,11 +57,11 @@ class OC_Sabre_DAV_FS_OwncloudDirectory extends OC_Sabre_DAV_FS_OwncloudNode imp if (OC_FILESYSTEM::is_dir($path)) { - return new OC_Sabre_DAV_FS_OwncloudDirectory($path); + return new OC_Connector_Sabre_Directory($path); } else { - return new OC_Sabre_DAV_FS_OwncloudFile($path); + return new OC_Connector_Sabre_File($path); } diff --git a/lib/Sabre/DAV/FS/OwncloudFile.php b/lib/Connector/Sabre/file.php similarity index 93% rename from lib/Sabre/DAV/FS/OwncloudFile.php rename to lib/Connector/Sabre/file.php index 8c390302a6..bb5ab73843 100644 --- a/lib/Sabre/DAV/FS/OwncloudFile.php +++ b/lib/Connector/Sabre/file.php @@ -10,7 +10,7 @@ require_once("lib/base.php"); * @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 { +class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_DAV_IFile { /** * Updates the data diff --git a/lib/Connector/Sabre/locks.php b/lib/Connector/Sabre/locks.php new file mode 100644 index 0000000000..58a0359899 --- /dev/null +++ b/lib/Connector/Sabre/locks.php @@ -0,0 +1,138 @@ + 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; + + } + +} + diff --git a/lib/Sabre/DAV/FS/OwncloudNode.php b/lib/Connector/Sabre/node.php similarity index 95% rename from lib/Sabre/DAV/FS/OwncloudNode.php rename to lib/Connector/Sabre/node.php index 7ccd410e62..fb607a709e 100644 --- a/lib/Sabre/DAV/FS/OwncloudNode.php +++ b/lib/Connector/Sabre/node.php @@ -13,7 +13,7 @@ require_once("lib/base.php"); * @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 { +abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode { /** * The path to the current node