aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/reddav.php116
-rw-r--r--mod/cloud.php24
-rw-r--r--version.inc2
3 files changed, 124 insertions, 18 deletions
diff --git a/include/reddav.php b/include/reddav.php
index c24414610..ab127afaa 100644
--- a/include/reddav.php
+++ b/include/reddav.php
@@ -1,7 +1,7 @@
<?php /** @file */
use Sabre\DAV;
- require_once('vendor/autoload.php');
+require_once('vendor/autoload.php');
class RedInode implements DAV\INode {
@@ -70,23 +70,38 @@ class RedInode implements DAV\INode {
}
-abstract class RedDirectory extends DAV\Node implements DAV\ICollection {
+class RedDirectory extends DAV\Node implements DAV\ICollection {
private $red_path;
+ private $root_dir = '';
private $dir_key;
private $auth;
private $channel_id;
- function __construct($red_path,$auth_plugin) {
+
+ function __construct($red_path,&$auth_plugin) {
+ logger('RedDirectory::__construct()');
$this->red_path = $red_path;
$this->auth = $auth_plugin;
+ logger('RedDirectory: ' . print_r($this->auth,true));
+
}
function getChildren() {
- if(! perm_is_allowed($this->channel_id,'','view_storage'))
+ logger('RedDirectory::getChildren : ' . print_r($this->auth,true));
+
+ if(! perm_is_allowed($this->auth->channel_id,$this->auth->observer,'view_storage'))
return array();
+ if($this->red_path === '/' . $this->auth->channel_name) {
+
+ return new RedFile('/' . $this->auth->channel_name . '/' . 'test',$this->auth);
+
+ }
+
+
+
$ret = array();
$r = q("select distinct filename from attach where folder = '%s' and uid = %d group by filename",
dbesc($this->dir_key),
@@ -103,17 +118,39 @@ abstract class RedDirectory extends DAV\Node implements DAV\ICollection {
function getChild($name) {
- if(! perm_is_allowed($this->channel_id,'','view_storage')) {
+
+
+ logger('RedDirectory::getChild : ' . $name);
+ logger('RedDirectory::getChild red_path : ' . $this->red_path);
+
+ logger('RedDirectory::getChild : ' . print_r($this->auth,true));
+
+
+ if(! perm_is_allowed($this->auth->channel_id,$this->auth->observer,'view_storage')) {
throw new DAV\Exception\Forbidden('Permission denied.');
return;
}
-// FIXME check revisions
+
+ // These should be constants
+
+ if($this->red_path == 'store' && $name == 'cloud') {
+ return new RedDirectory('/' . $this->auth->channel_name,$this->auth);
+ }
+
+ if($this->red_path === '/' . $this->auth->channel_name) {
+
+ return new RedFile('/' . $this->auth->channel_name . '/' . 'test',$this->auth);
+
+ }
+
+ // FIXME check file revisions
+
$r = q("select * from attach where folder = '%s' and filename = '%s' and uid = %d limit 1",
dbesc($this->dir_key),
dbesc($name),
- dbesc($this->channel_id)
+ dbesc($this->auth->channel_id)
);
if(! $r) {
throw new DAV\Exception\NotFound('The file with name: ' . $name . ' could not be found');
@@ -122,6 +159,12 @@ abstract class RedDirectory extends DAV\Node implements DAV\ICollection {
}
+ function getName() {
+ logger('RedDirectory::getName : ' . print_r($this->auth,true));
+
+
+ }
+
function createFile($name,$data = null) {
@@ -136,10 +179,13 @@ abstract class RedDirectory extends DAV\Node implements DAV\ICollection {
function childExists($name) {
+
+ logger('RedDirectory::childExists : ' . print_r($this->auth,true));
+
$r = q("select distinct filename from attach where folder = '%s' and filename = '%s' and uid = %d group by filename",
dbesc($this->dir_key),
dbesc($name),
- intval($this->channel_id)
+ intval($this->auth->channel_id)
);
if($r)
return true;
@@ -150,17 +196,27 @@ abstract class RedDirectory extends DAV\Node implements DAV\ICollection {
}
-abstract class RedFile extends DAV\Node implements DAV\IFile {
+class RedFile extends DAV\Node implements DAV\IFile {
private $data;
+ private $auth;
+ private $name;
+ function __construct($name, &$auth) {
+ logger('RedFile::_construct: ' . $name);
+ $this->name = $name;
+ $this->auth = $auth;
+ $this->data = RedFileData($name,$auth);
- function __construct($data) {
- $this->data = $data;
-
+ logger('RedFile::_construct: ' . print_r($this->data,true));
}
+ function getName() {
+ logger('RedFile::getName');
+ return basename($data);
+
+ }
function put($data) {
@@ -180,17 +236,49 @@ abstract class RedFile extends DAV\Node implements DAV\IFile {
function getContentType() {
- return $this->data['filetype'];
+ $type = 'text/plain';
+ return $type;
+
+// return $this->data['filetype'];
}
function getSize() {
- return $this->data['filesize'];
+ return 33122;
+// return $this->data['filesize'];
}
}
+function RedFileData($file, $auth) {
+
+ if(substr($file,0,1) !== '/')
+ return null;
+ $path_arr = explode('/',$file);
+ if(! $path_arr)
+ return null;
+
+ $channel_name = $path_arr[0];
+
+ $folder = '';
+
+ for($x = 1; $x < count($path_arr); $x ++) {
+
+ $r = q("select distinct filename from attach where folder = '%s' and filename = '%s' and uid = %d group by filename",
+ dbesc($folder),
+ dbesc($path_arr[$x]),
+ intval($this->auth->channel_id)
+ );
+
+ if($r && ( $r[0]['flags'] && ATTACH_FLAG_DIR)) {
+ $folder = $r[0]['filename'];
+ }
+ }
+
+ return $r[0];
+
+}
diff --git a/mod/cloud.php b/mod/cloud.php
index cdd926444..3a4cf01b1 100644
--- a/mod/cloud.php
+++ b/mod/cloud.php
@@ -46,6 +46,11 @@
class RedBasicAuth extends Sabre\DAV\Auth\Backend\AbstractBasic {
+ public $channel_name = '';
+ public $channel_id = 0;
+ public $channel_hash = '';
+ public $observer = '';
+
protected function validateUserPass($username, $password) {
require_once('include/auth.php');
$record = account_verify_password($email,$pass);
@@ -56,10 +61,13 @@ class RedBasicAuth extends Sabre\DAV\Auth\Backend\AbstractBasic {
);
if($r) {
$this->currentUser = $r[0]['channel_address'];
+ $this->channel_name = $r[0]['channel_address'];
+ $this->channel_id = $r[0]['channel_id'];
+ $this->channel_hash = $this->observer = $r[0]['channel_hash'];
return true;
}
}
- $r = q("select channel_account_id from channel where channel_address = '%s' limit 1",
+ $r = q("select * from channel where channel_address = '%s' limit 1",
dbesc($username)
);
if($r) {
@@ -71,6 +79,9 @@ class RedBasicAuth extends Sabre\DAV\Auth\Backend\AbstractBasic {
if(($record['account_flags'] == ACCOUNT_OK) || ($record['account_flags'] == ACCOUNT_UNVERIFIED)
&& (hash('whirlpool',$record['account_salt'] . $password) === $record['account_password'])) {
logger('(DAV) RedBasicAuth: password verified for ' . $username);
+ $this->channel_name = $r[0]['channel_address'];
+ $this->channel_id = $r[0]['channel_id'];
+ $this->channel_hash = $r[0]['channel_hash'];
return true;
}
}
@@ -87,18 +98,25 @@ function cloud_init() {
if(! get_config('system','enable_cloud'))
killme();
- $rootDirectory = new DAV\FS\Directory('store');
+ require_once('include/reddav.php');
+
+ $auth = new RedBasicAuth();
+
+ $rootDirectory = new RedDirectory('store',$auth);
$server = new DAV\Server($rootDirectory);
$lockBackend = new DAV\Locks\Backend\File('store/data/locks');
$lockPlugin = new DAV\Locks\Plugin($lockBackend);
$server->addPlugin($lockPlugin);
- $auth = new RedBasicAuth();
$auth->Authenticate($server,'Red Matrix');
+ $browser = new DAV\Browser\Plugin();
+ $server->addPlugin($browser);
+
+
// All we need to do now, is to fire up the server
$server->exec();
diff --git a/version.inc b/version.inc
index 37ed2c8fd..a5ad50190 100644
--- a/version.inc
+++ b/version.inc
@@ -1 +1 @@
-2013-12-30.542
+2014-01-01.544