diff options
author | Jakob Sack <kde@jakobsack.de> | 2011-07-27 19:07:28 +0200 |
---|---|---|
committer | Jakob Sack <kde@jakobsack.de> | 2011-07-27 19:07:28 +0200 |
commit | f5c0dbd947d45520550b68dae77a894f871a0758 (patch) | |
tree | 5e3c8fe6a12af97990fd529fb0d692ddc9400386 /lib/connector | |
parent | 59e55b711b36a41c4e4c621b5a46f9d601e15c38 (diff) | |
download | nextcloud-server-f5c0dbd947d45520550b68dae77a894f871a0758.tar.gz nextcloud-server-f5c0dbd947d45520550b68dae77a894f871a0758.zip |
Use autoload
Diffstat (limited to 'lib/connector')
-rw-r--r-- | lib/connector/sabre/auth.php | 34 | ||||
-rw-r--r-- | lib/connector/sabre/directory.php | 128 | ||||
-rw-r--r-- | lib/connector/sabre/file.php | 87 | ||||
-rw-r--r-- | lib/connector/sabre/locks.php | 152 | ||||
-rw-r--r-- | lib/connector/sabre/node.php | 158 |
5 files changed, 559 insertions, 0 deletions
diff --git a/lib/connector/sabre/auth.php b/lib/connector/sabre/auth.php new file mode 100644 index 00000000000..4e974ad821d --- /dev/null +++ b/lib/connector/sabre/auth.php @@ -0,0 +1,34 @@ +<?php +/** + * HTTP Basic authentication backend class + * + * This class can be used by authentication objects wishing to use HTTP Basic + * Most of the digest logic is handled, implementors just need to worry about + * the validateUserPass method. + * + * @package Sabre + * @subpackage DAV + * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved. + * @author James David Low (http://jameslow.com/) + * @author Evert Pot (http://www.rooftopsolutions.nl/) + * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License + */ +class OC_Connector_Sabre_Auth extends Sabre_DAV_Auth_Backend_AbstractBasic { + /** + * Validates a username and password + * + * This method should return true or false depending on if login + * succeeded. + * + * @return bool + */ + protected function validateUserPass($username, $password){ + if(OC_USER::login($username,$password)){ + OC_UTIL::setUpFS(); + return true; + } + else{ + return false; + } + } +} diff --git a/lib/connector/sabre/directory.php b/lib/connector/sabre/directory.php new file mode 100644 index 00000000000..a73888ca732 --- /dev/null +++ b/lib/connector/sabre/directory.php @@ -0,0 +1,128 @@ +<?php +/** + * Directory class + * + * @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_Directory extends OC_Connector_Sabre_Node implements Sabre_DAV_ICollection, Sabre_DAV_IQuota { + + /** + * Creates a new file in the directory + * + * data is a readable stream resource + * + * @param string $name Name of the file + * @param resource $data Initial payload + * @return void + */ + public function createFile($name, $data = null) { + + $newPath = $this->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..fb4e559aa50 --- /dev/null +++ b/lib/connector/sabre/file.php @@ -0,0 +1,87 @@ +<?php +/** + * File class + * + * @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_File extends OC_Connector_Sabre_Node implements Sabre_DAV_IFile { + + /** + * Updates the data + * + * @param resource $data + * @return void + */ + public function put($data) { + + OC_FILESYSTEM::file_put_contents($this->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..88bab509898 --- /dev/null +++ b/lib/connector/sabre/locks.php @@ -0,0 +1,152 @@ +<?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 + */ +/* + * + * 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, + * `userid` VARCHAR(200), + * `owner` VARCHAR(100), + * `timeout` INTEGER UNSIGNED, + * `created` INTEGER, + * `token` VARCHAR(100), + * `scope` TINYINT, + * `depth` TINYINT, + * `uri` text + * ); + * + */ +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 * FROM *PREFIX*locks WHERE userid = ? AND (created + timeout) > ? AND ((uri = ?)'; + $params = array(OC_USER::getUser(),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 userid = ? AND token = ?' ); + $result = $query->execute( array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,OC_USER::getUser(),$lockInfo->token)); + } else { + $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)); + } + + 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 userid = ? AND uri=? AND token=?' ); + $result = $query->execute( array(OC_USER::getUser(),$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..03d5e90012e --- /dev/null +++ b/lib/connector/sabre/node.php @@ -0,0 +1,158 @@ +<?php +/** + * Base node-class + * + * The node class implements the method used by both the File and the Directory classes + * + * @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 + */ +/* + * + * The following SQL statement is just a help for developers and will not be + * executed! + * + * CREATE TABLE IF NOT EXISTS `properties` ( + * `userid` varchar(200) COLLATE utf8_unicode_ci NOT NULL, + * `propertypath` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + * `propertyname` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + * `propertyvalue` text COLLATE utf8_unicode_ci NOT NULL + * ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + * + */ +abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IProperties { + + /** + * The path to the current node + * + * @var string + */ + protected $path; + + /** + * Sets up the node, expects a full path name + * + * @param string $path + * @return void + */ + public function __construct($path) { + $this->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; + $oldPath = $this->path; + + OC_FILESYSTEM::rename($this->path,$newPath); + + $this->path = $newPath; + + $query = OC_DB::prepare( 'UPDATE *PREFIX*properties SET propertypath = ? WHERE userid = ? AND propertypath = ?' ); + $query->execute( array( $newPath,OC_USER::getUser(), $oldPath )); + + } + + + + /** + * Returns the last modification time, as a unix timestamp + * + * @return int + */ + public function getLastModified() { + + return OC_FILESYSTEM::filemtime($this->path); + + } + + /** + * Updates properties on this node, + * + * @param array $mutations + * @see Sabre_DAV_IProperties::updateProperties + * @return bool|array + */ + public function updateProperties($properties) { + $existing = $this->getProperties(array()); + foreach($properties as $propertyName => $propertyValue) { + // If it was null, we need to delete the property + if (is_null($propertyValue)) { + if(array_key_exists( $propertyName, $existing )){ + $query = OC_DB::prepare( 'DELETE FROM *PREFIX*properties WHERE userid = ? AND propertypath = ? AND propertyname = ?' ); + $query->execute( array( OC_USER::getUser(), $this->path, $propertyName )); + } + } + else { + if(!array_key_exists( $propertyName, $existing )){ + $query = OC_DB::prepare( 'INSERT INTO *PREFIX*properties (userid,propertypath,propertyname,propertyvalue) VALUES(?,?,?,?)' ); + $query->execute( array( OC_USER::getUser(), $this->path, $propertyName,$propertyValue )); + } + else{ + $query = OC_DB::prepare( 'UPDATE *PREFIX*properties SET propertyvalue = ? WHERE userid = ? AND propertypath = ? AND propertyname = ?' ); + $query->execute( array( $propertyValue,OC_USER::getUser(), $this->path, $propertyName )); + } + } + + } + return true; + } + + /** + * Returns a list of properties for this nodes.; + * + * The properties list is a list of propertynames the client requested, encoded as xmlnamespace#tagName, for example: http://www.example.org/namespace#author + * If the array is empty, all properties should be returned + * + * @param array $properties + * @return void + */ + function getProperties($properties) { + // At least some magic in here :-) + $query = OC_DB::prepare( 'SELECT * FROM *PREFIX*properties WHERE userid = ? AND propertypath = ?' ); + $result = $query->execute( array( OC_USER::getUser(), $this->path )); + + $existing = array(); + while( $row = $result->fetchRow()){ + $existing[$row['propertyname']] = $row['propertyvalue']; + } + + if(count($properties) == 0){ + return $existing; + } + + // if the array was empty, we need to return everything + $props = array(); + foreach($properties as $property) { + if (isset($existing[$property])) $props[$property] = $existing[$property]; + } + return $props; + } +} + |