|
| 1 | +From cd1eb08076c8b8e310d4d553d427763f2577a1b6 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Hiroshi SHIBATA <hsbt@ruby-lang.org> |
| 3 | +Date: Fri, 21 Feb 2025 15:53:31 +0900 |
| 4 | +Subject: [PATCH] Escape/unescape unclosed tags as well |
| 5 | +Upstream Reference : https://github.com/ruby/cgi/commit/cd1eb08076c8b8e310d4d553d427763f2577a1b6 |
| 6 | + |
| 7 | +Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org> |
| 8 | +--- |
| 9 | + lib/cgi/util.rb | 4 ++-- |
| 10 | + test/cgi/test_cgi_util.rb | 18 ++++++++++++++++++ |
| 11 | + 2 files changed, 20 insertions(+), 2 deletions(-) |
| 12 | + |
| 13 | +diff --git a/lib/cgi/util.rb b/lib/cgi/util.rb |
| 14 | +index 4986e54..5f12eae 100644 |
| 15 | +--- a/lib/cgi/util.rb |
| 16 | ++++ b/lib/cgi/util.rb |
| 17 | +@@ -184,7 +184,7 @@ def unescapeHTML(string) |
| 18 | + def escapeElement(string, *elements) |
| 19 | + elements = elements[0] if elements[0].kind_of?(Array) |
| 20 | + unless elements.empty? |
| 21 | +- string.gsub(/<\/?(?:#{elements.join("|")})(?!\w)(?:.|\n)*?>/i) do |
| 22 | ++ string.gsub(/<\/?(?:#{elements.join("|")})\b[^<>]*+>?/im) do |
| 23 | + CGI.escapeHTML($&) |
| 24 | + end |
| 25 | + else |
| 26 | +@@ -204,7 +204,7 @@ def escapeElement(string, *elements) |
| 27 | + def unescapeElement(string, *elements) |
| 28 | + elements = elements[0] if elements[0].kind_of?(Array) |
| 29 | + unless elements.empty? |
| 30 | +- string.gsub(/<\/?(?:#{elements.join("|")})(?!\w)(?:.|\n)*?>/i) do |
| 31 | ++ string.gsub(/<\/?(?:#{elements.join("|")})\b(?>[^&]+|&(?![gl]t;)\w+;)*(?:>)?/im) do |
| 32 | + unescapeHTML($&) |
| 33 | + end |
| 34 | + else |
| 35 | +diff --git a/test/cgi/test_cgi_util.rb b/test/cgi/test_cgi_util.rb |
| 36 | +index b0612fc..bff77f7 100644 |
| 37 | +--- a/test/cgi/test_cgi_util.rb |
| 38 | ++++ b/test/cgi/test_cgi_util.rb |
| 39 | +@@ -269,6 +269,14 @@ def test_cgi_escapeElement |
| 40 | + assert_equal("<BR><A HREF="url"></A>", escapeElement('<BR><A HREF="url"></A>', ["A", "IMG"])) |
| 41 | + assert_equal("<BR><A HREF="url"></A>", escape_element('<BR><A HREF="url"></A>', "A", "IMG")) |
| 42 | + assert_equal("<BR><A HREF="url"></A>", escape_element('<BR><A HREF="url"></A>', ["A", "IMG"])) |
| 43 | ++ |
| 44 | ++ assert_equal("<A <A HREF="url"></A>", escapeElement('<A <A HREF="url"></A>', "A", "IMG")) |
| 45 | ++ assert_equal("<A <A HREF="url"></A>", escapeElement('<A <A HREF="url"></A>', ["A", "IMG"])) |
| 46 | ++ assert_equal("<A <A HREF="url"></A>", escape_element('<A <A HREF="url"></A>', "A", "IMG")) |
| 47 | ++ assert_equal("<A <A HREF="url"></A>", escape_element('<A <A HREF="url"></A>', ["A", "IMG"])) |
| 48 | ++ |
| 49 | ++ assert_equal("<A <A ", escapeElement('<A <A ', "A", "IMG")) |
| 50 | ++ assert_equal("<A <A ", escapeElement('<A <A ', ["A", "IMG"])) |
| 51 | + end |
| 52 | + |
| 53 | + |
| 54 | +@@ -277,6 +285,16 @@ def test_cgi_unescapeElement |
| 55 | + assert_equal('<BR><A HREF="url"></A>', unescapeElement(escapeHTML('<BR><A HREF="url"></A>'), ["A", "IMG"])) |
| 56 | + assert_equal('<BR><A HREF="url"></A>', unescape_element(escapeHTML('<BR><A HREF="url"></A>'), "A", "IMG")) |
| 57 | + assert_equal('<BR><A HREF="url"></A>', unescape_element(escapeHTML('<BR><A HREF="url"></A>'), ["A", "IMG"])) |
| 58 | ++ |
| 59 | ++ assert_equal('<A <A HREF="url"></A>', unescapeElement(escapeHTML('<A <A HREF="url"></A>'), "A", "IMG")) |
| 60 | ++ assert_equal('<A <A HREF="url"></A>', unescapeElement(escapeHTML('<A <A HREF="url"></A>'), ["A", "IMG"])) |
| 61 | ++ assert_equal('<A <A HREF="url"></A>', unescape_element(escapeHTML('<A <A HREF="url"></A>'), "A", "IMG")) |
| 62 | ++ assert_equal('<A <A HREF="url"></A>', unescape_element(escapeHTML('<A <A HREF="url"></A>'), ["A", "IMG"])) |
| 63 | ++ |
| 64 | ++ assert_equal('<A <A ', unescapeElement(escapeHTML('<A <A '), "A", "IMG")) |
| 65 | ++ assert_equal('<A <A ', unescapeElement(escapeHTML('<A <A '), ["A", "IMG"])) |
| 66 | ++ assert_equal('<A <A ', unescape_element(escapeHTML('<A <A '), "A", "IMG")) |
| 67 | ++ assert_equal('<A <A ', unescape_element(escapeHTML('<A <A '), ["A", "IMG"])) |
| 68 | + end |
| 69 | + end |
| 70 | + |
0 commit comments