gettext_i18n_rails 0.2.14 → 0.2.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Readme.md
CHANGED
@@ -134,11 +134,16 @@ namespace-aware translation
|
|
134
134
|
|
135
135
|
XSS / html_safe
|
136
136
|
===============
|
137
|
-
If you trust your translators and all your usages of % on translations
|
138
|
-
(% on string is atm buggy with always staying html_safe, no matter what was replaced)
|
137
|
+
If you trust your translators and all your usages of % on translations:<br/>
|
139
138
|
# config/environment.rb
|
140
139
|
GettextI18nRails.translations_are_html_safe = true
|
141
140
|
|
141
|
+
String % vs html_safe is buggy (can be used for XSS on 1.8 and is always non-safe in 1.9)<br/>
|
142
|
+
My recommended fix is: `require 'gettext_i18n_rails/string_interpolate_fix'`
|
143
|
+
|
144
|
+
- safe stays safe (escape added strings)
|
145
|
+
- unsafe stays unsafe (do not escape added strings)
|
146
|
+
|
142
147
|
ActiveRecord - error messages
|
143
148
|
=============================
|
144
149
|
ActiveRecord error messages are translated through Rails::I18n, but
|
@@ -194,10 +199,6 @@ lib/tasks/gettext.rake:
|
|
194
199
|
end
|
195
200
|
end
|
196
201
|
|
197
|
-
TODO
|
198
|
-
=====
|
199
|
-
- fix % on string to respect html_safe: `("<a>%{x}</a>".html_safe % {:x=>'<script>y</script>'})` should escape the `<script>y</script>` part)
|
200
|
-
|
201
202
|
Contributors
|
202
203
|
======
|
203
204
|
- [ruby gettext extractor](http://github.com/retoo/ruby_gettext_extractor/tree/master) from [retoo](http://github.com/retoo)
|
@@ -208,6 +209,6 @@ Contributors
|
|
208
209
|
- [Anh Hai Trinh](http://blog.onideas.ws)
|
209
210
|
- [ed0h](http://github.com/ed0h)
|
210
211
|
|
211
|
-
[Michael Grosser](http://grosser.it)
|
212
|
-
grosser.michael@gmail.com
|
212
|
+
[Michael Grosser](http://grosser.it)<br/>
|
213
|
+
grosser.michael@gmail.com<br/>
|
213
214
|
Hereby placed under public domain, do what you want, just do not hold me accountable...
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.15
|
data/gettext_i18n_rails.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{gettext_i18n_rails}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.15"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Michael Grosser"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-02-10}
|
13
13
|
s.email = %q{grosser.michael@gmail.com}
|
14
14
|
s.files = [
|
15
15
|
"Rakefile",
|
@@ -27,11 +27,13 @@ Gem::Specification.new do |s|
|
|
27
27
|
"lib/gettext_i18n_rails/model_attributes_finder.rb",
|
28
28
|
"lib/gettext_i18n_rails/railtie.rb",
|
29
29
|
"lib/gettext_i18n_rails/ruby_gettext_extractor.rb",
|
30
|
+
"lib/gettext_i18n_rails/string_interpolate_fix.rb",
|
30
31
|
"lib/gettext_i18n_rails/tasks.rb",
|
31
32
|
"lib/tasks/gettext_rails_i18n.rake",
|
32
33
|
"spec/gettext_i18n_rails/action_controller_spec.rb",
|
33
34
|
"spec/gettext_i18n_rails/active_record_spec.rb",
|
34
35
|
"spec/gettext_i18n_rails/backend_spec.rb",
|
36
|
+
"spec/gettext_i18n_rails/string_interpolate_fix_spec.rb",
|
35
37
|
"spec/gettext_i18n_rails_spec.rb",
|
36
38
|
"spec/spec_helper.rb"
|
37
39
|
]
|
@@ -43,6 +45,7 @@ Gem::Specification.new do |s|
|
|
43
45
|
"spec/gettext_i18n_rails/action_controller_spec.rb",
|
44
46
|
"spec/gettext_i18n_rails/active_record_spec.rb",
|
45
47
|
"spec/gettext_i18n_rails/backend_spec.rb",
|
48
|
+
"spec/gettext_i18n_rails/string_interpolate_fix_spec.rb",
|
46
49
|
"spec/gettext_i18n_rails_spec.rb",
|
47
50
|
"spec/spec_helper.rb"
|
48
51
|
]
|
@@ -0,0 +1,20 @@
|
|
1
|
+
needed = "".respond_to?(:html_safe) and
|
2
|
+
(
|
3
|
+
"".html_safe % {:x => '<br/>'} == '<br/>' or
|
4
|
+
not ("".html_safe % {:x=>'a'}).html_safe?
|
5
|
+
)
|
6
|
+
|
7
|
+
if needed
|
8
|
+
class String
|
9
|
+
alias :interpolate_without_html_safe :%
|
10
|
+
|
11
|
+
def %(*args)
|
12
|
+
if args.first.is_a?(Hash) and html_safe?
|
13
|
+
safe_replacement = Hash[args.first.map{|k,v| [k,ERB::Util.h(v)] }]
|
14
|
+
interpolate_without_html_safe(safe_replacement).html_safe
|
15
|
+
else
|
16
|
+
interpolate_without_html_safe(*args).dup # make sure its not html_safe
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.expand_path("../spec_helper", File.dirname(__FILE__))
|
2
|
+
require 'gettext_i18n_rails/string_interpolate_fix'
|
3
|
+
|
4
|
+
describe "String#%" do
|
5
|
+
it "is not safe if it was not safe" do
|
6
|
+
result = ("<br/>%{x}" % {:x => 'a'})
|
7
|
+
result.should == '<br/>a'
|
8
|
+
result.html_safe?.should == false
|
9
|
+
end
|
10
|
+
|
11
|
+
it "stays safe if it was safe" do
|
12
|
+
result = ("<br/>%{x}".html_safe % {:x => 'a'})
|
13
|
+
result.should == '<br/>a'
|
14
|
+
result.html_safe?.should == true
|
15
|
+
end
|
16
|
+
|
17
|
+
it "escapes unsafe added to safe" do
|
18
|
+
result = ("<br/>%{x}".html_safe % {:x => '<br/>'})
|
19
|
+
result.should == '<br/><br/>'
|
20
|
+
result.html_safe?.should == true
|
21
|
+
end
|
22
|
+
|
23
|
+
it "does not escape unsafe if it was unsafe" do
|
24
|
+
result = ("<br/>%{x}" % {:x => '<br/>'})
|
25
|
+
result.should == '<br/><br/>'
|
26
|
+
result.html_safe?.should == false
|
27
|
+
end
|
28
|
+
|
29
|
+
it "does not break array replacement" do
|
30
|
+
"%ssd" % ['a'].should == "asd"
|
31
|
+
end
|
32
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gettext_i18n_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 9
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 15
|
10
|
+
version: 0.2.15
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Michael Grosser
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-02-10 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -56,11 +56,13 @@ files:
|
|
56
56
|
- lib/gettext_i18n_rails/model_attributes_finder.rb
|
57
57
|
- lib/gettext_i18n_rails/railtie.rb
|
58
58
|
- lib/gettext_i18n_rails/ruby_gettext_extractor.rb
|
59
|
+
- lib/gettext_i18n_rails/string_interpolate_fix.rb
|
59
60
|
- lib/gettext_i18n_rails/tasks.rb
|
60
61
|
- lib/tasks/gettext_rails_i18n.rake
|
61
62
|
- spec/gettext_i18n_rails/action_controller_spec.rb
|
62
63
|
- spec/gettext_i18n_rails/active_record_spec.rb
|
63
64
|
- spec/gettext_i18n_rails/backend_spec.rb
|
65
|
+
- spec/gettext_i18n_rails/string_interpolate_fix_spec.rb
|
64
66
|
- spec/gettext_i18n_rails_spec.rb
|
65
67
|
- spec/spec_helper.rb
|
66
68
|
has_rdoc: true
|
@@ -101,5 +103,6 @@ test_files:
|
|
101
103
|
- spec/gettext_i18n_rails/action_controller_spec.rb
|
102
104
|
- spec/gettext_i18n_rails/active_record_spec.rb
|
103
105
|
- spec/gettext_i18n_rails/backend_spec.rb
|
106
|
+
- spec/gettext_i18n_rails/string_interpolate_fix_spec.rb
|
104
107
|
- spec/gettext_i18n_rails_spec.rb
|
105
108
|
- spec/spec_helper.rb
|