diff --git a/salt/serializers/yaml.py b/salt/serializers/yaml.py index 2fad384d1bb..e893c3f3898 100644 --- a/salt/serializers/yaml.py +++ b/salt/serializers/yaml.py @@ -77,10 +77,25 @@ def serialize(obj, **options): raise SerializationError(error) +class EncryptedString(str): + + yaml_tag = u'!encrypted' + + @staticmethod + def yaml_constructor(loader, tag, node): + return EncryptedString(loader.construct_scalar(node)) + + @staticmethod + def yaml_dumper(dumper, data): + return dumper.represent_scalar(EncryptedString.yaml_tag, data.__str__()) + + class Loader(BaseLoader): # pylint: disable=W0232 '''Overwrites Loader as not for pollute legacy Loader''' pass + +Loader.add_multi_constructor(EncryptedString.yaml_tag, EncryptedString.yaml_constructor) Loader.add_multi_constructor('tag:yaml.org,2002:null', Loader.construct_yaml_null) Loader.add_multi_constructor('tag:yaml.org,2002:bool', Loader.construct_yaml_bool) Loader.add_multi_constructor('tag:yaml.org,2002:int', Loader.construct_yaml_int) @@ -100,6 +115,7 @@ class Dumper(BaseDumper): # pylint: disable=W0232 '''Overwrites Dumper as not for pollute legacy Dumper''' pass +Dumper.add_multi_representer(EncryptedString, EncryptedString.yaml_dumper) Dumper.add_multi_representer(type(None), Dumper.represent_none) Dumper.add_multi_representer(str, Dumper.represent_str) if six.PY2: diff --git a/tests/unit/serializers/test_serializers.py b/tests/unit/serializers/test_serializers.py index 4f4890e06e0..980405f8b81 100644 --- a/tests/unit/serializers/test_serializers.py +++ b/tests/unit/serializers/test_serializers.py @@ -18,6 +18,7 @@ import salt.serializers.yaml as yaml import salt.serializers.yamlex as yamlex import salt.serializers.msgpack as msgpack import salt.serializers.python as python +from salt.serializers.yaml import EncryptedString from salt.serializers import SerializationError from salt.utils.odict import OrderedDict @@ -43,10 +44,11 @@ class TestSerializers(TestCase): @skipIf(not yaml.available, SKIP_MESSAGE % 'yaml') def test_serialize_yaml(self): data = { - "foo": "bar" + "foo": "bar", + "encrypted_data": EncryptedString("foo") } serialized = yaml.serialize(data) - assert serialized == '{foo: bar}', serialized + assert serialized == '{encrypted_data: !encrypted foo, foo: bar}', serialized deserialized = yaml.deserialize(serialized) assert deserialized == data, deserialized