Entry directories are always reported existing and empty, if not existing in sqlfs

This commit is contained in:
Ralf Becker 2014-06-16 20:01:59 +00:00
parent 7a9378d0d7
commit b49d9fac67

View File

@ -36,6 +36,8 @@ if (!class_exists('links_stream_wrapper_parent',false))
* If the do not implement such a function the title function is used to test if the user has * If the do not implement such a function the title function is used to test if the user has
* at least read access to an entry, and if true full (write) access to the files is granted. * at least read access to an entry, and if true full (write) access to the files is granted.
* *
* Entry directories are always reported existing and empty, if not existing in sqlfs.
*
* The stream wrapper interface is according to the docu on php.net * The stream wrapper interface is according to the docu on php.net
* *
* @link http://www.php.net/manual/en/function.stream-wrapper-register.php * @link http://www.php.net/manual/en/function.stream-wrapper-register.php
@ -149,9 +151,26 @@ class links_stream_wrapper extends links_stream_wrapper_parent
'mime' => $app == 'addressbook' ? 'text/vcard' : 'text/calendar', 'mime' => $app == 'addressbook' ? 'text/vcard' : 'text/calendar',
); );
} }
else // if entry directory does not exist --> return fake directory
elseif (!($ret = parent::url_stat($url,$flags,$eacl_check)) && $eacl_check)
{ {
$ret = parent::url_stat($url,$flags,$eacl_check); list(,/*$apps*/,/*$app*/,$id,$rel_path) = explode('/', parse_url($url, PHP_URL_PATH), 5);
if ($id && !isset($rel_path))
{
$ret = array(
'ino' => md5($url),
'name' => $id,
'mode' => self::MODE_DIR, // required by the stream wrapper
'size' => 0,
'uid' => 0,
'gid' => 0,
'mtime' => time(),
'ctime' => time(),
'nlink' => 2,
// eGW addition to return some extra values
'mime' => egw_vfs::DIR_MIME_TYPE,
);
}
} }
if (self::DEBUG) error_log(__METHOD__."('$url', $flags) calling parent::url_stat(,,".array2string($eacl_check).') returning '.array2string($ret)); if (self::DEBUG) error_log(__METHOD__."('$url', $flags) calling parent::url_stat(,,".array2string($eacl_check).') returning '.array2string($ret));
return $ret; return $ret;
@ -271,6 +290,11 @@ class links_stream_wrapper extends links_stream_wrapper_parent
unset($GLOBALS[$name]); // unset it, so it does not use up memory, once the stream is closed unset($GLOBALS[$name]); // unset it, so it does not use up memory, once the stream is closed
return true; return true;
} }
// create not existing entry directories on the fly
if ($mode[0] != 'r' && !parent::url_stat($dir = egw_vfs::dirname($url),0) && self::check_extended_acl($dir,egw_vfs::WRITABLE))
{
self::mkdir($dir,0,STREAM_MKDIR_RECURSIVE);
}
return parent::stream_open($url,$mode,$options,$opened_path); return parent::stream_open($url,$mode,$options,$opened_path);
} }
} }