summaryrefslogtreecommitdiffstats
path: root/lib/connector
diff options
context:
space:
mode:
authorJakob Sack <kde@jakobsack.de>2011-07-27 19:07:28 +0200
committerJakob Sack <kde@jakobsack.de>2011-07-27 19:07:28 +0200
commitf5c0dbd947d45520550b68dae77a894f871a0758 (patch)
tree5e3c8fe6a12af97990fd529fb0d692ddc9400386 /lib/connector
parent59e55b711b36a41c4e4c621b5a46f9d601e15c38 (diff)
downloadnextcloud-server-f5c0dbd947d45520550b68dae77a894f871a0758.tar.gz
nextcloud-server-f5c0dbd947d45520550b68dae77a894f871a0758.zip
Use autoload
Diffstat (limited to 'lib/connector')
-rw-r--r--lib/connector/sabre/auth.php34
-rw-r--r--lib/connector/sabre/directory.php128
-rw-r--r--lib/connector/sabre/file.php87
-rw-r--r--lib/connector/sabre/locks.php152
-rw-r--r--lib/connector/sabre/node.php158
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;
+ }
+}
+