From 7ac1d65bcd971f80257191c99615648d5b10c0ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Calvi=C3=B1o=20S=C3=A1nchez?= Date: Tue, 6 Sep 2022 02:58:42 +0200 Subject: [PATCH 1/2] Load PDF viewer only in public share pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The PDF viewer is initialized only in public share pages for PDF files, but it was loaded in all public pages (for example, in the public profile page). To reduce the number of unneeded loads now it is loaded only in public share pages instead. Signed-off-by: Daniel Calviño Sánchez --- lib/AppInfo/Application.php | 2 +- lib/Listeners/LoadPublicViewerListener.php | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index fecf4264..ba1ffe69 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -31,13 +31,13 @@ use OCA\Files_PDFViewer\Listeners\LoadPublicViewerListener; use OCA\Files_PDFViewer\Listeners\LoadViewerListener; +use OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent; use OCA\Viewer\Event\LoadViewer; use OCP\AppFramework\App; use OCP\AppFramework\Bootstrap\IBootContext; use OCP\AppFramework\Bootstrap\IBootstrap; use OCP\AppFramework\Bootstrap\IRegistrationContext; -use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent; use OCP\Security\CSP\AddContentSecurityPolicyEvent; class Application extends App implements IBootstrap { diff --git a/lib/Listeners/LoadPublicViewerListener.php b/lib/Listeners/LoadPublicViewerListener.php index 316e6b2e..e7996b8b 100644 --- a/lib/Listeners/LoadPublicViewerListener.php +++ b/lib/Listeners/LoadPublicViewerListener.php @@ -27,8 +27,7 @@ namespace OCA\Files_PDFViewer\Listeners; use OCA\Files_PDFViewer\AppInfo\Application; -use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent; -use OCP\AppFramework\Http\TemplateResponse; +use OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent; use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventListener; use OCP\Util; @@ -39,10 +38,12 @@ public function handle(Event $event): void { return; } - // Make sure we are on a public page rendering - if ($event->getResponse()->getRenderAs() !== TemplateResponse::RENDER_AS_PUBLIC) { + // If the event has a scope it is not the default share page but, for + // example, the authentication page + if ($event->getScope() !== null) { return; } + Util::addScript(Application::APP_ID, 'files_pdfviewer-public'); } } From 77f4c0cd043d70c3baba6bca04e5bdcdee2c1047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Calvi=C3=B1o=20S=C3=A1nchez?= Date: Tue, 6 Sep 2022 03:00:27 +0200 Subject: [PATCH 2/2] Do not load PDF viewer if public share has a download limit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The PDF viewer needs to download the file in order to render it in the client. Due to this, if a public share has a download limit, loading the PDF viewer automatically reduces the number of available downloads by one, even if the user does not download the file manually. To prevent that now the PDF viewer is not loaded in public shares if the share has a download limit. Signed-off-by: Daniel Calviño Sánchez --- lib/Listeners/LoadPublicViewerListener.php | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/lib/Listeners/LoadPublicViewerListener.php b/lib/Listeners/LoadPublicViewerListener.php index e7996b8b..8dbc959d 100644 --- a/lib/Listeners/LoadPublicViewerListener.php +++ b/lib/Listeners/LoadPublicViewerListener.php @@ -28,11 +28,21 @@ use OCA\Files_PDFViewer\AppInfo\Application; use OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent; +use OCP\AppFramework\QueryException; use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventListener; +use OCP\IServerContainer; use OCP\Util; class LoadPublicViewerListener implements IEventListener { + + /** @var IServerContainer */ + private $serverContainer; + + public function __construct(IServerContainer $serverContainer) { + $this->serverContainer = $serverContainer; + } + public function handle(Event $event): void { if (!$event instanceof BeforeTemplateRenderedEvent) { return; @@ -44,6 +54,27 @@ public function handle(Event $event): void { return; } + // Do not load the viewer if there is a download limit + if ($this->getDownloadLimit($event->getShare()->getToken()) >= 0) { + return; + } + Util::addScript(Application::APP_ID, 'files_pdfviewer-public'); } + + private function getDownloadLimit(string $shareToken): int { + try { + $limitMapper = $this->serverContainer->get('\OCA\Files_DownloadLimit\Db\LimitMapper'); + } catch (QueryException $e) { + return -1; + } + + try { + $shareLimit = $limitMapper->get($shareToken); + } catch (\Exception $e) { + return -1; + } + + return $shareLimit->getLimit(); + } }