diff options
author | friendica <info@friendica.com> | 2014-01-01 16:07:36 -0800 |
---|---|---|
committer | friendica <info@friendica.com> | 2014-01-01 16:07:36 -0800 |
commit | 057d885baf670467443dea0da0797b9289b919b4 (patch) | |
tree | 33efb6306a7fefc80b8bd962c33500e41259967f | |
parent | ca8bf551d1684966d377e9d316c00fd40bd08e6e (diff) | |
download | volse-hubzilla-057d885baf670467443dea0da0797b9289b919b4.tar.gz volse-hubzilla-057d885baf670467443dea0da0797b9289b919b4.tar.bz2 volse-hubzilla-057d885baf670467443dea0da0797b9289b919b4.zip |
return to working on red-dav; This is a bit of a slog at the moment and the basic framework isn't even close to working. This does break the working test we did have (which was never connected to the Red backend). Now we're starting to connect Red and DAV together intimately. There will probably be some twists and turns along the way as we get the information we need into all the class objects that need them. But the important part is that the RedDirectory and RedFile classes are loading without throwing white screens and from here we can use logging to figure out what the DAV front end is trying to do and what it is passing to the backend and hopefully figure out what it expects to do with the results. Unless you're a competent developer with a strong background in OOP and are helping develop this code, you should keep it an arm's length away from any production site and don't even think of enabling it. By default it is turned off.
-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 |