Skip to content

Commit

Permalink
Merge pull request #50647 from nextcloud/backport/50642/stable31
Browse files Browse the repository at this point in the history
[stable31] fix(sharing): better handle file share attributes
  • Loading branch information
AndyScherzinger authored Feb 4, 2025
2 parents c070f27 + 8fc1b6f commit c29e1b0
Show file tree
Hide file tree
Showing 3 changed files with 193 additions and 92 deletions.
64 changes: 41 additions & 23 deletions apps/files_sharing/lib/Controller/ShareAPIController.php
Original file line number Diff line number Diff line change
Expand Up @@ -654,7 +654,6 @@ public function createShare(
}

$share->setSharedBy($this->userId);
$this->checkInheritedAttributes($share);

// Handle mail send
if (is_null($sendMail)) {
Expand Down Expand Up @@ -787,6 +786,7 @@ public function createShare(
}

$share->setShareType($shareType);
$this->checkInheritedAttributes($share);

if ($note !== '') {
$share->setNote($note);
Expand Down Expand Up @@ -1272,7 +1272,6 @@ public function updateShare(
if ($attributes !== null) {
$share = $this->setShareAttributes($share, $attributes);
}
$this->checkInheritedAttributes($share);

// Handle mail send
if ($sendMail === 'true' || $sendMail === 'false') {
Expand Down Expand Up @@ -1359,6 +1358,7 @@ public function updateShare(
}

try {
$this->checkInheritedAttributes($share);
$share = $this->shareManager->updateShare($share);
} catch (HintException $e) {
$code = $e->getCode() === 0 ? 403 : $e->getCode();
Expand Down Expand Up @@ -2083,30 +2083,48 @@ private function checkInheritedAttributes(IShare $share): void {
if (!$share->getSharedBy()) {
return; // Probably in a test
}

$canDownload = false;
$hideDownload = true;

$userFolder = $this->rootFolder->getUserFolder($share->getSharedBy());
$node = $userFolder->getFirstNodeById($share->getNodeId());
if (!$node) {
return;
}
if ($node->getStorage()->instanceOfStorage(SharedStorage::class)) {
$storage = $node->getStorage();
if ($storage instanceof Wrapper) {
$storage = $storage->getInstanceOfStorage(SharedStorage::class);
if ($storage === null) {
throw new \RuntimeException('Should not happen, instanceOfStorage but getInstanceOfStorage return null');
}
} else {
throw new \RuntimeException('Should not happen, instanceOfStorage but not a wrapper');
$nodes = $userFolder->getById($share->getNodeId());
foreach ($nodes as $node) {
// Owner always can download it - so allow it and break
if ($node->getOwner()?->getUID() === $share->getSharedBy()) {
$canDownload = true;
$hideDownload = false;
break;
}
/** @var SharedStorage $storage */
$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);

if ($node->getStorage()->instanceOfStorage(SharedStorage::class)) {
$storage = $node->getStorage();
if ($storage instanceof Wrapper) {
$storage = $storage->getInstanceOfStorage(SharedStorage::class);
if ($storage === null) {
throw new \RuntimeException('Should not happen, instanceOfStorage but getInstanceOfStorage return null');
}
} else {
throw new \RuntimeException('Should not happen, instanceOfStorage but not a wrapper');
}

/** @var SharedStorage $storage */
$originalShare = $storage->getShare();
$inheritedAttributes = $originalShare->getAttributes();
// hide if hidden and also the current share enforces hide (can only be false if one share is false or user is owner)
$hideDownload = $hideDownload && $originalShare->getHideDownload();
// allow download if already allowed by previous share or when the current share allows downloading
$canDownload = $canDownload || $inheritedAttributes === null || $inheritedAttributes->getAttribute('permissions', 'download') !== false;
}
}

if ($hideDownload || !$canDownload) {
$share->setHideDownload(true);

if (!$canDownload) {
$attributes = $share->getAttributes() ?? $share->newAttributes();
$attributes->setAttribute('permissions', 'download', false);
$share->setAttributes($attributes);
}
}
}
Expand Down
Loading

0 comments on commit c29e1b0

Please sign in to comment.