govspeak 5.5.0 → 5.6.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
  SHA1:
3
- metadata.gz: 52ab560c9f4e178a3079553808221fed51396b32
4
- data.tar.gz: 371d78e8b275ca0c482e925a9e8a0bce71f791e0
3
+ metadata.gz: 6e0eb446c6565462c24ad3f78801c202917e9b20
4
+ data.tar.gz: 16455957358cc36b9e743974e885c61b48259227
5
5
  SHA512:
6
- metadata.gz: 81bfefe2e2923ef22e97898e1c9183833b220de4ceaec5d53a711dbf674ea513c081fa9bfb4b9633212278b06ab5ec8b3e9366ac0acf88f4f639e5a982b89aad
7
- data.tar.gz: 122a67b0d9182529e010c14cc3129b0c81b72182cb272ca6bcd167c337a965f2351398e0c2abac8595501ea1355a102fef37cee070ec0312963833606a0485b7
6
+ metadata.gz: 4e89a5cc8e001699815ea701efef079fbf2ede8a25b99a0493f880135919c913f2186a3a2745fb4bd9bfa2331da156ba0b86da7e5b5a206eca4665dcf55a94a0
7
+ data.tar.gz: e5295b34106249a7bc73751852688f0e00a80242380eaa6a09c94b2e185f6d5648132881148fdbc2d6658cbadd5b4352da340a7c89e5cdadf3b990b7654fa41b
@@ -1,3 +1,7 @@
1
+ ## 5.6.0
2
+
3
+ * Update sanitize version to 4.6.x [#127](https://github.com/alphagov/govspeak/issues/127)
4
+
1
5
  ## 5.5.0
2
6
  * Ignore links with blank or missing `href`s when extracting links from a document with `Govspeak::Document#extracted_links` [#124](https://github.com/alphagov/govspeak/pull/124)
3
7
 
@@ -1,9 +1,7 @@
1
1
  require 'addressable/uri'
2
2
  require 'sanitize'
3
- require 'with_deep_merge'
4
3
 
5
4
  class Govspeak::HtmlSanitizer
6
- include WithDeepMerge
7
5
 
8
6
  class ImageSourceWhitelister
9
7
  def initialize(allowed_image_hosts)
@@ -48,13 +46,12 @@ class Govspeak::HtmlSanitizer
48
46
  if @allowed_image_hosts && @allowed_image_hosts.any?
49
47
  transformers << ImageSourceWhitelister.new(@allowed_image_hosts)
50
48
  end
51
- Sanitize.clean(@dirty_html, sanitize_config.merge(transformers: transformers))
49
+ Sanitize.clean(@dirty_html, Sanitize::Config.merge(sanitize_config, transformers: transformers))
52
50
  end
53
51
 
54
52
  def sanitize_without_images
55
53
  config = sanitize_config
56
- config[:elements].delete('img')
57
- Sanitize.clean(@dirty_html, config)
54
+ Sanitize.clean(@dirty_html, Sanitize::Config.merge(config, elements: config[:elements] - ["img"]))
58
55
  end
59
56
 
60
57
  def button_sanitize_config
@@ -66,14 +63,14 @@ class Govspeak::HtmlSanitizer
66
63
  end
67
64
 
68
65
  def sanitize_config
69
- deep_merge(Sanitize::Config::RELAXED, {
66
+ Sanitize::Config.merge(
67
+ Sanitize::Config::RELAXED,
70
68
  attributes: {
71
- :all => Sanitize::Config::RELAXED[:attributes][:all] + [ "id", "class", "role", "aria-label" ],
72
- "a" => Sanitize::Config::RELAXED[:attributes]["a"] + ["rel"] + button_sanitize_config,
73
- "th" => Sanitize::Config::RELAXED[:attributes]["th"] + [ "style" ],
74
- "td" => Sanitize::Config::RELAXED[:attributes]["td"] + [ "style" ],
75
- },
76
- elements: Sanitize::Config::RELAXED[:elements] + [ "div", "span", "aside" ],
77
- })
69
+ :all => Sanitize::Config::RELAXED[:attributes][:all] + ["role", "aria-label"],
70
+ "a" => Sanitize::Config::RELAXED[:attributes]["a"] + button_sanitize_config,
71
+ "th" => Sanitize::Config::RELAXED[:attributes]["th"] + ["style"],
72
+ "td" => Sanitize::Config::RELAXED[:attributes]["td"] + ["style"],
73
+ }
74
+ )
78
75
  end
79
76
  end
@@ -1,3 +1,3 @@
1
1
  module Govspeak
2
- VERSION = "5.5.0".freeze
2
+ VERSION = "5.6.0".freeze
3
3
  end
@@ -53,13 +53,24 @@ class HtmlSanitizerTest < Minitest::Test
53
53
  end
54
54
 
55
55
  test "allows table cells and table headings without a style attribute" do
56
- html = "<th>thing</th><td>thing</td>"
56
+ html = "<table><thead><tr><th>thing</th></tr></thead><tbody><tr><td>thing</td></tr></tbody></table>"
57
57
  assert_equal html, Govspeak::HtmlSanitizer.new(html).sanitize
58
58
  end
59
59
 
60
+ test "strips table cells and headings that appear outside a table" do
61
+ html = "<th>thing</th></tr><tr><td>thing</td>"
62
+ assert_equal 'thingthing', Govspeak::HtmlSanitizer.new(html).sanitize
63
+ end
64
+
65
+ test "normalizes table tags to inject missing rows and bodies like a browser does" do
66
+ html = "<table><th>thing</th><td>thing</td></table>"
67
+ assert_equal '<table><tbody><tr><th>thing</th><td>thing</td></tr></tbody></table>', Govspeak::HtmlSanitizer.new(html).sanitize
68
+ end
69
+
70
+
60
71
  test "allows valid text-align properties on the style attribute for table cells and table headings" do
61
72
  ["left", "right", "center"].each do |alignment|
62
- html = "<th style=\"text-align: #{alignment}\">thing</th><td style=\"text-align: #{alignment}\">thing</td>"
73
+ html = "<table><thead><tr><th style=\"text-align: #{alignment}\">thing</th></tr></thead><tbody><tr><td style=\"text-align: #{alignment}\">thing</td></tr></tbody></table>"
63
74
  assert_equal html, Govspeak::HtmlSanitizer.new(html).sanitize
64
75
  end
65
76
 
@@ -70,8 +81,8 @@ class HtmlSanitizerTest < Minitest::Test
70
81
  "background-image: url(javascript:alert('XSS'))",
71
82
  "expression(alert('XSS'));"
72
83
  ].each do |style|
