summaryrefslogtreecommitdiffstats
path: root/config/privacy
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-05-04 10:18:45 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-05-21 00:41:42 +0200
commit0bbdef986d8eecf4fabe9a372e33626dbdfeb36b (patch)
tree72e52401c9bf5503e0581a0f522a350311e29a0e /config/privacy
parent9bd4236e1b3bee332439eef50e12d4481340c3eb (diff)
config: Add the foundation for GDPR privacy configuration
See #4616
Diffstat (limited to 'config/privacy')
-rw-r--r--config/privacy/privacyConfig.go85
-rw-r--r--config/privacy/privacyConfig_test.go93
2 files changed, 178 insertions, 0 deletions
diff --git a/config/privacy/privacyConfig.go b/config/privacy/privacyConfig.go
new file mode 100644
index 000000000..c93137da4
--- /dev/null
+++ b/config/privacy/privacyConfig.go
@@ -0,0 +1,85 @@
+// Copyright 2018 The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package privacy
+
+import (
+ "github.com/gohugoio/hugo/config"
+ "github.com/mitchellh/mapstructure"
+)
+
+const privacyConfigKey = "privacy"
+
+// Service is the common values for a service in a policy definition.
+type Service struct {
+ Disable bool
+}
+
+// Config is a privacy configuration for all the relevant services in Hugo.
+type Config struct {
+ Disqus Disqus
+ GoogleAnalytics GoogleAnalytics
+ Instagram Instagram
+ SpeakerDeck SpeakerDeck
+ Tweet Tweet
+ Vimeo Vimeo
+ YouTube YouTube
+}
+
+// Disqus holds the privacy configuration settings related to the Disqus template.
+type Disqus struct {
+ Service `mapstructure:",squash"`
+}
+
+// GoogleAnalytics holds the privacy configuration settings related to the Google Analytics template.
+type GoogleAnalytics struct {
+ Service `mapstructure:",squash"`
+}
+
+// Instagram holds the privacy configuration settings related to the Instagram shortcode.
+type Instagram struct {
+ Service `mapstructure:",squash"`
+}
+
+// SpeakerDeck holds the privacy configuration settings related to the SpeakerDeck shortcode.
+type SpeakerDeck struct {
+ Service `mapstructure:",squash"`
+}
+
+// Tweet holds the privacy configuration settingsrelated to the Tweet shortcode.
+type Tweet struct {
+ Service `mapstructure:",squash"`
+}
+
+// Vimeo holds the privacy configuration settingsrelated to the Vimeo shortcode.
+type Vimeo struct {
+ Service `mapstructure:",squash"`
+}
+
+// YouTube holds the privacy configuration settingsrelated to the YouTube shortcode.
+type YouTube struct {
+ Service `mapstructure:",squash"`
+ NoCookie bool
+}
+
+func DecodeConfig(cfg config.Provider) (pc Config, err error) {
+ if !cfg.IsSet(privacyConfigKey) {
+ return
+ }
+
+ m := cfg.GetStringMap(privacyConfigKey)
+
+ err = mapstructure.WeakDecode(m, &pc)
+
+ return
+}
diff --git a/config/privacy/privacyConfig_test.go b/config/privacy/privacyConfig_test.go
new file mode 100644
index 000000000..9b0d75e31
--- /dev/null
+++ b/config/privacy/privacyConfig_test.go
@@ -0,0 +1,93 @@
+// Copyright 2018 The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package privacy
+
+import (
+ "testing"
+
+ "github.com/gohugoio/hugo/config"
+ "github.com/spf13/viper"
+ "github.com/stretchr/testify/require"
+)
+
+func TestDecodeConfigFromTOML(t *testing.T) {
+ assert := require.New(t)
+
+ tomlConfig := `
+
+someOtherValue = "foo"
+
+[privacy]
+[privacy.disqus]
+disable = true
+[privacy.googleAnalytics]
+disable = true
+[privacy.instagram]
+disable = true
+[privacy.speakerDeck]
+disable = true
+[privacy.tweet]
+disable = true
+[privacy.vimeo]
+disable = true
+[privacy.youtube]
+disable = true
+noCookie = true
+`
+ cfg, err := config.FromConfigString(tomlConfig, "toml")
+ assert.NoError(err)
+
+ pc, err := DecodeConfig(cfg)
+ assert.NoError(err)
+ assert.NotNil(pc)
+
+ assert.True(pc.Disqus.Disable)
+ assert.True(pc.GoogleAnalytics.Disable)
+ assert.True(pc.Instagram.Disable)
+ assert.True(pc.SpeakerDeck.Disable)
+ assert.True(pc.Tweet.Disable)
+ assert.True(pc.Vimeo.Disable)
+
+ assert.True(pc.YouTube.NoCookie)
+ assert.True(pc.YouTube.Disable)
+}
+
+func TestDecodeConfigFromTOMLCaseInsensitive(t *testing.T) {
+ assert := require.New(t)
+
+ tomlConfig := `
+
+someOtherValue = "foo"
+
+[Privacy]
+[Privacy.YouTube]
+NoCOOKIE = true
+`
+ cfg, err := config.FromConfigString(tomlConfig, "toml")
+ assert.NoError(err)
+
+ pc, err := DecodeConfig(cfg)
+ assert.NoError(err)
+ assert.NotNil(pc)
+ assert.True(pc.YouTube.NoCookie)
+}
+
+func TestDecodeConfigDefault(t *testing.T) {
+ assert := require.New(t)
+
+ pc, err := DecodeConfig(viper.New())
+ assert.NoError(err)
+ assert.NotNil(pc)
+ assert.False(pc.YouTube.NoCookie)
+}