fix writeStream for jail wrapper
Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
parent
4094a5e74a
commit
9b3cc72f7c
|
@ -224,7 +224,7 @@ class File extends Node implements IFile {
|
|||
$renameOkay = $storage->moveFromStorage($partStorage, $internalPartPath, $internalPath);
|
||||
$fileExists = $storage->file_exists($internalPath);
|
||||
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');
|
||||
}
|
||||
} catch (ForbiddenException $ex) {
|
||||
|
|
|
@ -821,6 +821,9 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
|
|||
*/
|
||||
public function writeStream(string $path, $stream, int $size = null): int {
|
||||
$target = $this->fopen($path, 'w');
|
||||
if (!$target) {
|
||||
return 0;
|
||||
}
|
||||
list($count, $result) = \OC_Helper::streamCopy($stream, $target);
|
||||
fclose($stream);
|
||||
fclose($target);
|
||||
|
|
|
@ -29,6 +29,7 @@ use OC\Files\Cache\Wrapper\CacheJail;
|
|||
use OC\Files\Cache\Wrapper\JailPropagator;
|
||||
use OC\Files\Filesystem;
|
||||
use OCP\Files\Storage\IStorage;
|
||||
use OCP\Files\Storage\IWriteStreamStorage;
|
||||
use OCP\Lock\ILockingProvider;
|
||||
|
||||
/**
|
||||
|
@ -515,4 +516,18 @@ class Jail extends Wrapper {
|
|||
$this->propagator = new JailPropagator($storage, \OC::$server->getDatabaseConnection());
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
namespace Test\Files\Storage;
|
||||
|
||||
use OC\Files\Cache\Watcher;
|
||||
use OCP\Files\Storage\IWriteStreamStorage;
|
||||
|
||||
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->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'));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue