Merge pull request #7454 from owncloud/enc_remember_fopen_mode
[enc] remember original fopen access type in pre-proxy
This commit is contained in:
commit
61bc76fdd6
2 changed files with 29 additions and 6 deletions
|
@ -38,6 +38,7 @@ class Proxy extends \OC_FileProxy {
|
|||
|
||||
private static $blackList = null; //mimetypes blacklisted from encryption
|
||||
private static $unencryptedSizes = array(); // remember unencrypted size
|
||||
private static $fopenMode = array(); // remember the fopen mode
|
||||
|
||||
/**
|
||||
* Check if a file requires encryption
|
||||
|
@ -213,6 +214,16 @@ class Proxy extends \OC_FileProxy {
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief remember initial fopen mode because sometimes it gets changed during the request
|
||||
* @param string $path path
|
||||
* @param string $mode type of access
|
||||
*/
|
||||
public function preFopen($path, $mode) {
|
||||
self::$fopenMode[$path] = $mode;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param $path
|
||||
* @param $result
|
||||
|
@ -240,7 +251,15 @@ class Proxy extends \OC_FileProxy {
|
|||
$proxyStatus = \OC_FileProxy::$enabled;
|
||||
\OC_FileProxy::$enabled = false;
|
||||
|
||||
$meta = stream_get_meta_data($result);
|
||||
// if we remember the mode from the pre proxy we re-use it
|
||||
// oterwise we fall back to stream_get_meta_data()
|
||||
if (isset(self::$fopenMode[$path])) {
|
||||
$mode = self::$fopenMode[$path];
|
||||
unset(self::$fopenMode[$path]);
|
||||
} else {
|
||||
$meta = stream_get_meta_data($result);
|
||||
$mode = $meta['mode'];
|
||||
}
|
||||
|
||||
$view = new \OC_FilesystemView('');
|
||||
|
||||
|
@ -258,14 +277,15 @@ class Proxy extends \OC_FileProxy {
|
|||
|
||||
// Open the file using the crypto stream wrapper
|
||||
// protocol and let it do the decryption work instead
|
||||
$result = fopen('crypt://' . $path, $meta['mode']);
|
||||
$result = fopen('crypt://' . $path, $mode);
|
||||
|
||||
} elseif (
|
||||
self::shouldEncrypt($path)
|
||||
and $meta['mode'] !== 'r'
|
||||
and $meta['mode'] !== 'rb'
|
||||
self::shouldEncrypt($path)
|
||||
and $mode !== 'r'
|
||||
and $mode !== 'rb'
|
||||
|
||||
) {
|
||||
$result = fopen('crypt://' . $path, $meta['mode']);
|
||||
$result = fopen('crypt://' . $path, $mode);
|
||||
}
|
||||
|
||||
// Re-enable the proxy
|
||||
|
|
|
@ -167,6 +167,9 @@ class Stream {
|
|||
} else {
|
||||
|
||||
$this->meta = stream_get_meta_data($this->handle);
|
||||
// sometimes fopen changes the mode, e.g. for a url "r" convert to "r+"
|
||||
// but we need to remember the original access type
|
||||
$this->meta['mode'] = $mode;
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue