From 79a97a9db255e6483740dec8a19b8912b72f6f6a Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 16 Jul 2020 11:36:35 +0200 Subject: [PATCH] Use new BeforeTemplateRenderedEvent for share template loading Signed-off-by: Joas Schilling --- lib/AppInfo/Application.php | 5 +-- lib/PublicShare/TemplateLoader.php | 40 +++++++++------------ lib/PublicShareAuth/TemplateLoader.php | 48 +++++++++----------------- 3 files changed, 36 insertions(+), 57 deletions(-) diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 85d348ee3..ade710667 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace OCA\Talk\AppInfo; +use OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent; use OCA\Talk\Activity\Listener as ActivityListener; use OCA\Talk\Capabilities; use OCA\Talk\Chat\Changelog\Listener as ChangelogListener; @@ -87,6 +88,8 @@ class Application extends App implements IBootstrap { $context->registerEventListener(AddFeaturePolicyEvent::class, FeaturePolicyListener::class); $context->registerEventListener(UserDeletedEvent::class, UserDeletedListener::class); $context->registerEventListener(BeforeUserLoggedOutEvent::class, BeforeUserLoggedOutListener::class); + $context->registerEventListener(BeforeTemplateRenderedEvent::class, PublicShareTemplateLoader::class); + $context->registerEventListener(BeforeTemplateRenderedEvent::class, PublicShareAuthTemplateLoader::class); } public function boot(IBootContext $context): void { @@ -105,8 +108,6 @@ class Application extends App implements IBootstrap { SystemMessageListener::register($dispatcher); ParserListener::register($dispatcher); PublicShareAuthListener::register($dispatcher); - PublicShareAuthTemplateLoader::register($dispatcher); - PublicShareTemplateLoader::register($dispatcher); FilesListener::register($dispatcher); FilesTemplateLoader::register($dispatcher); RestrictStartingCallsListener::register($dispatcher); diff --git a/lib/PublicShare/TemplateLoader.php b/lib/PublicShare/TemplateLoader.php index 38a18f330..f5e1bccc8 100644 --- a/lib/PublicShare/TemplateLoader.php +++ b/lib/PublicShare/TemplateLoader.php @@ -25,25 +25,23 @@ declare(strict_types=1); namespace OCA\Talk\PublicShare; +use OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent; use OCA\Talk\Config; use OCA\Talk\TInitialState; -use OCP\EventDispatcher\IEventDispatcher; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; use OCP\Files\FileInfo; use OCP\ICacheFactory; use OCP\IConfig; use OCP\IInitialStateService; -use OCP\Share\IShare; use OCP\Util; -use Symfony\Component\EventDispatcher\GenericEvent; /** * Helper class to extend the "publicshare" template from the server. * - * The "loadTalkSidebarUi" method loads additional scripts that, when run on the - * browser, adjust the page generated by the server to inject the Talk UI as - * needed. + * The additional scripts modify the page in the browser to inject the Talk UI as needed. */ -class TemplateLoader { +class TemplateLoader implements IEventListener { use TInitialState; public function __construct(IInitialStateService $initialStateService, @@ -56,30 +54,26 @@ class TemplateLoader { $this->serverConfig = $serverConfig; } - public static function register(IEventDispatcher $dispatcher): void { - $dispatcher->addListener('OCA\Files_Sharing::loadAdditionalScripts', static function (GenericEvent $event) { - /** @var IShare $share */ - $share = $event->getArgument('share'); - /** @var self $templateLoader */ - $templateLoader = \OC::$server->query(self::class); - $templateLoader->loadTalkSidebarUi($share); - }); - } - /** * Load the "Talk sidebar" UI in the public share page for the given share. - * - * This method should be called when loading additional scripts for the - * public share page of the server. - * - * @param IShare $share + * @param Event $event */ - public function loadTalkSidebarUi(IShare $share): void { + public function handle(Event $event): void { + if (!$event instanceof BeforeTemplateRenderedEvent) { + return; + } + + if ($event->getScope() !== null) { + // If the event has a scope, it's not the default share page, but e.g. authentication + return; + } + if ($this->serverConfig->getAppValue('spreed', 'conversations_files', '1') !== '1' || $this->serverConfig->getAppValue('spreed', 'conversations_files_public_shares', '1') !== '1') { return; } + $share = $event->getShare(); if ($share->getNodeType() !== FileInfo::TYPE_FILE) { return; } diff --git a/lib/PublicShareAuth/TemplateLoader.php b/lib/PublicShareAuth/TemplateLoader.php index 1b96fe419..af68c1413 100644 --- a/lib/PublicShareAuth/TemplateLoader.php +++ b/lib/PublicShareAuth/TemplateLoader.php @@ -1,6 +1,7 @@ initialStateService = $initialStateService; - $this->memcacheFactory = $memcacheFactory; $this->talkConfig = $talkConfig; + $this->memcacheFactory = $memcacheFactory; $this->serverConfig = $serverConfig; } - public static function register(IEventDispatcher $dispatcher): void { - $listener = static function (GenericEvent $event) { - /** @var IShare $share */ - $share = $event->getArgument('share'); - /** @var self $templateLoader */ - $templateLoader = \OC::$server->query(self::class); - $templateLoader->loadRequestPasswordByTalkUi($share); - }; - $dispatcher->addListener('OCA\Files_Sharing::loadAdditionalScripts::publicShareAuth', $listener); - } - /** - * Load the "Request password by Talk" UI in the public share authentication - * page for the given share. - * - * If the "Send Password by Talk" option is not set in the share then no UI - * to request the password is provided. - * - * This method should be called when loading additional scripts for the - * public share authentication page of the server. - * - * @param IShare $share + * Load the "Video verification" UI in the public share auth page. + * @param Event $event */ - public function loadRequestPasswordByTalkUi(IShare $share): void { - if (!$share->getSendPasswordByTalk()) { + public function handle(Event $event): void { + if (!$event instanceof BeforeTemplateRenderedEvent) { + return; + } + + if ($event->getScope() !== BeforeTemplateRenderedEvent::SCOPE_PUBLIC_SHARE_AUTH) { + // If the scope is not the authentication page we don't load this part of the Talk UI return; } Util::addStyle('spreed', 'merged-share-auth'); Util::addScript('spreed', 'talk-public-share-auth-sidebar'); - $this->publishInitialStateForGuest(); } }