diff options
-rw-r--r-- | include/reddav.php | 116 | ||||
-rw-r--r-- | mod/cloud.php | 24 | ||||
-rw-r--r-- | version.inc | 2 |
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 |