diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-16 21:08:22 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-16 21:08:22 +0300 |
commit | 123c68a7cf788ace140e57e478a12c5b7ac893ae (patch) | |
tree | b36e565ecd895ee46c1713f3734308cfce0e6ba9 /spec/lib/banzai | |
parent | 862d225ca0d8eb452e56b8fe5a0109aac796e872 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/lib/banzai')
4 files changed, 79 insertions, 177 deletions
diff --git a/spec/lib/banzai/filter/broadcast_message_sanitization_filter_spec.rb b/spec/lib/banzai/filter/broadcast_message_sanitization_filter_spec.rb new file mode 100644 index 00000000000..317ac7ef854 --- /dev/null +++ b/spec/lib/banzai/filter/broadcast_message_sanitization_filter_spec.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Banzai::Filter::BroadcastMessageSanitizationFilter do + include FilterSpecHelper + + it_behaves_like 'default whitelist' + + describe 'custom whitelist' do + it_behaves_like 'XSS prevention' + it_behaves_like 'sanitize link' + + subject { filter(exp).to_html } + + context 'allows `a` elements' do + let(:exp) { %q{<a href="/">Link</a>} } + + it { is_expected.to eq(exp) } + end + + context 'allows `br` elements' do + let(:exp) { %q{Hello<br>World} } + + it { is_expected.to eq(exp) } + end + + context 'when `a` elements have `style` attribute' do + let(:whitelisted_style) { 'color: red; border: blue; background: green; padding: 10px; margin: 10px; text-decoration: underline;' } + + context 'allows specific properties' do + let(:exp) { %{<a href="#" style="#{whitelisted_style}">Stylish Link</a>} } + + it { is_expected.to eq(exp) } + end + + it 'disallows other properties in `style` attribute on `a` elements' do + style = [whitelisted_style, 'position: fixed'].join(';') + doc = filter(%{<a href="#" style="#{style}">Stylish Link</a>}) + + expect(doc.at_css('a')['style']).to eq(whitelisted_style) + end + end + + context 'allows `class` on `a` elements' do + let(:exp) { %q{<a href="#" class="btn">Button Link</a>} } + + it { is_expected.to eq(exp) } + end + end +end diff --git a/spec/lib/banzai/filter/relative_link_filter_spec.rb b/spec/lib/banzai/filter/relative_link_filter_spec.rb index a17a645d4d0..1efca647b8b 100644 --- a/spec/lib/banzai/filter/relative_link_filter_spec.rb +++ b/spec/lib/banzai/filter/relative_link_filter_spec.rb @@ -157,7 +157,7 @@ describe Banzai::Filter::RelativeLinkFilter do end it 'does not modify relative URLs in system notes' do - path = "#{project_path}/merge_requests/1/diffs" + path = "#{project_path}/-/merge_requests/1/diffs" doc = filter(link(path), system_note: true) expect(doc.at_css('a')['href']).to eq path diff --git a/spec/lib/banzai/filter/sanitization_filter_spec.rb b/spec/lib/banzai/filter/sanitization_filter_spec.rb index 8a4b819e4d6..607dc3fda47 100644 --- a/spec/lib/banzai/filter/sanitization_filter_spec.rb +++ b/spec/lib/banzai/filter/sanitization_filter_spec.rb @@ -5,48 +5,12 @@ require 'spec_helper' describe Banzai::Filter::SanitizationFilter do include FilterSpecHelper - describe 'default whitelist' do - it 'sanitizes tags that are not whitelisted' do - act = %q{<textarea>no inputs</textarea> and <blink>no blinks</blink>} - exp = 'no inputs and no blinks' - expect(filter(act).to_html).to eq exp - end - - it 'sanitizes tag attributes' do - act = %q{<a href="http://example.com/bar.html" onclick="bar">Text</a>} - exp = %q{<a href="http://example.com/bar.html">Text</a>} - expect(filter(act).to_html).to eq exp - end - - it 'sanitizes javascript in attributes' do - act = %q(<a href="javascript:alert('foo')">Text</a>) - exp = '<a>Text</a>' - expect(filter(act).to_html).to eq exp - end - - it 'sanitizes mixed-cased javascript in attributes' do - act = %q(<a href="javaScript:alert('foo')">Text</a>) - exp = '<a>Text</a>' - expect(filter(act).to_html).to eq exp - end - - it 'allows whitelisted HTML tags from the user' do - exp = act = "<dl>\n<dt>Term</dt>\n<dd>Definition</dd>\n</dl>" - expect(filter(act).to_html).to eq exp - end - - it 'sanitizes `class` attribute on any element' do - act = %q{<strong class="foo">Strong</strong>} - expect(filter(act).to_html).to eq %q{<strong>Strong</strong>} - end - - it 'sanitizes `id` attribute on any element' do - act = %q{<em id="foo">Emphasis</em>} - expect(filter(act).to_html).to eq %q{<em>Emphasis</em>} - end - end + it_behaves_like 'default whitelist' describe 'custom whitelist' do + it_behaves_like 'XSS prevention' + it_behaves_like 'sanitize link' + it 'customizes the whitelist only once' do instance = described_class.new('Foo') control_count = instance.whitelist[:transformers].size @@ -167,142 +131,6 @@ describe Banzai::Filter::SanitizationFilter do expect(filter(html).to_html).to eq(output) end - it 'removes `rel` attribute from `a` elements' do - act = %q{<a href="#" rel="nofollow">Link</a>} - exp = %q{<a href="#">Link</a>} - - expect(filter(act).to_html).to eq exp - end - - # Adapted from the Sanitize test suite: http://git.io/vczrM - protocols = { - 'protocol-based JS injection: simple, no spaces' => { - input: '<a href="javascript:alert(\'XSS\');">foo</a>', - output: '<a>foo</a>' - }, - - 'protocol-based JS injection: simple, spaces before' => { - input: '<a href="javascript :alert(\'XSS\');">foo</a>', - output: '<a>foo</a>' - }, - - 'protocol-based JS injection: simple, spaces after' => { - input: '<a href="javascript: alert(\'XSS\');">foo</a>', - output: '<a>foo</a>' - }, - - 'protocol-based JS injection: simple, spaces before and after' => { - input: '<a href="javascript : alert(\'XSS\');">foo</a>', - output: '<a>foo</a>' - }, - - 'protocol-based JS injection: preceding colon' => { - input: '<a href=":javascript:alert(\'XSS\');">foo</a>', - output: '<a>foo</a>' - }, - - 'protocol-based JS injection: UTF-8 encoding' => { - input: '<a href="javascript:">foo</a>', - output: '<a>foo</a>' - }, - - 'protocol-based JS injection: long UTF-8 encoding' => { - input: '<a href="javascript:">foo</a>', - output: '<a>foo</a>' - }, - - 'protocol-based JS injection: long UTF-8 encoding without semicolons' => { - input: '<a href=javascript:alert('XSS')>foo</a>', - output: '<a>foo</a>' - }, - - 'protocol-based JS injection: hex encoding' => { - input: '<a href="javascript:">foo</a>', - output: '<a>foo</a>' - }, - - 'protocol-based JS injection: long hex encoding' => { - input: '<a href="javascript:">foo</a>', - output: '<a>foo</a>' - }, - - 'protocol-based JS injection: hex encoding without semicolons' => { - input: '<a href=javascript:alert('XSS')>foo</a>', - output: '<a>foo</a>' - }, - - 'protocol-based JS injection: null char' => { - input: "<a href=java\0script:alert(\"XSS\")>foo</a>", - output: '<a href="java"></a>' - }, - - 'protocol-based JS injection: invalid URL char' => { - input: '<img src=java\script:alert("XSS")>', - output: '<img>' - }, - - 'protocol-based JS injection: Unicode' => { - input: %Q(<a href="\u0001java\u0003script:alert('XSS')">foo</a>), - output: '<a>foo</a>' - }, - - 'protocol-based JS injection: spaces and entities' => { - input: '<a href="  javascript:alert(\'XSS\');">foo</a>', - output: '<a href="">foo</a>' - }, - - 'protocol whitespace' => { - input: '<a href=" http://example.com/"></a>', - output: '<a href="http://example.com/"></a>' - } - } - - protocols.each do |name, data| - it "disallows #{name}" do - doc = filter(data[:input]) - - expect(doc.to_html).to eq data[:output] - end - end - - it 'disallows data links' do - input = '<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">XSS</a>' - output = filter(input) - - expect(output.to_html).to eq '<a>XSS</a>' - end - - it 'disallows vbscript links' do - input = '<a href="vbscript:alert(document.domain)">XSS</a>' - output = filter(input) - - expect(output.to_html).to eq '<a>XSS</a>' - end - - it 'disallows invalid URIs' do - expect(Addressable::URI).to receive(:parse).with('foo://example.com') - .and_raise(Addressable::URI::InvalidURIError) - - input = '<a href="foo://example.com">Foo</a>' - output = filter(input) - - expect(output.to_html).to eq '<a>Foo</a>' - end - - it 'allows non-standard anchor schemes' do - exp = %q{<a href="irc://irc.freenode.net/git">IRC</a>} - act = filter(exp) - - expect(act.to_html).to eq exp - end - - it 'allows relative links' do - exp = %q{<a href="foo/bar.md">foo/bar.md</a>} - act = filter(exp) - - expect(act.to_html).to eq exp - end - it 'allows the `data-sourcepos` attribute globally' do exp = %q{<p data-sourcepos="1:1-1:10">foo/bar.md</p>} act = filter(exp) diff --git a/spec/lib/banzai/pipeline/broadcast_message_pipeline_spec.rb b/spec/lib/banzai/pipeline/broadcast_message_pipeline_spec.rb new file mode 100644 index 00000000000..9832b132b58 --- /dev/null +++ b/spec/lib/banzai/pipeline/broadcast_message_pipeline_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Banzai::Pipeline::BroadcastMessagePipeline do + before do + stub_commonmark_sourcepos_disabled + end + + subject { described_class.to_html(exp, project: spy) } + + context "allows `a` elements" do + let(:exp) { "<a>Link</a>" } + + it { is_expected.to eq("<p>#{exp}</p>") } + end + + context "allows `br` elements" do + let(:exp) { "Hello<br>World" } + + it { is_expected.to eq("<p>#{exp}</p>") } + end +end |