haml-edge 2.3.62 → 2.3.63
Sign up to get free protection for your applications and to get access to all the features.
- data/EDGE_GEM_VERSION +1 -1
- data/VERSION +1 -1
- data/lib/haml/engine.rb +2 -1
- data/lib/haml/precompiler.rb +7 -1
- data/lib/haml/template.rb +32 -13
- data/test/haml/template_test.rb +11 -0
- metadata +1 -1
data/EDGE_GEM_VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.3.
|
1
|
+
2.3.63
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.3.
|
1
|
+
2.3.63
|
data/lib/haml/engine.rb
CHANGED
@@ -179,7 +179,8 @@ module Haml
|
|
179
179
|
@haml_buffer = buffer
|
180
180
|
end
|
181
181
|
|
182
|
-
eval(precompiled
|
182
|
+
eval(precompiled + "\n" + precompiled_method_return_value,
|
183
|
+
scope, @options[:filename], @options[:line])
|
183
184
|
|
184
185
|
# Get rid of the current buffer
|
185
186
|
scope_object.instance_eval do
|
data/lib/haml/precompiler.rb
CHANGED
@@ -99,11 +99,17 @@ __in_erb_template = true
|
|
99
99
|
END
|
100
100
|
postamble = <<END.gsub("\n", ";")
|
101
101
|
@haml_buffer = @haml_buffer.upper
|
102
|
-
|
102
|
+
#{precompiled_method_return_value}
|
103
103
|
END
|
104
104
|
preamble + locals_code(local_names) + precompiled + postamble
|
105
105
|
end
|
106
106
|
|
107
|
+
# Returns the string used as the return value of the precompiled method.
|
108
|
+
# This method exists so it can be monkeypatched to return modified values.
|
109
|
+
def precompiled_method_return_value
|
110
|
+
"_erbout"
|
111
|
+
end
|
112
|
+
|
107
113
|
def locals_code(names)
|
108
114
|
names = names.keys if Hash == names
|
109
115
|
|
data/lib/haml/template.rb
CHANGED
@@ -11,6 +11,31 @@ module Haml
|
|
11
11
|
#
|
12
12
|
# @return [Hash<Symbol, Object>]
|
13
13
|
attr_accessor :options
|
14
|
+
|
15
|
+
# Enables integration with the Rails 2.2.5+ XSS protection,
|
16
|
+
# if it's available and enabled.
|
17
|
+
#
|
18
|
+
# @return [Boolean] Whether the XSS integration was enabled.
|
19
|
+
def try_enabling_xss_integration
|
20
|
+
return false unless ActionView::Base.respond_to?(:xss_safe?) && ActionView::Base.xss_safe?
|
21
|
+
|
22
|
+
Haml::Template.options[:escape_html] = true
|
23
|
+
|
24
|
+
Haml::Util.module_eval {def rails_xss_safe?; true; end}
|
25
|
+
|
26
|
+
require 'haml/helpers/xss_mods'
|
27
|
+
Haml::Helpers.send(:include, Haml::Helpers::XssMods)
|
28
|
+
|
29
|
+
Haml::Precompiler.module_eval do
|
30
|
+
def precompiled_method_return_value_with_haml_xss
|
31
|
+
"(#{precompiled_method_return_value_without_haml_xss}).html_safe!"
|
32
|
+
end
|
33
|
+
alias_method :precompiled_method_return_value_without_haml_xss, :precompiled_method_return_value
|
34
|
+
alias_method :precompiled_method_return_value, :precompiled_method_return_value_with_haml_xss
|
35
|
+
end
|
36
|
+
|
37
|
+
true
|
38
|
+
end
|
14
39
|
end
|
15
40
|
end
|
16
41
|
|
@@ -27,19 +52,13 @@ else
|
|
27
52
|
require 'haml/template/patch'
|
28
53
|
end
|
29
54
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
require 'haml/helpers/xss_mods'
|
40
|
-
module Haml::Helpers
|
41
|
-
include XssMods
|
42
|
-
end
|
55
|
+
# Enable XSS integration. Use Rails' after_initialize method if possible
|
56
|
+
# so that integration will be checked after the rails_xss plugin is loaded
|
57
|
+
# (for Rails 2.3.* where it's not enabled by default).
|
58
|
+
if defined?(Rails.configuration.after_initialize)
|
59
|
+
Rails.configuration.after_initialize {Haml::Template.try_enabling_xss_integration}
|
60
|
+
else
|
61
|
+
Haml::Template.try_enabling_xss_integration
|
43
62
|
end
|
44
63
|
|
45
64
|
if defined?(RAILS_ROOT)
|
data/test/haml/template_test.rb
CHANGED
@@ -241,6 +241,9 @@ END
|
|
241
241
|
|
242
242
|
## XSS Protection Tests
|
243
243
|
|
244
|
+
# In order to enable these, either test against Rails 3.0
|
245
|
+
# or test against Rails 2.2.5+ with the rails_xss plugin
|
246
|
+
# (http://github.com/NZKoz/rails_xss) in test/plugins.
|
244
247
|
if Haml::Util.rails_xss_safe?
|
245
248
|
def test_escape_html_option_set
|
246
249
|
assert Haml::Template.options[:escape_html]
|
@@ -273,5 +276,13 @@ END
|
|
273
276
|
def test_xss_protection_with_mixed_strings_in_interpolation
|
274
277
|
assert_equal("Foo & Bar & Baz\n", render('Foo #{"&".html_safe!} Bar #{"&"} Baz', :action_view))
|
275
278
|
end
|
279
|
+
|
280
|
+
def test_rendered_string_is_html_safe
|
281
|
+
assert(render("Foo").html_safe?)
|
282
|
+
end
|
283
|
+
|
284
|
+
def test_rendered_string_is_html_safe_with_action_view
|
285
|
+
assert(render("Foo", :action_view).html_safe?)
|
286
|
+
end
|
276
287
|
end
|
277
288
|
end
|