]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix writeStream for jail wrapper 12072/head
authorRobin Appelman <robin@icewind.nl>
Wed, 31 Oct 2018 18:41:55 +0000 (19:41 +0100)
committerRobin Appelman <robin@icewind.nl>
Wed, 31 Oct 2018 20:10:57 +0000 (21:10 +0100)
Signed-off-by: Robin Appelman <robin@icewind.nl>
apps/dav/lib/Connector/Sabre/File.php
lib/private/Files/Storage/Common.php
lib/private/Files/Storage/Wrapper/Jail.php
tests/lib/Files/Storage/Storage.php

index a8e6d8b907c429b5943d7a856d4c37f27f62e1bd..57c072fda47f273802f19d1e7c640c8ad1e9dfa5 100644 (file)
@@ -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) {
index 6324050b472d543423bb2c3ff4733e93eda82fa3..72fe3a79792d8f7b51b60517900afc2cd2165ede 100644 (file)
@@ -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);
index 56514af6d80150f3ed9ea03466f0d6c82f92650d..f21b5716467b44b55a605e1b833d079dbbda1edd 100644 (file)
@@ -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;
+               }
+       }
 }
index 04aafece2e35630827a41a8bc6d4fd31266bf577..a25a3f74f9e435675fd1b841f682b7dcbcbd16cc 100644 (file)
@@ -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'));
+       }
 }