diff options
author | Roeland Jago Douma <rullzer@users.noreply.github.com> | 2020-10-01 15:31:54 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-01 15:31:54 +0200 |
commit | 0840eedbfc57afc979c49bc2196644ffc29e118b (patch) | |
tree | 3ed83edc9ebf22720e576b41f46ee60a9967592d /lib/private | |
parent | 916f6124b087e0d719c8ffaa0a9fcaac6f9df669 (diff) | |
parent | 7a4a0dca220fd0f25d00fb7c82d9ea6be168f668 (diff) | |
download | nextcloud-server-0840eedbfc57afc979c49bc2196644ffc29e118b.tar.gz nextcloud-server-0840eedbfc57afc979c49bc2196644ffc29e118b.zip |
Merge pull request #22784 from nextcloud/backport/22234/stable19
[stable19] Use user mount with matching shared storage only
Diffstat (limited to 'lib/private')
-rw-r--r-- | lib/private/Share20/Manager.php | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index 8f28a92cf36..18f26434857 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -43,6 +43,7 @@ use OC\Cache\CappedMemoryCache; use OC\Files\Mount\MoveableMount; use OC\HintException; use OC\Share20\Exception\ProviderException; +use OCA\Files_Sharing\ISharedStorage; use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\File; use OCP\Files\Folder; @@ -299,10 +300,17 @@ class Manager implements IManager { $isFederatedShare = $share->getNode()->getStorage()->instanceOfStorage('\OCA\Files_Sharing\External\Storage'); $permissions = 0; - $userMounts = $userFolder->getById($share->getNode()->getId()); - $userMount = array_shift($userMounts); - $mount = $userMount->getMountPoint(); if (!$isFederatedShare && $share->getNode()->getOwner() && $share->getNode()->getOwner()->getUID() !== $share->getSharedBy()) { + $userMounts = array_filter($userFolder->getById($share->getNode()->getId()), function ($mount) { + // We need to filter since there might be other mountpoints that contain the file + // e.g. if the user has access to the same external storage that the file is originating from + return $mount->getStorage()->instanceOfStorage(ISharedStorage::class); + }); + $userMount = array_shift($userMounts); + if ($userMount === null) { + throw new GenericShareException('Could not get proper share mount for ' . $share->getNode()->getId() . '. Failing since else the next calls are called with null'); + } + $mount = $userMount->getMountPoint(); // When it's a reshare use the parent share permissions as maximum $userMountPointId = $mount->getStorageRootId(); $userMountPoints = $userFolder->getById($userMountPointId); @@ -331,7 +339,7 @@ class Manager implements IManager { * while we 'most likely' do have that on the storage. */ $permissions = $share->getNode()->getPermissions(); - if (!($mount instanceof MoveableMount)) { + if (!($share->getNode()->getMountPoint() instanceof MoveableMount)) { $permissions |= \OCP\Constants::PERMISSION_DELETE | \OCP\Constants::PERMISSION_UPDATE; } } |