diff options
Diffstat (limited to 'lib/ansible/parsing/ajson.py')
-rw-r--r-- | lib/ansible/parsing/ajson.py | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/ansible/parsing/ajson.py b/lib/ansible/parsing/ajson.py new file mode 100644 index 0000000..8049755 --- /dev/null +++ b/lib/ansible/parsing/ajson.py @@ -0,0 +1,42 @@ +# Copyright: (c) 2018, Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +# Make coding more python3-ish +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import json + +# Imported for backwards compat +from ansible.module_utils.common.json import AnsibleJSONEncoder + +from ansible.parsing.vault import VaultLib +from ansible.parsing.yaml.objects import AnsibleVaultEncryptedUnicode +from ansible.utils.unsafe_proxy import wrap_var + + +class AnsibleJSONDecoder(json.JSONDecoder): + + _vaults = {} # type: dict[str, VaultLib] + + def __init__(self, *args, **kwargs): + kwargs['object_hook'] = self.object_hook + super(AnsibleJSONDecoder, self).__init__(*args, **kwargs) + + @classmethod + def set_secrets(cls, secrets): + cls._vaults['default'] = VaultLib(secrets=secrets) + + def object_hook(self, pairs): + for key in pairs: + value = pairs[key] + + if key == '__ansible_vault': + value = AnsibleVaultEncryptedUnicode(value) + if self._vaults: + value.vault = self._vaults['default'] + return value + elif key == '__ansible_unsafe': + return wrap_var(value) + + return pairs |