2011-07-22 16:38:42 +04:00
|
|
|
<?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
|
|
|
|
*/
|
2011-07-22 18:21:29 +04:00
|
|
|
/*
|
|
|
|
*
|
|
|
|
* The following SQL statement is just a help for developers and will not be
|
|
|
|
* executed!
|
|
|
|
*
|
|
|
|
* CREATE TABLE locks (
|
|
|
|
* `id` INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
2011-07-23 00:30:45 +04:00
|
|
|
* `userid` VARCHAR(200),
|
2011-07-22 18:21:29 +04:00
|
|
|
* `owner` VARCHAR(100),
|
|
|
|
* `timeout` INTEGER UNSIGNED,
|
|
|
|
* `created` INTEGER,
|
|
|
|
* `token` VARCHAR(100),
|
|
|
|
* `scope` TINYINT,
|
|
|
|
* `depth` TINYINT,
|
|
|
|
* `uri` text
|
|
|
|
* );
|
|
|
|
*
|
|
|
|
*/
|
2011-07-22 16:38:42 +04:00
|
|
|
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.
|
2011-07-23 00:30:45 +04:00
|
|
|
$query = 'SELECT * FROM *PREFIX*locks WHERE userid = ? AND ((created + timeout) > CAST(? AS UNSIGNED INTEGER)) AND ((uri = ?)';
|
|
|
|
$params = array(OC_USER::getUser(),time(),$uri);
|
2011-07-22 16:38:42 +04:00
|
|
|
|
|
|
|
// 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) {
|
2011-07-23 00:30:45 +04:00
|
|
|
$query = OC_DB::prepare( 'UPDATE *PREFIX*locks SET owner = ?, timeout = ?, scope = ?, depth = ?, uri = ?, created = ? WHERE userid = ? AND token = ?' );
|
|
|
|
$result = $query->execute( array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,OC_USER::getUser(),$lockInfo->token));
|
2011-07-22 16:38:42 +04:00
|
|
|
} else {
|
2011-07-23 00:30:45 +04:00
|
|
|
$query = OC_DB::prepare( 'INSERT INTO *PREFIX*locks (userid,owner,timeout,scope,depth,uri,created,token) VALUES (?,?,?,?,?,?,?,?)' );
|
|
|
|
$result = $query->execute( array(OC_USER::getUser(),$lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token));
|
2011-07-22 16:38:42 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
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) {
|
|
|
|
|
2011-07-23 01:06:53 +04:00
|
|
|
$query = OC_DB::prepare( 'DELETE FROM *PREFIX*locks WHERE userid = ? AND uri=? AND token=?' );
|
2011-07-23 00:30:45 +04:00
|
|
|
$result = $query->execute( array(OC_USER::getUser(),$uri,$lockInfo->token));
|
2011-07-22 16:38:42 +04:00
|
|
|
|
|
|
|
return $result->numRows() === 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|