* EPL/Filemanager: fix PHP Fatal using file-a-file dialog (upload with setting eg. a comment)

This commit is contained in:
Ralf Becker 2016-08-03 15:26:30 +02:00
parent 1f05f6f528
commit 8a6127efea
3 changed files with 20 additions and 19 deletions

View File

@ -142,30 +142,32 @@ class Vfs
*
* @param string $path filename with absolute path in the eGW VFS
* @param string $mode 'r', 'w', ... like fopen
* @param resource $context =null context to pass to stream-wrapper
* @return resource
*/
static function fopen($path,$mode)
static function fopen($path, $mode, $context=null)
{
if ($path[0] != '/')
{
throw new Exception\AssertionFailed("Filename '$path' is not an absolute path!");
}
return fopen(self::PREFIX.$path,$mode);
return $context ? fopen(self::PREFIX.$path, $mode, false, $context) : fopen(self::PREFIX.$path, $mode);
}
/**
* opendir working on just the eGW VFS: returns resource for readdir() etc.
*
* @param string $path filename with absolute path in the eGW VFS
* @param resource $context =null context to pass to stream-wrapper
* @return resource
*/
static function opendir($path)
static function opendir($path, $context=null)
{
if ($path[0] != '/')
{
throw new Exception\AssertionFailed("Directory '$path' is not an absolute path!");
}
return opendir(self::PREFIX.$path);
return $context ? opendir(self::PREFIX.$path, $context) : opendir(self::PREFIX.$path);
}
/**
@ -2096,13 +2098,16 @@ class Vfs
if (!self::stat($target))
{
self::touch($target); // create empty file, to be able to attach properties
self::$treat_as_new = true; // notify as new
// tell vfs stream-wrapper to treat file in following copy as a new file notification-wises
$context = stream_context_create(array(
self::SCHEME => array('treat_as_new' => true)
));
}
self::proppatch($target, $props);
}
if (is_resource($tmp_name))
{
$ret = ($dest = self::fopen($target, 'w')) &&
$ret = ($dest = self::fopen($target, 'w', $context)) &&
stream_copy_to_stream($tmp_name, $dest) !== false &&
fclose($dest) ? self::stat($target) : false;
@ -2110,7 +2115,9 @@ class Vfs
}
else
{
$ret = copy($tmp_name,self::PREFIX.$target) ? self::stat($target) : false;
$ret = ($context ? copy($tmp_name, self::PREFIX.$target, $context) :
copy($tmp_name, self::PREFIX.$target)) ?
self::stat($target) : false;
}
if (self::LOG_LEVEL > 1 || !$ret && self::LOG_LEVEL) error_log(__METHOD__."($tmp_name, $target, ".array2string($props).") returning ".array2string($ret));
return $ret;

View File

@ -900,7 +900,7 @@ class StreamWrapper extends Api\Db\Pdo implements Vfs\StreamWrapperIface
{
return false;
}
if (is_null($time))
if (!$time)
{
return true; // new (empty) file created with current mod time
}

View File

@ -291,13 +291,6 @@ class StreamWrapper implements StreamWrapperIface
return null;
}
/**
* Can be used from egw_vfs to tell vfs notifications to treat an opened file as a new file
*
* @var boolean
*/
static protected $treat_as_new;
/**
* This method is called immediately after your stream object is created.
*
@ -335,11 +328,12 @@ class StreamWrapper implements StreamWrapperIface
$this->opened_stream_is_new = !$stat;
// are we requested to treat the opened file as new file (only for files opened NOT for reading)
if ($mode[0] != 'r' && !$this->opened_stream_is_new && self::$treat_as_new)
if ($mode[0] != 'r' && !$this->opened_stream_is_new && $this->context &&
($opts = stream_context_get_params($this->context)) &&
$opts['options'][self::SCHEME]['treat_as_new'])
{
$this->opened_stream_is_new = true;
//error_log(__METHOD__."($path,$mode,...) stat=$stat, treat_as_new=".self::$treat_as_new." --> ".array2string($this->opened_stream_is_new));
self::$treat_as_new = null;
//error_log(__METHOD__."($path,$mode,...) stat=$stat, context=".array2string($opts)." --> ".array2string($this->opened_stream_is_new));
}
return true;
}
@ -494,7 +488,7 @@ class StreamWrapper implements StreamWrapperIface
*/
function stream_metadata($path, $option, $value)
{
if (!($url = $this->resolve_url_symlinks($path, $option == STREAM_META_TOUCH, false))) // true,false file need to exist, but do not resolve last component
if (!($url = $this->resolve_url_symlinks($path, $option != STREAM_META_TOUCH, false))) // true,false file need to exist, but do not resolve last component
{
return false;
}