Commit 5640070915e3b18a29e3a941dc96a603529fb40c

Authored by Rodrigo Souto
1 parent 89b2559c

avoid html double escape

This is already handled on rails 3.

Fix #62
test/unit/article_test.rb
@@ -931,14 +931,6 @@ class ArticleTest < ActiveSupport::TestCase @@ -931,14 +931,6 @@ class ArticleTest < ActiveSupport::TestCase
931 assert_no_match(/<script>/, a.name) 931 assert_no_match(/<script>/, a.name)
932 end 932 end
933 933
934 - should 'escape malformed html tags' do  
935 - article = Article.new  
936 - article.name = "<h1 Malformed >> html >< tag"  
937 - article.valid?  
938 -  
939 - assert_no_match /[<>]/, article.name  
940 - end  
941 -  
942 should 'return truncated title in short_title' do 934 should 'return truncated title in short_title' do
943 article = Article.new 935 article = Article.new
944 article.name = 'a123456789abcdefghij' 936 article.name = 'a123456789abcdefghij'
test/unit/comment_test.rb
@@ -201,17 +201,6 @@ class CommentTest &lt; ActiveSupport::TestCase @@ -201,17 +201,6 @@ class CommentTest &lt; ActiveSupport::TestCase
201 assert comment.errors[:body.to_s].present? 201 assert comment.errors[:body.to_s].present?
202 end 202 end
203 203
204 - should 'escape malformed html tags' do  
205 - owner = create_user('testuser').person  
206 - article = owner.articles.create(:name => 'test', :body => '...')  
207 - comment = build(Comment, :article => article, :title => '<h1 title </h1>>> sd f <<', :body => '<h1>> sdf><asd>< body </h1>', :name => '<h1 name </h1>>><<dfsf<sd', :email => 'cracker@test.org')  
208 - comment.valid?  
209 -  
210 - assert_no_match /[<>]/, comment.title  
211 - assert_no_match /[<>]/, comment.body  
212 - assert_no_match /[<>]/, comment.name  
213 - end  
214 -  
215 should 'use an existing image for deleted comments' do 204 should 'use an existing image for deleted comments' do
216 image = Comment.new.removed_user_image[1..-1] 205 image = Comment.new.removed_user_image[1..-1]
217 assert File.exists?(Rails.root.join('public', image)), "#{image} does not exist." 206 assert File.exists?(Rails.root.join('public', image)), "#{image} does not exist."
@@ -749,6 +738,18 @@ class CommentTest &lt; ActiveSupport::TestCase @@ -749,6 +738,18 @@ class CommentTest &lt; ActiveSupport::TestCase
749 comment.destroy 738 comment.destroy
750 end 739 end
751 740
  741 + should 'not double escape html content after validation' do
  742 + comment = create_comment
  743 + body = 'Comment with "quotes"'
  744 + comment.body = body
  745 +
  746 + comment.valid?
  747 + assert_equal body, comment.body
  748 +
  749 + comment.valid?
  750 + assert_equal body, comment.body
  751 + end
  752 +
