1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
# frozen_string_literal: true
require 'psych/helper'
module Psych
class TestSafeLoad < TestCase
def setup
@orig_verbose, $VERBOSE = $VERBOSE, nil
end
def teardown
$VERBOSE = @orig_verbose
end
class Foo; end
[1, 2.2, {}, [], "foo"].each do |obj|
define_method(:"test_basic_#{obj.class}") do
assert_safe_cycle obj
end
end
def test_raises_when_alias_found_if_alias_parsing_not_enabled
yaml_with_aliases = <<~YAML
---
a: &ABC
k1: v1
k2: v2
b: *ABC
YAML
assert_raise(Psych::BadAlias) do
Psych.safe_load(yaml_with_aliases)
end
end
def test_aliases_are_parsed_when_alias_parsing_is_enabled
yaml_with_aliases = <<~YAML
---
a: &ABC
k1: v1
k2: v2
b: *ABC
YAML
result = Psych.safe_load(yaml_with_aliases, aliases: true)
assert_same result.fetch("a"), result.fetch("b")
end
def test_permitted_symbol
yml = Psych.dump :foo
assert_raise(Psych::DisallowedClass) do
Psych.safe_load yml
end
assert_equal(
:foo,
Psych.safe_load(
yml,
permitted_classes: [Symbol],
permitted_symbols: [:foo]
)
)
end
def test_symbol
assert_raise(Psych::DisallowedClass) do
assert_safe_cycle :foo
end
assert_raise(Psych::DisallowedClass) do
Psych.safe_load '--- !ruby/symbol foo', permitted_classes: []
end
assert_safe_cycle :foo, permitted_classes: [Symbol]
assert_safe_cycle :foo, permitted_classes: %w{ Symbol }
assert_equal :foo, Psych.safe_load('--- !ruby/symbol foo', permitted_classes: [Symbol])
end
def test_foo
assert_raise(Psych::DisallowedClass) do
Psych.safe_load '--- !ruby/object:Foo {}', permitted_classes: [Foo]
end
assert_raise(Psych::DisallowedClass) do
assert_safe_cycle Foo.new
end
assert_kind_of(Foo, Psych.safe_load(Psych.dump(Foo.new), permitted_classes: [Foo]))
end
X = Struct.new(:x)
def test_struct_depends_on_sym
assert_safe_cycle(X.new, permitted_classes: [X, Symbol])
assert_raise(Psych::DisallowedClass) do
cycle X.new, permitted_classes: [X]
end
end
def test_anon_struct
assert Psych.safe_load(<<-eoyml, permitted_classes: [Struct, Symbol])
--- !ruby/struct
foo: bar
eoyml
assert_raise(Psych::DisallowedClass) do
Psych.safe_load(<<-eoyml, permitted_classes: [Struct])
--- !ruby/struct
foo: bar
eoyml
end
assert_raise(Psych::DisallowedClass) do
Psych.safe_load(<<-eoyml, permitted_classes: [Symbol])
--- !ruby/struct
foo: bar
eoyml
end
end
def test_safe_load_default_fallback
assert_nil Psych.safe_load("")
end
def test_safe_load
assert_equal %w[a b], Psych.safe_load("- a\n- b")
end
def test_safe_load_raises_on_bad_input
assert_raise(Psych::SyntaxError) { Psych.safe_load("--- `") }
end
private
def cycle object, permitted_classes: []
Psych.safe_load(Psych.dump(object), permitted_classes: permitted_classes)
end
def assert_safe_cycle object, permitted_classes: []
other = cycle object, permitted_classes: permitted_classes
assert_equal object, other
end
end
end
|