diff options
author | friendica <info@friendica.com> | 2014-01-02 01:09:57 -0800 |
---|---|---|
committer | friendica <info@friendica.com> | 2014-01-02 01:09:57 -0800 |
commit | ad08561d84fa73e672b3621c511a95714f4ba99e (patch) | |
tree | e7595f3c952e7b70828ad36e79bb23a3a722470b | |
parent | 76106e16d5ac3eaa0327cd4781914733f4c08448 (diff) | |
download | volse-hubzilla-ad08561d84fa73e672b3621c511a95714f4ba99e.tar.gz volse-hubzilla-ad08561d84fa73e672b3621c511a95714f4ba99e.tar.bz2 volse-hubzilla-ad08561d84fa73e672b3621c511a95714f4ba99e.zip |
some DAV tweaks before the next round of heavy lifting
-rw-r--r-- | include/reddav.php | 260 | ||||
-rw-r--r-- | mod/cloud.php | 8 | ||||
-rw-r--r-- | version.inc | 2 |
3 files changed, 197 insertions, 73 deletions
diff --git a/include/reddav.php b/include/reddav.php index ab127afaa..704c13017 100644 --- a/include/reddav.php +++ b/include/reddav.php @@ -73,46 +73,39 @@ class RedInode implements DAV\INode { class RedDirectory extends DAV\Node implements DAV\ICollection { private $red_path; + private $ext_path; private $root_dir = ''; - private $dir_key; +// private $dir_key; private $auth; - private $channel_id; +// private $channel_id; - function __construct($red_path,&$auth_plugin) { - logger('RedDirectory::__construct()'); - $this->red_path = $red_path; + function __construct($ext_path,&$auth_plugin) { + logger('RedDirectory::__construct() ' . $ext_path); + $this->ext_path = $ext_path; + $this->red_path = ((strpos($ext_path,'/cloud') === 0) ? substr($ext_path,6) : $ext_path); + if(! $this->red_path) + $this->red_path = '/'; $this->auth = $auth_plugin; - logger('RedDirectory: ' . print_r($this->auth,true)); + logger('Red_Directory: ' . print_r($this,true)); + } function getChildren() { - 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); + logger('RedDirectory::getChildren : ' . print_r($this,true)); + if(get_config('system','block_public') && (! $this->auth->channel_id) && (! $this->auth->observer)) { + throw new DAV\Exception\Forbidden('Permission denied.'); + return; } + if(! perm_is_allowed($this->auth->channel_id,$this->auth->observer,'view_storage')) + return array(); - $ret = array(); - $r = q("select distinct filename from attach where folder = '%s' and uid = %d group by filename", - dbesc($this->dir_key), - intval($this->channel_id) - ); - if($r) { - foreach($r as $rr) { - $ret[] = $rr['filename']; - } - } - return $ret; + return RedCollectionData($this->red_path,$this->auth); } @@ -121,48 +114,34 @@ class RedDirectory extends DAV\Node implements DAV\ICollection { logger('RedDirectory::getChild : ' . $name); - logger('RedDirectory::getChild red_path : ' . $this->red_path); - - logger('RedDirectory::getChild : ' . print_r($this->auth,true)); - + logger('RedDirectory::getChild : ' . print_r($this,true)); - if(! perm_is_allowed($this->auth->channel_id,$this->auth->observer,'view_storage')) { + if(get_config('system','block_public') && (! $this->auth->channel_id) && (! $this->auth->observer)) { throw new DAV\Exception\Forbidden('Permission denied.'); return; } - - - // These should be constants - - if($this->red_path == 'store' && $name == 'cloud') { - return new RedDirectory('/' . $this->auth->channel_name,$this->auth); + + if(! perm_is_allowed($this->auth->channel_id,$this->auth->observer,'view_storage')) { + throw new DAV\Exception\Forbidden('Permission denied.'); + return; } - - if($this->red_path === '/' . $this->auth->channel_name) { - - return new RedFile('/' . $this->auth->channel_name . '/' . 'test',$this->auth); + if($this->red_path === '/' && $name === 'cloud') { + return new RedDirectory('/cloud', $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->auth->channel_id) - ); - if(! $r) { - throw new DAV\Exception\NotFound('The file with name: ' . $name . ' could not be found'); - } + $x = RedFileData('/cloud' . (($this->red_path === '/') ? '' : '/') . '/' . $name, $this->auth); + logger('RedFileData returns: ' . print_r($x,true)); + if($x) + return $x; + throw new DAV\Exception\NotFound('The file with name: ' . $name . ' could not be found'); } function getName() { - logger('RedDirectory::getName : ' . print_r($this->auth,true)); - - + logger('RedDirectory::getName : ' . print_r($this,true)); + return (basename($this->red_path)); } @@ -250,34 +229,181 @@ class RedFile extends DAV\Node implements DAV\IFile { } +function RedChannelList(&$auth) { -function RedFileData($file, $auth) { + $ret = array(); + $r = q("select channel_address from channel where not (channel_pageflags & %d)", + intval(PAGE_REMOVED) + ); - if(substr($file,0,1) !== '/') - return null; - $path_arr = explode('/',$file); + if($r) { + foreach($r as $rr) { + $ret[] = new RedDirectory('/cloud/' . $rr['channel_address'],$auth); + } + } + return $ret; + +} + + +function RedCollectionData($file,&$auth) { + + $ret = array(); + + + $x = strpos($file,'/cloud'); + if($x === 0) { + $file = substr($file,6); + } + + if((! $file) || ($file === '/')) { + return RedChannelList($auth); + + } + + $file = trim($file,'/'); + $path_arr = explode('/', $file); + if(! $path_arr) return null; $channel_name = $path_arr[0]; + $r = q("select channel_id from channel where channel_name = '%s' limit 1", + dbesc($channel_name) + ); + if(! $r) + return null; + + $channel_id = $r[0]['channel_id']; + + $path = '/' . $channel_name; + $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", + for($x = 1; $x < count($path_arr); $x ++) { + $r = q("hash, filename, flags from attach where folder = '%s' and (flags & %d)", dbesc($folder), - dbesc($path_arr[$x]), - intval($this->auth->channel_id) + intval($channel_id), + intval(ATTACH_FLAG_DIR) ); + if($r && ( $r[0]['flags'] & ATTACH_FLAG_DIR)) { + $folder = $r[0]['hash']; + $path = $path . '/' . $r[0]['filename']; + } + } - if($r && ( $r[0]['flags'] && ATTACH_FLAG_DIR)) { - $folder = $r[0]['filename']; - } + if($path !== '/' . $file) { + logger("RedCollectionData: Path mismatch: $path !== /$file"); + return NULL; + } + + $ret = array(); + + $r = q("select filename from attach where folder = '%s' group by filename", + dbesc($folder), + intval($channel_id), + intval(ATTACH_FLAG_DIR) + ); + + foreach($r as $rr) { + if($rr['flags'] & ATTACH_FLAG_DIR) + $ret[] = new RedDirectory('/cloud' . $path . '/' . $rr['filename'],$auth); + else + $ret[] = newRedFile('/cloud' . $path . '/' . $rr['filename'],$auth); + } + + return $ret; + +} + +function RedFileData($file, &$auth) { + +logger('RedFileData:' . $file); + + + $x = strpos($file,'/cloud'); + if($x === 0) { + $file = substr($file,6); + } + +logger('RedFileData2: ' . $file); + + if((! $file) || ($file === '/')) { + return RedDirectory('/',$auth); + + } + + $file = trim($file,'/'); + +logger('file=' . $file); + + $path_arr = explode('/', $file); + + if(! $path_arr) + return null; + + logger("file = $file - path = " . print_r($path_arr,true)); + + $channel_name = $path_arr[0]; +//dbg(1); + + $r = q("select channel_id from channel where channel_address = '%s' limit 1", + dbesc($channel_name) + ); + +//dbg(0); + + if(! $r) + return null; + + $channel_id = $r[0]['channel_id']; + + $path = '/' . $channel_name; + + $folder = ''; +//dbg(1); + for($x = 1; $x < count($path_arr); $x ++) { + $r = q("hash, filename, flags from attach where folder = '%s' and uid = %d and (flags & %d)", + dbesc($folder), + intval($channel_id), + intval(ATTACH_FLAG_DIR) + ); + if($r && ( $r[0]['flags'] & ATTACH_FLAG_DIR)) { + $folder = $r[0]['hash']; + $path = $path . '/' . $r[0]['filename']; + } + } +//dbg(0); + + if($path === '/' . $file) { + // final component was a directory. + return new RedDirectory('/cloud/' . $file,$auth); + } + +// //if($path !== dirname($file)) { +// logger("RedFileData: Path mismatch: $path !== dirname($file)"); +// return NULL; +// } + + $ret = array(); +//dbg(1); + $r = q("select filename from attach where folder = '%s' and filename = '%s' and uid = %d group by filename limit 1", + dbesc($folder), + basename($file), + intval($channel_id) + + ); +//dbg(0); + foreach($r as $rr) { + if($rr['flags'] & ATTACH_FLAG_DIR) + $ret[] = new RedDirectory($path . '/' . $rr['filename'],$auth); + else + $ret[] = newRedFile($path . '/' . $rr['filename'],$auth); } - return $r[0]; + return $ret[0]; } diff --git a/mod/cloud.php b/mod/cloud.php index 3a4cf01b1..209a74c74 100644 --- a/mod/cloud.php +++ b/mod/cloud.php @@ -93,7 +93,7 @@ class RedBasicAuth extends Sabre\DAV\Auth\Backend\AbstractBasic { } -function cloud_init() { +function cloud_init(&$a) { if(! get_config('system','enable_cloud')) killme(); @@ -102,7 +102,7 @@ function cloud_init() { $auth = new RedBasicAuth(); - $rootDirectory = new RedDirectory('store',$auth); + $rootDirectory = new RedDirectory('/cloud',$auth); $server = new DAV\Server($rootDirectory); $lockBackend = new DAV\Locks\Backend\File('store/data/locks'); $lockPlugin = new DAV\Locks\Plugin($lockBackend); @@ -112,7 +112,6 @@ function cloud_init() { $auth->Authenticate($server,'Red Matrix'); - $browser = new DAV\Browser\Plugin(); $server->addPlugin($browser); @@ -120,6 +119,5 @@ function cloud_init() { // All we need to do now, is to fire up the server $server->exec(); - exit; - + killme(); }
\ No newline at end of file diff --git a/version.inc b/version.inc index a5ad50190..1ccd4beb1 100644 --- a/version.inc +++ b/version.inc @@ -1 +1 @@ -2014-01-01.544 +2014-01-02.545 |