govuk_frontend_toolkit 7.3.0 → 7.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0334902cdeefff962323abe904470c7558848f31bda9660316d85abf05e26d34
4
- data.tar.gz: f69772e14fcbbbd38c6a5fecdc627618c990d481f6a818b8bba157d231b69a73
3
+ metadata.gz: c7d913fed9e8375459ac2c0cb48ba26fd4bea526a38faa372ca84cbcb0333e2b
4
+ data.tar.gz: 87d5bacfb307d6586cb334764aa31e5165a4720320374905023498c273ed95a8
5
5
  SHA512:
6
- metadata.gz: 57596cc95ffa5ec4c46b0e020cefde1007f2c2d074707e53b6ed3a221e5807e13c040f62289fc89fc561d5e56f758b6279e56f685f839a46149eb2eae1f12425
7
- data.tar.gz: 608f7fa34a8f4723b883b564d401f52a3c9afca816303c574f7f0ca4574c458d0d9b32e243fa6828e5840ab403069275ed405d6a564efde0532fda50b2adf919
6
+ metadata.gz: fb987f4d033bd8089be306d3301fb5f93c07ff0fbcc52f5d5938b006413312184d31893fb48869e9d4fcd324a21de6358830f8fa4112f21c5d548a7a848b6af7
7
+ data.tar.gz: 0340fecd6ab4340d6fdfb47dd7ed6d76b867ab45cd39bd6c5846330a1836c0b414f8f981af5bc0bdeb73da8f93b2cb04c91e02b4a94fb12f3b51a684fed50688
@@ -1,3 +1,8 @@
1
+ # 7.4.0
2
+
3
+ - Allow wrapping arguments to analytics as PII safe to tell the analytics code not to attempt to strip PII from the values: ([PR #448](https://github.com/alphagov/govuk_frontend_toolkit/pull/448))
4
+ - Documentation improvements: ([PR #446](https://github.com/alphagov/govuk_frontend_toolkit/pull/446), [PR #447](https://github.com/alphagov/govuk_frontend_toolkit/pull/447))
5
+
1
6
  # 7.3.0
2
7
 
3
8
  - Strip PII from all arguments passed to GA. Emails are stripped by default, postcodes can also be stripped if configured to do so: ([PR #435](https://github.com/alphagov/govuk_frontend_toolkit/pull/435)).
data/app/assets/README.md CHANGED
@@ -1,11 +1,5 @@
1
1
  # GOV.UK frontend toolkit
2
2
 
3
- ---
4
-
5
- #### You can help us improve the GOV.UK frontend toolkit by completing our [5 minute survey](https://www.surveymonkey.co.uk/r/2MZRS9H).
6
-
7
- ---
8
-
9
3
  A collection of Sass and JavaScript files for using as part of your
10
4
  application's frontend.
11
5
 
@@ -39,6 +33,20 @@ may need to upgrade to a more recent version to use the grid helpers. Minimal
39
33
  compatible versions include `node-sass` 1.0.0, `grunt-sass` 0.16.0,
40
34
  `gulp-sass` 1.2.0 and `libsass` 3.0.0.
41
35
 
36
+ ### Django
37
+
38
+ Requirement: [NodeJS](https://nodejs.org/en/) installed. This gives you [Node Package Manager](https://docs.npmjs.com/getting-started/installing-node)(NPM) which is required to install npm packages.
39
+
40
+ The easiest way to integrate it would be to create a `package.json` file in your application with `npm init`
41
+
42
+ You then install the toolkit with `npm install --save govuk_frontend_toolkit`.
43
+ If you need javascript files, they will live in (`node_modules/govuk_frontend_toolkit/javascripts`).
44
+ If you need stylesheets they will live in (`node_modules/govuk_frontend_toolkit/stylesheets`).
45
+
46
+ With Django you can use https://github.com/jrief/django-sass-processor to compile Sass files.
47
+
48
+ Note: if you need complete styles you might want to install govuk-elements-sass package that also installs toolkit
49
+
42
50
  ### Composer
43
51
 
44
52
  [govuk_frontend_toolkit_composer][toolkit_composer_github] is an composer package that can be
@@ -1 +1 @@
1
- 7.3.0
1
+ 7.4.0
@@ -249,3 +249,22 @@ initialize time as follows:
249
249
 
250
250
  Any value other than the JS literal `true` for `stripPostcodePII` will leave
251
251
  the analytics module configured not to strip postcodes.
252
+
253
+ #### Avoding false positives
254
+
255
+ Sometimes you will have data you want to send to analytics that looks like PII
256
+ and would be stripped out. For example on GOV.UK the content_ids that belong
257
+ to every document can sometimes contain a string of characters that look like a
258
+ UK postcode: in `eed5b92e-8279-4ca9-a141-5c35ed22fcf1` the substring `c35ed` in
259
+ the final portion looks like a postcode, `C3 5ED`, and will be transformed into
260
+ `eed5b92e-8279-4ca9-a141-5[postcode]22fcf1` which breaks the `content_id`. To
261
+ send data that you know is not PII, but it looks like an email address or a UK
262
+ postcode you can provide your arguments wrapped in a `GOVUK.Analytics.PIISafe`
263
+ object. If any argument to an analytics function is an instance of one of these
264
+ objects the value contained within will be extracted and sent directly to the
265
+ analytics tracker without attempting to strip PII from it. For example:
266
+
267
+ ```js
268
+ GOVUK.analytics.setDimension(1, new GOVUK.Analytics.PIISafe('this-is-not-an@email-address-but-it-looks-like-one'));
269
+ GOVUK.analytics.trackEvent('report title clicked', new GOVUK.Analytics.PIISafe('this report title looks like it contains a P0 5TC ode but it does not really'));
270
+ ````
@@ -29,10 +29,15 @@
29
29
  }
30
30
  }
31
31
 
32
+ var PIISafe = function (value) {
33
+ this.value = value
34
+ }
35
+ Analytics.PIISafe = PIISafe
36
+
32
37
  Analytics.prototype.stripPII = function (value) {
33
38
  if (typeof value === 'string') {
34
39
  return this.stripPIIFromString(value)
35
- } else if (Object.prototype.toString.call(value) === '[object Array]') {
40
+ } else if (Object.prototype.toString.call(value) === '[object Array]' || Object.prototype.toString.call(value) === '[object Arguments]') {
36
41
  return this.stripPIIFromArray(value)
37
42
  } else if (typeof value === 'object') {
38
43
  return this.stripPIIFromObject(value)
@@ -51,12 +56,16 @@
51
56
  }
52
57
 
53
58
  Analytics.prototype.stripPIIFromObject = function (object) {
54
- for (var property in object) {
55
- var value = object[property]
59
+ if (object instanceof Analytics.PIISafe) {
60
+ return object.value
61
+ } else {
62
+ for (var property in object) {
63
+ var value = object[property]
56
64
 
57
- object[property] = this.stripPII(value)
65
+ object[property] = this.stripPII(value)
66
+ }
67
+ return object
58
68
  }
59
- return object
60
69
  }
61
70
 
62
71
  Analytics.prototype.stripPIIFromArray = function (array) {
@@ -150,6 +150,24 @@ describe('GOVUK.Analytics', function () {
150
150
  analytics.setDimension(1, 'SW1+1AA-value', { label: 'RG209NJ', value: ['data', 'data', 'someone has added their personalIV63 6TU postcode'] })
151
151
  expect(window.ga.calls.mostRecent().args).toEqual(['set', 'dimension1', '[postcode]-value']) // set dimension ignores extra options
152
152
  })
153
+
154
+ it('ignores any PIISafe arguments even if they look like emails or postcodes', function () {
155
+ analytics = new GOVUK.Analytics({
156
+ universalId: 'universal-id',
157
+ cookieDomain: '.www.gov.uk',
158
+ siteSpeedSampleRate: 100,
159
+ stripPostcodePII: true
160
+ })
161
+
162
+ analytics.trackPageview(new GOVUK.Analytics.PIISafe('/path/to/an/embedded/SW1+1AA/postcode/?with=an&postcode=SP4%207DE'), new GOVUK.Analytics.PIISafe('an.email@example.com'), { label: new GOVUK.Analytics.PIISafe('another.email@example.com'), value: ['data', 'data', new GOVUK.Analytics.PIISafe('someone has added their personalIV63 6TU postcode')] })
163
+ expect(window.ga.calls.mostRecent().args).toEqual(['send', 'pageview', { page: '/path/to/an/embedded/SW1+1AA/postcode/?with=an&postcode=SP4%207DE', title: 'an.email@example.com', label: 'another.email@example.com', value: ['data', 'data', 'someone has added their personalIV63 6TU postcode'] }])
164
+
165
+ analytics.trackEvent(new GOVUK.Analytics.PIISafe('SW1+1AA-category'), new GOVUK.Analytics.PIISafe('an.email@example.com-action'), { label: new GOVUK.Analytics.PIISafe('RG209NJ'), value: ['data', 'data', 'someone has added their personalIV63 6TU postcode'] })
166
+ expect(window.ga.calls.mostRecent().args).toEqual(['send', { hitType: 'event', eventCategory: 'SW1+1AA-category', eventAction: 'an.email@example.com-action', eventLabel: 'RG209NJ' }]) // trackEvent ignores options other than label or integer values for value
167
+
168
+ analytics.setDimension(1, new GOVUK.Analytics.PIISafe('an.email@SW1+1AA-value.com'), { label: new GOVUK.Analytics.PIISafe('RG209NJ'), value: ['data', 'data', new GOVUK.Analytics.PIISafe('someone has added their personalIV63 6TU postcode')] })
169
+ expect(window.ga.calls.mostRecent().args).toEqual(['set', 'dimension1', 'an.email@SW1+1AA-value.com']) // set dimension ignores extra options
170
+ })
153
171
  })
154
172
 
155
173
  describe('when tracking social media shares', function () {
@@ -224,6 +242,31 @@ describe('GOVUK.Analytics', function () {
224
242
  value: ['data', 'data', 'someone has added their personal[postcode] postcode']
225
243
  }])
226
244
  })
245
+
246
+ it('ignores any PIISafe arguments even if they look like emails or postcodes', function () {
247
+ analytics = new GOVUK.Analytics({
248
+ universalId: 'universal-id',
249
+ cookieDomain: '.www.gov.uk',
250
+ siteSpeedSampleRate: 100,
251
+ stripPostcodePII: true
252
+ })
253
+
254
+ analytics.trackShare('email', {
255
+ to: new GOVUK.Analytics.PIISafe('IV63 6TU'),
256
+ label: new GOVUK.Analytics.PIISafe('an.email@example.com'),
257
+ value: new GOVUK.Analytics.PIISafe(['data', 'another.email@example.com', 'someone has added their personalTD15 2SE postcode'])
258
+ })
259
+
260
+ expect(window.ga.calls.mostRecent().args).toEqual(['send', {
261
+ hitType: 'social',
262
+ socialNetwork: 'email',
263
+ socialAction: 'share',
264
+ socialTarget: jasmine.any(String),
265
+ to: 'IV63 6TU',
266
+ label: 'an.email@example.com',
267
+ value: ['data', 'another.email@example.com', 'someone has added their personalTD15 2SE postcode']
268
+ }])
269
+ })
227
270
  })
228
271
 
229
272
  describe('when adding a linked domain', function () {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk_frontend_toolkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.3.0
4
+ version: 7.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Government Digital Service
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-08 00:00:00.000000000 Z
11
+ date: 2018-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties