aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorFerdinand Thiessen <opensource@fthiessen.de>2024-08-02 14:30:52 +0200
committerFerdinand Thiessen <opensource@fthiessen.de>2024-08-12 11:28:03 +0200
commitcb1b366baf75da4c578bc534884eefa7f6b4b3d2 (patch)
treebdb367d502a6990c39165960a76d3268270162ef /apps
parent1a7acf061e26d938e2162f791afb262dc7c2b90d (diff)
downloadnextcloud-server-cb1b366baf75da4c578bc534884eefa7f6b4b3d2.tar.gz
nextcloud-server-cb1b366baf75da4c578bc534884eefa7f6b4b3d2.zip
fix(dav): Ensure share properties are also set on public remote endpoint
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/appinfo/v2/publicremote.php7
-rw-r--r--apps/dav/composer/composer/autoload_classmap.php1
-rw-r--r--apps/dav/composer/composer/autoload_static.php1
-rw-r--r--apps/dav/lib/Connector/Sabre/FilesPlugin.php7
-rw-r--r--apps/dav/lib/Connector/Sabre/Node.php34
-rw-r--r--apps/dav/lib/Storage/PublicShareWrapper.php38
6 files changed, 64 insertions, 24 deletions
diff --git a/apps/dav/appinfo/v2/publicremote.php b/apps/dav/appinfo/v2/publicremote.php
index 44cf4214505..53e85d556eb 100644
--- a/apps/dav/appinfo/v2/publicremote.php
+++ b/apps/dav/appinfo/v2/publicremote.php
@@ -10,6 +10,7 @@ use OC\Files\Filesystem;
use OC\Files\Storage\Wrapper\PermissionsMask;
use OC\Files\View;
use OCA\DAV\Storage\PublicOwnerWrapper;
+use OCA\DAV\Storage\PublicShareWrapper;
use OCA\FederatedFileSharing\FederatedShareProvider;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\Mount\IMountManager;
@@ -98,6 +99,12 @@ $server = $serverFactory->createServer($baseuri, $requestUri, $authPlugin, funct
return new PublicOwnerWrapper(['storage' => $storage, 'owner' => $share->getShareOwner()]);
});
+ // Ensure that also private shares have the `getShare` method
+ /** @psalm-suppress MissingClosureParamType */
+ Filesystem::addStorageWrapper('getShare', function ($mountPoint, $storage) use ($share) {
+ return new PublicShareWrapper(['storage' => $storage, 'share' => $share]);
+ }, 0);
+
/** @psalm-suppress InternalMethod */
Filesystem::logWarningWhenAddingStorageWrapper($previousLog);
diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php
index 5081cc0ae97..adbf0a23d36 100644
--- a/apps/dav/composer/composer/autoload_classmap.php
+++ b/apps/dav/composer/composer/autoload_classmap.php
@@ -350,6 +350,7 @@ return array(
'OCA\\DAV\\SetupChecks\\NeedsSystemAddressBookSync' => $baseDir . '/../lib/SetupChecks/NeedsSystemAddressBookSync.php',
'OCA\\DAV\\SetupChecks\\WebdavEndpoint' => $baseDir . '/../lib/SetupChecks/WebdavEndpoint.php',
'OCA\\DAV\\Storage\\PublicOwnerWrapper' => $baseDir . '/../lib/Storage/PublicOwnerWrapper.php',
+ 'OCA\\DAV\\Storage\\PublicShareWrapper' => $baseDir . '/../lib/Storage/PublicShareWrapper.php',
'OCA\\DAV\\SystemTag\\SystemTagList' => $baseDir . '/../lib/SystemTag/SystemTagList.php',
'OCA\\DAV\\SystemTag\\SystemTagMappingNode' => $baseDir . '/../lib/SystemTag/SystemTagMappingNode.php',
'OCA\\DAV\\SystemTag\\SystemTagNode' => $baseDir . '/../lib/SystemTag/SystemTagNode.php',
diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php
index 79bddfe8717..975af1af81f 100644
--- a/apps/dav/composer/composer/autoload_static.php
+++ b/apps/dav/composer/composer/autoload_static.php
@@ -365,6 +365,7 @@ class ComposerStaticInitDAV
'OCA\\DAV\\SetupChecks\\NeedsSystemAddressBookSync' => __DIR__ . '/..' . '/../lib/SetupChecks/NeedsSystemAddressBookSync.php',
'OCA\\DAV\\SetupChecks\\WebdavEndpoint' => __DIR__ . '/..' . '/../lib/SetupChecks/WebdavEndpoint.php',
'OCA\\DAV\\Storage\\PublicOwnerWrapper' => __DIR__ . '/..' . '/../lib/Storage/PublicOwnerWrapper.php',
+ 'OCA\\DAV\\Storage\\PublicShareWrapper' => __DIR__ . '/..' . '/../lib/Storage/PublicShareWrapper.php',
'OCA\\DAV\\SystemTag\\SystemTagList' => __DIR__ . '/..' . '/../lib/SystemTag/SystemTagList.php',
'OCA\\DAV\\SystemTag\\SystemTagMappingNode' => __DIR__ . '/..' . '/../lib/SystemTag/SystemTagMappingNode.php',
'OCA\\DAV\\SystemTag\\SystemTagNode' => __DIR__ . '/..' . '/../lib/SystemTag/SystemTagNode.php',
diff --git a/apps/dav/lib/Connector/Sabre/FilesPlugin.php b/apps/dav/lib/Connector/Sabre/FilesPlugin.php
index 3b96f67a82b..13244004993 100644
--- a/apps/dav/lib/Connector/Sabre/FilesPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/FilesPlugin.php
@@ -345,13 +345,10 @@ class FilesPlugin extends ServerPlugin {
return $node->getNode()->getInternalPath() === '' ? 'true' : 'false';
});
- $propFind->handle(self::SHARE_NOTE, function () use ($node, $httpRequest): ?string {
+ $propFind->handle(self::SHARE_NOTE, function () use ($node, $httpRequest): string {
$user = $this->userSession->getUser();
- if ($user === null) {
- return null;
- }
return $node->getNoteFromShare(
- $user->getUID()
+ $user?->getUID()
);
});
diff --git a/apps/dav/lib/Connector/Sabre/Node.php b/apps/dav/lib/Connector/Sabre/Node.php
index 379574b30d6..075ea2dd65b 100644
--- a/apps/dav/lib/Connector/Sabre/Node.php
+++ b/apps/dav/lib/Connector/Sabre/Node.php
@@ -15,6 +15,7 @@ use OCA\DAV\Connector\Sabre\Exception\InvalidPath;
use OCP\Files\DavUtil;
use OCP\Files\FileInfo;
use OCP\Files\IRootFolder;
+use OCP\Files\NotFoundException;
use OCP\Files\StorageNotAvailableException;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager;
@@ -298,15 +299,14 @@ abstract class Node implements \Sabre\DAV\INode {
* @return array
*/
public function getShareAttributes(): array {
- $attributes = [];
-
try {
- $storage = $this->info->getStorage();
- } catch (StorageNotAvailableException $e) {
- $storage = null;
+ $storage = $this->node->getStorage();
+ } catch (NotFoundException $e) {
+ return [];
}
- if ($storage && $storage->instanceOfStorage(\OCA\Files_Sharing\SharedStorage::class)) {
+ $attributes = [];
+ if (method_exists($storage, 'getShare')) {
/** @var \OCA\Files_Sharing\SharedStorage $storage */
$attributes = $storage->getShare()->getAttributes();
if ($attributes === null) {
@@ -319,29 +319,25 @@ abstract class Node implements \Sabre\DAV\INode {
return $attributes;
}
- /**
- * @param string $user
- * @return string
- */
- public function getNoteFromShare($user) {
- if ($user === null) {
+ public function getNoteFromShare(?string $user): string {
+ try {
+ $storage = $this->node->getStorage();
+ } catch (NotFoundException) {
return '';
}
- // Retrieve note from the share object already loaded into
- // memory, to avoid additional database queries.
- $storage = $this->getNode()->getStorage();
- if (!$storage->instanceOfStorage(\OCA\Files_Sharing\SharedStorage::class)) {
+ if (!method_exists($storage, 'getShare')) {
return '';
}
/** @var \OCA\Files_Sharing\SharedStorage $storage */
$share = $storage->getShare();
$note = $share->getNote();
- if ($share->getShareOwner() !== $user) {
- return $note;
+ if ($user === $share->getShareOwner()) {
+ // Note is only for recipient not the owner
+ return '';
}
- return '';
+ return $note;
}
/**
diff --git a/apps/dav/lib/Storage/PublicShareWrapper.php b/apps/dav/lib/Storage/PublicShareWrapper.php
new file mode 100644
index 00000000000..fb24abda9d0
--- /dev/null
+++ b/apps/dav/lib/Storage/PublicShareWrapper.php
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\DAV\Storage;
+
+use OC\Files\Storage\Wrapper\Wrapper;
+use OCP\Share\IShare;
+
+class PublicShareWrapper extends Wrapper {
+
+ private IShare $share;
+
+ /**
+ * @param array $arguments ['storage' => $storage, 'share' => $share]
+ *
+ * $storage: The storage the permissions mask should be applied on
+ * $share: The share to use in case no share is found
+ */
+ public function __construct($arguments) {
+ parent::__construct($arguments);
+ $this->share = $arguments['share'];
+ }
+
+ public function getShare(): IShare {
+ $storage = parent::getWrapperStorage();
+ if (method_exists($storage, 'getShare')) {
+ /** @var \OCA\Files_Sharing\SharedStorage $storage */
+ return $storage->getShare();
+ }
+
+ return $this->share;
+ }
+}