fix writeStream for jail wrapper

Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
Robin Appelman 2018-10-31 19:41:55 +01:00
parent 4094a5e74a
commit 9b3cc72f7c
No known key found for this signature in database
GPG Key ID: 42B69D8A64526EFB
4 changed files with 36 additions and 1 deletions

View File

@ -224,7 +224,7 @@ class File extends Node implements IFile {
$renameOkay = $storage->moveFromStorage($partStorage, $internalPartPath, $internalPath); $renameOkay = $storage->moveFromStorage($partStorage, $internalPartPath, $internalPath);
$fileExists = $storage->file_exists($internalPath); $fileExists = $storage->file_exists($internalPath);
if ($renameOkay === false || $fileExists === false) { if ($renameOkay === false || $fileExists === false) {
\OC::$server->getLogger()->error('renaming part file to final file failed ($run: ' . ($run ? 'true' : 'false') . ', $renameOkay: ' . ($renameOkay ? 'true' : 'false') . ', $fileExists: ' . ($fileExists ? 'true' : 'false') . ')', ['app' => 'webdav']); \OC::$server->getLogger()->error('renaming part file to final file failed $renameOkay: ' . ($renameOkay ? 'true' : 'false') . ', $fileExists: ' . ($fileExists ? 'true' : 'false') . ')', ['app' => 'webdav']);
throw new Exception('Could not rename part file to final file'); throw new Exception('Could not rename part file to final file');
} }
} catch (ForbiddenException $ex) { } catch (ForbiddenException $ex) {

View File

@ -821,6 +821,9 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
*/ */
public function writeStream(string $path, $stream, int $size = null): int { public function writeStream(string $path, $stream, int $size = null): int {
$target = $this->fopen($path, 'w'); $target = $this->fopen($path, 'w');
if (!$target) {
return 0;
}
list($count, $result) = \OC_Helper::streamCopy($stream, $target); list($count, $result) = \OC_Helper::streamCopy($stream, $target);
fclose($stream); fclose($stream);
fclose($target); fclose($target);

View File

@ -29,6 +29,7 @@ use OC\Files\Cache\Wrapper\CacheJail;
use OC\Files\Cache\Wrapper\JailPropagator; use OC\Files\Cache\Wrapper\JailPropagator;
use OC\Files\Filesystem; use OC\Files\Filesystem;
use OCP\Files\Storage\IStorage; use OCP\Files\Storage\IStorage;
use OCP\Files\Storage\IWriteStreamStorage;
use OCP\Lock\ILockingProvider; use OCP\Lock\ILockingProvider;
/** /**
@ -515,4 +516,18 @@ class Jail extends Wrapper {
$this->propagator = new JailPropagator($storage, \OC::$server->getDatabaseConnection()); $this->propagator = new JailPropagator($storage, \OC::$server->getDatabaseConnection());
return $this->propagator; return $this->propagator;
} }
public function writeStream(string $path, $stream, int $size = null): int {
$storage = $this->getWrapperStorage();
if ($storage->instanceOfStorage(IWriteStreamStorage::class)) {
/** @var IWriteStreamStorage $storage */
return $storage->writeStream($this->getUnjailedPath($path), $stream, $size);
} else {
$target = $this->fopen($path, 'w');
list($count, $result) = \OC_Helper::streamCopy($stream, $target);
fclose($stream);
fclose($target);
return $count;
}
}
} }

View File

@ -23,6 +23,7 @@
namespace Test\Files\Storage; namespace Test\Files\Storage;
use OC\Files\Cache\Watcher; use OC\Files\Cache\Watcher;
use OCP\Files\Storage\IWriteStreamStorage;
abstract class Storage extends \Test\TestCase { abstract class Storage extends \Test\TestCase {
/** /**
@ -628,4 +629,20 @@ abstract class Storage extends \Test\TestCase {
$this->instance->rename('bar.txt.part', 'bar.txt'); $this->instance->rename('bar.txt.part', 'bar.txt');
$this->assertEquals('bar', $this->instance->file_get_contents('bar.txt')); $this->assertEquals('bar', $this->instance->file_get_contents('bar.txt'));
} }
public function testWriteStream() {
$textFile = \OC::$SERVERROOT . '/tests/data/lorem.txt';
if (!$this->instance->instanceOfStorage(IWriteStreamStorage::class)) {
$this->markTestSkipped('Not a WriteSteamStorage');
}
/** @var IWriteStreamStorage $storage */
$storage = $this->instance;
$source = fopen($textFile, 'r');
$storage->writeStream('test.txt', $source);
$this->assertTrue($storage->file_exists('test.txt'));
$this->assertEquals(file_get_contents($textFile), $storage->file_get_contents('test.txt'));
}
} }