]> source.dussan.org Git - nextcloud-server.git/commitdiff
prevent the root storage from accidentally scanning user folders 21360/head
authorRobin Appelman <robin@icewind.nl>
Wed, 10 Jun 2020 13:27:30 +0000 (15:27 +0200)
committerRoeland Jago Douma <roeland@famdouma.nl>
Thu, 11 Jun 2020 13:41:33 +0000 (15:41 +0200)
while this scan *should* never be triggered, it's good to have some failsafe to ensure
that the users home contents don't end up getting scanned in the root storage

Signed-off-by: Robin Appelman <robin@icewind.nl>
lib/composer/composer/autoload_classmap.php
lib/composer/composer/autoload_static.php
lib/private/Files/Cache/LocalRootScanner.php [new file with mode: 0644]
lib/private/Files/Storage/LocalRootStorage.php [new file with mode: 0644]
lib/private/legacy/OC_Util.php
tests/lib/Files/Cache/LocalRootScannerTest.php [new file with mode: 0644]

index bbd9a6ef8c07f60d51784c3764411c1c59715cfa..6a83917e8335c7edf04c0142a7499185a245c083 100644 (file)
@@ -972,6 +972,7 @@ return array(
     'OC\\Files\\Cache\\FailedCache' => $baseDir . '/lib/private/Files/Cache/FailedCache.php',
     'OC\\Files\\Cache\\HomeCache' => $baseDir . '/lib/private/Files/Cache/HomeCache.php',
     'OC\\Files\\Cache\\HomePropagator' => $baseDir . '/lib/private/Files/Cache/HomePropagator.php',
+    'OC\\Files\\Cache\\LocalRootScanner' => $baseDir . '/lib/private/Files/Cache/LocalRootScanner.php',
     'OC\\Files\\Cache\\MoveFromCacheTrait' => $baseDir . '/lib/private/Files/Cache/MoveFromCacheTrait.php',
     'OC\\Files\\Cache\\Propagator' => $baseDir . '/lib/private/Files/Cache/Propagator.php',
     'OC\\Files\\Cache\\QuerySearchHelper' => $baseDir . '/lib/private/Files/Cache/QuerySearchHelper.php',
@@ -1036,6 +1037,7 @@ return array(
     'OC\\Files\\Storage\\Flysystem' => $baseDir . '/lib/private/Files/Storage/Flysystem.php',
     'OC\\Files\\Storage\\Home' => $baseDir . '/lib/private/Files/Storage/Home.php',
     'OC\\Files\\Storage\\Local' => $baseDir . '/lib/private/Files/Storage/Local.php',
+    'OC\\Files\\Storage\\LocalRootStorage' => $baseDir . '/lib/private/Files/Storage/LocalRootStorage.php',
     'OC\\Files\\Storage\\LocalTempFileTrait' => $baseDir . '/lib/private/Files/Storage/LocalTempFileTrait.php',
     'OC\\Files\\Storage\\PolyFill\\CopyDirectory' => $baseDir . '/lib/private/Files/Storage/PolyFill/CopyDirectory.php',
     'OC\\Files\\Storage\\Storage' => $baseDir . '/lib/private/Files/Storage/Storage.php',
index b0b0aa0edf01be0a053664c052515b915e08c800..e38b0129611345ddb3d4c965ab1abd0363c0b47d 100644 (file)
@@ -1001,6 +1001,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
         'OC\\Files\\Cache\\FailedCache' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/FailedCache.php',
         'OC\\Files\\Cache\\HomeCache' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/HomeCache.php',
         'OC\\Files\\Cache\\HomePropagator' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/HomePropagator.php',
+        'OC\\Files\\Cache\\LocalRootScanner' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/LocalRootScanner.php',
         'OC\\Files\\Cache\\MoveFromCacheTrait' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/MoveFromCacheTrait.php',
         'OC\\Files\\Cache\\Propagator' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/Propagator.php',
         'OC\\Files\\Cache\\QuerySearchHelper' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/QuerySearchHelper.php',
@@ -1065,6 +1066,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
         'OC\\Files\\Storage\\Flysystem' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/Flysystem.php',
         'OC\\Files\\Storage\\Home' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/Home.php',
         'OC\\Files\\Storage\\Local' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/Local.php',
+        'OC\\Files\\Storage\\LocalRootStorage' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/LocalRootStorage.php',
         'OC\\Files\\Storage\\LocalTempFileTrait' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/LocalTempFileTrait.php',
         'OC\\Files\\Storage\\PolyFill\\CopyDirectory' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/PolyFill/CopyDirectory.php',
         'OC\\Files\\Storage\\Storage' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/Storage.php',
diff --git a/lib/private/Files/Cache/LocalRootScanner.php b/lib/private/Files/Cache/LocalRootScanner.php
new file mode 100644 (file)
index 0000000..9ecc8c6
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2020 Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Files\Cache;
+
+class LocalRootScanner extends Scanner {
+       public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true, $data = null) {
+               if ($this->shouldScanPath($file)) {
+                       return parent::scanFile($file, $reuseExisting, $parentId, $cacheData, $lock, $data);
+               } else {
+                       return null;
+               }
+       }
+
+       public function scan($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $lock = true) {
+               if ($this->shouldScanPath($path)) {
+                       return parent::scan($path, $recursive, $reuse, $lock);
+               } else {
+                       return null;
+               }
+       }
+
+       private function shouldScanPath(string $path): bool {
+               $path = trim($path, '/');
+               return $path === '' || strpos($path, 'appdata_') === 0 || strpos($path, '__groupfolders') === 0;
+       }
+}
diff --git a/lib/private/Files/Storage/LocalRootStorage.php b/lib/private/Files/Storage/LocalRootStorage.php
new file mode 100644 (file)
index 0000000..0ad9c18
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2020 Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Files\Storage;
+
+use OC\Files\Cache\LocalRootScanner;
+
+class LocalRootStorage extends Local {
+       public function getScanner($path = '', $storage = null) {
+               if (!$storage) {
+                       $storage = $this;
+               }
+               if (!isset($storage->scanner)) {
+                       $storage->scanner = new LocalRootScanner($storage);
+               }
+               return $storage->scanner;
+       }
+}
index 71f6edba0bfbf28601f1088eeb32d3d188ad15f5..dde47041c2b3e59bf515e2f4c97242e5d6e562cf 100644 (file)
@@ -63,6 +63,7 @@
  */
 
 use OC\AppFramework\Http\Request;
+use OC\Files\Storage\LocalRootStorage;
 use OCP\IConfig;
 use OCP\IGroupManager;
 use OCP\ILogger;
@@ -88,7 +89,7 @@ class OC_Util {
                //first set up the local "root" storage
                \OC\Files\Filesystem::initMountManager();
                if (!self::$rootMounted) {
-                       \OC\Files\Filesystem::mount('\OC\Files\Storage\Local', ['datadir' => $configDataDirectory], '/');
+                       \OC\Files\Filesystem::mount(LocalRootStorage::class, ['datadir' => $configDataDirectory], '/');
                        self::$rootMounted = true;
                }
        }
diff --git a/tests/lib/Files/Cache/LocalRootScannerTest.php b/tests/lib/Files/Cache/LocalRootScannerTest.php
new file mode 100644 (file)
index 0000000..0a85f00
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2020 Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Test\Files\Cache;
+
+use OC\Files\Storage\LocalRootStorage;
+use Test\TestCase;
+
+/**
+ * @group DB
+ */
+class LocalRootScannerTest extends TestCase {
+       /** @var LocalRootStorage */
+       private $storage;
+
+       protected function setUp(): void {
+               parent::setUp();
+
+               $folder = \OC::$server->getTempManager()->getTemporaryFolder();
+               $this->storage = new LocalRootStorage(['datadir' => $folder]);
+       }
+
+       public function testDontScanUsers() {
+               $this->storage->mkdir('foo');
+               $this->storage->mkdir('foo/bar');
+
+               $this->storage->getScanner()->scan('');
+               $this->assertFalse($this->storage->getCache()->inCache('foo'));
+       }
+
+       public function testDoScanAppData() {
+               $this->storage->mkdir('appdata_foo');
+               $this->storage->mkdir('appdata_foo/bar');
+
+               $this->storage->getScanner()->scan('');
+               $this->assertTrue($this->storage->getCache()->inCache('appdata_foo'));
+               $this->assertTrue($this->storage->getCache()->inCache('appdata_foo/bar'));
+       }
+}