Skip to content

Commit bbcf95f

Browse files
alexsigmavirus24
authored andcommitted
Now, for py3k!
1 parent 517e83e commit bbcf95f

File tree

6 files changed

+46
-37
lines changed

6 files changed

+46
-37
lines changed

lib3/yaml/__init__.py

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -66,40 +66,48 @@ def load(stream, Loader=Loader):
6666
"""
6767
Parse the first YAML document in a stream
6868
and produce the corresponding Python object.
69+
70+
By default resolve only basic YAML tags, if an alternate Loader is
71+
provided, may be dangerous.
6972
"""
7073
loader = Loader(stream)
7174
try:
7275
return loader.get_single_data()
7376
finally:
7477
loader.dispose()
78+
safe_load = load
7579

7680
def load_all(stream, Loader=Loader):
7781
"""
7882
Parse all YAML documents in a stream
7983
and produce corresponding Python objects.
84+
85+
By default resolve only basic YAML tags, if an alternate Loader is
86+
provided, may be dangerous.
8087
"""
8188
loader = Loader(stream)
8289
try:
8390
while loader.check_data():
8491
yield loader.get_data()
8592
finally:
8693
loader.dispose()
94+
safe_load_all = load_all
8795

88-
def safe_load(stream):
96+
def danger_load(stream):
8997
"""
9098
Parse the first YAML document in a stream
9199
and produce the corresponding Python object.
92-
Resolve only basic YAML tags.
100+
When used on untrusted input, can result in arbitrary code execution.
93101
"""
94-
return load(stream, SafeLoader)
102+
return load(stream, DangerLoader)
95103

96-
def safe_load_all(stream):
104+
def danger_load_all(stream):
97105
"""
98106
Parse all YAML documents in a stream
99107
and produce corresponding Python objects.
100-
Resolve only basic YAML tags.
108+
When used on untrusted input, can result in arbitrary code execution.
101109
"""
102-
return load_all(stream, SafeLoader)
110+
return load_all(stream, DangerLoader)
103111

