mirror of
https://codeberg.org/streams/streams.git
synced 2024-09-20 02:35:12 +00:00
reddav - basic mkdir support - needs more work to be robust
This commit is contained in:
parent
d920e212ac
commit
061894d37f
3 changed files with 115 additions and 11 deletions
|
@ -526,11 +526,14 @@ function attach_mkdir($channel,$observer_hash,$arr = null) {
|
|||
$sql_options = '';
|
||||
|
||||
$basepath = 'store/' . $channel['channel_address'];
|
||||
|
||||
logger('attach_mkdir: basepath: ' . $basepath);
|
||||
|
||||
if(! is_dir($basepath))
|
||||
@mkdir($basepath,STORAGE_DEFAULT_PERMISSIONS,true);
|
||||
mkdir($basepath,STORAGE_DEFAULT_PERMISSIONS,true);
|
||||
|
||||
|
||||
if(! perm_is_allowed($channel_id, get_observer_hash(),'write_storage')) {
|
||||
if(! perm_is_allowed($channel_id, $observer_hash,'write_storage')) {
|
||||
$ret['message'] = t('Permission denied.');
|
||||
return $ret;
|
||||
}
|
||||
|
@ -607,10 +610,10 @@ function attach_mkdir($channel,$observer_hash,$arr = null) {
|
|||
dbesc(''),
|
||||
dbesc($created),
|
||||
dbesc($created),
|
||||
dbesc(($arr && array_key_exists('allow_cid',$arr)) ? $arr['allow_cid'] : ''),
|
||||
dbesc(($arr && array_key_exists('allow_gid',$arr)) ? $arr['allow_gid'] : ''),
|
||||
dbesc(($arr && array_key_exists('deny_cid',$arr)) ? $arr['deny_cid'] : ''),
|
||||
dbesc(($arr && array_key_exists('deny_gid',$arr)) ? $arr['deny_gid'] : '')
|
||||
dbesc(($arr && array_key_exists('allow_cid',$arr)) ? $arr['allow_cid'] : $channel['channel_allow_cid']),
|
||||
dbesc(($arr && array_key_exists('allow_gid',$arr)) ? $arr['allow_gid'] : $channel['channel_allow_gid']),
|
||||
dbesc(($arr && array_key_exists('deny_cid',$arr)) ? $arr['deny_cid'] : $channel['channel_deny_cid']),
|
||||
dbesc(($arr && array_key_exists('deny_gid',$arr)) ? $arr['deny_gid'] : $channel['channel_deny_gid'])
|
||||
);
|
||||
|
||||
if($r) {
|
||||
|
|
|
@ -75,12 +75,12 @@ class RedInode implements DAV\INode {
|
|||
class RedDirectory extends DAV\Node implements DAV\ICollection {
|
||||
|
||||
private $red_path;
|
||||
private $folder_hash;
|
||||
private $ext_path;
|
||||
private $root_dir = '';
|
||||
private $auth;
|
||||
|
||||
|
||||
|
||||
function __construct($ext_path,&$auth_plugin) {
|
||||
logger('RedDirectory::__construct() ' . $ext_path);
|
||||
$this->ext_path = $ext_path;
|
||||
|
@ -89,7 +89,9 @@ class RedDirectory extends DAV\Node implements DAV\ICollection {
|
|||
$this->red_path = '/';
|
||||
$this->auth = $auth_plugin;
|
||||
logger('Red_Directory: ' . print_r($this,true));
|
||||
$this->folder_hash = '';
|
||||
|
||||
$this->getDir();
|
||||
|
||||
}
|
||||
|
||||
|
@ -202,12 +204,24 @@ dbg(0);
|
|||
|
||||
|
||||
function createDirectory($name) {
|
||||
if(! perm_is_allowed($this->auth->channel_id,$this->auth->observer,'write_storage')) {
|
||||
|
||||
logger('RedDirectory::createDirectory: ' . $name);
|
||||
|
||||
if((! $this->auth->owner_id) || (! perm_is_allowed($this->auth->owner_id,$this->auth->observer,'write_storage'))) {
|
||||
throw new DAV\Exception\Forbidden('Permission denied.');
|
||||
return;
|
||||
}
|
||||
|
||||
$r = q("select * from channel where channel_id = %d limit 1",
|
||||
dbesc($this->auth->owner_id)
|
||||
);
|
||||
|
||||
if($r) {
|
||||
$result = attach_mkdir($r[0],$this->auth->observer,array('filename' => $name,'folder' => $this->folder_hash));
|
||||
|
||||
logger('RedDirectory::createDirectory: ' . print_r($result,true));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -235,6 +249,64 @@ dbg(0);
|
|||
|
||||
}
|
||||
|
||||
function getDir() {
|
||||
|
||||
logger('getDir: ' . $this->ext_path);
|
||||
|
||||
$x = strpos($this->ext_path,'/cloud');
|
||||
if($x === false)
|
||||
return;
|
||||
if($x === 0) {
|
||||
$file = substr($file,6);
|
||||
}
|
||||
|
||||
if((! $file) || ($file === '/')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$file = trim($file,'/');
|
||||
$path_arr = explode('/', $file);
|
||||
|
||||
if(! $path_arr)
|
||||
return;
|
||||
|
||||
$channel_name = $path_arr[0];
|
||||
|
||||
$r = q("select channel_id from channel where channel_address = '%s' limit 1",
|
||||
dbesc($channel_name)
|
||||
);
|
||||
|
||||
if(! $r)
|
||||
return;
|
||||
|
||||
$channel_id = $r[0]['channel_id'];
|
||||
$this->auth->owner_id = $channel_id;
|
||||
|
||||
$path = '/' . $channel_name;
|
||||
|
||||
$folder = '';
|
||||
|
||||
for($x = 1; $x < count($path_arr); $x ++) {
|
||||
dbg(1);
|
||||
$r = q("select id, hash, filename, flags from attach where folder = '%s' and (flags & %d)",
|
||||
dbesc($folder),
|
||||
intval($channel_id),
|
||||
intval(ATTACH_FLAG_DIR)
|
||||
);
|
||||
dbg(0);
|
||||
if($r && ( $r[0]['flags'] & ATTACH_FLAG_DIR)) {
|
||||
$folder = $r[0]['hash'];
|
||||
$path = $path . '/' . $r[0]['filename'];
|
||||
}
|
||||
}
|
||||
$this->folder_hash = $folder;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -390,6 +462,7 @@ logger('dbg1: ' . print_r($r,true));
|
|||
return null;
|
||||
|
||||
$channel_id = $r[0]['channel_id'];
|
||||
$auth->owner_id = $channel_id;
|
||||
|
||||
$path = '/' . $channel_name;
|
||||
|
||||
|
@ -437,7 +510,7 @@ logger('dbg2: ' . print_r($r,true));
|
|||
|
||||
function RedFileData($file, &$auth,$test = false) {
|
||||
|
||||
logger('RedFileData:' . $file);
|
||||
logger('RedFileData:' . $file . (($test) ? ' (test mode) ' : ''));
|
||||
|
||||
|
||||
$x = strpos($file,'/cloud');
|
||||
|
@ -479,6 +552,11 @@ logger('file=' . $file);
|
|||
|
||||
$path = '/' . $channel_name;
|
||||
|
||||
$auth->owner_id = $channel_id;
|
||||
|
||||
$permission_error = false;
|
||||
|
||||
|
||||
$folder = '';
|
||||
//dbg(1);
|
||||
|
||||
|
@ -510,13 +588,27 @@ dbg(0);
|
|||
|
||||
);
|
||||
}
|
||||
if(! $r)
|
||||
if(! $r) {
|
||||
|
||||
$errors = true;
|
||||
$r = q("select id, uid, hash, filename, filetype, filesize, revision, folder, flags, created, edited from attach
|
||||
where folder = '%s' and filename = '%s' and uid = %d group by filename limit 1",
|
||||
dbesc($folder),
|
||||
basename($file),
|
||||
intval($channel_id)
|
||||
);
|
||||
if($r)
|
||||
$permission_error = true;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
logger('dbg1: ' . print_r($r,true));
|
||||
|
||||
if($path === '/' . $file) {
|
||||
if($test)
|
||||
return true;
|
||||
// final component was a directory.
|
||||
return new RedDirectory('/cloud/' . $file,$auth);
|
||||
}
|
||||
|
@ -524,11 +616,18 @@ dbg(0);
|
|||
if($errors) {
|
||||
if($test)
|
||||
return false;
|
||||
throw new DAV\Exception\Forbidden('Permission denied.');
|
||||
if($permission_error) {
|
||||
logger('RedFileData: permission error');
|
||||
throw new DAV\Exception\Forbidden('Permission denied.');
|
||||
}
|
||||
logger('RedFileData: not found');
|
||||
return;
|
||||
}
|
||||
|
||||
if($r) {
|
||||
if($test)
|
||||
return true;
|
||||
|
||||
if($r[0]['flags'] & ATTACH_FLAG_DIR)
|
||||
return new RedDirectory('/cloud' . $path . '/' . $r[0]['filename'],$auth);
|
||||
else
|
||||
|
|
|
@ -51,6 +51,8 @@ class RedBasicAuth extends Sabre\DAV\Auth\Backend\AbstractBasic {
|
|||
public $channel_hash = '';
|
||||
public $observer = '';
|
||||
|
||||
public $owner_id;
|
||||
|
||||
protected function validateUserPass($username, $password) {
|
||||
require_once('include/auth.php');
|
||||
$record = account_verify_password($email,$pass);
|
||||
|
|
Loading…
Reference in a new issue