From 5b7b9f40ae2e0b656f0a5fdbd8106370a233ebc9 Mon Sep 17 00:00:00 2001 From: benjamin wil Date: Sat, 13 Feb 2021 16:04:42 -0800 Subject: [PATCH] Only escape HTML from breadcrumbs. Resolves #1658 (#1663) --- lib/gollum/views/overview.rb | 4 +- lib/gollum/views/page.rb | 13 +++--- test/test_overview_view.rb | 31 ++++++++++-- test/test_page_view.rb | 91 +++++++++++++++++++++++++++--------- 4 files changed, 103 insertions(+), 36 deletions(-) diff --git a/lib/gollum/views/overview.rb b/lib/gollum/views/overview.rb index 87c8ced4..0c651296 100644 --- a/lib/gollum/views/overview.rb +++ b/lib/gollum/views/overview.rb @@ -26,9 +26,9 @@ module Precious title = crumb.basename if title == path.basename - breadcrumb << %{} + breadcrumb << %{} else - breadcrumb << %{} + breadcrumb << %{} end end breadcrumb << %{} diff --git a/lib/gollum/views/page.rb b/lib/gollum/views/page.rb index 98c21f6b..65dc3bb7 100644 --- a/lib/gollum/views/page.rb +++ b/lib/gollum/views/page.rb @@ -16,15 +16,10 @@ module Precious DEFAULT_AUTHOR = 'you' @@to_xml = { :save_with => Nokogiri::XML::Node::SaveOptions::DEFAULT_XHTML ^ 1, :indent => 0, :encoding => 'UTF-8' } - def title - h1 = @h1_title ? page_header_from_content(@content) : false - h1 || @page.url_path_title # url_path_title is the metadata title if present, otherwise the filename-based title - end - def page_header title end - + def breadcrumb path = Pathname.new(@page.url_path).parent return '' if path.to_s == '.' @@ -32,7 +27,7 @@ module Precious path.descend do |crumb| element = "#{crumb.basename}" next if element == @page.title - breadcrumb << %{} + breadcrumb << %{} end breadcrumb << %{} breadcrumb.join("\n") @@ -269,6 +264,10 @@ module Precious result << "\n\n" end + def title + h1 = @h1_title ? page_header_from_content(@content) : false + h1 || @page.url_path_title # url_path_title is the metadata title if present, otherwise the filename-based title + end end end end diff --git a/test/test_overview_view.rb b/test/test_overview_view.rb index a0956fef..4189ed4c 100644 --- a/test/test_overview_view.rb +++ b/test/test_overview_view.rb @@ -43,12 +43,22 @@ context "Precious::Views::Overview" do @page.instance_variable_set("@base_url", "") assert_equal "", @page.breadcrumb end - - test 'guard against malicious filenames' do - malicious_title = '' - @page.instance_variable_set("@path", malicious_title) + + test "breadcrumbs guard against malicious filenames" do + malicious_path = '' + "\n # 3", commit_details) - page = @wiki.page(title) - - @view = Precious::Views::Page.new - @view.instance_variable_set :@page, page - @view.instance_variable_set :@content, page.formatted_data - @view.instance_variable_set :@h1_title, false - - # Title is based on file name when h1_title is false. - actual = @view.title - assert_equal title, actual - end - test "breadcrumbs" do @wiki.write_page('subdir/BC Test 1', :markdown, 'Test', commit_details) page = @wiki.page('subdir/BC Test 1')