diff --git a/apps/dav/lib/Connector/Sabre/ServerFactory.php b/apps/dav/lib/Connector/Sabre/ServerFactory.php index 42d3ce1818ace..460de0e3a9434 100644 --- a/apps/dav/lib/Connector/Sabre/ServerFactory.php +++ b/apps/dav/lib/Connector/Sabre/ServerFactory.php @@ -11,6 +11,7 @@ use OCA\DAV\CalDAV\DefaultCalendarValidator; use OCA\DAV\DAV\ViewOnlyPlugin; use OCA\DAV\Files\ErrorPagePlugin; +use OCA\DAV\SystemTag\SystemTagPlugin; use OCA\Theming\ThemingDefaults; use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Folder; @@ -18,49 +19,32 @@ use OCP\Files\Mount\IMountManager; use OCP\IConfig; use OCP\IDBConnection; +use OCP\IGroupManager; use OCP\IL10N; use OCP\IPreview; use OCP\IRequest; use OCP\ITagManager; use OCP\IUserSession; use OCP\SabrePluginEvent; +use OCP\SystemTag\ISystemTagManager; +use OCP\SystemTag\ISystemTagObjectMapper; use Psr\Log\LoggerInterface; use Sabre\DAV\Auth\Plugin; class ServerFactory { - private IConfig $config; - private LoggerInterface $logger; - private IDBConnection $databaseConnection; - private IUserSession $userSession; - private IMountManager $mountManager; - private ITagManager $tagManager; - private IRequest $request; - private IPreview $previewManager; - private IEventDispatcher $eventDispatcher; - private IL10N $l10n; public function __construct( - IConfig $config, - LoggerInterface $logger, - IDBConnection $databaseConnection, - IUserSession $userSession, - IMountManager $mountManager, - ITagManager $tagManager, - IRequest $request, - IPreview $previewManager, - IEventDispatcher $eventDispatcher, - IL10N $l10n + private IConfig $config, + private LoggerInterface $logger, + private IDBConnection $databaseConnection, + private IUserSession $userSession, + private IMountManager $mountManager, + private ITagManager $tagManager, + private IRequest $request, + private IPreview $previewManager, + private IEventDispatcher $eventDispatcher, + private IL10N $l10n ) { - $this->config = $config; - $this->logger = $logger; - $this->databaseConnection = $databaseConnection; - $this->userSession = $userSession; - $this->mountManager = $mountManager; - $this->tagManager = $tagManager; - $this->request = $request; - $this->previewManager = $previewManager; - $this->eventDispatcher = $eventDispatcher; - $this->l10n = $l10n; } /** @@ -139,6 +123,12 @@ public function createServer(string $baseUri, ); $server->addPlugin(new \OCA\DAV\Connector\Sabre\QuotaPlugin($view, true)); $server->addPlugin(new \OCA\DAV\Connector\Sabre\ChecksumUpdatePlugin()); + $server->addPlugin(new SystemTagPlugin( + \OCP\Server::get(ISystemTagManager::class), + \OCP\Server::get(IGroupManager::class), + \OCP\Server::get(IUserSession::class), + \OCP\Server::get(ISystemTagObjectMapper::class), + )); // Allow view-only plugin for webdav requests $server->addPlugin(new ViewOnlyPlugin( diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index 2784e99b5f73b..65330d27eb6c6 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -197,7 +197,7 @@ public function __construct(IRequest $request, string $baseUri) { } // system tags plugins - $this->server->addPlugin(\OC::$server->get(SystemTagPlugin::class)); + $this->server->addPlugin(\OCP\Server::get(SystemTagPlugin::class)); // comments plugin $this->server->addPlugin(new CommentsPlugin( diff --git a/apps/dav/lib/SystemTag/SystemTagList.php b/apps/dav/lib/SystemTag/SystemTagList.php index cbdf98b752fcb..7f651e7de0a45 100644 --- a/apps/dav/lib/SystemTag/SystemTagList.php +++ b/apps/dav/lib/SystemTag/SystemTagList.php @@ -20,12 +20,13 @@ class SystemTagList implements Element { public const NS_NEXTCLOUD = 'http://nextcloud.org/ns'; - /** @var ISystemTag[] */ - private array $tags; - private ISystemTagManager $tagManager; - private IUser $user; - - public function __construct(array $tags, ISystemTagManager $tagManager, IUser $user) { + /** + * @param ISystemTag[] $tags + */ + public function __construct( + private array $tags, + private ISystemTagManager $tagManager, + private ?IUser $user) { $this->tags = $tags; $this->tagManager = $tagManager; $this->user = $user; diff --git a/apps/dav/lib/SystemTag/SystemTagPlugin.php b/apps/dav/lib/SystemTag/SystemTagPlugin.php index ec2014163b376..ef7d3e88d9354 100644 --- a/apps/dav/lib/SystemTag/SystemTagPlugin.php +++ b/apps/dav/lib/SystemTag/SystemTagPlugin.php @@ -305,9 +305,6 @@ private function propfindForFile(PropFind $propFind, Node $node): void { $propFind->handle(self::SYSTEM_TAGS_PROPERTYNAME, function () use ($node) { $user = $this->userSession->getUser(); - if ($user === null) { - return; - } $tags = $this->getTagsForFile($node->getId(), $user); usort($tags, function (ISystemTag $tagA, ISystemTag $tagB): int { @@ -321,8 +318,7 @@ private function propfindForFile(PropFind $propFind, Node $node): void { * @param int $fileId * @return ISystemTag[] */ - private function getTagsForFile(int $fileId, IUser $user): array { - + private function getTagsForFile(int $fileId, ?IUser $user): array { if (isset($this->cachedTagMappings[$fileId])) { $tagIds = $this->cachedTagMappings[$fileId]; } else { diff --git a/apps/files_sharing/lib/DefaultPublicShareTemplateProvider.php b/apps/files_sharing/lib/DefaultPublicShareTemplateProvider.php index 784dc4e5e1591..5d3820d86f8c0 100644 --- a/apps/files_sharing/lib/DefaultPublicShareTemplateProvider.php +++ b/apps/files_sharing/lib/DefaultPublicShareTemplateProvider.php @@ -102,6 +102,7 @@ public function renderPage(IShare $share, string $token, string $path): Template \OCP\Util::addInitScript(Application::APP_ID, 'init-public'); \OCP\Util::addScript('files', 'main'); \OCP\Util::addStyle('files', 'merged'); + \OCP\Util::addInitScript('systemtags', 'init'); // Add file-request script if needed $attributes = $share->getAttributes(); diff --git a/lib/private/SystemTag/SystemTagManager.php b/lib/private/SystemTag/SystemTagManager.php index e99213b618bee..671c9e2ad615f 100644 --- a/lib/private/SystemTag/SystemTagManager.php +++ b/lib/private/SystemTag/SystemTagManager.php @@ -305,7 +305,11 @@ public function deleteTags($tagIds): void { /** * {@inheritdoc} */ - public function canUserAssignTag(ISystemTag $tag, IUser $user): bool { + public function canUserAssignTag(ISystemTag $tag, ?IUser $user): bool { + if ($user === null) { + return false; + } + // early check to avoid unneeded group lookups if ($tag->isUserAssignable() && $tag->isUserVisible()) { return true; @@ -333,11 +337,16 @@ public function canUserAssignTag(ISystemTag $tag, IUser $user): bool { /** * {@inheritdoc} */ - public function canUserSeeTag(ISystemTag $tag, IUser $user): bool { + public function canUserSeeTag(ISystemTag $tag, ?IUser $user): bool { if ($tag->isUserVisible()) { return true; } + // If no user and not user visible, then it's invisible + if ($user === null) { + return false; + } + if ($this->groupManager->isAdmin($user->getUID())) { return true; } diff --git a/lib/private/Tags.php b/lib/private/Tags.php index 6a31ac94ef61f..7a03d57975087 100644 --- a/lib/private/Tags.php +++ b/lib/private/Tags.php @@ -27,11 +27,6 @@ class Tags implements ITags { private LoggerInterface $logger; private array $tags = []; - /** - * Are we including tags for shared items? - */ - private bool $includeShared = false; - /** * The current user, plus any owners of the items shared with the current * user, if $this->includeShared === true. @@ -59,8 +54,6 @@ class Tags implements ITags { * @param string $user The user whose data the object will operate on. * @param string $type The type of items for which tags will be loaded. * @param array $defaultTags Tags that should be created at construction. - * - * since 20.0.0 $includeShared isn't used anymore */ public function __construct(TagMapper $mapper, string $user, string $type, LoggerInterface $logger, IDBConnection $connection, array $defaultTags = []) { $this->mapper = $mapper; diff --git a/lib/public/SystemTag/ISystemTagManager.php b/lib/public/SystemTag/ISystemTagManager.php index 8d0241e752fad..1c007ea0afa72 100644 --- a/lib/public/SystemTag/ISystemTagManager.php +++ b/lib/public/SystemTag/ISystemTagManager.php @@ -112,7 +112,7 @@ public function deleteTags($tagIds); * * @since 9.1.0 */ - public function canUserAssignTag(ISystemTag $tag, IUser $user): bool; + public function canUserAssignTag(ISystemTag $tag, ?IUser $user): bool; /** * Checks whether the given user is allowed to see the tag with the given id. @@ -124,7 +124,7 @@ public function canUserAssignTag(ISystemTag $tag, IUser $user): bool; * * @since 9.1.0 */ - public function canUserSeeTag(ISystemTag $tag, IUser $user): bool; + public function canUserSeeTag(ISystemTag $tag, ?IUser $user): bool; /** * Set groups that can assign a given tag.