Merge pull request #5880 from owncloud/replace_etmp_files
write encryption tmp files to the cache folder
This commit is contained in:
commit
6355af162c
4 changed files with 63 additions and 15 deletions
|
@ -165,7 +165,7 @@ class Helper {
|
||||||
public static function isPartialFilePath($path) {
|
public static function isPartialFilePath($path) {
|
||||||
|
|
||||||
$extension = pathinfo($path, PATHINFO_EXTENSION);
|
$extension = pathinfo($path, PATHINFO_EXTENSION);
|
||||||
if ( $extension === 'part' || $extension === 'etmp') {
|
if ( $extension === 'part') {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
@ -183,7 +183,7 @@ class Helper {
|
||||||
public static function stripPartialFileExtension($path) {
|
public static function stripPartialFileExtension($path) {
|
||||||
$extension = pathinfo($path, PATHINFO_EXTENSION);
|
$extension = pathinfo($path, PATHINFO_EXTENSION);
|
||||||
|
|
||||||
if ( $extension === 'part' || $extension === 'etmp') {
|
if ( $extension === 'part') {
|
||||||
|
|
||||||
$newLength = strlen($path) - 5; // 5 = strlen(".part") = strlen(".etmp")
|
$newLength = strlen($path) - 5; // 5 = strlen(".part") = strlen(".etmp")
|
||||||
$fPath = substr($path, 0, $newLength);
|
$fPath = substr($path, 0, $newLength);
|
||||||
|
@ -256,24 +256,53 @@ class Helper {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief get path to the correspondig file in data/user/files
|
* @brief get path to the correspondig file in data/user/files if path points
|
||||||
|
* to a version or to a file in cache
|
||||||
* @param string $path path to a version or a file in the trash
|
* @param string $path path to a version or a file in the trash
|
||||||
* @return string path to correspondig file relative to data/user/files
|
* @return string path to correspondig file relative to data/user/files
|
||||||
*/
|
*/
|
||||||
public static function getPathToRealFile($path) {
|
public static function getPathToRealFile($path) {
|
||||||
$trimmed = ltrim($path, '/');
|
$trimmed = ltrim($path, '/');
|
||||||
$split = explode('/', $trimmed);
|
$split = explode('/', $trimmed);
|
||||||
|
$result = false;
|
||||||
|
|
||||||
if (count($split) < 3 || $split[1] !== "files_versions") {
|
if (count($split) >= 3 && ($split[1] === "files_versions" || $split[1] === 'cache')) {
|
||||||
return false;
|
$sliced = array_slice($split, 2);
|
||||||
|
$result = implode('/', $sliced);
|
||||||
|
if ($split[1] === "files_versions") {
|
||||||
|
// we skip user/files
|
||||||
|
$sliced = array_slice($split, 2);
|
||||||
|
$relPath = implode('/', $sliced);
|
||||||
|
//remove the last .v
|
||||||
|
$result = substr($relPath, 0, strrpos($relPath, '.v'));
|
||||||
|
}
|
||||||
|
if ($split[1] === "cache") {
|
||||||
|
// we skip /user/cache/transactionId
|
||||||
|
$sliced = array_slice($split, 3);
|
||||||
|
$result = implode('/', $sliced);
|
||||||
|
//prepare the folders
|
||||||
|
self::mkdirr($path, new \OC\Files\View('/'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$sliced = array_slice($split, 2);
|
return $result;
|
||||||
$realPath = implode('/', $sliced);
|
}
|
||||||
//remove the last .v
|
|
||||||
$realPath = substr($realPath, 0, strrpos($realPath, '.v'));
|
|
||||||
|
|
||||||
return $realPath;
|
/**
|
||||||
|
* @brief create directory recursively
|
||||||
|
* @param string $path
|
||||||
|
* @param \OC\Files\View $view
|
||||||
|
*/
|
||||||
|
public static function mkdirr($path, $view) {
|
||||||
|
$dirname = \OC_Filesystem::normalizePath(dirname($path));
|
||||||
|
$dirParts = explode('/', $dirname);
|
||||||
|
$dir = "";
|
||||||
|
foreach ($dirParts as $part) {
|
||||||
|
$dir = $dir . '/' . $part;
|
||||||
|
if (!$view->file_exists($dir)) {
|
||||||
|
$view->mkdir($dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -90,7 +90,13 @@ class Proxy extends \OC_FileProxy {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
$handle = fopen('crypt://' . $path . '.etmp', 'w');
|
// create random cache folder
|
||||||
|
$cacheFolder = rand();
|
||||||
|
$path_slices = explode('/', \OC_Filesystem::normalizePath($path));
|
||||||
|
$path_slices[2] = "cache/".$cacheFolder;
|
||||||
|
$tmpPath = implode('/', $path_slices);
|
||||||
|
|
||||||
|
$handle = fopen('crypt://' . $tmpPath, 'w');
|
||||||
if (is_resource($handle)) {
|
if (is_resource($handle)) {
|
||||||
|
|
||||||
// write data to stream
|
// write data to stream
|
||||||
|
@ -104,10 +110,10 @@ class Proxy extends \OC_FileProxy {
|
||||||
\OC_FileProxy::$enabled = false;
|
\OC_FileProxy::$enabled = false;
|
||||||
|
|
||||||
// get encrypted content
|
// get encrypted content
|
||||||
$data = $view->file_get_contents($path . '.etmp');
|
$data = $view->file_get_contents($tmpPath);
|
||||||
|
|
||||||
// remove our temp file
|
// remove our temp file
|
||||||
$view->unlink($path . '.etmp');
|
$view->deleteAll('/' . \OCP\User::getUser() . '/cache/' . $cacheFolder);
|
||||||
|
|
||||||
// re-enable proxy - our work is done
|
// re-enable proxy - our work is done
|
||||||
\OC_FileProxy::$enabled = $proxyStatus;
|
\OC_FileProxy::$enabled = $proxyStatus;
|
||||||
|
|
|
@ -108,7 +108,7 @@ class Stream {
|
||||||
}
|
}
|
||||||
|
|
||||||
if($this->relPath === false) {
|
if($this->relPath === false) {
|
||||||
\OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '" expecting a path to user/files or to user/files_versions', \OCP\Util::ERROR);
|
\OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '" expecting a path to "files", "files_versions" or "cache"', \OCP\Util::ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,4 +51,17 @@ class Test_Encryption_Helper extends \PHPUnit_Framework_TestCase {
|
||||||
$this->assertEquals('testfile.txt', Encryption\Helper::stripPartialFileExtension($filename));
|
$this->assertEquals('testfile.txt', Encryption\Helper::stripPartialFileExtension($filename));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testGetPathToRealFile() {
|
||||||
|
|
||||||
|
// the relative path to /user/files/ that's what we want to get from getPathToRealFile()
|
||||||
|
$relativePath = "foo/bar/test.txt";
|
||||||
|
|
||||||
|
// test paths
|
||||||
|
$versionPath = "/user/files_versions/foo/bar/test.txt.v456756835";
|
||||||
|
$cachePath = "/user/cache/transferid636483/foo/bar/test.txt";
|
||||||
|
|
||||||
|
$this->assertEquals($relativePath, Encryption\Helper::getPathToRealFile($versionPath));
|
||||||
|
$this->assertEquals($relativePath, Encryption\Helper::getPathToRealFile($cachePath));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in a new issue