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..8dbc959d 100644 --- a/lib/Listeners/LoadPublicViewerListener.php +++ b/lib/Listeners/LoadPublicViewerListener.php @@ -27,22 +27,54 @@ 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\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; } - // 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; + } + + // 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(); + } }