]> source.dussan.org Git - nextcloud-server.git/commitdiff
Fix getById for files in appdata and the root mount 17175/head
authorJoas Schilling <coding@schilljs.com>
Tue, 17 Sep 2019 09:15:59 +0000 (11:15 +0200)
committerJoas Schilling <coding@schilljs.com>
Tue, 17 Sep 2019 09:15:59 +0000 (11:15 +0200)
In case the path we are currently in is inside the appdata_* folder,
the original getById method does not work, because it can only look inside
the user's mount points. But the user has no mount point for the root storage.

So in that case we directly check the mount of the root if it contains
the id. If it does we check if the path is inside the path we are working
in.

Signed-off-by: Joas Schilling <coding@schilljs.com>
lib/private/Files/Node/Folder.php

index 8b2a93ffdc2d2d8c55d098410bfb989c78c19bb6..4a134cdcdbf10932980f3da4a77edde532aa54fa 100644 (file)
@@ -299,6 +299,9 @@ class Folder extends Node implements \OCP\Files\Folder {
                }));
 
                if (count($mountsContainingFile) === 0) {
+                       if ($user === $this->getAppDataDirectoryName()) {
+                               return $this->getByIdInRootMount((int) $id);
+                       }
                        return [];
                }
 
@@ -327,6 +330,47 @@ class Folder extends Node implements \OCP\Files\Folder {
                });
        }
 
+       protected function getAppDataDirectoryName(): string {
+               $instanceId = \OC::$server->getConfig()->getSystemValueString('instanceid');
+               return 'appdata_' . $instanceId;
+       }
+
+       /**
+        * In case the path we are currently in is inside the appdata_* folder,
+        * the original getById method does not work, because it can only look inside
+        * the user's mount points. But the user has no mount point for the root storage.
+        *
+        * So in that case we directly check the mount of the root if it contains
+        * the id. If it does we check if the path is inside the path we are working
+        * in.
+        *
+        * @param int $id
+        * @return array
+        */
+       protected function getByIdInRootMount(int $id): array {
+               $mount = $this->root->getMount('');
+               $cacheEntry = $mount->getStorage()->getCache($this->path)->get($id);
+               if (!$cacheEntry) {
+                       return [];
+               }
+
+               $absolutePath = '/' . ltrim($cacheEntry->getPath(), '/');
+               $currentPath = rtrim($this->path, '/') . '/';
+
+               if (strpos($absolutePath, $currentPath) !== 0) {
+                       return [];
+               }
+
+               return [$this->root->createNode(
+                       $absolutePath, new \OC\Files\FileInfo(
+                               $absolutePath,
+                               $mount->getStorage(),
+                               $cacheEntry->getPath(),
+                               $cacheEntry,
+                               $mount
+               ))];
+       }
+
        public function getFreeSpace() {
                return $this->view->free_space($this->path);
        }