]> source.dussan.org Git - nextcloud-server.git/commitdiff
delay calculating the shared cache root until it's used 7323/head
authorRobin Appelman <robin@icewind.nl>
Mon, 4 Dec 2017 14:16:39 +0000 (15:16 +0100)
committerRobin Appelman <robin@icewind.nl>
Mon, 4 Dec 2017 14:18:23 +0000 (15:18 +0100)
Signed-off-by: Robin Appelman <robin@icewind.nl>
apps/files_sharing/lib/Cache.php
lib/private/Files/Cache/Wrapper/CacheJail.php

index 0cc1ac4ee8901c3936d881a5c91c9dcd4f017663..e4e298e4a2e4d32c0ff308c14c601812e56b83d5 100644 (file)
@@ -63,23 +63,29 @@ class Cache extends CacheJail {
                $this->sourceRootInfo = $sourceRootInfo;
                $this->numericId = $sourceRootInfo->getStorageId();
 
-               $absoluteRoot = $this->sourceRootInfo->getPath();
-
-               // the sourceRootInfo path is the absolute path of the folder in the "real" storage
-               // in the case where a folder is shared from a Jail we need to ensure that the share Jail
-               // has it's root set relative to the source Jail
-               $currentStorage = $storage->getSourceStorage();
-               if ($currentStorage->instanceOfStorage(Jail::class)) {
-                       /** @var Jail $currentStorage */
-                       $absoluteRoot = $currentStorage->getJailedPath($absoluteRoot);
-               }
-
                parent::__construct(
                        null,
-                       $absoluteRoot
+                       null
                );
        }
 
+       protected function getRoot() {
+               if (is_null($this->root)) {
+                       $absoluteRoot = $this->sourceRootInfo->getPath();
+
+                       // the sourceRootInfo path is the absolute path of the folder in the "real" storage
+                       // in the case where a folder is shared from a Jail we need to ensure that the share Jail
+                       // has it's root set relative to the source Jail
+                       $currentStorage = $this->storage->getSourceStorage();
+                       if ($currentStorage->instanceOfStorage(Jail::class)) {
+                               /** @var Jail $currentStorage */
+                               $absoluteRoot = $currentStorage->getJailedPath($absoluteRoot);
+                       }
+                       $this->root = $absoluteRoot;
+               }
+               return $this->root;
+       }
+
        public function getCache() {
                if (is_null($this->cache)) {
                        $sourceStorage = $this->storage->getSourceStorage();
@@ -103,7 +109,7 @@ class Cache extends CacheJail {
 
        public function get($file) {
                if ($this->rootUnchanged && ($file === '' || $file === $this->sourceRootInfo->getId())) {
-                       return $this->formatCacheEntry(clone $this->sourceRootInfo);
+                       return $this->formatCacheEntry(clone $this->sourceRootInfo, '');
                }
                return parent::get($file);
        }
@@ -128,16 +134,20 @@ class Cache extends CacheJail {
                return parent::moveFromCache($sourceCache, $sourcePath, $targetPath);
        }
 
-       protected function formatCacheEntry($entry) {
-               $path = isset($entry['path']) ? $entry['path'] : '';
-               $entry = parent::formatCacheEntry($entry);
+       protected function formatCacheEntry($entry, $path = null) {
+               if (is_null($path)) {
+                       $path = isset($entry['path']) ? $entry['path'] : '';
+                       $entry['path'] = $this->getJailedPath($path);
+               } else {
+                       $entry['path'] = $path;
+               }
                $sharePermissions = $this->storage->getPermissions($path);
                if (isset($entry['permissions'])) {
                        $entry['permissions'] &= $sharePermissions;
                } else {
                        $entry['permissions'] = $sharePermissions;
                }
-               $entry['uid_owner'] = $this->storage->getOwner($path);
+               $entry['uid_owner'] = $this->storage->getOwner('');
                $entry['displayname_owner'] = $this->getOwnerDisplayName();
                if ($path === '') {
                        $entry['is_share_mount_point'] = true;
index 8f12ca77ee668e0c5539d045b1418ebae3d261c2..37111206df0d4b48166be18200ddba068a123cff 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 namespace OC\Files\Cache\Wrapper;
+
 use OC\Files\Cache\Cache;
 use OCP\Files\Cache\ICacheEntry;
 use OCP\Files\Search\ISearchQuery;
@@ -48,11 +49,15 @@ class CacheJail extends CacheWrapper {
                $this->root = $root;
        }
 
+       protected function getRoot() {
+               return $this->root;
+       }
+
        protected function getSourcePath($path) {
                if ($path === '') {
-                       return $this->root;
+                       return $this->getRoot();
                } else {
-                       return $this->root . '/' . ltrim($path, '/');
+                       return $this->getRoot() . '/' . ltrim($path, '/');
                }
        }
 
@@ -61,13 +66,13 @@ class CacheJail extends CacheWrapper {
         * @return null|string the jailed path or null if the path is outside the jail
         */
        protected function getJailedPath($path) {
-               if ($this->root === '') {
+               if ($this->getRoot() === '') {
                        return $path;
                }
-               $rootLength = strlen($this->root) + 1;
-               if ($path === $this->root) {
+               $rootLength = strlen($this->getRoot()) + 1;
+               if ($path === $this->getRoot()) {
                        return '';
-               } else if (substr($path, 0, $rootLength) === $this->root . '/') {
+               } else if (substr($path, 0, $rootLength) === $this->getRoot() . '/') {
                        return substr($path, $rootLength);
                } else {
                        return null;
@@ -86,8 +91,8 @@ class CacheJail extends CacheWrapper {
        }
 
        protected function filterCacheEntry($entry) {
-               $rootLength = strlen($this->root) + 1;
-               return ($entry['path'] === $this->root) or (substr($entry['path'], 0, $rootLength) === $this->root . '/');
+               $rootLength = strlen($this->getRoot()) + 1;
+               return ($entry['path'] === $this->getRoot()) or (substr($entry['path'], 0, $rootLength) === $this->getRoot() . '/');
        }
 
        /**
@@ -189,7 +194,7 @@ class CacheJail extends CacheWrapper {
         * remove all entries for files that are stored on the storage from the cache
         */
        public function clear() {
-               $this->getCache()->remove($this->root);
+               $this->getCache()->remove($this->getRoot());
        }
 
        /**