diff --git a/lib/redmine/helpers/diff.rb b/lib/redmine/helpers/diff.rb index 785ff38..7a28ad7 100644 --- a/lib/redmine/helpers/diff.rb +++ b/lib/redmine/helpers/diff.rb @@ -53,7 +53,7 @@ module Redmine else del_at = pos unless del_at deleted << ' ' unless deleted.empty? - deleted << h(change[2]) + deleted << change[2] words_del += 1 end end @@ -62,13 +62,14 @@ module Redmine words[add_to] = words[add_to] + ''.html_safe end if del_at - words.insert del_at - del_off + dels + words_add, ''.html_safe + deleted + ''.html_safe + # deleted is not safe html at this point + words.insert del_at - del_off + dels + words_add, ''.html_safe + h(deleted) + ''.html_safe dels += 1 del_off += words_del words_del = 0 end end - words.join(' ').html_safe + safe_join(words, ' ') end end end diff --git a/test/unit/lib/redmine/helpers/diff_test.rb b/test/unit/lib/redmine/helpers/diff_test.rb index a5f7afe..e2006d7 100644 --- a/test/unit/lib/redmine/helpers/diff_test.rb +++ b/test/unit/lib/redmine/helpers/diff_test.rb @@ -22,4 +22,16 @@ class DiffTest < ActiveSupport::TestCase diff = Redmine::Helpers::Diff.new("foo", "bar") assert_not_nil diff end + + def test_dont_double_escape + # 3 cases to test in the before: first word, last word, everything inbetween + before = " with html & special chars" + # all words in after are treated equal + after = "other stuff