104112
def emit(events, stream=None, Dumper=Dumper,
105113
canonical=None, indent=None, width=None,
@@ -191,29 +199,31 @@ def dump_all(documents, stream=None, Dumper=Dumper,
191199
dumper.dispose()
192200
if getvalue:
193201
return getvalue()
202+
safe_dump_all = dump_all
194203

195-
def dump(data, stream=None, Dumper=Dumper, **kwds):
204+
def danger_dump_all(documents, stream=None, **kwds):
196205
"""
197-
Serialize a Python object into a YAML stream.
206+
Serialize a sequence of Python objects into a YAML stream.
207+
Produce only basic YAML tags.
198208
If stream is None, return the produced string instead.
199209
"""
200-
return dump_all([data], stream, Dumper=Dumper, **kwds)
210+
return dump_all(documents, stream, Dumper=DangerDumper, **kwds)
201211

202-
def safe_dump_all(documents, stream=None, **kwds):
212+
def dump(data, stream=None, Dumper=Dumper, **kwds):
203213
"""
204-
Serialize a sequence of Python objects into a YAML stream.
205-
Produce only basic YAML tags.
214+
Serialize a Python object into a YAML stream.
206215
If stream is None, return the produced string instead.
207216
"""
208-
return dump_all(documents, stream, Dumper=SafeDumper, **kwds)
217+
return dump_all([data], stream, Dumper=Dumper, **kwds)
218+
safe_dump = dump
209219

210-
def safe_dump(data, stream=None, **kwds):
220+
def danger_dump(data, stream=None, **kwds):
211221
"""
212222
Serialize a Python object into a YAML stream.
213223
Produce only basic YAML tags.
214224
If stream is None, return the produced string instead.
215225
"""
216-
return dump_all([data], stream, Dumper=SafeDumper, **kwds)
226+
return dump_all([data], stream, Dumper=DangerDumper, **kwds)
217227

218228
def add_implicit_resolver(tag, regexp, first=None,
219229
Loader=Loader, Dumper=Dumper):

lib3/yaml/cyaml.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

2-
__all__ = ['CBaseLoader', 'CSafeLoader', 'CLoader',
3-
'CBaseDumper', 'CSafeDumper', 'CDumper']
2+
__all__ = ['CBaseLoader', 'CSafeLoader', 'CLoader', 'CDangerLoader',
3+
'CBaseDumper', 'CSafeDumper', 'CDumper', 'CDangerDumper']
44

55
from _yaml import CParser, CEmitter
66

@@ -18,14 +18,15 @@ def __init__(self, stream):
1818
BaseConstructor.__init__(self)
1919
BaseResolver.__init__(self)
2020

21-
class CSafeLoader(CParser, SafeConstructor, Resolver):
21+
class CLoader(CParser, SafeConstructor, Resolver):
2222

2323
def __init__(self, stream):
2424
CParser.__init__(self, stream)
2525
SafeConstructor.__init__(self)
2626
Resolver.__init__(self)
27+
CSafeLoader = CLoader
2728

28-
class CLoader(CParser, Constructor, Resolver):
29+
class CDangerLoader(CParser, Constructor, Resolver):
2930

3031
def __init__(self, stream):
3132
CParser.__init__(self, stream)
@@ -49,7 +50,7 @@ def __init__(self, stream,
4950
default_flow_style=default_flow_style)
5051
Resolver.__init__(self)
5152

52-
class CSafeDumper(CEmitter, SafeRepresenter, Resolver):
53+
class CDumper(CEmitter, SafeRepresenter, Resolver):
5354

5455
def __init__(self, stream,
5556
default_style=None, default_flow_style=None,
@@ -65,8 +66,9 @@ def __init__(self, stream,
6566
SafeRepresenter.__init__(self, default_style=default_style,
6667
default_flow_style=default_flow_style)
6768
Resolver.__init__(self)
69+
CSafeDumper = CDumper
6870

69-
class CDumper(CEmitter, Serializer, Representer, Resolver):
71+
class CDangerDumper(CEmitter, Serializer, Representer, Resolver):
7072

7173
def __init__(self, stream,
7274
default_style=None, default_flow_style=None,
@@ -82,4 +84,3 @@ def __init__(self, stream,
8284
Representer.__init__(self, default_style=default_style,
8385
default_flow_style=default_flow_style)
8486
Resolver.__init__(self)
85-

lib3/yaml/dumper.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
__all__ = ['BaseDumper', 'SafeDumper', 'Dumper']
2+
__all__ = ['BaseDumper', 'SafeDumper', 'Dumper', 'DangerDumper']
33

44
from .emitter import *
55
from .serializer import *
@@ -24,7 +24,7 @@ def __init__(self, stream,
2424
default_flow_style=default_flow_style)
2525
Resolver.__init__(self)
2626

27-
class SafeDumper(Emitter, Serializer, SafeRepresenter, Resolver):
27+
class Dumper(Emitter, Serializer, SafeRepresenter, Resolver):
2828

2929
def __init__(self, stream,
3030
default_style=None, default_flow_style=None,
@@ -41,8 +41,9 @@ def __init__(self, stream,
4141
SafeRepresenter.__init__(self, default_style=default_style,
4242
default_flow_style=default_flow_style)
4343
Resolver.__init__(self)
44+
SafeDumper = Dumper
4445

45-
class Dumper(Emitter, Serializer, Representer, Resolver):
46+
class DangerDumper(Emitter, Serializer, Representer, Resolver):
4647

4748
def __init__(self, stream,
4849
default_style=None, default_flow_style=None,
@@ -59,4 +60,3 @@ def __init__(self, stream,
5960
Representer.__init__(self, default_style=default_style,
6061
default_flow_style=default_flow_style)
6162
Resolver.__init__(self)
62-

lib3/yaml/loader.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
__all__ = ['BaseLoader', 'SafeLoader', 'Loader']
2+
__all__ = ['BaseLoader', 'SafeLoader', 'Loader', 'DangerLoader']
33

44
from .reader import *
55
from .scanner import *
@@ -18,7 +18,7 @@ def __init__(self, stream):
1818
BaseConstructor.__init__(self)
1919
BaseResolver.__init__(self)
2020

21-
class SafeLoader(Reader, Scanner, Parser, Composer, SafeConstructor, Resolver):
21+
class Loader(Reader, Scanner, Parser, Composer, SafeConstructor, Resolver):
2222

2323
def __init__(self, stream):
2424
Reader.__init__(self, stream)
@@ -27,8 +27,9 @@ def __init__(self, stream):
2727
Composer.__init__(self)
2828
SafeConstructor.__init__(self)
2929
Resolver.__init__(self)
30+
SafeLoader = Loader
3031

31-
class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver):
32+
class DangerLoader(Reader, Scanner, Parser, Composer, Constructor, Resolver):
3233

3334
def __init__(self, stream):
3435
Reader.__init__(self, stream)
@@ -37,4 +38,3 @@ def __init__(self, stream):
3738
Composer.__init__(self)
3839
Constructor.__init__(self)
3940
Resolver.__init__(self)
40-

tests/lib3/test_constructor.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ def _make_objects():
1616
NewArgs, NewArgsWithState, Reduce, ReduceWithState, MyInt, MyList, MyDict, \
1717
FixedOffset, today, execute
1818

19-
class MyLoader(yaml.Loader):
19+
class MyLoader(yaml.DangerLoader):
2020
pass
21-
class MyDumper(yaml.Dumper):
21+
class MyDumper(yaml.DangerDumper):
2222
pass
2323

2424
class MyTestClass1:
@@ -257,4 +257,3 @@ def test_constructor_types(data_filename, code_filename, verbose=False):
257257
sys.modules['test_constructor'] = sys.modules['__main__']
258258
import test_appliance
259259
test_appliance.run(globals())
260-

tests/lib3/test_recursive.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ def test_recursive(recursive_filename, verbose=False):
3030
value2 = None
3131
output2 = None
3232
try:
33-
output1 = yaml.dump(value1)
34-
value2 = yaml.load(output1)
35-
output2 = yaml.dump(value2)
33+
output1 = yaml.danger_dump(value1)
34+
value2 = yaml.danger_load(output1)
35+
output2 = yaml.danger_dump(value2)
3636
assert output1 == output2, (output1, output2)
3737
finally:
3838
if verbose:
@@ -48,4 +48,3 @@ def test_recursive(recursive_filename, verbose=False):
4848
if __name__ == '__main__':
4949
import test_appliance
5050
test_appliance.run(globals())
51-

0 commit comments

Comments
 (0)