mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Ensure that the strings returned by SafeBuffer#gsub and friends aren't considered html_safe?
Also make sure that the versions of those methods which modify a string in place such as gsub! can't be called on safe buffers at all. Conflicts: activesupport/test/safe_buffer_test.rb
This commit is contained in:
parent
7d1782a2c1
commit
1300c03477
2 changed files with 25 additions and 0 deletions
|
@ -74,6 +74,7 @@ end
|
|||
|
||||
module ActiveSupport #:nodoc:
|
||||
class SafeBuffer < String
|
||||
UNSAFE_STRING_METHODS = ["capitalize", "chomp", "chop", "delete", "downcase", "gsub", "lstrip", "next", "reverse", "rstrip", "slice", "squeeze", "strip", "sub", "succ", "swapcase", "tr", "tr_s", "upcase"].freeze
|
||||
alias safe_concat concat
|
||||
|
||||
def concat(value)
|
||||
|
@ -110,6 +111,18 @@ module ActiveSupport #:nodoc:
|
|||
|
||||
to_str.to_yaml(*args)
|
||||
end
|
||||
|
||||
for unsafe_method in UNSAFE_STRING_METHODS
|
||||
class_eval <<-EOT, __FILE__, __LINE__
|
||||
def #{unsafe_method}(*args)
|
||||
super.to_str
|
||||
end
|
||||
|
||||
def #{unsafe_method}!(*args)
|
||||
raise TypeError, "Cannot modify SafeBuffer in place"
|
||||
end
|
||||
EOT
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -60,4 +60,16 @@ class SafeBufferTest < ActiveSupport::TestCase
|
|||
yaml = YAML.dump data
|
||||
assert_equal({'str' => str}, YAML.load(yaml))
|
||||
end
|
||||
|
||||
test "Should not return safe buffer from gsub" do
|
||||
altered_buffer = @buffer.gsub('', 'asdf')
|
||||
assert_equal 'asdf', altered_buffer
|
||||
assert !altered_buffer.html_safe?
|
||||
end
|
||||
|
||||
test "Should not allow gsub! on safe buffers" do
|
||||
assert_raise TypeError do
|
||||
@buffer.gsub!('', 'asdf')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue