From 67ae310693f6457bdbbdfe414e2ed5eae23f1124 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 16 Aug 2018 18:24:10 +0200 Subject: [PATCH 01/11] remove double loop for detecting changed mounts Signed-off-by: Robin Appelman --- lib/private/Files/Config/UserMountCache.php | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php index 255314c4e83d4..095a0df7e0cac 100644 --- a/lib/private/Files/Config/UserMountCache.php +++ b/lib/private/Files/Config/UserMountCache.php @@ -136,16 +136,19 @@ public function registerMounts(IUser $user, array $mounts) { * @return ICachedMountInfo[] */ private function findChangedMounts(array $newMounts, array $cachedMounts) { + $new = []; + foreach ($newMounts as $mount) { + $new[$mount->getRootId()] = $mount; + } $changed = []; - foreach ($newMounts as $newMount) { - foreach ($cachedMounts as $cachedMount) { + foreach ($cachedMounts as $cachedMount) { + $rootId = $cachedMount->getRootId(); + if (isset($new[$rootId])) { + $newMount = $new[$rootId]; if ( - $newMount->getRootId() === $cachedMount->getRootId() && - ( - $newMount->getMountPoint() !== $cachedMount->getMountPoint() || - $newMount->getStorageId() !== $cachedMount->getStorageId() || - $newMount->getMountId() !== $cachedMount->getMountId() - ) + $newMount->getMountPoint() !== $cachedMount->getMountPoint() || + $newMount->getStorageId() !== $cachedMount->getStorageId() || + $newMount->getMountId() !== $cachedMount->getMountId() ) { $changed[] = $newMount; } @@ -198,7 +201,7 @@ private function dbRowToMountInfo(array $row) { } $mount_id = $row['mount_id']; if (!is_null($mount_id)) { - $mount_id = (int) $mount_id; + $mount_id = (int)$mount_id; } return new CachedMountInfo($user, (int)$row['storage_id'], (int)$row['root_id'], $row['mount_point'], $mount_id, isset($row['path']) ? $row['path'] : ''); } From bb092553efa3131123eab27b8631e56995986a22 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 16 Aug 2018 18:53:32 +0200 Subject: [PATCH 02/11] use more efficient method to find mountpoint for path Signed-off-by: Robin Appelman --- lib/private/Files/Mount/Manager.php | 31 +++++++++++++++-------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/lib/private/Files/Mount/Manager.php b/lib/private/Files/Mount/Manager.php index 7bd888a6389f0..e479a7d2a866e 100644 --- a/lib/private/Files/Mount/Manager.php +++ b/lib/private/Files/Mount/Manager.php @@ -70,23 +70,24 @@ public function moveMount($mountPoint, $target){ */ public function find($path) { \OC_Util::setupFS(); - $path = $this->formatPath($path); - if (isset($this->mounts[$path])) { - return $this->mounts[$path]; - } + $path = Filesystem::normalizePath($path); - \OC_Hook::emit('OC_Filesystem', 'get_mountpoint', array('path' => $path)); - $foundMountPoint = ''; - $mountPoints = array_keys($this->mounts); - foreach ($mountPoints as $mountpoint) { - if (strpos($path, $mountpoint) === 0 and strlen($mountpoint) > strlen($foundMountPoint)) { - $foundMountPoint = $mountpoint; + $current = $path; + while(true) { + $mountPoint = $current . '/'; + if (isset($this->mounts[$mountPoint])) { + $this->pathCache[$path] = $this->mounts[$mountPoint]; + return $this->mounts[$mountPoint]; + } + + if ($current === '') { + return null; + } + + $current = dirname($current); + if ($current === '.' || $current === '/') { + $current = ''; } - } - if (isset($this->mounts[$foundMountPoint])) { - return $this->mounts[$foundMountPoint]; - } else { - return null; } } From 65c8fd3b29e8ab9a170a411950fff467ae0776a2 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 16 Aug 2018 19:02:00 +0200 Subject: [PATCH 03/11] cache OC\Files\Mount\Manager::findIn results Signed-off-by: Robin Appelman --- lib/private/Files/Mount/Manager.php | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/lib/private/Files/Mount/Manager.php b/lib/private/Files/Mount/Manager.php index e479a7d2a866e..aad75e49257df 100644 --- a/lib/private/Files/Mount/Manager.php +++ b/lib/private/Files/Mount/Manager.php @@ -30,16 +30,22 @@ use OCP\Files\Mount\IMountPoint; class Manager implements IMountManager { - /** - * @var MountPoint[] - */ - private $mounts = array(); + /** @var MountPoint[] */ + private $mounts = []; + + /** @var CappedMemoryCache */ + private $inPathCache; + + public function __construct() { + $this->inPathCache = new CappedMemoryCache(); + } /** * @param IMountPoint $mount */ public function addMount(IMountPoint $mount) { $this->mounts[$mount->getMountPoint()] = $mount; + $this->inPathCache->clear(); } /** @@ -51,15 +57,17 @@ public function removeMount($mountPoint) { $mountPoint .= '/'; } unset($this->mounts[$mountPoint]); + $this->inPathCache->clear(); } /** * @param string $mountPoint * @param string $target */ - public function moveMount($mountPoint, $target){ + public function moveMount($mountPoint, $target) { $this->mounts[$target] = $this->mounts[$mountPoint]; unset($this->mounts[$mountPoint]); + $this->inPathCache->clear(); } /** @@ -73,7 +81,7 @@ public function find($path) { $path = Filesystem::normalizePath($path); $current = $path; - while(true) { + while (true) { $mountPoint = $current . '/'; if (isset($this->mounts[$mountPoint])) { $this->pathCache[$path] = $this->mounts[$mountPoint]; @@ -108,11 +116,14 @@ public function findIn($path) { $result[] = $this->mounts[$mountPoint]; } } + + $this->inPathCache[$path] = $result; return $result; } public function clear() { - $this->mounts = array(); + $this->mounts = []; + $this->inPathCache->clear(); } /** From f199e7ed17683b19362520cf116701852c456c36 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 27 Aug 2018 16:24:38 +0200 Subject: [PATCH 04/11] cache OC\Files\Mount\Manager::findIn results Signed-off-by: Robin Appelman --- lib/private/Files/Mount/Manager.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/private/Files/Mount/Manager.php b/lib/private/Files/Mount/Manager.php index aad75e49257df..ee52436653550 100644 --- a/lib/private/Files/Mount/Manager.php +++ b/lib/private/Files/Mount/Manager.php @@ -25,6 +25,7 @@ namespace OC\Files\Mount; +use OC\Cache\CappedMemoryCache; use \OC\Files\Filesystem; use OCP\Files\Mount\IMountManager; use OCP\Files\Mount\IMountPoint; From f2152ecda9536659b0149fab4811f366b4cd7c37 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 16 Aug 2018 19:16:24 +0200 Subject: [PATCH 05/11] more efficient unique share target generation Signed-off-by: Robin Appelman --- apps/files_sharing/lib/MountProvider.php | 5 +++-- apps/files_sharing/lib/SharedMount.php | 18 +++++++----------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/apps/files_sharing/lib/MountProvider.php b/apps/files_sharing/lib/MountProvider.php index fd4c537210f7c..e279b4303a886 100644 --- a/apps/files_sharing/lib/MountProvider.php +++ b/apps/files_sharing/lib/MountProvider.php @@ -85,7 +85,7 @@ public function getMountsForUser(IUser $user, IStorageFactory $storageFactory) { $mounts = []; foreach ($superShares as $share) { try { - $mounts[] = new SharedMount( + $mount = new SharedMount( '\OCA\Files_Sharing\SharedStorage', $mounts, [ @@ -97,6 +97,7 @@ public function getMountsForUser(IUser $user, IStorageFactory $storageFactory) { ], $storageFactory ); + $mounts[$mount->getMountPoint()] = $mount; } catch (\Exception $e) { $this->logger->logException($e); $this->logger->error('Error while trying to create shared mount'); @@ -104,7 +105,7 @@ public function getMountsForUser(IUser $user, IStorageFactory $storageFactory) { } // array_filter removes the null values from the array - return array_filter($mounts); + return array_values(array_filter($mounts)); } /** diff --git a/apps/files_sharing/lib/SharedMount.php b/apps/files_sharing/lib/SharedMount.php index 4f0dc89e9978c..ba3efaf3f87fe 100644 --- a/apps/files_sharing/lib/SharedMount.php +++ b/apps/files_sharing/lib/SharedMount.php @@ -135,20 +135,16 @@ private function generateUniqueTarget($path, $view, array $mountpoints) { $name = $pathinfo['filename']; $dir = $pathinfo['dirname']; - // Helper function to find existing mount points - $mountpointExists = function ($path) use ($mountpoints) { - foreach ($mountpoints as $mountpoint) { - if ($mountpoint->getShare()->getTarget() === $path) { - return true; - } - } - return false; - }; - $i = 2; - while ($view->file_exists($path) || $mountpointExists($path)) { + $absolutePath = $this->recipientView->getAbsolutePath($path) . '/'; + while ($view->file_exists($path) || isset($mountpoints[$absolutePath])) { $path = Filesystem::normalizePath($dir . '/' . $name . ' (' . $i . ')' . $ext); + $absolutePath = $this->recipientView->getAbsolutePath($path) . '/'; + var_dump($absolutePath); $i++; + if ($i > 10) { + return $path; + } } return $path; From c897e2af8e43f37dda08d99a1a3460b6aa90da67 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 16 Aug 2018 19:56:49 +0200 Subject: [PATCH 06/11] more efficient way to detect added and removed mounts Signed-off-by: Robin Appelman --- apps/files_sharing/lib/SharedMount.php | 4 --- lib/private/Files/Config/UserMountCache.php | 32 +++++++++++++++------ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/apps/files_sharing/lib/SharedMount.php b/apps/files_sharing/lib/SharedMount.php index ba3efaf3f87fe..bf274f2c2f63d 100644 --- a/apps/files_sharing/lib/SharedMount.php +++ b/apps/files_sharing/lib/SharedMount.php @@ -140,11 +140,7 @@ private function generateUniqueTarget($path, $view, array $mountpoints) { while ($view->file_exists($path) || isset($mountpoints[$absolutePath])) { $path = Filesystem::normalizePath($dir . '/' . $name . ' (' . $i . ')' . $ext); $absolutePath = $this->recipientView->getAbsolutePath($path) . '/'; - var_dump($absolutePath); $i++; - if ($i > 10) { - return $path; - } } return $path; diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php index 095a0df7e0cac..07c6e1f2d623e 100644 --- a/lib/private/Files/Config/UserMountCache.php +++ b/lib/private/Files/Config/UserMountCache.php @@ -102,17 +102,31 @@ public function registerMounts(IUser $user, array $mounts) { } }, $mounts); $newMounts = array_values(array_filter($newMounts)); + $newMountRootIds = array_map(function (ICachedMountInfo $mount) { + return $mount->getRootId(); + }, $newMounts); + $newMounts = array_combine($newMountRootIds, $newMounts); $cachedMounts = $this->getMountsForUser($user); - $mountDiff = function (ICachedMountInfo $mount1, ICachedMountInfo $mount2) { - // since we are only looking for mounts for a specific user comparing on root id is enough - return $mount1->getRootId() - $mount2->getRootId(); - }; - - /** @var ICachedMountInfo[] $addedMounts */ - $addedMounts = array_udiff($newMounts, $cachedMounts, $mountDiff); - /** @var ICachedMountInfo[] $removedMounts */ - $removedMounts = array_udiff($cachedMounts, $newMounts, $mountDiff); + $cachedMountRootIds = array_map(function (ICachedMountInfo $mount) { + return $mount->getRootId(); + }, $cachedMounts); + $cachedMounts = array_combine($cachedMountRootIds, $cachedMounts); + + $addedMounts = []; + $removedMounts = []; + + foreach ($newMounts as $rootId => $newMount) { + if (!isset($cachedMounts[$rootId])) { + $addedMounts[] = $newMount; + } + } + + foreach ($cachedMounts as $rootId => $cachedMount) { + if (!isset($newMounts[$rootId])) { + $removedMounts[] = $cachedMount; + } + } $changedMounts = $this->findChangedMounts($newMounts, $cachedMounts); From a396c376937397fb75bbd55c1180cba6e3dc414b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 16 Aug 2018 20:10:45 +0200 Subject: [PATCH 07/11] re-use view instances for shared storages Signed-off-by: Robin Appelman --- apps/files_sharing/lib/MountProvider.php | 15 +++++++++++++-- apps/files_sharing/lib/SharedMount.php | 8 ++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/apps/files_sharing/lib/MountProvider.php b/apps/files_sharing/lib/MountProvider.php index e279b4303a886..a3db685c6afd5 100644 --- a/apps/files_sharing/lib/MountProvider.php +++ b/apps/files_sharing/lib/MountProvider.php @@ -27,6 +27,7 @@ namespace OCA\Files_Sharing; +use OC\Files\View; use OCP\Files\Config\IMountProvider; use OCP\Files\Storage\IStorageFactory; use OCP\IConfig; @@ -83,19 +84,29 @@ public function getMountsForUser(IUser $user, IStorageFactory $storageFactory) { $superShares = $this->buildSuperShares($shares, $user); $mounts = []; + $view = new View('/' . $user->getUID() . '/files'); + $ownerViews = []; foreach ($superShares as $share) { try { + /** @var \OCP\Share\IShare $parentShare */ + $parentShare = $share[0]; + $owner = $parentShare->getShareOwner(); + if (!isset($ownerViews[$owner])) { + $ownerViews[$owner] = new View('/' . $parentShare->getShareOwner() . '/files'); + } $mount = new SharedMount( '\OCA\Files_Sharing\SharedStorage', $mounts, [ 'user' => $user->getUID(), // parent share - 'superShare' => $share[0], + 'superShare' => $parentShare, // children/component of the superShare 'groupedShares' => $share[1], + 'ownerView' => $ownerViews[$owner] ], - $storageFactory + $storageFactory, + $view ); $mounts[$mount->getMountPoint()] = $mount; } catch (\Exception $e) { diff --git a/apps/files_sharing/lib/SharedMount.php b/apps/files_sharing/lib/SharedMount.php index bf274f2c2f63d..9a801311a4179 100644 --- a/apps/files_sharing/lib/SharedMount.php +++ b/apps/files_sharing/lib/SharedMount.php @@ -61,19 +61,19 @@ class SharedMount extends MountPoint implements MoveableMount { /** * @param string $storage * @param SharedMount[] $mountpoints - * @param array|null $arguments + * @param array $arguments * @param \OCP\Files\Storage\IStorageFactory $loader + * @param View $recipientView */ - public function __construct($storage, array $mountpoints, $arguments = null, $loader = null) { + public function __construct($storage, array $mountpoints, $arguments, $loader, $recipientView) { $this->user = $arguments['user']; - $this->recipientView = new View('/' . $this->user . '/files'); + $this->recipientView = $recipientView; $this->superShare = $arguments['superShare']; $this->groupedShares = $arguments['groupedShares']; $newMountPoint = $this->verifyMountPoint($this->superShare, $mountpoints); $absMountPoint = '/' . $this->user . '/files' . $newMountPoint; - $arguments['ownerView'] = new View('/' . $this->superShare->getShareOwner() . '/files'); parent::__construct($storage, $absMountPoint, $arguments, $loader); } From 237e4b75219e91b5b684b9907f19c7ddc73543cb Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 16 Aug 2018 20:18:13 +0200 Subject: [PATCH 08/11] don't check if target dir exists when using the default share target directory Signed-off-by: Robin Appelman --- apps/files_sharing/lib/Helper.php | 4 ++++ apps/files_sharing/lib/SharedMount.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/files_sharing/lib/Helper.php b/apps/files_sharing/lib/Helper.php index c8f46fa8132bd..465a55a0052bc 100644 --- a/apps/files_sharing/lib/Helper.php +++ b/apps/files_sharing/lib/Helper.php @@ -237,6 +237,10 @@ public static function generateUniqueTarget($path, $excludeList, $view) { return $path; } + public static function isUsingShareFolder() { + return \OC::$server->getConfig()->getSystemValue('share_folder', '/') !== '/'; + } + /** * get default share folder * diff --git a/apps/files_sharing/lib/SharedMount.php b/apps/files_sharing/lib/SharedMount.php index 9a801311a4179..dacc78edac3cc 100644 --- a/apps/files_sharing/lib/SharedMount.php +++ b/apps/files_sharing/lib/SharedMount.php @@ -89,7 +89,7 @@ private function verifyMountPoint(\OCP\Share\IShare $share, array $mountpoints) $mountPoint = basename($share->getTarget()); $parent = dirname($share->getTarget()); - if (!$this->recipientView->is_dir($parent)) { + if (Helper::isUsingShareFolder() && !$this->recipientView->is_dir($parent)) { $parent = Helper::getShareFolder($this->recipientView); } From 110650ff588513df559c5d96b0451d88fc866fc5 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 16 Aug 2018 20:24:02 +0200 Subject: [PATCH 09/11] only determine is sharing is disabled for a user once Signed-off-by: Robin Appelman --- apps/files_sharing/lib/MountProvider.php | 4 +++- apps/files_sharing/lib/SharedStorage.php | 10 +++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/files_sharing/lib/MountProvider.php b/apps/files_sharing/lib/MountProvider.php index a3db685c6afd5..c4fa6edc87605 100644 --- a/apps/files_sharing/lib/MountProvider.php +++ b/apps/files_sharing/lib/MountProvider.php @@ -86,6 +86,7 @@ public function getMountsForUser(IUser $user, IStorageFactory $storageFactory) { $mounts = []; $view = new View('/' . $user->getUID() . '/files'); $ownerViews = []; + $sharingDisabledForUser = $this->shareManager->sharingDisabledForUser($user->getUID()); foreach ($superShares as $share) { try { /** @var \OCP\Share\IShare $parentShare */ @@ -103,7 +104,8 @@ public function getMountsForUser(IUser $user, IStorageFactory $storageFactory) { 'superShare' => $parentShare, // children/component of the superShare 'groupedShares' => $share[1], - 'ownerView' => $ownerViews[$owner] + 'ownerView' => $ownerViews[$owner], + 'sharingDisabledForUser' => $sharingDisabledForUser ], $storageFactory, $view diff --git a/apps/files_sharing/lib/SharedStorage.php b/apps/files_sharing/lib/SharedStorage.php index f681854cd2b31..2d2f14fc55423 100644 --- a/apps/files_sharing/lib/SharedStorage.php +++ b/apps/files_sharing/lib/SharedStorage.php @@ -79,6 +79,9 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto private $options; + /** @var boolean */ + private $sharingDisabledForUser; + public function __construct($arguments) { $this->ownerView = $arguments['ownerView']; $this->logger = \OC::$server->getLogger(); @@ -87,6 +90,11 @@ public function __construct($arguments) { $this->groupedShares = $arguments['groupedShares']; $this->user = $arguments['user']; + if (isset($arguments['sharingDisabledForUser'])) { + $this->sharingDisabledForUser = $arguments['sharingDisabledForUser']; + } else { + $this->sharingDisabledForUser = false; + } parent::__construct([ 'storage' => null, @@ -193,7 +201,7 @@ public function getPermissions($target = '') { $permissions |= \OCP\Constants::PERMISSION_DELETE; } - if (\OCP\Util::isSharingDisabledForUser()) { + if ($this->sharingDisabledForUser) { $permissions &= ~\OCP\Constants::PERMISSION_SHARE; } From e3b9e9e57c9aab9175b381048597d0a92abcd118 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 16 Aug 2018 20:39:51 +0200 Subject: [PATCH 10/11] tokens can't be valid local user names this saves searching for shares on non-public link dav requests Signed-off-by: Robin Appelman --- lib/private/Files/View.php | 20 +++++++++----------- lib/private/Share20/Manager.php | 4 ++++ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index 73219635e8909..cd1219fd77e90 100644 --- a/lib/private/Files/View.php +++ b/lib/private/Files/View.php @@ -1431,16 +1431,21 @@ public function getDirectoryContent($directory, $mimetype_filter = '') { $contents = $cache->getFolderContentsById($folderId); //TODO: mimetype_filter $sharingDisabled = \OCP\Util::isSharingDisabledForUser(); + + $fileNames = array_map(function(ICacheEntry $content) { + return $content->getName(); + }, $contents); /** - * @var \OC\Files\FileInfo[] $files + * @var \OC\Files\FileInfo[] $fileInfos */ - $files = array_map(function (ICacheEntry $content) use ($path, $storage, $mount, $sharingDisabled) { + $fileInfos = array_map(function (ICacheEntry $content) use ($path, $storage, $mount, $sharingDisabled) { if ($sharingDisabled) { $content['permissions'] = $content['permissions'] & ~\OCP\Constants::PERMISSION_SHARE; } $owner = $this->getUserObjectForOwner($storage->getOwner($content['path'])); return new FileInfo($path . '/' . $content['name'], $storage, $content['path'], $content, $mount, $owner); }, $contents); + $files = array_combine($fileNames, $fileInfos); //add a folder for any mountpoint in this directory and add the sizes of other mountpoints to the folders $mounts = Filesystem::getMountManager()->findIn($path); @@ -1495,13 +1500,6 @@ public function getDirectoryContent($directory, $mimetype_filter = '') { $rootEntry['permissions'] = $permissions & (\OCP\Constants::PERMISSION_ALL - (\OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE)); } - //remove any existing entry with the same name - foreach ($files as $i => $file) { - if ($file['name'] === $rootEntry['name']) { - unset($files[$i]); - break; - } - } $rootEntry['path'] = substr(Filesystem::normalizePath($path . '/' . $rootEntry['name']), strlen($user) + 2); // full path without /$user/ // if sharing was disabled for the user we remove the share permissions @@ -1510,7 +1508,7 @@ public function getDirectoryContent($directory, $mimetype_filter = '') { } $owner = $this->getUserObjectForOwner($subStorage->getOwner('')); - $files[] = new FileInfo($path . '/' . $rootEntry['name'], $subStorage, '', $rootEntry, $mount, $owner); + $files[$rootEntry->getName()] = new FileInfo($path . '/' . $rootEntry['name'], $subStorage, '', $rootEntry, $mount, $owner); } } } @@ -1526,7 +1524,7 @@ public function getDirectoryContent($directory, $mimetype_filter = '') { }); } - return $files; + return array_values($files); } else { return []; } diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index b8131425b4a52..69a3d749a99a5 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -1165,6 +1165,10 @@ public function getSharesByPath(\OCP\Files\Node $path, $page=0, $perPage=50) { * @throws ShareNotFound */ public function getShareByToken($token) { + // tokens can't be valid local user names + if ($this->userManager->userExists($token)) { + throw new ShareNotFound(); + } $share = null; try { if($this->shareApiAllowLinks()) { From 6dae2b92508696c6b47216099abdd3f3fcd8497e Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 16 Aug 2018 21:05:01 +0200 Subject: [PATCH 11/11] cache parent exists status during share setup Signed-off-by: Robin Appelman --- apps/files_sharing/lib/Helper.php | 4 ---- apps/files_sharing/lib/MountProvider.php | 5 ++++- apps/files_sharing/lib/SharedMount.php | 18 +++++++++++++----- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/apps/files_sharing/lib/Helper.php b/apps/files_sharing/lib/Helper.php index 465a55a0052bc..c8f46fa8132bd 100644 --- a/apps/files_sharing/lib/Helper.php +++ b/apps/files_sharing/lib/Helper.php @@ -237,10 +237,6 @@ public static function generateUniqueTarget($path, $excludeList, $view) { return $path; } - public static function isUsingShareFolder() { - return \OC::$server->getConfig()->getSystemValue('share_folder', '/') !== '/'; - } - /** * get default share folder * diff --git a/apps/files_sharing/lib/MountProvider.php b/apps/files_sharing/lib/MountProvider.php index c4fa6edc87605..5623f18d6624f 100644 --- a/apps/files_sharing/lib/MountProvider.php +++ b/apps/files_sharing/lib/MountProvider.php @@ -27,6 +27,7 @@ namespace OCA\Files_Sharing; +use OC\Cache\CappedMemoryCache; use OC\Files\View; use OCP\Files\Config\IMountProvider; use OCP\Files\Storage\IStorageFactory; @@ -87,6 +88,7 @@ public function getMountsForUser(IUser $user, IStorageFactory $storageFactory) { $view = new View('/' . $user->getUID() . '/files'); $ownerViews = []; $sharingDisabledForUser = $this->shareManager->sharingDisabledForUser($user->getUID()); + $foldersExistCache = new CappedMemoryCache(); foreach ($superShares as $share) { try { /** @var \OCP\Share\IShare $parentShare */ @@ -108,7 +110,8 @@ public function getMountsForUser(IUser $user, IStorageFactory $storageFactory) { 'sharingDisabledForUser' => $sharingDisabledForUser ], $storageFactory, - $view + $view, + $foldersExistCache ); $mounts[$mount->getMountPoint()] = $mount; } catch (\Exception $e) { diff --git a/apps/files_sharing/lib/SharedMount.php b/apps/files_sharing/lib/SharedMount.php index dacc78edac3cc..4b38698f81d77 100644 --- a/apps/files_sharing/lib/SharedMount.php +++ b/apps/files_sharing/lib/SharedMount.php @@ -28,10 +28,12 @@ namespace OCA\Files_Sharing; +use OC\Cache\CappedMemoryCache; use OC\Files\Filesystem; use OC\Files\Mount\MountPoint; use OC\Files\Mount\MoveableMount; use OC\Files\View; +use OCP\Files\Storage\IStorageFactory; /** * Shared mount points can be moved by the user @@ -62,17 +64,17 @@ class SharedMount extends MountPoint implements MoveableMount { * @param string $storage * @param SharedMount[] $mountpoints * @param array $arguments - * @param \OCP\Files\Storage\IStorageFactory $loader + * @param IStorageFactory $loader * @param View $recipientView */ - public function __construct($storage, array $mountpoints, $arguments, $loader, $recipientView) { + public function __construct($storage, array $mountpoints, $arguments, IStorageFactory $loader, View $recipientView, CappedMemoryCache $folderExistCache) { $this->user = $arguments['user']; $this->recipientView = $recipientView; $this->superShare = $arguments['superShare']; $this->groupedShares = $arguments['groupedShares']; - $newMountPoint = $this->verifyMountPoint($this->superShare, $mountpoints); + $newMountPoint = $this->verifyMountPoint($this->superShare, $mountpoints, $folderExistCache); $absMountPoint = '/' . $this->user . '/files' . $newMountPoint; parent::__construct($storage, $absMountPoint, $arguments, $loader); } @@ -84,12 +86,18 @@ public function __construct($storage, array $mountpoints, $arguments, $loader, $ * @param SharedMount[] $mountpoints * @return string */ - private function verifyMountPoint(\OCP\Share\IShare $share, array $mountpoints) { + private function verifyMountPoint(\OCP\Share\IShare $share, array $mountpoints, CappedMemoryCache $folderExistCache) { $mountPoint = basename($share->getTarget()); $parent = dirname($share->getTarget()); - if (Helper::isUsingShareFolder() && !$this->recipientView->is_dir($parent)) { + if ($folderExistCache->hasKey($parent)) { + $parentExists = $folderExistCache->get($parent); + } else { + $parentExists = $this->recipientView->is_dir($parent); + $folderExistCache->set($parent, $parentExists); + } + if (!$parentExists) { $parent = Helper::getShareFolder($this->recipientView); }