aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Collaboration/Reference
diff options
context:
space:
mode:
Diffstat (limited to 'lib/private/Collaboration/Reference')
-rw-r--r--lib/private/Collaboration/Reference/File/FileReferenceEventListener.php32
-rw-r--r--lib/private/Collaboration/Reference/File/FileReferenceProvider.php88
-rw-r--r--lib/private/Collaboration/Reference/LinkReferenceProvider.php178
-rw-r--r--lib/private/Collaboration/Reference/ReferenceManager.php120
-rw-r--r--lib/private/Collaboration/Reference/RenderReferenceEventListener.php30
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 {