diff options
Diffstat (limited to 'lib/private/Collaboration/Reference')
5 files changed, 112 insertions, 336 deletions
diff --git a/lib/private/Collaboration/Reference/File/FileReferenceEventListener.php b/lib/private/Collaboration/Reference/File/FileReferenceEventListener.php index 1dbe8e3bc35..9c18531c8e7 100644 --- a/lib/private/Collaboration/Reference/File/FileReferenceEventListener.php +++ b/lib/private/Collaboration/Reference/File/FileReferenceEventListener.php @@ -2,24 +2,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2022 Julius Härtl <jus@bitgrid.net> - * - * @author Julius Härtl <jus@bitgrid.net> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OC\Collaboration\Reference\File; @@ -31,19 +15,20 @@ use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventDispatcher; use OCP\EventDispatcher\IEventListener; use OCP\Files\Events\Node\NodeDeletedEvent; +use OCP\Files\Events\Node\NodeRenamedEvent; use OCP\Share\Events\ShareCreatedEvent; use OCP\Share\Events\ShareDeletedEvent; /** @template-implements IEventListener<Event|NodeDeletedEvent|ShareDeletedEvent|ShareCreatedEvent> */ class FileReferenceEventListener implements IEventListener { - private IReferenceManager $manager; - - public function __construct(IReferenceManager $manager) { - $this->manager = $manager; + public function __construct( + private IReferenceManager $manager, + ) { } public static function register(IEventDispatcher $eventDispatcher): void { $eventDispatcher->addServiceListener(NodeDeletedEvent::class, FileReferenceEventListener::class); + $eventDispatcher->addServiceListener(NodeRenamedEvent::class, FileReferenceEventListener::class); $eventDispatcher->addServiceListener(ShareDeletedEvent::class, FileReferenceEventListener::class); $eventDispatcher->addServiceListener(ShareCreatedEvent::class, FileReferenceEventListener::class); } @@ -59,6 +44,9 @@ class FileReferenceEventListener implements IEventListener { $this->manager->invalidateCache((string)$event->getNode()->getId()); } + if ($event instanceof NodeRenamedEvent) { + $this->manager->invalidateCache((string)$event->getTarget()->getId()); + } if ($event instanceof ShareDeletedEvent) { $this->manager->invalidateCache((string)$event->getShare()->getNodeId()); } diff --git a/lib/private/Collaboration/Reference/File/FileReferenceProvider.php b/lib/private/Collaboration/Reference/File/FileReferenceProvider.php index 4e6c7ea623f..3cb174d9607 100644 --- a/lib/private/Collaboration/Reference/File/FileReferenceProvider.php +++ b/lib/private/Collaboration/Reference/File/FileReferenceProvider.php @@ -2,59 +2,41 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2022 Julius Härtl <jus@bitgrid.net> - * - * @author Julius Härtl <jus@bitgrid.net> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OC\Collaboration\Reference\File; use OC\User\NoUserException; +use OCP\Collaboration\Reference\ADiscoverableReferenceProvider; use OCP\Collaboration\Reference\IReference; -use OCP\Collaboration\Reference\IReferenceProvider; use OCP\Collaboration\Reference\Reference; use OCP\Files\IMimeTypeDetector; use OCP\Files\InvalidPathException; use OCP\Files\IRootFolder; -use OCP\Files\Node; use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; +use OCP\IL10N; use OCP\IPreview; use OCP\IURLGenerator; use OCP\IUserSession; +use OCP\L10N\IFactory; -class FileReferenceProvider implements IReferenceProvider { - private IURLGenerator $urlGenerator; - private IRootFolder $rootFolder; +class FileReferenceProvider extends ADiscoverableReferenceProvider { private ?string $userId; - private IPreview $previewManager; - private IMimeTypeDetector $mimeTypeDetector; - - public function __construct(IURLGenerator $urlGenerator, - IRootFolder $rootFolder, - IUserSession $userSession, - IMimeTypeDetector $mimeTypeDetector, - IPreview $previewManager) { - $this->urlGenerator = $urlGenerator; - $this->rootFolder = $rootFolder; - $this->userId = $userSession->getUser() ? $userSession->getUser()->getUID() : null; - $this->previewManager = $previewManager; - $this->mimeTypeDetector = $mimeTypeDetector; + private IL10N $l10n; + + public function __construct( + private IURLGenerator $urlGenerator, + private IRootFolder $rootFolder, + IUserSession $userSession, + private IMimeTypeDetector $mimeTypeDetector, + private IPreview $previewManager, + IFactory $l10n, + ) { + $this->userId = $userSession->getUser()?->getUID(); + $this->l10n = $l10n->get('files'); } public function matchReference(string $referenceText): bool { @@ -62,21 +44,21 @@ class FileReferenceProvider implements IReferenceProvider { } private function getFilesAppLinkId(string $referenceText): ?int { - $start = $this->urlGenerator->getAbsoluteURL('/apps/files'); - $startIndex = $this->urlGenerator->getAbsoluteURL('/index.php/apps/files'); + $start = $this->urlGenerator->getAbsoluteURL('/apps/files/'); + $startIndex = $this->urlGenerator->getAbsoluteURL('/index.php/apps/files/'); $fileId = null; if (mb_strpos($referenceText, $start) === 0) { $parts = parse_url($referenceText); - parse_str($parts['query'], $query); + parse_str($parts['query'] ?? '', $query); $fileId = isset($query['fileid']) ? (int)$query['fileid'] : $fileId; $fileId = isset($query['openfile']) ? (int)$query['openfile'] : $fileId; } if (mb_strpos($referenceText, $startIndex) === 0) { $parts = parse_url($referenceText); - parse_str($parts['query'], $query); + parse_str($parts['query'] ?? '', $query); $fileId = isset($query['fileid']) ? (int)$query['fileid'] : $fileId; $fileId = isset($query['openfile']) ? (int)$query['openfile'] : $fileId; } @@ -122,15 +104,12 @@ class FileReferenceProvider implements IReferenceProvider { try { $userFolder = $this->rootFolder->getUserFolder($this->userId); - $files = $userFolder->getById($fileId); + $file = $userFolder->getFirstNodeById($fileId); - if (empty($files)) { + if (!$file) { throw new NotFoundException(); } - /** @var Node $file */ - $file = array_shift($files); - $reference->setTitle($file->getName()); $reference->setDescription($file->getMimetype()); $reference->setUrl($this->urlGenerator->getAbsoluteURL('/index.php/f/' . $fileId)); @@ -145,9 +124,10 @@ class FileReferenceProvider implements IReferenceProvider { 'id' => $file->getId(), 'name' => $file->getName(), 'size' => $file->getSize(), - 'path' => $file->getPath(), + 'path' => $userFolder->getRelativePath($file->getPath()), 'link' => $reference->getUrl(), 'mimetype' => $file->getMimetype(), + 'mtime' => $file->getMTime(), 'preview-available' => $this->previewManager->isAvailable($file) ]); } catch (InvalidPathException|NotFoundException|NotPermittedException|NoUserException $e) { @@ -162,4 +142,20 @@ class FileReferenceProvider implements IReferenceProvider { public function getCacheKey(string $referenceId): ?string { return $this->userId ?? ''; } + + public function getId(): string { + return 'files'; + } + + public function getTitle(): string { + return $this->l10n->t('Files'); + } + + public function getOrder(): int { + return 0; + } + + public function getIconUrl(): string { + return $this->urlGenerator->imagePath('files', 'folder.svg'); + } } diff --git a/lib/private/Collaboration/Reference/LinkReferenceProvider.php b/lib/private/Collaboration/Reference/LinkReferenceProvider.php index 2a6d4d5afaf..5af23bf633d 100644 --- a/lib/private/Collaboration/Reference/LinkReferenceProvider.php +++ b/lib/private/Collaboration/Reference/LinkReferenceProvider.php @@ -2,182 +2,14 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2022 Julius Härtl <jus@bitgrid.net> - * - * @author Julius Härtl <jus@bitgrid.net> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OC\Collaboration\Reference; -use Fusonic\OpenGraph\Consumer; -use GuzzleHttp\Psr7\LimitStream; -use GuzzleHttp\Psr7\Utils; -use OC\Security\RateLimiting\Exception\RateLimitExceededException; -use OC\Security\RateLimiting\Limiter; -use OC\SystemConfig; -use OCP\Collaboration\Reference\IReference; -use OCP\Collaboration\Reference\IReferenceProvider; -use OCP\Collaboration\Reference\Reference; -use OCP\Files\AppData\IAppDataFactory; -use OCP\Files\NotFoundException; -use OCP\Http\Client\IClientService; -use OCP\IRequest; -use OCP\IURLGenerator; -use OCP\IUserSession; -use Psr\Log\LoggerInterface; +use OCP\Collaboration\Reference\LinkReferenceProvider as OCPLinkReferenceProvider; -class LinkReferenceProvider implements IReferenceProvider { - public const MAX_PREVIEW_SIZE = 1024 * 1024; - - public const ALLOWED_CONTENT_TYPES = [ - 'image/png', - 'image/jpg', - 'image/jpeg', - 'image/gif', - 'image/svg+xml', - 'image/webp' - ]; - - private IClientService $clientService; - private LoggerInterface $logger; - private SystemConfig $systemConfig; - private IAppDataFactory $appDataFactory; - private IURLGenerator $urlGenerator; - private Limiter $limiter; - private IUserSession $userSession; - private IRequest $request; - - public function __construct(IClientService $clientService, LoggerInterface $logger, SystemConfig $systemConfig, IAppDataFactory $appDataFactory, IURLGenerator $urlGenerator, Limiter $limiter, IUserSession $userSession, IRequest $request) { - $this->clientService = $clientService; - $this->logger = $logger; - $this->systemConfig = $systemConfig; - $this->appDataFactory = $appDataFactory; - $this->urlGenerator = $urlGenerator; - $this->limiter = $limiter; - $this->userSession = $userSession; - $this->request = $request; - } - - public function matchReference(string $referenceText): bool { - if ($this->systemConfig->getValue('reference_opengraph', true) !== true) { - return false; - } - - return (bool)preg_match(IURLGenerator::URL_REGEX, $referenceText); - } - - public function resolveReference(string $referenceText): ?IReference { - if ($this->matchReference($referenceText)) { - $reference = new Reference($referenceText); - $this->fetchReference($reference); - return $reference; - } - - return null; - } - - private function fetchReference(Reference $reference): void { - try { - $user = $this->userSession->getUser(); - if ($user) { - $this->limiter->registerUserRequest('opengraph', 10, 120, $user); - } else { - $this->limiter->registerAnonRequest('opengraph', 10, 120, $this->request->getRemoteAddress()); - } - } catch (RateLimitExceededException $e) { - return; - } - - $client = $this->clientService->newClient(); - try { - $headResponse = $client->head($reference->getId(), [ 'timeout' => 10 ]); - } catch (\Exception $e) { - $this->logger->debug('Failed to perform HEAD request to get target metadata', ['exception' => $e]); - return; - } - $linkContentLength = $headResponse->getHeader('Content-Length'); - if (is_numeric($linkContentLength) && (int) $linkContentLength > 5 * 1024 * 1024) { - $this->logger->debug('Skip resolving links pointing to content length > 5 MB'); - return; - } - $linkContentType = $headResponse->getHeader('Content-Type'); - $expectedContentType = 'text/html'; - $suffixedExpectedContentType = $expectedContentType . ';'; - $startsWithSuffixed = substr($linkContentType, 0, strlen($suffixedExpectedContentType)) === $suffixedExpectedContentType; - // check the header begins with the expected content type - if ($linkContentType !== $expectedContentType && !$startsWithSuffixed) { - $this->logger->debug('Skip resolving links pointing to content type that is not "text/html"'); - return; - } - try { - $response = $client->get($reference->getId(), [ 'timeout' => 10 ]); - } catch (\Exception $e) { - $this->logger->debug('Failed to fetch link for obtaining open graph data', ['exception' => $e]); - return; - } - - $responseBody = (string)$response->getBody(); - - // OpenGraph handling - $consumer = new Consumer(); - $consumer->useFallbackMode = true; - $object = $consumer->loadHtml($responseBody); - - $reference->setUrl($reference->getId()); - - if ($object->title) { - $reference->setTitle($object->title); - } - - if ($object->description) { - $reference->setDescription($object->description); - } - - if ($object->images) { - try { - $appData = $this->appDataFactory->get('core'); - try { - $folder = $appData->getFolder('opengraph'); - } catch (NotFoundException $e) { - $folder = $appData->newFolder('opengraph'); - } - $response = $client->get($object->images[0]->url, [ 'timeout' => 10 ]); - $contentType = $response->getHeader('Content-Type'); - $contentLength = $response->getHeader('Content-Length'); - - if (in_array($contentType, self::ALLOWED_CONTENT_TYPES, true) && $contentLength < self::MAX_PREVIEW_SIZE) { - $stream = Utils::streamFor($response->getBody()); - $bodyStream = new LimitStream($stream, self::MAX_PREVIEW_SIZE, 0); - $reference->setImageContentType($contentType); - $folder->newFile(md5($reference->getId()), $bodyStream->getContents()); - $reference->setImageUrl($this->urlGenerator->linkToRouteAbsolute('core.Reference.preview', ['referenceId' => md5($reference->getId())])); - } - } catch (\Throwable $e) { - $this->logger->error('Failed to fetch and store the open graph image for ' . $reference->getId(), ['exception' => $e]); - } - } - } - - public function getCachePrefix(string $referenceId): string { - return $referenceId; - } - - public function getCacheKey(string $referenceId): ?string { - return null; - } +/** @deprecated 29.0.0 Use OCP\Collaboration\Reference\LinkReferenceProvider instead */ +class LinkReferenceProvider extends OCPLinkReferenceProvider { } diff --git a/lib/private/Collaboration/Reference/ReferenceManager.php b/lib/private/Collaboration/Reference/ReferenceManager.php index 2897410f5d6..9287b66b2a2 100644 --- a/lib/private/Collaboration/Reference/ReferenceManager.php +++ b/lib/private/Collaboration/Reference/ReferenceManager.php @@ -2,24 +2,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2022 Julius Härtl <jus@bitgrid.net> - * - * @author Julius Härtl <jus@bitgrid.net> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OC\Collaboration\Reference; @@ -27,6 +11,7 @@ namespace OC\Collaboration\Reference; use OC\AppFramework\Bootstrap\Coordinator; use OC\Collaboration\Reference\File\FileReferenceProvider; use OCP\Collaboration\Reference\IDiscoverableReferenceProvider; +use OCP\Collaboration\Reference\IPublicReferenceProvider; use OCP\Collaboration\Reference\IReference; use OCP\Collaboration\Reference\IReferenceManager; use OCP\Collaboration\Reference\IReferenceProvider; @@ -46,33 +31,22 @@ class ReferenceManager implements IReferenceManager { /** @var IReferenceProvider[]|null */ private ?array $providers = null; private ICache $cache; - private Coordinator $coordinator; - private ContainerInterface $container; - private LinkReferenceProvider $linkReferenceProvider; - private LoggerInterface $logger; - private IConfig $config; - private IUserSession $userSession; - - public function __construct(LinkReferenceProvider $linkReferenceProvider, - ICacheFactory $cacheFactory, - Coordinator $coordinator, - ContainerInterface $container, - LoggerInterface $logger, - IConfig $config, - IUserSession $userSession) { - $this->linkReferenceProvider = $linkReferenceProvider; + + public function __construct( + private LinkReferenceProvider $linkReferenceProvider, + ICacheFactory $cacheFactory, + private Coordinator $coordinator, + private ContainerInterface $container, + private LoggerInterface $logger, + private IConfig $config, + private IUserSession $userSession, + ) { $this->cache = $cacheFactory->createDistributed('reference'); - $this->coordinator = $coordinator; - $this->container = $container; - $this->logger = $logger; - $this->config = $config; - $this->userSession = $userSession; } /** * Extract a list of URLs from a text * - * @param string $text * @return string[] */ public function extractReferences(string $text): array { @@ -85,26 +59,20 @@ class ReferenceManager implements IReferenceManager { /** * Try to get a cached reference object from a reference string - * - * @param string $referenceId - * @return IReference|null */ - public function getReferenceFromCache(string $referenceId): ?IReference { - $matchedProvider = $this->getMatchedProvider($referenceId); + public function getReferenceFromCache(string $referenceId, bool $public = false, string $sharingToken = ''): ?IReference { + $matchedProvider = $this->getMatchedProvider($referenceId, $public); if ($matchedProvider === null) { return null; } - $cacheKey = $this->getFullCacheKey($matchedProvider, $referenceId); + $cacheKey = $this->getFullCacheKey($matchedProvider, $referenceId, $public, $sharingToken); return $this->getReferenceByCacheKey($cacheKey); } /** * Try to get a cached reference object from a full cache key - * - * @param string $cacheKey - * @return IReference|null */ public function getReferenceByCacheKey(string $cacheKey): ?IReference { $cached = $this->cache->get($cacheKey); @@ -118,25 +86,32 @@ class ReferenceManager implements IReferenceManager { /** * Get a reference object from a reference string with a matching provider * Use a cached reference if possible - * - * @param string $referenceId - * @return IReference|null */ - public function resolveReference(string $referenceId): ?IReference { - $matchedProvider = $this->getMatchedProvider($referenceId); + public function resolveReference(string $referenceId, bool $public = false, $sharingToken = ''): ?IReference { + $matchedProvider = $this->getMatchedProvider($referenceId, $public); if ($matchedProvider === null) { return null; } - $cacheKey = $this->getFullCacheKey($matchedProvider, $referenceId); + $cacheKey = $this->getFullCacheKey($matchedProvider, $referenceId, $public, $sharingToken); $cached = $this->cache->get($cacheKey); if ($cached) { return Reference::fromCache($cached); } - $reference = $matchedProvider->resolveReference($referenceId); + $reference = null; + if ($public && $matchedProvider instanceof IPublicReferenceProvider) { + $reference = $matchedProvider->resolveReferencePublic($referenceId, $sharingToken); + } elseif ($matchedProvider instanceof IReferenceProvider) { + $reference = $matchedProvider->resolveReference($referenceId); + } if ($reference) { + $cachePrefix = $matchedProvider->getCachePrefix($referenceId); + if ($cachePrefix !== '') { + // If a prefix is used we set an additional key to know when we need to delete by prefix during invalidateCache() + $this->cache->set('hasPrefix-' . md5($cachePrefix), true, self::CACHE_TTL); + } $this->cache->set($cacheKey, Reference::toCache($reference), self::CACHE_TTL); return $reference; } @@ -148,12 +123,14 @@ class ReferenceManager implements IReferenceManager { * Try to match a reference string with all the registered providers * Fallback to the link reference provider (using OpenGraph) * - * @param string $referenceId - * @return IReferenceProvider|null the first matching provider + * @return IReferenceProvider|IPublicReferenceProvider|null the first matching provider */ - private function getMatchedProvider(string $referenceId): ?IReferenceProvider { + private function getMatchedProvider(string $referenceId, bool $public): null|IReferenceProvider|IPublicReferenceProvider { $matchedProvider = null; foreach ($this->getProviders() as $provider) { + if ($public && !($provider instanceof IPublicReferenceProvider)) { + continue; + } $matchedProvider = $provider->matchReference($referenceId) ? $provider : null; if ($matchedProvider !== null) { break; @@ -169,13 +146,14 @@ class ReferenceManager implements IReferenceManager { /** * Get a hashed full cache key from a key and prefix given by a provider - * - * @param IReferenceProvider $provider - * @param string $referenceId - * @return string */ - private function getFullCacheKey(IReferenceProvider $provider, string $referenceId): string { - $cacheKey = $provider->getCacheKey($referenceId); + private function getFullCacheKey(IReferenceProvider $provider, string $referenceId, bool $public, string $sharingToken): string { + if ($public && !($provider instanceof IPublicReferenceProvider)) { + throw new \RuntimeException('Provider doesn\'t support public lookups'); + } + $cacheKey = $public + ? $provider->getCacheKeyPublic($referenceId, $sharingToken) + : $provider->getCacheKey($referenceId); return md5($provider->getCachePrefix($referenceId)) . ( $cacheKey !== null ? ('-' . md5($cacheKey)) : '' ); @@ -183,14 +161,14 @@ class ReferenceManager implements IReferenceManager { /** * Remove a specific cache entry from its key+prefix - * - * @param string $cachePrefix - * @param string|null $cacheKey - * @return void */ public function invalidateCache(string $cachePrefix, ?string $cacheKey = null): void { if ($cacheKey === null) { - $this->cache->clear(md5($cachePrefix)); + // clear might be a heavy operation, so we only do it if there have actually been keys set + if ($this->cache->remove('hasPrefix-' . md5($cachePrefix))) { + $this->cache->clear(md5($cachePrefix)); + } + return; } @@ -253,7 +231,7 @@ class ReferenceManager implements IReferenceManager { } $configKey = 'provider-last-use_' . $providerId; - $this->config->setUserValue($userId, 'references', $configKey, (string) $timestamp); + $this->config->setUserValue($userId, 'references', $configKey, (string)$timestamp); return true; } return false; @@ -276,7 +254,7 @@ class ReferenceManager implements IReferenceManager { $timestamps = []; foreach ($keys as $key) { $providerId = substr($key, strlen($prefix)); - $timestamp = (int) $this->config->getUserValue($userId, 'references', $key); + $timestamp = (int)$this->config->getUserValue($userId, 'references', $key); $timestamps[$providerId] = $timestamp; } return $timestamps; diff --git a/lib/private/Collaboration/Reference/RenderReferenceEventListener.php b/lib/private/Collaboration/Reference/RenderReferenceEventListener.php index dc2c5612666..9e6192314cb 100644 --- a/lib/private/Collaboration/Reference/RenderReferenceEventListener.php +++ b/lib/private/Collaboration/Reference/RenderReferenceEventListener.php @@ -2,24 +2,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2022 Julien Veyssier <eneiluj@posteo.net> - * - * @author Julien Veyssier <eneiluj@posteo.net> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OC\Collaboration\Reference; @@ -34,12 +18,10 @@ use OCP\IInitialStateService; /** @template-implements IEventListener<Event|RenderReferenceEvent> */ class RenderReferenceEventListener implements IEventListener { - private IReferenceManager $manager; - private IInitialStateService $initialStateService; - - public function __construct(IReferenceManager $manager, IInitialStateService $initialStateService) { - $this->manager = $manager; - $this->initialStateService = $initialStateService; + public function __construct( + private IReferenceManager $manager, + private IInitialStateService $initialStateService, + ) { } public static function register(IEventDispatcher $eventDispatcher): void { |