mirror of
https://github.com/EGroupware/egroupware.git
synced 2025-01-14 09:58:58 +01:00
- renamed key of property value to 'val' like in HTTP_WebDAV_Server
- support for propfind and proppatch for WebDAV
This commit is contained in:
parent
0a7d4f9782
commit
401c0de336
@ -521,7 +521,7 @@ class filemanager_ui
|
|||||||
$cfs = config::get_customfields('filemanager');
|
$cfs = config::get_customfields('filemanager');
|
||||||
$all_cfs = in_array('customfields',$cols_to_show) && $cols_to_show[count($cols_to_show)-1][0] != '#';
|
$all_cfs = in_array('customfields',$cols_to_show) && $cols_to_show[count($cols_to_show)-1][0] != '#';
|
||||||
if ($path2n && (in_array('comment',$cols_to_show) || in_array('customfields',$cols_to_show)) &&
|
if ($path2n && (in_array('comment',$cols_to_show) || in_array('customfields',$cols_to_show)) &&
|
||||||
($path2props = egw_vfs::propfind(array_keys($path2n),'http://egroupware.org/')))
|
($path2props = egw_vfs::propfind(array_keys($path2n))))
|
||||||
{
|
{
|
||||||
foreach($path2props as $path => $props)
|
foreach($path2props as $path => $props)
|
||||||
{
|
{
|
||||||
@ -529,7 +529,7 @@ class filemanager_ui
|
|||||||
foreach($props as $prop)
|
foreach($props as $prop)
|
||||||
{
|
{
|
||||||
if (!$all_cfs && $prop['name'][0] == '#' && !in_array($prop['name'],$cols_to_show)) continue;
|
if (!$all_cfs && $prop['name'][0] == '#' && !in_array($prop['name'],$cols_to_show)) continue;
|
||||||
$row[$prop['name']] = strlen($prop['value']) < 64 ? $prop['value'] : substr($prop['value'],0,64).' ...';
|
$row[$prop['name']] = strlen($prop['val']) < 64 ? $prop['val'] : substr($prop['val'],0,64).' ...';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -567,7 +567,7 @@ class filemanager_ui
|
|||||||
$content['gid'] *= -1; // our widgets use negative gid's
|
$content['gid'] *= -1; // our widgets use negative gid's
|
||||||
if (($props = egw_vfs::propfind($path)))
|
if (($props = egw_vfs::propfind($path)))
|
||||||
{
|
{
|
||||||
foreach($props as $prop) $content[$prop['name']] = $prop['value'];
|
foreach($props as $prop) $content[$prop['name']] = $prop['val'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$content[$tabs] = $_GET['tabs'];
|
$content[$tabs] = $_GET['tabs'];
|
||||||
@ -619,7 +619,7 @@ class filemanager_ui
|
|||||||
}
|
}
|
||||||
elseif ($name[0] == '#' || $name == 'comment')
|
elseif ($name[0] == '#' || $name == 'comment')
|
||||||
{
|
{
|
||||||
$props[] = array('name' => $name, 'value' => $content[$name] ? $content[$name] : null);
|
$props[] = array('name' => $name, 'val' => $content[$name] ? $content[$name] : null);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -649,7 +649,7 @@ class filemanager_ui
|
|||||||
{
|
{
|
||||||
foreach($props as $prop)
|
foreach($props as $prop)
|
||||||
{
|
{
|
||||||
$content['old'][$prop['name']] = $prop['value'];
|
$content['old'][$prop['name']] = $prop['val'];
|
||||||
}
|
}
|
||||||
$msg .= lang('Properties saved.');
|
$msg .= lang('Properties saved.');
|
||||||
}
|
}
|
||||||
|
@ -693,7 +693,7 @@ class egw_vfs extends vfs_stream_wrapper
|
|||||||
* Store properties for a single ressource (file or dir)
|
* Store properties for a single ressource (file or dir)
|
||||||
*
|
*
|
||||||
* @param string $path string with path
|
* @param string $path string with path
|
||||||
* @param array $props array or array with values for keys 'name', 'ns', 'value' (null to delete the prop)
|
* @param array $props array or array with values for keys 'name', 'ns', 'val' (null to delete the prop)
|
||||||
* @return boolean true if props are updated, false otherwise (eg. ressource not found)
|
* @return boolean true if props are updated, false otherwise (eg. ressource not found)
|
||||||
*/
|
*/
|
||||||
static function proppatch($path,array $props)
|
static function proppatch($path,array $props)
|
||||||
@ -712,7 +712,7 @@ class egw_vfs extends vfs_stream_wrapper
|
|||||||
*
|
*
|
||||||
* @param array|string $path (array of) string with path
|
* @param array|string $path (array of) string with path
|
||||||
* @param string $ns='http://egroupware.org/' namespace if propfind should be limited to a single one, otherwise use null
|
* @param string $ns='http://egroupware.org/' namespace if propfind should be limited to a single one, otherwise use null
|
||||||
* @return array|boolean array with props (values for keys 'name', 'ns', 'value'), or path => array of props for is_array($path)
|
* @return array|boolean array with props (values for keys 'name', 'ns', 'val'), or path => array of props for is_array($path)
|
||||||
* false if $path does not exist
|
* false if $path does not exist
|
||||||
*/
|
*/
|
||||||
static function propfind($path,$ns=self::DEFAULT_PROP_NAMESPACE)
|
static function propfind($path,$ns=self::DEFAULT_PROP_NAMESPACE)
|
||||||
|
@ -1503,11 +1503,12 @@ class sqlfs_stream_wrapper implements iface_stream_wrapper
|
|||||||
* Store properties for a single ressource (file or dir)
|
* Store properties for a single ressource (file or dir)
|
||||||
*
|
*
|
||||||
* @param string|int $path string with path or integer fs_id
|
* @param string|int $path string with path or integer fs_id
|
||||||
* @param array $props array or array with values for keys 'name', 'ns', 'value' (null to delete the prop)
|
* @param array $props array or array with values for keys 'name', 'ns', 'val' (null to delete the prop)
|
||||||
* @return boolean true if props are updated, false otherwise (eg. ressource not found)
|
* @return boolean true if props are updated, false otherwise (eg. ressource not found)
|
||||||
*/
|
*/
|
||||||
static function proppatch($path,array &$props)
|
static function proppatch($path,array &$props)
|
||||||
{
|
{
|
||||||
|
//error_log(__METHOD__."(".array2string($path).','.array2string($props));
|
||||||
if (!is_numeric($path))
|
if (!is_numeric($path))
|
||||||
{
|
{
|
||||||
if (!($stat = self::url_stat($path,0)))
|
if (!($stat = self::url_stat($path,0)))
|
||||||
@ -1528,7 +1529,7 @@ class sqlfs_stream_wrapper implements iface_stream_wrapper
|
|||||||
{
|
{
|
||||||
if (!isset($prop['ns'])) $prop['ns'] = egw_vfs::DEFAULT_PROP_NAMESPACE;
|
if (!isset($prop['ns'])) $prop['ns'] = egw_vfs::DEFAULT_PROP_NAMESPACE;
|
||||||
|
|
||||||
if (!isset($prop['value']) || self::$pdo_type != 'mysql') // for non mysql, we have to delete the prop anyway, as there's no REPLACE!
|
if (!isset($prop['val']) || self::$pdo_type != 'mysql') // for non mysql, we have to delete the prop anyway, as there's no REPLACE!
|
||||||
{
|
{
|
||||||
if (!isset($del_stmt))
|
if (!isset($del_stmt))
|
||||||
{
|
{
|
||||||
@ -1539,7 +1540,7 @@ class sqlfs_stream_wrapper implements iface_stream_wrapper
|
|||||||
$del_stmt->bindParam(':prop_name',$prop['name']);
|
$del_stmt->bindParam(':prop_name',$prop['name']);
|
||||||
$del_stmt->execute();
|
$del_stmt->execute();
|
||||||
}
|
}
|
||||||
if (isset($prop['value']))
|
if (isset($prop['val']))
|
||||||
{
|
{
|
||||||
if (!isset($ins_stmt))
|
if (!isset($ins_stmt))
|
||||||
{
|
{
|
||||||
@ -1549,7 +1550,7 @@ class sqlfs_stream_wrapper implements iface_stream_wrapper
|
|||||||
}
|
}
|
||||||
$ins_stmt->bindParam(':prop_namespace',$prop['ns']);
|
$ins_stmt->bindParam(':prop_namespace',$prop['ns']);
|
||||||
$ins_stmt->bindParam(':prop_name',$prop['name']);
|
$ins_stmt->bindParam(':prop_name',$prop['name']);
|
||||||
$ins_stmt->bindParam(':prop_value',$prop['value']);
|
$ins_stmt->bindParam(':prop_value',$prop['val']);
|
||||||
if (!$ins_stmt->execute())
|
if (!$ins_stmt->execute())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -1595,7 +1596,7 @@ class sqlfs_stream_wrapper implements iface_stream_wrapper
|
|||||||
foreach($stmt as $row)
|
foreach($stmt as $row)
|
||||||
{
|
{
|
||||||
$props[$row['fs_id']][] = array(
|
$props[$row['fs_id']][] = array(
|
||||||
'value' => $row['prop_value'],
|
'val' => $row['prop_value'],
|
||||||
'name' => $row['prop_name'],
|
'name' => $row['prop_name'],
|
||||||
'ns' => $row['prop_namespace'],
|
'ns' => $row['prop_namespace'],
|
||||||
);
|
);
|
||||||
|
@ -169,21 +169,56 @@ class vfs_webdav_server extends HTTP_WebDAV_Server_Filesystem
|
|||||||
*/
|
*/
|
||||||
// ToDo: etag from inode and modification time
|
// ToDo: etag from inode and modification time
|
||||||
|
|
||||||
/*
|
|
||||||
// get additional properties from database
|
|
||||||
$query = "SELECT ns, name, value
|
|
||||||
FROM {$this->db_prefix}properties
|
|
||||||
WHERE path = '$path'";
|
|
||||||
$res = mysql_query($query);
|
|
||||||
while ($row = mysql_fetch_assoc($res)) {
|
|
||||||
$info["props"][] = HTTP_WebDAV_Server::mkprop ($row["ns"], $row["name"], $row["value"]);
|
|
||||||
}
|
|
||||||
mysql_free_result($res);
|
|
||||||
*/
|
|
||||||
//error_log(__METHOD__."($path) info=".print_r($info,true));
|
//error_log(__METHOD__."($path) info=".print_r($info,true));
|
||||||
return $info;
|
return $info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PROPFIND method handler
|
||||||
|
*
|
||||||
|
* Reimplemented to fetch all extra property of a PROPFIND request in one go.
|
||||||
|
*
|
||||||
|
* @param array general parameter passing array
|
||||||
|
* @param array return array for file properties
|
||||||
|
* @return bool true on success
|
||||||
|
*/
|
||||||
|
function PROPFIND(&$options, &$files)
|
||||||
|
{
|
||||||
|
if (!parent::PROPFIND($options,$files))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$path2n = array();
|
||||||
|
foreach($files['files'] as $n => $info)
|
||||||
|
{
|
||||||
|
if (!$n && substr($info['path'],-1) == '/')
|
||||||
|
{
|
||||||
|
$path2n[substr($info['path'],0,-1)] = $n;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$path2n[$info['path']] = $n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($path2n && ($path2props = egw_vfs::propfind(array_keys($path2n),null)))
|
||||||
|
{
|
||||||
|
foreach($path2props as $path => $props)
|
||||||
|
{
|
||||||
|
$fileprops =& $files['files'][$path2n[$path]]['props'];
|
||||||
|
foreach($props as $prop)
|
||||||
|
{
|
||||||
|
if ($prop['ns'] == egw_vfs::DEFAULT_PROP_NAMESPACE && $prop['name'][0] == '#') // eGW's customfields
|
||||||
|
{
|
||||||
|
$prop['ns'] .= 'customfields/';
|
||||||
|
$prop['name'] = substr($prop['name'],1);
|
||||||
|
}
|
||||||
|
$fileprops[] = $prop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used eg. by get
|
* Used eg. by get
|
||||||
*
|
*
|
||||||
@ -223,9 +258,12 @@ class vfs_webdav_server extends HTTP_WebDAV_Server_Filesystem
|
|||||||
case 'getlastmodified':
|
case 'getlastmodified':
|
||||||
egw_vfs::touch($path,strtotime($prop['val']));
|
egw_vfs::touch($path,strtotime($prop['val']));
|
||||||
break;
|
break;
|
||||||
case 'srt_creationtime':
|
//case 'srt_creationtime':
|
||||||
// not supported via the streamwrapper interface atm.
|
// not supported via the streamwrapper interface atm.
|
||||||
//$attributes['created'] = strtotime($prop['val']);
|
//$attributes['created'] = strtotime($prop['val']);
|
||||||
|
//break;
|
||||||
|
default:
|
||||||
|
if (!egw_vfs::proppatch($path,array($prop))) $options['props'][$key]['status'] = '403 Forbidden';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -243,6 +281,14 @@ class vfs_webdav_server extends HTTP_WebDAV_Server_Filesystem
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case egw_vfs::DEFAULT_PROP_NAMESPACE.'customfields/': // eGW's customfields
|
||||||
|
$prop['ns'] = egw_vfs::DEFAULT_PROP_NAMESPACE;
|
||||||
|
$prop['name'] = '#'.$prop['name'];
|
||||||
|
// fall through
|
||||||
|
default:
|
||||||
|
if (!egw_vfs::proppatch($path,array($prop))) $options['props'][$key]['status'] = '403 Forbidden';
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if ($this->debug) $props[] = '('.$prop['ns'].')'.$prop['name'].'='.$prop['val'];
|
if ($this->debug) $props[] = '('.$prop['ns'].')'.$prop['name'].'='.$prop['val'];
|
||||||
}
|
}
|
||||||
@ -263,7 +309,7 @@ class vfs_webdav_server extends HTTP_WebDAV_Server_Filesystem
|
|||||||
*/
|
*/
|
||||||
function LOCK(&$options)
|
function LOCK(&$options)
|
||||||
{
|
{
|
||||||
error_log(__METHOD__.'('.str_replace(array("\n",' '),'',print_r($options,true)).')');
|
if ($this->debug) error_log(__METHOD__.'('.str_replace(array("\n",' '),'',print_r($options,true)).')');
|
||||||
// TODO recursive locks on directories not supported yet
|
// TODO recursive locks on directories not supported yet
|
||||||
if (is_dir($this->base . $options['path']) && !empty($options['depth']))
|
if (is_dir($this->base . $options['path']) && !empty($options['depth']))
|
||||||
{
|
{
|
||||||
@ -289,7 +335,7 @@ class vfs_webdav_server extends HTTP_WebDAV_Server_Filesystem
|
|||||||
*/
|
*/
|
||||||
function UNLOCK(&$options)
|
function UNLOCK(&$options)
|
||||||
{
|
{
|
||||||
error_log(__METHOD__.'('.str_replace(array("\n",' '),'',print_r($options,true)).')');
|
if ($this->debug) error_log(__METHOD__.'('.str_replace(array("\n",' '),'',print_r($options,true)).')');
|
||||||
return egw_vfs::unlock($options['path'],$options['token']) ? '204 No Content' : '409 Conflict';
|
return egw_vfs::unlock($options['path'],$options['token']) ? '204 No Content' : '409 Conflict';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user