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
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue