diff options
author | Ferdinand Thiessen <opensource@fthiessen.de> | 2024-08-02 14:30:52 +0200 |
---|---|---|
committer | Ferdinand Thiessen <opensource@fthiessen.de> | 2024-08-12 11:28:03 +0200 |
commit | cb1b366baf75da4c578bc534884eefa7f6b4b3d2 (patch) | |
tree | bdb367d502a6990c39165960a76d3268270162ef /apps | |
parent | 1a7acf061e26d938e2162f791afb262dc7c2b90d (diff) | |
download | nextcloud-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.php | 7 | ||||
-rw-r--r-- | apps/dav/composer/composer/autoload_classmap.php | 1 | ||||
-rw-r--r-- | apps/dav/composer/composer/autoload_static.php | 1 | ||||
-rw-r--r-- | apps/dav/lib/Connector/Sabre/FilesPlugin.php | 7 | ||||
-rw-r--r-- | apps/dav/lib/Connector/Sabre/Node.php | 34 | ||||
-rw-r--r-- | apps/dav/lib/Storage/PublicShareWrapper.php | 38 |
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; + } +} |