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
|
# Copyright: (c) 2023, Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
# deprecated: description="deprecate unsafe_proxy module" core_version="2.23"
# DTFIX5: add full unit test coverage
from __future__ import annotations
from collections.abc import Mapping, Set
from ansible.module_utils.common.text.converters import to_bytes, to_text
from ansible.module_utils.common.collections import is_sequence
from ansible._internal._datatag._tags import TrustedAsTemplate
from ansible.module_utils.six import binary_type, text_type
import typing as t
__all__ = ['AnsibleUnsafe', 'wrap_var']
T = t.TypeVar('T')
class AnsibleUnsafe:
def __new__(cls, value):
return TrustedAsTemplate.untag(value)
class AnsibleUnsafeBytes(bytes):
def __new__(cls, value):
return TrustedAsTemplate.untag(value)
class AnsibleUnsafeText(str):
def __new__(cls, value):
return TrustedAsTemplate.untag(value)
class NativeJinjaUnsafeText(str):
def __new__(cls, value):
return TrustedAsTemplate.untag(value)
def _wrap_dict(v):
return dict((wrap_var(k), wrap_var(item)) for k, item in v.items())
def _wrap_sequence(v):
"""Wraps a sequence with unsafe, not meant for strings, primarily
``tuple`` and ``list``
"""
v_type = type(v)
return v_type(wrap_var(item) for item in v)
def _wrap_set(v):
return set(wrap_var(item) for item in v)
def wrap_var(v):
# maintain backward compat by recursively *un* marking TrustedAsTemplate
if v is None or isinstance(v, AnsibleUnsafe):
return v
if isinstance(v, Mapping):
v = _wrap_dict(v)
elif isinstance(v, Set):
v = _wrap_set(v)
elif is_sequence(v):
v = _wrap_sequence(v)
elif isinstance(v, binary_type):
v = AnsibleUnsafeBytes(v)
elif isinstance(v, text_type):
v = AnsibleUnsafeText(v)
return v
def to_unsafe_bytes(*args, **kwargs):
return wrap_var(to_bytes(*args, **kwargs))
def to_unsafe_text(*args, **kwargs):
return wrap_var(to_text(*args, **kwargs))
|