73
- html = "<th style=\"#{style}\">thing</th><td style=\"#{style}\">thing</td>"
74
- assert_equal '<th>thing</th><td>thing</td>', Govspeak::HtmlSanitizer.new(html).sanitize
84
+ html = "<table><thead><tr><th style=\"#{style}\">thing</th></tr></thead><tbody><tr><td style=\"#{style}\">thing</td></tr></tbody></table>"
85
+ assert_equal '<table><thead><tr><th>thing</th></tr></thead><tbody><tr><td>thing</td></tr></tbody></table>', Govspeak::HtmlSanitizer.new(html).sanitize
75
86
  end
76
87
  end
77
88
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govspeak
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.5.0
4
+ version: 5.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-21 00:00:00.000000000 Z
11
+ date: 2018-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kramdown
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 2.1.0
47
+ version: '4.6'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 2.1.0
54
+ version: '4.6'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: nokogiri
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -279,7 +279,6 @@ files:
279
279
  - lib/templates/attachment.html.erb
280
280
  - lib/templates/contact.html.erb
281
281
  - lib/templates/inline_attachment.html.erb
282
- - lib/with_deep_merge.rb
283
282
  - test/blockquote_extra_quote_remover_test.rb
284
283
  - test/govspeak_attachments_image_test.rb
285
284
  - test/govspeak_attachments_inline_test.rb
@@ -295,7 +294,6 @@ files:
295
294
  - test/html_validator_test.rb
296
295
  - test/presenters/h_card_presenter_test.rb
297
296
  - test/test_helper.rb
298
- - test/with_deep_merge_test.rb
299
297
  homepage: http://github.com/alphagov/govspeak
300
298
  licenses: []
301
299
  metadata: {}
@@ -323,7 +321,6 @@ test_files:
323
321
  - test/govspeak_link_extractor_test.rb
324
322
  - test/govspeak_structured_headers_test.rb
325
323
  - test/govspeak_button_test.rb
326
- - test/with_deep_merge_test.rb
327
324
  - test/blockquote_extra_quote_remover_test.rb
328
325
  - test/govspeak_test_helper.rb
329
326
  - test/govspeak_link_test.rb
@@ -1,11 +0,0 @@
1
- module WithDeepMerge
2
- def deep_merge(base_object, other_object)
3
- if base_object.is_a?(Hash) && other_object.is_a?(Hash)
4
- base_object.merge(other_object) { |_, base_value, other_value|
5
- deep_merge(base_value, other_value)
6
- }
7
- else
8
- other_object
9
- end
10
- end
11
- end
@@ -1,18 +0,0 @@
1
- require 'with_deep_merge'
2
-
3
- class WithDeepMergeTest < Minitest::Test
4
- include WithDeepMerge
5
-
6
- def test_simple_merge
7
- base_hash = { "a" => "b" }
8
- other_hash = { "c" => "d" }
9
- assert_equal({ "a" => "b", "c" => "d" }, deep_merge(base_hash, other_hash))
10
- end
11
-
12
- def test_recursive_merge
13
- base_hash = { "a" => { "b" => "c", "d" => "e" } }
14
- other_hash = { "a" => { "b" => "z", "f" => "g" } }
15
- assert_equal({ "a" => { "b" => "z", "d" => "e", "f" => "g" } },
16
- deep_merge(base_hash, other_hash))
17
- end
18
- end