From 926ffc1688d7e35474b2f028f0c427a71c486cec Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 15 Sep 2011 12:19:33 +0000 Subject: [PATCH] * Filemanager/WebDAV: understand Windows7 modification time attribute and setting and returning is as vfs modification time --- phpgwapi/inc/class.vfs_webdav_server.inc.php | 73 +++++++++++++++++--- 1 file changed, 64 insertions(+), 9 deletions(-) diff --git a/phpgwapi/inc/class.vfs_webdav_server.inc.php b/phpgwapi/inc/class.vfs_webdav_server.inc.php index 92cd87b328..5d561d5dc4 100644 --- a/phpgwapi/inc/class.vfs_webdav_server.inc.php +++ b/phpgwapi/inc/class.vfs_webdav_server.inc.php @@ -316,6 +316,26 @@ class vfs_webdav_server extends HTTP_WebDAV_Server_Filesystem return $info; } + /** + * Which regular properties should be copied to different namespaces and names, + * because PROPPATCH stores them not as properties under their namespace and name, + * but simply sets the standard stat values instead. + * + * @var array stat-attr => array(array('ns'=>namespace, 'name'=>attribute-name)[, ...]) + */ + public static $auto_props = array( + 'mtime' => array( + array('ns' => 'urn:schemas-microsoft-com:', 'name' => 'Win32LastModifiedTime'), + array('ns' => 'http://www.southrivertech.com/', 'name' => 'srt_modifiedtime'), + array('ns' => 'http://www.southrivertech.com/', 'name' => 'getlastmodified'), + ), + 'ctime' => array( + // no streamwrapper interface / php function to set the ctime currently + //array('ns' => 'urn:schemas-microsoft-com:', 'name' => 'Win32CreationTime'), + //array('ns' => 'http://www.southrivertech.com/', 'name' => 'srt_creationtime'), + ), + ); + /** * PROPFIND method handler * @@ -334,13 +354,33 @@ class vfs_webdav_server extends HTTP_WebDAV_Server_Filesystem $path2n = array(); foreach($files['files'] as $n => $info) { - if (!$n && substr($info['path'],-1) == '/') + $path = $info['path']; + if (!$n && substr($info['path'],-1) == '/') $path = substr($info['path'],0,-1); + $path2n[$path] = $n; + + // adding some properties used instead of regular DAV times + if (($stat = egw_vfs::stat($path))) { - $path2n[substr($info['path'],0,-1)] = $n; - } - else - { - $path2n[$info['path']] = $n; + $fileprops =& $files['files'][$path2n[$path]]['props']; + foreach(self::$auto_props as $attr => $props) + { + switch($attr) + { + case 'ctime': + case 'mtime': + case 'atime': + $value = gmdate('D, d M Y H:i:s T',$stat[$attr]); + break; + + default: + continue 2; + } + foreach($props as $prop) + { + $prop['val'] = $value; + $fileprops[] = $prop; + } + } } } if ($path2n && ($path2props = egw_vfs::propfind(array_keys($path2n),null))) @@ -359,6 +399,7 @@ class vfs_webdav_server extends HTTP_WebDAV_Server_Filesystem } } } + if ($this->debug) error_log(__METHOD__."() props=".array2string($files['files'])); return true; } @@ -403,13 +444,12 @@ class vfs_webdav_server extends HTTP_WebDAV_Server_Filesystem * They are not stored as (arbitrary) WebDAV properties with their own namespace and name, * but in the regular vfs attributes. * - * @todo Store a properties in the DB and retrieve them in PROPFIND again. * @param array general parameter passing array * @return bool true on success */ function PROPPATCH(&$options) { - $path = $GLOBALS['egw']->translation->convert($options['path'],'utf-8'); + $path = translation::convert($options['path'],'utf-8'); foreach ($options['props'] as $key => $prop) { $attributes = array(); @@ -424,7 +464,7 @@ class vfs_webdav_server extends HTTP_WebDAV_Server_Filesystem egw_vfs::touch($path,strtotime($prop['val'])); break; //case 'srt_creationtime': - // not supported via the streamwrapper interface atm. + // no streamwrapper interface / php function to set the ctime currently //$attributes['created'] = strtotime($prop['val']); //break; default: @@ -447,6 +487,21 @@ class vfs_webdav_server extends HTTP_WebDAV_Server_Filesystem } break; + case 'urn:schemas-microsoft-com:': + switch($prop['name']) + { + case 'Win32LastModifiedTime': + egw_vfs::touch($path,strtotime($prop['val'])); + break; + case 'Win32CreationTime': // eg. "Wed, 14 Sep 2011 15:48:26 GMT" + case 'Win32LastAccessTime': + case 'Win32FileAttributes': // not sure what that is, it was always "00000000" + default: + if (!egw_vfs::proppatch($path,array($prop))) $options['props'][$key]['status'] = '403 Forbidden'; + break; + } + break; + case egw_vfs::DEFAULT_PROP_NAMESPACE.'customfields/': // eGW's customfields $prop['ns'] = egw_vfs::DEFAULT_PROP_NAMESPACE; $prop['name'] = '#'.$prop['name'];