752 private 753 private
753 754
754 def create_comment(args = {}) 755 def create_comment(args = {})
test/unit/community_test.rb
@@ -242,20 +242,6 @@ class CommunityTest &lt; ActiveSupport::TestCase @@ -242,20 +242,6 @@ class CommunityTest &lt; ActiveSupport::TestCase
242 end 242 end
243 end 243 end
244 244
245 - should 'escape malformed html tags' do  
246 - community = Community.new  
247 - community.name = "<h1 Malformed >> html >< tag"  
248 - community.address = "<h1 Malformed >,<<<asfdf> html >< tag"  
249 - community.contact_phone = "<h1 Malformed<<> >> html >><>< tag"  
250 - community.description = "<h1 Malformed /h1>>><<> html ><>h1< tag"  
251 - community.valid?  
252 -  
253 - assert_no_match /[<>]/, community.name  
254 - assert_no_match /[<>]/, community.address  
255 - assert_no_match /[<>]/, community.contact_phone  
256 - assert_no_match /[<>]/, community.description  
257 - end  
258 -  
259 should "the followed_by method be protected and true to the community members by default" do 245 should "the followed_by method be protected and true to the community members by default" do
260 c = fast_create(Community) 246 c = fast_create(Community)
261 p1 = fast_create(Person) 247 p1 = fast_create(Person)
test/unit/environment_test.rb
@@ -1140,14 +1140,6 @@ class EnvironmentTest &lt; ActiveSupport::TestCase @@ -1140,14 +1140,6 @@ class EnvironmentTest &lt; ActiveSupport::TestCase
1140 assert_equal "<h1> Disabled Enterprise </h1>", environment.message_for_disabled_enterprise 1140 assert_equal "<h1> Disabled Enterprise </h1>", environment.message_for_disabled_enterprise
1141 end 1141 end
1142 1142
1143 - should 'escape malformed html tags' do  
1144 - environment = Environment.new  
1145 - environment.message_for_disabled_enterprise = "<h1> Disabled Enterprise /h1>"  
1146 - environment.valid?  
1147 -  
1148 - assert_no_match /[<>]/, environment.message_for_disabled_enterprise  
1149 - end  
1150 -  
1151 should 'not sanitize html comments' do 1143 should 'not sanitize html comments' do
1152 environment = Environment.new 1144 environment = Environment.new
1153 environment.message_for_disabled_enterprise = '<p><!-- <asdf> << aasdfa >>> --> <h1> Wellformed html code </h1>' 1145 environment.message_for_disabled_enterprise = '<p><!-- <asdf> << aasdfa >>> --> <h1> Wellformed html code </h1>'
test/unit/event_test.rb
@@ -263,24 +263,6 @@ class EventTest &lt; ActiveSupport::TestCase @@ -263,24 +263,6 @@ class EventTest &lt; ActiveSupport::TestCase
263 assert_not_includes profile.events.by_day(today), event_out_of_range 263 assert_not_includes profile.events.by_day(today), event_out_of_range
264 end 264 end
265 265
266 - should 'filter fields with full filter' do  
267 - event = Event.new  
268 - event.link = "<h1 Malformed >> html >< tag"  
269 - event.valid?  
270 -  
271 - assert_no_match /[<>]/, event.link  
272 - end  
273 -  
274 - should 'filter fields with white_list filter' do  
275 - event = Event.new  
276 - event.body = "<h1> Description </h1>"  
277 - event.address = "<strong> Address <strong>"  
278 - event.valid?  
279 -  
280 - assert_equal "<h1> Description </h1>", event.body  
281 - assert_equal "<strong> Address <strong>", event.address  
282 - end  
283 -  
284 should 'not filter & on link field' do 266 should 'not filter & on link field' do
285 event = Event.new 267 event = Event.new
286 event.link = 'myevent.com/?param1=value&param2=value2' 268 event.link = 'myevent.com/?param1=value&param2=value2'
@@ -289,16 +271,6 @@ class EventTest &lt; ActiveSupport::TestCase @@ -289,16 +271,6 @@ class EventTest &lt; ActiveSupport::TestCase
289 assert_equal "http://myevent.com/?param1=value&param2=value2", event.link 271 assert_equal "http://myevent.com/?param1=value&param2=value2", event.link
290 end 272 end
291 273
292 - should 'escape malformed html tags' do  
293 - event = Event.new  
294 - event.body = "<h1<< Description >>/h1>"  
295 - event.address = "<strong>><< Address <strong>"  
296 - event.valid?  
297 -  
298 - assert_no_match /[<>]/, event.body  
299 - assert_no_match /[<>]/, event.address  
300 - end  
301 -  
302 should 'not sanitize html comments' do 274 should 'not sanitize html comments' do
303 event = Event.new 275 event = Event.new
304 event.body = '<p><!-- <asdf> << aasdfa >>> --> <h1> Wellformed html code </h1>' 276 event.body = '<p><!-- <asdf> << aasdfa >>> --> <h1> Wellformed html code </h1>'
test/unit/folder_test.rb
@@ -133,14 +133,6 @@ class FolderTest &lt; ActiveSupport::TestCase @@ -133,14 +133,6 @@ class FolderTest &lt; ActiveSupport::TestCase
133 assert_match /<!-- .* --> <h1> Wellformed html code <\/h1>/, folder.body 133 assert_match /<!-- .* --> <h1> Wellformed html code <\/h1>/, folder.body
134 end 134 end
135 135
136 - should 'escape malformed html tags' do  
137 - folder = Folder.new  
138 - folder.body = "<h1<< Description >>/h1>"  
139 - folder.valid?  
140 -  
141 - assert_no_match /[<>]/, folder.body  
142 - end  
143 -  
144 should 'not have a blog as parent' do 136 should 'not have a blog as parent' do
145 folder = Folder.new 137 folder = Folder.new
146 folder.parent = Blog.new 138 folder.parent = Blog.new
test/unit/gallery_test.rb
@@ -134,14 +134,6 @@ class GalleryTest &lt; ActiveSupport::TestCase @@ -134,14 +134,6 @@ class GalleryTest &lt; ActiveSupport::TestCase
134 assert_match /<!-- .* --> <h1> Wellformed html code <\/h1>/, gallery.body 134 assert_match /<!-- .* --> <h1> Wellformed html code <\/h1>/, gallery.body
135 end 135 end
136 136
137 - should 'escape malformed html tags' do  
138 - gallery = Gallery.new  
139 - gallery.body = "<h1<< Description >>/h1>"  
140 - gallery.valid?  
141 -  
142 - assert_no_match /[<>]/, gallery.body  
143 - end  
144 -  
145 should 'accept uploads' do 137 should 'accept uploads' do
146 folder = fast_create(Gallery) 138 folder = fast_create(Gallery)
147 assert folder.accept_uploads? 139 assert folder.accept_uploads?
test/unit/organization_test.rb
@@ -253,25 +253,6 @@ class OrganizationTest &lt; ActiveSupport::TestCase @@ -253,25 +253,6 @@ class OrganizationTest &lt; ActiveSupport::TestCase
253 assert organization.closed 253 assert organization.closed
254 end 254 end
255 255
256 - should 'escape malformed html tags' do  
257 - organization = Organization.new  
258 - organization.acronym = "<h1 Malformed >> html >< tag"  
259 - organization.contact_person = "<h1 Malformed >,<<<asfdf> html >< tag"  
260 - organization.contact_email = "<h1<malformed@html.com>>"  
261 - organization.description = "<h1 Malformed /h1>>><<> html ><>h1< tag"  
262 - organization.legal_form = "<h1 Malformed /h1>>><<> html ><>h1< tag"  
263 - organization.economic_activity = "<h1 Malformed /h1>>><<> html ><>h1< tag"  
264 - organization.management_information = "<h1 Malformed /h1>>><<> html ><>h1< tag"  
265 - organization.valid?  
266 -  
267 - assert_no_match /[<>]/, organization.acronym  
268 - assert_no_match /[<>]/, organization.contact_person  
269 - assert_no_match /[<>]/, organization.contact_email  
270 - assert_no_match /[<>]/, organization.legal_form  
271 - assert_no_match /[<>]/, organization.economic_activity  
272 - assert_no_match /[<>]/, organization.management_information  
273 - end  
274 -  
275 should "the followed_by? be true only to members" do 256 should "the followed_by? be true only to members" do
276 o = fast_create(Organization) 257 o = fast_create(Organization)
277 p1 = fast_create(Person) 258 p1 = fast_create(Person)
test/unit/product_test.rb
@@ -171,16 +171,6 @@ class ProductTest &lt; ActiveSupport::TestCase @@ -171,16 +171,6 @@ class ProductTest &lt; ActiveSupport::TestCase
171 assert_equal @product_category.name, product.name 171 assert_equal @product_category.name, product.name
172 end 172 end
173 173
174 - should 'escape malformed html tags' do  
175 - product = build(Product, :product_category => @product_category)  
176 - product.name = "<h1 Malformed >> html >< tag"  
177 - product.description = "<h1 Malformed</h1>><<<a>> >> html >< tag"  
178 - product.valid?  
179 -  
180 - assert_no_match /[<>]/, product.name  
181 - assert_no_match /[<>]/, product.description  
182 - end  
183 -  
184 should 'use name of category when has no name yet' do 174 should 'use name of category when has no name yet' do
185 product = Product.new 175 product = Product.new
186 product.product_category = @product_category 176 product.product_category = @product_category
test/unit/profile_test.rb
@@ -1696,34 +1696,6 @@ class ProfileTest &lt; ActiveSupport::TestCase @@ -1696,34 +1696,6 @@ class ProfileTest &lt; ActiveSupport::TestCase
1696 assert_equal "<strong> Custom Footer <strong>", profile.custom_footer 1696 assert_equal "<strong> Custom Footer <strong>", profile.custom_footer
1697 end 1697 end
1698 1698
1699 - should 'escape malformed html tags' do  
1700 - profile = Profile.new  
1701 - profile.name = "<h1 Malformed >> html >>></a>< tag"  
1702 - profile.nickname = "<h1 Malformed <<h1>>< html >< tag"  
1703 - profile.address = "<h1><</h2< Malformed >> html >< tag"  
1704 - profile.contact_phone = "<h1<< Malformed ><>>> html >< tag"  
1705 - profile.description = "<h1<a> Malformed >> html ></a>< tag"  
1706 - profile.valid?  
1707 -  
1708 - assert_no_match /[<>]/, profile.name  
1709 - assert_no_match /[<>]/, profile.nickname  
1710 - assert_no_match /[<>]/, profile.address  
1711 - assert_no_match /[<>]/, profile.contact_phone  
1712 - assert_no_match /[<>]/, profile.description  
1713 - assert_no_match /[<>]/, profile.custom_header  
1714 - assert_no_match /[<>]/, profile.custom_footer  
1715 - end  
1716 -  
1717 - should 'escape malformed html tags in header and footer' do  
1718 - profile = fast_create(Profile)  
1719 - profile.custom_header = "<h1<a>><<> Malformed >> html ></a>< tag"  
1720 - profile.custom_footer = "<h1> Malformed <><< html ></a>< tag"  
1721 - profile.save  
1722 -  
1723 - assert_no_match /[<>]/, profile.custom_header  
1724 - assert_no_match /[<>]/, profile.custom_footer  
1725 - end  
1726 -  
1727 should 'not sanitize html comments' do 1699 should 'not sanitize html comments' do
1728 profile = Profile.new 1700 profile = Profile.new
1729 profile.custom_header = '<p><!-- <asdf> << aasdfa >>> --> <h1> Wellformed html code </h1>' 1701 profile.custom_header = '<p><!-- <asdf> << aasdfa >>> --> <h1> Wellformed html code </h1>'
test/unit/text_article_test.rb
@@ -14,15 +14,6 @@ class TextArticleTest &lt; ActiveSupport::TestCase @@ -14,15 +14,6 @@ class TextArticleTest &lt; ActiveSupport::TestCase
14 assert_includes TextArticle.find(:all), article 14 assert_includes TextArticle.find(:all), article
15 end 15 end
16 16
17 - should 'remove HTML from name' do  
18 - person = create_user('testuser').person  
19 - article = TextArticle.new(:profile => person)  
20 - article.name = "<h1 Malformed >> html >>></a>< tag"  
21 - article.valid?  
22 -  
23 - assert_no_match /[<>]/, article.name  
24 - end  
25 -  
26 should 'be translatable' do 17 should 'be translatable' do
27 assert_kind_of Noosfero::TranslatableContent, TextArticle.new 18 assert_kind_of Noosfero::TranslatableContent, TextArticle.new
28 end 19 end
test/unit/validation_info_test.rb
@@ -21,14 +21,4 @@ class ValidationInfoTest &lt; ActiveSupport::TestCase @@ -21,14 +21,4 @@ class ValidationInfoTest &lt; ActiveSupport::TestCase
21 end 21 end
22 end 22 end
23 23
24 - should 'escape malformed html tags' do  
25 - info = ValidationInfo.new  
26 - info.validation_methodology = "<h1 Malformed >> html >< tag"  
27 - info.restrictions = "<h1 Malformed >> html >< tag"  
28 - info.valid?  
29 -  
30 - assert_no_match /[<>]/, info.validation_methodology  
31 - assert_no_match /[<>]/, info.restrictions  
32 - end  
33 -  
34 end 24 end
vendor/plugins/xss_terminate/lib/xss_terminate.rb
@@ -38,7 +38,7 @@ module XssTerminate @@ -38,7 +38,7 @@ module XssTerminate
38 38
39 module InstanceMethods 39 module InstanceMethods
40 40
41 - def sanitize_field(sanitizer, field, serialized = false, with= :full) 41 + def sanitize_field(sanitizer, field, serialized = false)
42 field = field.to_sym 42 field = field.to_sym
43 if serialized 43 if serialized
44 puts field 44 puts field
@@ -49,25 +49,11 @@ module XssTerminate @@ -49,25 +49,11 @@ module XssTerminate
49 else 49 else
50 if self[field] 50 if self[field]
51 self[field] = sanitizer.sanitize(self[field]) 51 self[field] = sanitizer.sanitize(self[field])
52 -  
53 - if with == :full  
54 - self[field] = CGI.escapeHTML(self[field])  
55 - elsif with == :white_list  
56 - self[field] = CGI.escapeHTML(self[field]) if !wellformed_html_code?(self[field])  
57 - end  
58 -  
59 else 52 else
60 value = self.send("#{field}") 53 value = self.send("#{field}")
61 return unless value 54 return unless value
62 value = sanitizer.sanitize(value) 55 value = sanitizer.sanitize(value)
63 self.send("#{field}=", value) 56 self.send("#{field}=", value)
64 -  
65 - if with == :full  
66 - self.send("#{field}=", CGI.escapeHTML(value))  
67 - elsif with == :white_list  
68 - self.send("#{field}=", CGI.escapeHTML(value)) if !wellformed_html_code?(value)  
69 - end  
70 -  
71 end 57 end
72 end 58 end
73 end 59 end
@@ -86,7 +72,7 @@ module XssTerminate @@ -86,7 +72,7 @@ module XssTerminate
86 sanitizer = ActionView::Base.full_sanitizer 72 sanitizer = ActionView::Base.full_sanitizer
87 columns, columns_serialized = sanitize_columns(:full) 73 columns, columns_serialized = sanitize_columns(:full)
88 columns.each do |column| 74 columns.each do |column|
89 - sanitize_field(sanitizer, column.to_sym, columns_serialized.include?(column), :full) 75 + sanitize_field(sanitizer, column.to_sym, columns_serialized.include?(column))
90 end 76 end
91 end 77 end
92 78
@@ -94,7 +80,7 @@ module XssTerminate @@ -94,7 +80,7 @@ module XssTerminate
94 sanitizer = ActionView::Base.white_list_sanitizer 80 sanitizer = ActionView::Base.white_list_sanitizer
95 columns, columns_serialized = sanitize_columns(:white_list) 81 columns, columns_serialized = sanitize_columns(:white_list)
96 columns.each do |column| 82 columns.each do |column|
97 - sanitize_field(sanitizer, column.to_sym, columns_serialized.include?(column), :white_list) 83 + sanitize_field(sanitizer, column.to_sym, columns_serialized.include?(column))
98 end 84 end
99 end 85 end
100 86
@@ -102,38 +88,8 @@ module XssTerminate @@ -102,38 +88,8 @@ module XssTerminate
102 sanitizer = HTML5libSanitize.new 88 sanitizer = HTML5libSanitize.new
103 columns = sanitize_columns(:html5lib) 89 columns = sanitize_columns(:html5lib)
104 columns.each do |column| 90 columns.each do |column|
105 - sanitize_field(sanitizer, column.to_sym, columns_serialized.include?(column), :html5lib)  
106 - end  
107 - end  
108 -  
109 - def wellformed_html_code?(field)  
110 - return true if !field  
111 - counter = 0  
112 - in_comment = false  
113 - field=field.split(//)  
114 - for i in 0..field.length-1  
115 - if !in_comment  
116 - if field[i] == '<'  
117 - if field[i+1..i+3] == ["!","-","-"]  
118 - in_comment = true  
119 - else  
120 - counter += 1  
121 - end  
122 - elsif field[i] == '>'  
123 - counter -= 1  
124 - end  
125 - else  
126 - if field[i-2..i] == ["-","-",">"]  
127 - in_comment = false  
128 - end  
129 - end  
130 -  
131 - if counter < 0 || 1 < counter  
132 - return false  
133 - end 91 + sanitize_field(sanitizer, column.to_sym, columns_serialized.include?(column))
134 end 92 end
135 -  
136 - return counter == 0  
137 end 93 end
138 94
139 end 95 end