summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJakob Sack <kde@jakobsack.de>2011-07-22 14:38:42 +0200
committerJakob Sack <kde@jakobsack.de>2011-07-22 14:38:42 +0200
commit7c9f356abeaaa9348332908bfcced21be88011ac (patch)
tree4ef4e6ad548175532d0a903d6d5b681d3da56320 /lib
parent86cd8063b49315246929f51774ac5314dab2c2cb (diff)
downloadnextcloud-server-7c9f356abeaaa9348332908bfcced21be88011ac.tar.gz
nextcloud-server-7c9f356abeaaa9348332908bfcced21be88011ac.zip
Support for locks, minor changes
Diffstat (limited to 'lib')
-rw-r--r--lib/Connector/Sabre/auth.php (renamed from lib/Sabre/DAV/Auth/Backend/Owncloud.php)2
-rw-r--r--lib/Connector/Sabre/directory.php (renamed from lib/Sabre/DAV/FS/OwncloudDirectory.php)6
-rw-r--r--lib/Connector/Sabre/file.php (renamed from lib/Sabre/DAV/FS/OwncloudFile.php)2
-rw-r--r--lib/Connector/Sabre/locks.php138
-rw-r--r--lib/Connector/Sabre/node.php (renamed from lib/Sabre/DAV/FS/OwncloudNode.php)2
5 files changed, 144 insertions, 6 deletions
diff --git a/lib/Sabre/DAV/Auth/Backend/Owncloud.php b/lib/Connector/Sabre/auth.php
index 8c8556f9f20..cfe7723e761 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
index 5a5e9fcabf6..d0ff87f9b1a 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
index 8c390302a64..bb5ab738430 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 00000000000..58a0359899e
--- /dev/null
+++ b/lib/Connector/Sabre/locks.php
@@ -0,0 +1,138 @@
+<?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;
+
+ }
+
+}
+
diff --git a/lib/Sabre/DAV/FS/OwncloudNode.php b/lib/Connector/Sabre/node.php
index 7ccd410e627..fb607a709e4 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