Add RespectDoNotTrack to GDPR privacy policy for Google Analytics

See #4616
This commit is contained in:
Bjørn Erik Pedersen 2018-05-21 10:18:36 +02:00
parent f45b522ebf
commit 710142016b
5 changed files with 54 additions and 20 deletions

View file

@ -44,6 +44,10 @@ type Disqus struct {
// GoogleAnalytics holds the privacy configuration settings related to the Google Analytics template. // GoogleAnalytics holds the privacy configuration settings related to the Google Analytics template.
type GoogleAnalytics struct { type GoogleAnalytics struct {
Service `mapstructure:",squash"` 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. // Instagram holds the privacy configuration settings related to the Instagram shortcode.

View file

@ -33,6 +33,7 @@ someOtherValue = "foo"
disable = true disable = true
[privacy.googleAnalytics] [privacy.googleAnalytics]
disable = true disable = true
respectDoNotTrack = true
[privacy.instagram] [privacy.instagram]
disable = true disable = true
[privacy.speakerDeck] [privacy.speakerDeck]
@ -54,6 +55,7 @@ noCookie = true
assert.True(pc.Disqus.Disable) assert.True(pc.Disqus.Disable)
assert.True(pc.GoogleAnalytics.Disable) assert.True(pc.GoogleAnalytics.Disable)
assert.True(pc.GoogleAnalytics.RespectDoNotTrack)
assert.True(pc.Instagram.Disable) assert.True(pc.Instagram.Disable)
assert.True(pc.SpeakerDeck.Disable) assert.True(pc.SpeakerDeck.Disable)
assert.True(pc.Tweet.Disable) assert.True(pc.Tweet.Disable)

View file

@ -103,23 +103,37 @@ var EmbeddedTemplates = [][2]string{
{{- if not $pc.Disable -}} {{- if not $pc.Disable -}}
{{ with .Site.GoogleAnalytics }} {{ with .Site.GoogleAnalytics }}
<script> <script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ {{ template "__ga_js_set_doNotTrack" $ }}
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), if (!doNotTrack) {
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); (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)
ga('create', '{{ . }}', 'auto'); })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('send', 'pageview'); ga('create', '{{ . }}', 'auto');
ga('send', 'pageview');
}
</script> </script>
{{ end }} {{ 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 -}}`}, {{- end -}}`},
{`google_analytics_async.html`, `{{- $pc := .Site.PrivacyConfig.GoogleAnalytics -}} {`google_analytics_async.html`, `{{- $pc := .Site.PrivacyConfig.GoogleAnalytics -}}
{{- if not $pc.Disable -}} {{- if not $pc.Disable -}}
{{ with .Site.GoogleAnalytics }} {{ with .Site.GoogleAnalytics }}
<script> <script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; {{ template "__ga_js_set_doNotTrack" $ }}
ga('create', '{{ . }}', 'auto'); if (!doNotTrack) {
ga('send', 'pageview'); window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', '{{ . }}', 'auto');
ga('send', 'pageview');
}
</script> </script>
<script async src='//www.google-analytics.com/analytics.js'></script> <script async src='//www.google-analytics.com/analytics.js'></script>
{{ end }} {{ end }}

View file

@ -2,13 +2,24 @@
{{- if not $pc.Disable -}} {{- if not $pc.Disable -}}
{{ with .Site.GoogleAnalytics }} {{ with .Site.GoogleAnalytics }}
<script> <script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ {{ template "__ga_js_set_doNotTrack" $ }}
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), if (!doNotTrack) {
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); (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)
ga('create', '{{ . }}', 'auto'); })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('send', 'pageview'); ga('create', '{{ . }}', 'auto');
ga('send', 'pageview');
}
</script> </script>
{{ end }} {{ 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 -}} {{- end -}}

View file

@ -2,9 +2,12 @@
{{- if not $pc.Disable -}} {{- if not $pc.Disable -}}
{{ with .Site.GoogleAnalytics }} {{ with .Site.GoogleAnalytics }}
<script> <script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; {{ template "__ga_js_set_doNotTrack" $ }}
ga('create', '{{ . }}', 'auto'); if (!doNotTrack) {
ga('send', 'pageview'); window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', '{{ . }}', 'auto');
ga('send', 'pageview');
}
</script> </script>
<script async src='//www.google-analytics.com/analytics.js'></script> <script async src='//www.google-analytics.com/analytics.js'></script>
{{ end }} {{ end }}