diff options
author | Carl Schwan <carl@carlschwan.eu> | 2022-10-10 16:09:14 +0200 |
---|---|---|
committer | Carl Schwan <carl@carlschwan.eu> | 2022-10-10 17:06:29 +0200 |
commit | cf39885b539e15ee39f40486370ac7baafa90d82 (patch) | |
tree | 6623c2b370505941ee50eaddd54cd8403487596e /apps/files_sharing | |
parent | cf5bf3036dee4527b93c5bb8e43c0ed3a216e15a (diff) | |
download | nextcloud-server-cf39885b539e15ee39f40486370ac7baafa90d82.tar.gz nextcloud-server-cf39885b539e15ee39f40486370ac7baafa90d82.zip |
Propagate attributes when resharing
When updating a share, load the node from the initiator instead of the
owner similar to how this is done when creating the share.
Signed-off-by: Carl Schwan <carl@carlschwan.eu>
Diffstat (limited to 'apps/files_sharing')
-rw-r--r-- | apps/files_sharing/lib/Controller/ShareAPIController.php | 47 |
1 files changed, 20 insertions, 27 deletions
diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php index 00f12ea7779..2689cdd79e7 100644 --- a/apps/files_sharing/lib/Controller/ShareAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareAPIController.php @@ -533,6 +533,10 @@ class ShareAPIController extends OCSController { $permissions &= ~($permissions & ~$node->getPermissions()); } + if ($attributes !== null) { + $share = $this->setShareAttributes($share, $attributes); + } + $this->checkInheritedAttributes($share); if ($shareType === IShare::TYPE_USER) { @@ -693,10 +697,6 @@ class ShareAPIController extends OCSController { $share->setNote($note); } - if ($attributes !== null) { - $share = $this->setShareAttributes($share, $attributes); - } - try { $share = $this->shareManager->createShare($share); } catch (GenericShareException $e) { @@ -1112,24 +1112,10 @@ class ShareAPIController extends OCSController { $share->setNote($note); } - $userFolder = $this->rootFolder->getUserFolder($this->currentUser); - - // get the node with the point of view of the current user - $nodes = $userFolder->getById($share->getNode()->getId()); - if (count($nodes) > 0) { - $node = $nodes[0]; - $storage = $node->getStorage(); - if ($storage && $storage->instanceOfStorage(SharedStorage::class)) { - /** @var \OCA\Files_Sharing\SharedStorage $storage */ - $inheritedAttributes = $storage->getShare()->getAttributes(); - if ($inheritedAttributes !== null && $inheritedAttributes->getAttribute('permissions', 'download') === false) { - if ($hideDownload === 'false') { - throw new OCSBadRequestException($this->l->t('Cannot increase permissions')); - } - $share->setHideDownload(true); - } - } + if ($attributes !== null) { + $share = $this->setShareAttributes($share, $attributes); } + $this->checkInheritedAttributes($share); /** * expirationdate, password and publicUpload only make sense for link shares @@ -1263,10 +1249,6 @@ class ShareAPIController extends OCSController { } } - if ($attributes !== null) { - $share = $this->setShareAttributes($share, $attributes); - } - try { $share = $this->shareManager->updateShare($share); } catch (GenericShareException $e) { @@ -1912,8 +1894,14 @@ class ShareAPIController extends OCSController { } private function checkInheritedAttributes(IShare $share): void { - if ($share->getNode()->getStorage()->instanceOfStorage(SharedStorage::class)) { - $storage = $share->getNode()->getStorage(); + $userFolder = $this->rootFolder->getUserFolder($share->getSharedBy()); + $nodes = $userFolder->getById($share->getNodeId()); + if (empty($nodes)) { + throw new NotFoundException('Node for share not found, fileid: ' . $share->getNodeId()); + } + $node = $nodes[0]; + if ($node->getStorage()->instanceOfStorage(SharedStorage::class)) { + $storage = $node->getStorage(); if ($storage instanceof Wrapper) { $storage = $storage->getInstanceOfStorage(SharedStorage::class); if ($storage === null) { @@ -1926,6 +1914,11 @@ class ShareAPIController extends OCSController { $inheritedAttributes = $storage->getShare()->getAttributes(); if ($inheritedAttributes !== null && $inheritedAttributes->getAttribute('permissions', 'download') === false) { $share->setHideDownload(true); + $attributes = $share->getAttributes(); + if ($attributes) { + $attributes->setAttribute('permissions', 'download', false); + $share->setAttributes($attributes); + } } } |