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