safe_yaml 0.8.4 → 0.8.5
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/lib/safe_yaml.rb +5 -1
- data/lib/safe_yaml/transform/to_float.rb +4 -1
- data/lib/safe_yaml/transform/to_integer.rb +11 -1
- data/lib/safe_yaml/version.rb +1 -1
- data/spec/resolver_specs.rb +6 -3
- data/spec/safe_yaml_spec.rb +8 -25
- metadata +2 -2
data/lib/safe_yaml.rb
CHANGED
@@ -17,6 +17,7 @@ module SafeYAML
|
|
17
17
|
|
18
18
|
DEFAULT_OPTIONS = {
|
19
19
|
:default_mode => nil,
|
20
|
+
:suppress_warnings => false,
|
20
21
|
:deserialize_symbols => false,
|
21
22
|
:whitelisted_tags => [],
|
22
23
|
:custom_initializers => {},
|
@@ -156,7 +157,10 @@ module YAML
|
|
156
157
|
def safe_mode_from_options(method, options={})
|
157
158
|
if options[:safe].nil?
|
158
159
|
safe_mode = SafeYAML::OPTIONS[:default_mode] || :safe
|
159
|
-
|
160
|
+
if SafeYAML::OPTIONS[:default_mode].nil? && !SafeYAML::OPTIONS[:suppress_warnings]
|
161
|
+
Kernel.warn "Called '#{method}' without the :safe option -- defaulting to #{safe_mode} mode."
|
162
|
+
SafeYAML::OPTIONS[:suppress_warnings] = true
|
163
|
+
end
|
160
164
|
return safe_mode
|
161
165
|
end
|
162
166
|
|
@@ -16,8 +16,11 @@ module SafeYAML
|
|
16
16
|
".NAN" => NaN,
|
17
17
|
}.freeze
|
18
18
|
|
19
|
+
MATCHER = /\A[-+]?(?:\d[\d_]*)?\.[\d_]*(?:[eE][-+][\d]+)?\Z/.freeze
|
20
|
+
|
19
21
|
def transform?(value)
|
20
|
-
return true, Float(value)
|
22
|
+
return true, Float(value) if MATCHER.match(value)
|
23
|
+
try_edge_cases?(value)
|
21
24
|
end
|
22
25
|
|
23
26
|
def try_edge_cases?(value)
|
@@ -1,8 +1,18 @@
|
|
1
1
|
module SafeYAML
|
2
2
|
class Transform
|
3
3
|
class ToInteger
|
4
|
+
MATCHERS = [
|
5
|
+
/\A[-+]?[1-9][0-9_]*\Z/.freeze, # decimal
|
6
|
+
/\A0[0-7]+\Z/.freeze, # octal
|
7
|
+
/\A0x[0-9a-f]+\Z/i.freeze, # hexadecimal
|
8
|
+
/\A0b[01_]+\Z/.freeze # binary
|
9
|
+
].freeze
|
10
|
+
|
4
11
|
def transform?(value)
|
5
|
-
|
12
|
+
MATCHERS.each do |matcher|
|
13
|
+
return true, Integer(value) if matcher.match(value)
|
14
|
+
end
|
15
|
+
try_edge_cases?(value)
|
6
16
|
end
|
7
17
|
|
8
18
|
def try_edge_cases?(value)
|
data/lib/safe_yaml/version.rb
CHANGED
data/spec/resolver_specs.rb
CHANGED
@@ -182,9 +182,12 @@ module ResolverSpecs
|
|
182
182
|
result.should == [Time.utc(2013, 1, 29, 13, 58, 0)]
|
183
183
|
end
|
184
184
|
|
185
|
-
|
186
|
-
|
187
|
-
|
185
|
+
# On Ruby 2.0.0-rc1, even YAML.load overflows the stack on this input.
|
186
|
+
if RUBY_VERSION != "2.0.0"
|
187
|
+
it "applies the same transformation to keys" do
|
188
|
+
parse "2013-01-29 05:58:00 -0800: time"
|
189
|
+
result.should == { Time.utc(2013, 1, 29, 13, 58, 0) => "time" }
|
190
|
+
end
|
188
191
|
end
|
189
192
|
end
|
190
193
|
end
|
data/spec/safe_yaml_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe YAML do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
before :each do
|
15
|
-
SafeYAML
|
15
|
+
SafeYAML.restore_defaults!
|
16
16
|
end
|
17
17
|
|
18
18
|
describe "unsafe_load" do
|
@@ -42,10 +42,6 @@ describe YAML do
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
after :each do
|
46
|
-
SafeYAML.restore_defaults!
|
47
|
-
end
|
48
|
-
|
49
45
|
it "effectively ignores the whitelist (since everything is whitelisted)" do
|
50
46
|
result = YAML.unsafe_load <<-YAML.unindent
|
51
47
|
--- !ruby/object:OpenStruct
|
@@ -260,10 +256,6 @@ describe YAML do
|
|
260
256
|
end
|
261
257
|
end
|
262
258
|
|
263
|
-
after :each do
|
264
|
-
SafeYAML.restore_defaults!
|
265
|
-
end
|
266
|
-
|
267
259
|
it "will use a custom initializer to instantiate an array-like class upon deserialization" do
|
268
260
|
result = YAML.safe_load <<-YAML.unindent
|
269
261
|
--- !set
|
@@ -299,10 +291,6 @@ describe YAML do
|
|
299
291
|
SafeYAML::OPTIONS[:deserialize_symbols] = true
|
300
292
|
end
|
301
293
|
|
302
|
-
after :each do
|
303
|
-
SafeYAML.restore_defaults!
|
304
|
-
end
|
305
|
-
|
306
294
|
it "will allow objects to be deserialized for whitelisted tags" do
|
307
295
|
result = YAML.safe_load("--- !ruby/object:OpenStruct\ntable:\n foo: bar\n")
|
308
296
|
result.should be_a(OpenStruct)
|
@@ -429,10 +417,6 @@ describe YAML do
|
|
429
417
|
}
|
430
418
|
|
431
419
|
context "as long as a :default_mode has been specified" do
|
432
|
-
after :each do
|
433
|
-
SafeYAML.restore_defaults!
|
434
|
-
end
|
435
|
-
|
436
420
|
it "doesn't issue a warning for safe mode, since an explicit mode has been set" do
|
437
421
|
SafeYAML::OPTIONS[:default_mode] = :safe
|
438
422
|
Kernel.should_not_receive(:warn)
|
@@ -453,6 +437,13 @@ describe YAML do
|
|
453
437
|
end
|
454
438
|
end
|
455
439
|
|
440
|
+
it "only issues a warning once (to avoid spamming an app's output)" do
|
441
|
+
silence_warnings do
|
442
|
+
Kernel.should_receive(:warn).once
|
443
|
+
2.times { YAML.load(*arguments) }
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
456
447
|
it "doesn't issue a warning as long as the :safe option is specified" do
|
457
448
|
Kernel.should_not_receive(:warn)
|
458
449
|
YAML.load(*(arguments + [{:safe => true}]))
|
@@ -480,10 +471,6 @@ describe YAML do
|
|
480
471
|
SafeYAML::OPTIONS[:default_mode] = :unsafe
|
481
472
|
end
|
482
473
|
|
483
|
-
after :each do
|
484
|
-
SafeYAML.restore_defaults!
|
485
|
-
end
|
486
|
-
|
487
474
|
it "defaults to unsafe mode if the :safe option is omitted" do
|
488
475
|
silence_warnings do
|
489
476
|
YAML.should_receive(:unsafe_load).with(*arguments)
|
@@ -535,10 +522,6 @@ describe YAML do
|
|
535
522
|
SafeYAML::OPTIONS[:default_mode] = :unsafe
|
536
523
|
end
|
537
524
|
|
538
|
-
after :each do
|
539
|
-
SafeYAML.restore_defaults!
|
540
|
-
end
|
541
|
-
|
542
525
|
it "defaults to unsafe mode if the :safe option is omitted" do
|
543
526
|
silence_warnings do
|
544
527
|
YAML.should_receive(:unsafe_load_file).with(filename)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: safe_yaml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-11 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Parse YAML safely, without that pesky arbitrary object deserialization
|
15
15
|
vulnerability
|