From: Jakob Sack Date: Fri, 22 Jul 2011 12:38:42 +0000 (+0200) Subject: Support for locks, minor changes X-Git-Tag: v3.0~267^2~383^2~5 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=7c9f356abeaaa9348332908bfcced21be88011ac;p=nextcloud-server.git Support for locks, minor changes --- diff --git a/files/webdav.php b/files/webdav.php index 7d5855672ac..7dce0b48197 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/Connector/Sabre/auth.php b/lib/Connector/Sabre/auth.php new file mode 100644 index 00000000000..cfe7723e761 --- /dev/null +++ b/lib/Connector/Sabre/auth.php @@ -0,0 +1,35 @@ +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() + ); + + } + +} + diff --git a/lib/Connector/Sabre/file.php b/lib/Connector/Sabre/file.php new file mode 100644 index 00000000000..bb5ab738430 --- /dev/null +++ b/lib/Connector/Sabre/file.php @@ -0,0 +1,89 @@ +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); + + } +} + 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 @@ + 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/Connector/Sabre/node.php b/lib/Connector/Sabre/node.php new file mode 100644 index 00000000000..fb607a709e4 --- /dev/null +++ b/lib/Connector/Sabre/node.php @@ -0,0 +1,81 @@ +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); + + } + +} + diff --git a/lib/Sabre/DAV/Auth/Backend/Owncloud.php b/lib/Sabre/DAV/Auth/Backend/Owncloud.php deleted file mode 100644 index 8c8556f9f20..00000000000 --- a/lib/Sabre/DAV/Auth/Backend/Owncloud.php +++ /dev/null @@ -1,35 +0,0 @@ -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() - ); - - } - -} - diff --git a/lib/Sabre/DAV/FS/OwncloudFile.php b/lib/Sabre/DAV/FS/OwncloudFile.php deleted file mode 100644 index 8c390302a64..00000000000 --- a/lib/Sabre/DAV/FS/OwncloudFile.php +++ /dev/null @@ -1,89 +0,0 @@ -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); - - } -} - diff --git a/lib/Sabre/DAV/FS/OwncloudNode.php b/lib/Sabre/DAV/FS/OwncloudNode.php deleted file mode 100644 index 7ccd410e627..00000000000 --- a/lib/Sabre/DAV/FS/OwncloudNode.php +++ /dev/null @@ -1,81 +0,0 @@ -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); - - } - -} -