diff --git a/app/views/layouts/application.html.slim b/app/views/layouts/application.html.slim index d92096b27bc..8ac7ed4c9b5 100644 --- a/app/views/layouts/application.html.slim +++ b/app/views/layouts/application.html.slim @@ -59,6 +59,4 @@ html lang="#{I18n.locale}" == javascript_include_tag 'misc/i18n-mode' - if Figaro.env.participate_in_dap == 'true' - = t('notices.dap_html') - - dap_source = 'https://dap.digitalgov.gov/Universal-Federated-Analytics-Min.js?agency=GSA' - + = render 'shared/dap_analytics' diff --git a/app/views/shared/_dap_analytics.html.erb b/app/views/shared/_dap_analytics.html.erb new file mode 100644 index 00000000000..6ff51cd70ef --- /dev/null +++ b/app/views/shared/_dap_analytics.html.erb @@ -0,0 +1,4 @@ +<%= t('notices.dap_html') %> +<% dap_source = 'https://dap.digitalgov.gov/Universal-Federated-Analytics-Min.js?agency=GSA' %> +<%= nonced_javascript_tag({src: dap_source, async: true, id: '_fed_an_ua_tag'}) do %> +<% end %> diff --git a/app/views/shared/google_analytics/_page_tracking.html.erb b/app/views/shared/google_analytics/_page_tracking.html.erb new file mode 100644 index 00000000000..53df7f0f696 --- /dev/null +++ b/app/views/shared/google_analytics/_page_tracking.html.erb @@ -0,0 +1,16 @@ +<% nonce = content_security_policy_script_nonce %> + +<%= nonced_javascript_tag do %> + var nonce = "<%= nonce %>"; + var analyticsKey = "<%= Figaro.env.google_analytics_key %>"; + + (function(i,s,o,g,r,a,m,n){n=a;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.setAttribute('nonce',n);a.async=1;a.src=g;m.parentNode.insertBefore(a,m) +})(window,document,'script','//www.google-analytics.com/analytics.js','ga', nonce); + + ga('create', analyticsKey, 'auto'); + ga('set', 'anonymizeIp', true); + ga('set', 'forceSSL', true); + ga('send', 'pageview'); +<% end %> diff --git a/app/views/shared/google_analytics/_page_tracking.html.slim b/app/views/shared/google_analytics/_page_tracking.html.slim deleted file mode 100644 index 6ec46edd88c..00000000000 --- a/app/views/shared/google_analytics/_page_tracking.html.slim +++ /dev/null @@ -1,10 +0,0 @@ -javascript: - (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','//www.google-analytics.com/analytics.js','ga'); - - ga('create', '#{Figaro.env.google_analytics_key}', 'auto'); - ga('set', 'anonymizeIp', true); - ga('set', 'forceSSL', true); - ga('send', 'pageview'); diff --git a/config/initializers/secure_headers.rb b/config/initializers/secure_headers.rb index e2c3761d87e..be14bcd18b5 100644 --- a/config/initializers/secure_headers.rb +++ b/config/initializers/secure_headers.rb @@ -14,10 +14,16 @@ block_all_mixed_content: true, # CSP 2.0 only; connect_src: ["'self'"], font_src: ["'self'", 'data:'], - img_src: ["'self'", 'data:'], + img_src: ["'self'", 'data:', '*.google-analytics.com'], media_src: ["'self'"], object_src: ["'none'"], - script_src: ["'self'", '*.newrelic.com', '*.nr-data.net'], + script_src: [ + "'self'", + '*.newrelic.com', + '*.nr-data.net', + 'dap.digitalgov.gov', + '*.google-analytics.com' + ], style_src: ["'self'"], base_uri: ["'self'"] }