diff options
author | Jakob Sack <kde@jakobsack.de> | 2011-07-22 14:38:42 +0200 |
---|---|---|
committer | Jakob Sack <kde@jakobsack.de> | 2011-07-22 14:38:42 +0200 |
commit | 7c9f356abeaaa9348332908bfcced21be88011ac (patch) | |
tree | 4ef4e6ad548175532d0a903d6d5b681d3da56320 /lib | |
parent | 86cd8063b49315246929f51774ac5314dab2c2cb (diff) | |
download | nextcloud-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.php | 138 | ||||
-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 |