Merge pull request #7454 from owncloud/enc_remember_fopen_mode

[enc] remember original fopen access type in pre-proxy
This commit is contained in:
Björn Schießle 2014-02-28 09:57:58 +01:00
commit 61bc76fdd6
2 changed files with 29 additions and 6 deletions

View File

@ -38,6 +38,7 @@ class Proxy extends \OC_FileProxy {
private static $blackList = null; //mimetypes blacklisted from encryption private static $blackList = null; //mimetypes blacklisted from encryption
private static $unencryptedSizes = array(); // remember unencrypted size private static $unencryptedSizes = array(); // remember unencrypted size
private static $fopenMode = array(); // remember the fopen mode
/** /**
* Check if a file requires encryption * Check if a file requires encryption
@ -213,6 +214,16 @@ class Proxy extends \OC_FileProxy {
return true; 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 $path
* @param $result * @param $result
@ -240,7 +251,15 @@ class Proxy extends \OC_FileProxy {
$proxyStatus = \OC_FileProxy::$enabled; $proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false; \OC_FileProxy::$enabled = false;
// 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); $meta = stream_get_meta_data($result);
$mode = $meta['mode'];
}
$view = new \OC_FilesystemView(''); $view = new \OC_FilesystemView('');
@ -258,14 +277,15 @@ class Proxy extends \OC_FileProxy {
// Open the file using the crypto stream wrapper // Open the file using the crypto stream wrapper
// protocol and let it do the decryption work instead // protocol and let it do the decryption work instead
$result = fopen('crypt://' . $path, $meta['mode']); $result = fopen('crypt://' . $path, $mode);
} elseif ( } elseif (
self::shouldEncrypt($path) self::shouldEncrypt($path)
and $meta['mode'] !== 'r' and $mode !== 'r'
and $meta['mode'] !== 'rb' and $mode !== 'rb'
) { ) {
$result = fopen('crypt://' . $path, $meta['mode']); $result = fopen('crypt://' . $path, $mode);
} }
// Re-enable the proxy // Re-enable the proxy

View File

@ -167,6 +167,9 @@ class Stream {
} else { } else {
$this->meta = stream_get_meta_data($this->handle); $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;
} }