diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index ac0d46b..02ddcce 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -4,15 +4,14 @@ namespace OCA\NCGoogleAnalytics\AppInfo; -use OC\Security\CSP\ContentSecurityPolicyManager; -use OC\Security\CSP\ContentSecurityPolicyNonceManager; +use OCA\NCGoogleAnalytics\Listener\LoadScript; +use OCA\NCGoogleAnalytics\Listener\AddCsp; use OCP\AppFramework\App; use OCP\AppFramework\Bootstrap\IBootContext; use OCP\AppFramework\Bootstrap\IBootstrap; use OCP\AppFramework\Bootstrap\IRegistrationContext; -use OCP\AppFramework\Http\ContentSecurityPolicy; -use OCP\IURLGenerator; -use OCP\Util; +use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent; +use OCP\Security\CSP\AddContentSecurityPolicyEvent; class Application extends App implements IBootstrap { @@ -23,60 +22,12 @@ public function __construct() parent::__construct(self::APP_ID); } - public function register(IRegistrationContext $context): void - { + public function register(IRegistrationContext $context): void { + $context->registerEventListener(BeforeTemplateRenderedEvent::class, LoadScript::class); + $context->registerEventListener(AddContentSecurityPolicyEvent::class, AddCsp::class); } public function boot(IBootContext $context): void { - $context->injectFn([$this, 'addTrackingScript']); - $context->injectFn([$this, 'addContentSecurityPolicy']); - } - - public function addTrackingScript(IURLGenerator $urlGenerator, ContentSecurityPolicyNonceManager $nonceManager): void - { - Util::addHeader( - 'script', - [ - 'src' => $urlGenerator->linkToRoute('googleanalytics.JavaScript.tracking'), - 'nonce' => $nonceManager->getNonce(), - ], - '' - ); - } - - /** - * Add the Content Security Policy for the Google Analytics tracking according - * to https://developers.google.com/tag-platform/security/guides/csp - * - * @param ContentSecurityPolicyManager $policyManager - * @return void - */ - public function addContentSecurityPolicy(ContentSecurityPolicyManager $policyManager): void - { - $policy = new ContentSecurityPolicy(); - - $policy->addAllowedScriptDomain("*.googletagmanager.com"); - $policy->addAllowedImageDomain("*.googletagmanager.com"); - $policy->addAllowedConnectDomain("*.googletagmanager.com"); - - $policy->addAllowedScriptDomain("tagmanager.google.com"); - $policy->addAllowedImageDomain("tagmanager.google.com"); - $policy->addAllowedConnectDomain("tagmanager.google.com"); - - $policy->addAllowedScriptDomain("*.google-analytics.com"); - $policy->addAllowedImageDomain("*.google-analytics.com"); - $policy->addAllowedConnectDomain("*.google-analytics.com"); - - // additional SCP for GTM preview mode - $policy->addAllowedStyleDomain("https://www.googletagmanager.com"); - $policy->addAllowedStyleDomain("https://fonts.googleapis.com"); - - $policy->addAllowedFontDomain("https://fonts.gstatic.com"); - - $policy->addAllowedImageDomain("https://fonts.gstatic.com"); - $policy->addAllowedImageDomain("https://fonts.googleapis.com"); - - $policyManager->addDefaultPolicy($policy); } } diff --git a/lib/Listener/AddCsp.php b/lib/Listener/AddCsp.php new file mode 100644 index 0000000..ce0c361 --- /dev/null +++ b/lib/Listener/AddCsp.php @@ -0,0 +1,58 @@ +consentDetection->isConsentGiven()) { + return; + } + + $policy = new ContentSecurityPolicy(); + + $policy->addAllowedScriptDomain("*.googletagmanager.com"); + $policy->addAllowedImageDomain("*.googletagmanager.com"); + $policy->addAllowedConnectDomain("*.googletagmanager.com"); + + $policy->addAllowedScriptDomain("tagmanager.google.com"); + $policy->addAllowedImageDomain("tagmanager.google.com"); + $policy->addAllowedConnectDomain("tagmanager.google.com"); + + $policy->addAllowedScriptDomain("*.google-analytics.com"); + $policy->addAllowedImageDomain("*.google-analytics.com"); + $policy->addAllowedConnectDomain("*.google-analytics.com"); + + // additional SCP for GTM preview mode + $policy->addAllowedStyleDomain("https://www.googletagmanager.com"); + $policy->addAllowedStyleDomain("https://fonts.googleapis.com"); + + $policy->addAllowedFontDomain("https://fonts.gstatic.com"); + + $policy->addAllowedImageDomain("https://fonts.gstatic.com"); + $policy->addAllowedImageDomain("https://fonts.googleapis.com"); + + $event->addPolicy($policy); + } +} diff --git a/lib/Listener/LoadScript.php b/lib/Listener/LoadScript.php new file mode 100644 index 0000000..9d244e8 --- /dev/null +++ b/lib/Listener/LoadScript.php @@ -0,0 +1,47 @@ +consentDetection->isConsentGiven()) { + return; + } + + Util::addHeader( + 'script', + [ + 'src' => $this->urlGenerator->linkToRoute('googleanalytics.JavaScript.tracking'), + 'nonce' => $this->nonceManager->getNonce(), + ], + '' + ); + } +} diff --git a/lib/Service/ConsentDetection.php b/lib/Service/ConsentDetection.php new file mode 100644 index 0000000..22ff669 --- /dev/null +++ b/lib/Service/ConsentDetection.php @@ -0,0 +1,31 @@ +request->getCookie(self::CONSENT_COOKIE_NAME); + $jsonStr = base64_decode($codedJsonStr); + $settings = json_decode($jsonStr); + return $settings->statistics ?? false; + } +}