shithub: hugo

Download patch

ref: 710142016b140538bfc11e48bb32d26fa685b2ad
parent: f45b522ebffafc61a3cb9b694bc3542747c73e07
author: Bjørn Erik Pedersen <[email protected]>
date: Mon May 21 06:18:36 EDT 2018

Add RespectDoNotTrack to GDPR privacy policy for Google Analytics

See #4616

--- a/config/privacy/privacyConfig.go
+++ b/config/privacy/privacyConfig.go
@@ -44,6 +44,10 @@
 // GoogleAnalytics holds the privacy configuration settings related to the Google Analytics template.
 type GoogleAnalytics struct {
 	Service `mapstructure:",squash"`
+
+	// Enabling this will make the GA templates respect the
+	// "Do Not Track" HTTP header. See  https://www.paulfurley.com/google-analytics-dnt/.
+	RespectDoNotTrack bool
 }
 
 // Instagram holds the privacy configuration settings related to the Instagram shortcode.
--- a/config/privacy/privacyConfig_test.go
+++ b/config/privacy/privacyConfig_test.go
@@ -33,6 +33,7 @@
 disable = true
 [privacy.googleAnalytics]
 disable = true
+respectDoNotTrack = true
 [privacy.instagram]
 disable = true
 [privacy.speakerDeck]
@@ -54,6 +55,7 @@
 
 	assert.True(pc.Disqus.Disable)
 	assert.True(pc.GoogleAnalytics.Disable)
+	assert.True(pc.GoogleAnalytics.RespectDoNotTrack)
 	assert.True(pc.Instagram.Disable)
 	assert.True(pc.SpeakerDeck.Disable)
 	assert.True(pc.Tweet.Disable)
--- a/tpl/tplimpl/embedded/templates.autogen.go
+++ b/tpl/tplimpl/embedded/templates.autogen.go
@@ -103,23 +103,37 @@
 {{- if not $pc.Disable -}}
 {{ with .Site.GoogleAnalytics }}
 <script>
-(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-ga('create', '{{ . }}', 'auto');
-ga('send', 'pageview');
+{{ template "__ga_js_set_doNotTrack" $ }}
+if (!doNotTrack) {
+	(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+	(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+	m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+	})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+	ga('create', '{{ . }}', 'auto');
+	ga('send', 'pageview');
+}
 </script>
 {{ end }}
+{{- end -}}
+{{- define "__ga_js_set_doNotTrack" -}}{{/* This is also used in the async version. */}}
+{{- $pc := .Site.PrivacyConfig.GoogleAnalytics -}}
+{{- if not $pc.RespectDoNotTrack -}}
+var doNotTrack = false;
+{{- else -}}
+var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
+var doNotTrack = (dnt == "1" || dnt == "yes");
+{{- end -}}
 {{- end -}}`},
 	{`google_analytics_async.html`, `{{- $pc := .Site.PrivacyConfig.GoogleAnalytics -}}
 {{- if not $pc.Disable -}}
 {{ with .Site.GoogleAnalytics }}
 <script>
-window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
-ga('create', '{{ . }}', 'auto');
-ga('send', 'pageview');
+{{ template "__ga_js_set_doNotTrack" $ }}
+if (!doNotTrack) {
+	window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
+	ga('create', '{{ . }}', 'auto');
+	ga('send', 'pageview');
+}
 </script>
 <script async src='//www.google-analytics.com/analytics.js'></script>
 {{ end }}
--- a/tpl/tplimpl/embedded/templates/google_analytics.html
+++ b/tpl/tplimpl/embedded/templates/google_analytics.html
@@ -2,13 +2,24 @@
 {{- if not $pc.Disable -}}
 {{ with .Site.GoogleAnalytics }}
 <script>
-(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-ga('create', '{{ . }}', 'auto');
-ga('send', 'pageview');
+{{ template "__ga_js_set_doNotTrack" $ }}
+if (!doNotTrack) {
+	(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+	(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+	m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+	})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+	ga('create', '{{ . }}', 'auto');
+	ga('send', 'pageview');
+}
 </script>
 {{ end }}
+{{- end -}}
+{{- define "__ga_js_set_doNotTrack" -}}{{/* This is also used in the async version. */}}
+{{- $pc := .Site.PrivacyConfig.GoogleAnalytics -}}
+{{- if not $pc.RespectDoNotTrack -}}
+var doNotTrack = false;
+{{- else -}}
+var dnt = (navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack);
+var doNotTrack = (dnt == "1" || dnt == "yes");
+{{- end -}}
 {{- end -}}
\ No newline at end of file
--- a/tpl/tplimpl/embedded/templates/google_analytics_async.html
+++ b/tpl/tplimpl/embedded/templates/google_analytics_async.html
@@ -2,9 +2,12 @@
 {{- if not $pc.Disable -}}
 {{ with .Site.GoogleAnalytics }}
 <script>
-window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
-ga('create', '{{ . }}', 'auto');
-ga('send', 'pageview');
+{{ template "__ga_js_set_doNotTrack" $ }}
+if (!doNotTrack) {
+	window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
+	ga('create', '{{ . }}', 'auto');
+	ga('send', 'pageview');
+}
 </script>
 <script async src='//www.google-analytics.com/analytics.js'></script>
 {{ end }}