govspeak 6.8.0 → 6.8.3

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: 4de0ad0d505ecb467987eb27087a076411a0bd6de2fe535eb058b0550d17d09d
4
- data.tar.gz: 5b1cba9b7ecc6bc47d1f1646e0dfbb3ff3c2a5cee04a41079c8bb419b0b21610
3
+ metadata.gz: ca0f29b1dceee03154a3f7f535e27c5bf7ebf5ae5e42845919c7bfea3eb2e132
4
+ data.tar.gz: 428ff21aa80eaccd670ee643aed80d3081148417161f1a1bf10b78742e01c6b4
5
5
  SHA512:
6
- metadata.gz: def9659344fe5ed585999686924483c0c8dbc6a130820b86fa427d3eee31b635f2ac64efd0e15a2e42d5102e0b709f15f13c5d70f9d76c90757241bb6734bd23
7
- data.tar.gz: 6ff2c9ae06337d1b8030cf823c8dab8983a99c0fab7abe7673e7c917347ff91be94834c6b00601397ecef2ada1837e58c69cf21419a872571e218bc55e64d695
6
+ metadata.gz: cef697b4026db708378ede49588032d2b95e603a4f4ce87053b8c47ce119ff94b6ad5363e4ec7079d914941c48db0fb6d93ed3b75fff1225459957ed3d24736a
7
+ data.tar.gz: e78af326c264e4d4d92dedebb23a8db4a08927e55101f435a4ebe4714142e5432262bf1b1ce45553e83f6bb969af859ee4bcba7388a62fc63c987cc83f86ad99
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## 6.8.3
2
+
3
+ * Require Kramdown minimum version of 2.3.1 to avoid CVE-2021-28834 [#246](https://github.com/alphagov/govspeak/pull/246)
4
+
5
+ ## 6.8.2
6
+
7
+ * Fix footnote numbering [#239](https://github.com/alphagov/govspeak/pull/239)
8
+
9
+ ## 6.8.1
10
+
11
+ * Fix a bug which resulted in validation errors on 'Start Button' elements [#237](https://github.com/alphagov/govspeak/pull/237)
12
+
1
13
  ## 6.8.0
2
14
 
3
15
  * Drop support for Ruby 2.6 which reaches End of Life (EOL) on 31/03/2022
@@ -46,7 +46,17 @@ class Govspeak::HtmlSanitizer
46
46
  transformers << ImageSourceWhitelister.new(@allowed_image_hosts)
47
47
  end
48
48
 
49
- Sanitize.clean(@dirty_html, Sanitize::Config.merge(sanitize_config(allowed_elements: allowed_elements), transformers: transformers))
49
+ # It would be cleaner to move this `transformers` key into the `sanitize_config` method rather
50
+ # than having to use Sanitize::Config.merge() twice in succession. However, `sanitize_config`
51
+ # is a public method and it looks like other projects depend on it behaving the way it
52
+ # currently does – i.e. to return Sanitize config without any transformers.
53
+ # e.g. https://github.com/alphagov/hmrc-manuals-api/blob/4a83f78d0bb839520155623fd9b63b3b12a3b13a/app/validators/no_dangerous_html_in_text_fields_validator.rb#L44
54
+ config_with_transformers = Sanitize::Config.merge(
55
+ sanitize_config(allowed_elements: allowed_elements),
56
+ transformers: transformers,
57
+ )
58
+
59
+ Sanitize.clean(@dirty_html, config_with_transformers)
50
60
  end
51
61
 
52
62
  def sanitize_config(allowed_elements: [])
@@ -1,9 +1,9 @@
1
1
  class Govspeak::HtmlValidator
2
2
  attr_reader :govspeak_string
3
3
 
4
- def initialize(govspeak_string, sanitization_options = {})
4
+ def initialize(govspeak_string, options = {})
5
5
  @govspeak_string = govspeak_string.dup.force_encoding(Encoding::UTF_8)
6
- @sanitization_options = sanitization_options
6
+ @allowed_image_hosts = options[:allowed_image_hosts]
7
7
  end
8
8
 
9
9
  def invalid?
@@ -11,17 +11,23 @@ class Govspeak::HtmlValidator
11
11
  end
12
12
 
13
13
  def valid?
14
- dirty_html = govspeak_to_html
15
- clean_html = Govspeak::HtmlSanitizer.new(dirty_html, @sanitization_options).sanitize
14
+ dirty_html = govspeak_to_html(sanitize: false)
15
+ clean_html = govspeak_to_html(sanitize: true)
16
16
  normalise_html(dirty_html) == normalise_html(clean_html)
17
17
  end
18
18
 
19
+ private
20
+
19
21
  # Make whitespace in html tags consistent
20
22
  def normalise_html(html)
21
23
  Nokogiri::HTML5.fragment(html).to_s
22
24
  end
23
25
 
24
- def govspeak_to_html
25
- Govspeak::Document.new(govspeak_string, sanitize: false).to_html
26
+ def govspeak_to_html(sanitize:)
27
+ Govspeak::Document.new(
28
+ govspeak_string,
29
+ sanitize: sanitize,
30
+ allowed_image_hosts: @allowed_image_hosts,
31
+ ).to_html
26
32
  end
27
33
  end
@@ -1,3 +1,3 @@
1
1
  module Govspeak
2
- VERSION = "6.8.0".freeze
2
+ VERSION = "6.8.3".freeze
3
3
  end
data/lib/govspeak.rb CHANGED
@@ -54,6 +54,7 @@ module Govspeak
54
54
 
55
55
  @images = options.delete(:images) || []
56
56
  @allowed_elements = options.delete(:allowed_elements) || []
57
+ @allowed_image_hosts = options.delete(:allowed_image_hosts) || []
57
58
  @attachments = Array.wrap(options.delete(:attachments))
58
59
  @links = Array.wrap(options.delete(:links))
59
60
  @contacts = Array.wrap(options.delete(:contacts))
@@ -69,7 +70,8 @@ module Govspeak
69
70
  def to_html
70
71
  @to_html ||= begin
71
72
  html = if @options[:sanitize]
72
- HtmlSanitizer.new(kramdown_doc.to_html).sanitize(allowed_elements: @allowed_elements)
73
+ HtmlSanitizer.new(kramdown_doc.to_html, allowed_image_hosts: @allowed_image_hosts)
74
+ .sanitize(allowed_elements: @allowed_elements)
73
75
  else
74
76
  kramdown_doc.to_html
75
77
  end
@@ -136,7 +138,7 @@ module Govspeak
136
138
  def footnote_definitions(source)
137
139
  is_legislative_list = source.scan(/\$LegislativeList.*?\[\^\d\]*.*?\$EndLegislativeList/m).size.positive?
138
140
  is_cta = source.scan(/\$CTA.*?\[\^\d\]*.*?\$CTA/m).size.positive?
139
- footnotes = source.scan(/\[\^(\d+)\]:(.*)/)
141
+ footnotes = source.scan(/^\s*\[\^(\d+)\]:(.*)/)
140
142
  @acronyms = source.scan(/(?<=\*)\[(.*)\]:(.*)/)
141
143
  if (is_legislative_list || is_cta) && footnotes.size.positive?
142
144
  list_items = footnotes.map do |footnote|
@@ -1048,6 +1048,48 @@ Teston
1048
1048
  )
1049
1049
  end
1050
1050
 
1051
+ test_given_govspeak "
1052
+ $LegislativeList
1053
+ 1. some text[^1]:
1054
+ $EndLegislativeList
1055
+ [^1]: footnote text
1056
+ " do
1057
+ assert_html_output %(
1058
+ <p>1. some text<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">[footnote 1]</a></sup>:</p>
1059
+
1060
+ <div class="footnotes" role="doc-endnotes">
1061
+ <ol>
1062
+ <li id="fn:1" role="doc-endnote">
1063
+ <p>
1064
+ footnote text<a href="#fnref:1" class="reversefootnote" role="doc-backlink" aria-label="go to where this is referenced">↩</a>
1065
+ </p>
1066
+ </li>
1067
+ </ol>
1068
+ </div>
1069
+ )
1070
+ end
1071
+
1072
+ test_given_govspeak "
1073
+ $LegislativeList
1074
+ 1. some text[^1]: extra
1075
+ $EndLegislativeList
1076
+ [^1]: footnote text
1077
+ " do
1078
+ assert_html_output %(
1079
+ <p>1. some text<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">[footnote 1]</a></sup>: extra</p>
1080
+
1081
+ <div class="footnotes" role="doc-endnotes">
1082
+ <ol>
1083
+ <li id="fn:1" role="doc-endnote">
1084
+ <p>
1085
+ footnote text<a href="#fnref:1" class="reversefootnote" role="doc-backlink" aria-label="go to where this is referenced">↩</a>
1086
+ </p>
1087
+ </li>
1088
+ </ol>
1089
+ </div>
1090
+ )
1091
+ end
1092
+
1051
1093
  # FIXME: this code is buggy and replaces abbreviations in HTML tags - removing the functionality for now
1052
1094
  # test_given_govspeak "
1053
1095
  # $LegislativeList
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: 6.8.0
4
+ version: 6.8.3
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: 2022-02-17 00:00:00.000000000 Z
11
+ date: 2022-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview
@@ -92,14 +92,14 @@ dependencies:
92
92
  requirements:
93
93
  - - ">="
94
94
  - !ruby/object:Gem::Version
95
- version: 2.3.0
95
+ version: 2.3.1
96
96
  type: :runtime
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - ">="
101
101
  - !ruby/object:Gem::Version
102
- version: 2.3.0
102
+ version: 2.3.1
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: nokogiri
105
105
  requirement: !ruby/object:Gem::Requirement
@@ -190,14 +190,14 @@ dependencies:
190
190
  requirements:
191
191
  - - '='
192
192
  - !ruby/object:Gem::Version
193
- version: 4.3.0
193
+ version: 4.5.0
194
194
  type: :development
195
195
  prerelease: false
196
196
  version_requirements: !ruby/object:Gem::Requirement
197
197
  requirements:
198
198
  - - '='
199
199
  - !ruby/object:Gem::Version
200
- version: 4.3.0
200
+ version: 4.5.0
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: simplecov
203
203
  requirement: !ruby/object:Gem::Requirement
@@ -327,29 +327,29 @@ required_rubygems_version: !ruby/object:Gem::Requirement
327
327
  - !ruby/object:Gem::Version
328
328
  version: '0'
329
329
  requirements: []
330
- rubygems_version: 3.3.7
330
+ rubygems_version: 3.3.16
331
331
  signing_key:
332
332
  specification_version: 4
333
333
  summary: Markup language for single domain
334
334
  test_files:
335
- - test/govspeak_test_helper.rb
335
+ - test/govspeak_attachment_link_test.rb
336
+ - test/test_helper.rb
337
+ - test/govspeak_button_test.rb
338
+ - test/govspeak_footnote_test.rb
339
+ - test/govspeak_images_test.rb
340
+ - test/govspeak_images_bang_test.rb
336
341
  - test/blockquote_extra_quote_remover_test.rb
342
+ - test/html_sanitizer_test.rb
343
+ - test/govspeak_table_with_headers_test.rb
344
+ - test/govspeak_extract_contact_content_ids_test.rb
345
+ - test/html_validator_test.rb
346
+ - test/govspeak_contacts_test.rb
347
+ - test/govspeak_test.rb
348
+ - test/govspeak_attachments_image_test.rb
349
+ - test/govspeak_attachment_test.rb
337
350
  - test/govspeak_link_extractor_test.rb
338
- - test/govspeak_images_test.rb
339
351
  - test/govspeak_link_test.rb
340
- - test/govspeak_extract_contact_content_ids_test.rb
341
- - test/govspeak_footnote_test.rb
342
352
  - test/presenters/h_card_presenter_test.rb
343
353
  - test/govspeak_attachments_inline_test.rb
354
+ - test/govspeak_test_helper.rb
344
355
  - test/govspeak_structured_headers_test.rb
345
- - test/test_helper.rb
346
- - test/govspeak_button_test.rb
347
- - test/govspeak_attachment_test.rb
348
- - test/html_sanitizer_test.rb
349
- - test/govspeak_contacts_test.rb
350
- - test/govspeak_attachments_image_test.rb
351
- - test/govspeak_images_bang_test.rb
352
- - test/govspeak_test.rb
353
- - test/govspeak_table_with_headers_test.rb
354
- - test/html_validator_test.rb
355
- - test/govspeak_attachment_link_test.rb