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 +4 -4
 - data/CHANGELOG.md +4 -0
 - data/lib/govspeak/html_sanitizer.rb +10 -13
 - data/lib/govspeak/version.rb +1 -1
 - data/test/html_sanitizer_test.rb +15 -4
 - metadata +4 -7
 - data/lib/with_deep_merge.rb +0 -11
 - data/test/with_deep_merge_test.rb +0 -18
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 6e0eb446c6565462c24ad3f78801c202917e9b20
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 16455957358cc36b9e743974e885c61b48259227
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 4e89a5cc8e001699815ea701efef079fbf2ede8a25b99a0493f880135919c913f2186a3a2745fb4bd9bfa2331da156ba0b86da7e5b5a206eca4665dcf55a94a0
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: e5295b34106249a7bc73751852688f0e00a80242380eaa6a09c94b2e185f6d5648132881148fdbc2d6658cbadd5b4352da340a7c89e5cdadf3b990b7654fa41b
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -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,  
     | 
| 
      
 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] 
     | 
| 
       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 
     | 
    
         
            -
                 
     | 
| 
      
 66 
     | 
    
         
            +
                Sanitize::Config.merge(
         
     | 
| 
      
 67 
     | 
    
         
            +
                  Sanitize::Config::RELAXED,
         
     | 
| 
       70 
68 
     | 
    
         
             
                  attributes: {
         
     | 
| 
       71 
     | 
    
         
            -
                    :all => Sanitize::Config::RELAXED[:attributes][:all] + [ 
     | 
| 
       72 
     | 
    
         
            -
                    "a"  => Sanitize::Config::RELAXED[:attributes]["a"] +  
     | 
| 
       73 
     | 
    
         
            -
                    "th"  => Sanitize::Config::RELAXED[:attributes]["th"] + [ 
     | 
| 
       74 
     | 
    
         
            -
                    "td"  => Sanitize::Config::RELAXED[:attributes]["td"] + [ 
     | 
| 
       75 
     | 
    
         
            -
                  } 
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       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
         
     | 
    
        data/lib/govspeak/version.rb
    CHANGED
    
    
    
        data/test/html_sanitizer_test.rb
    CHANGED
    
    | 
         @@ -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. 
     | 
| 
      
 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- 
     | 
| 
      
 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:  
     | 
| 
      
 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:  
     | 
| 
      
 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
         
     | 
    
        data/lib/with_deep_merge.rb
    DELETED
    
    | 
         @@ -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
         
     |