From ad08561d84fa73e672b3621c511a95714f4ba99e Mon Sep 17 00:00:00 2001 From: friendica Date: Thu, 2 Jan 2014 01:09:57 -0800 Subject: some DAV tweaks before the next round of heavy lifting --- include/reddav.php | 260 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 193 insertions(+), 67 deletions(-) (limited to 'include') 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]; } -- cgit v1.2.3