Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

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

# PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 

# -------------------------------------------- 

# 

# 1. This LICENSE AGREEMENT is between the Python Software Foundation 

# ("PSF"), and the Individual or Organization ("Licensee") accessing and 

# otherwise using this software ("Python") in source or binary form and 

# its associated documentation. 

# 

# 2. Subject to the terms and conditions of this License Agreement, PSF hereby 

# grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, 

# analyze, test, perform and/or display publicly, prepare derivative works, 

# distribute, and otherwise use Python alone or in any derivative version, 

# provided, however, that PSF's License Agreement and PSF's notice of copyright, 

# i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 

# 2011, 2012, 2013, 2014 Python Software Foundation; All Rights Reserved" are 

# retained in Python alone or in any derivative version prepared by Licensee. 

# 

# 3. In the event Licensee prepares a derivative work that is based on 

# or incorporates Python or any part thereof, and wants to make 

# the derivative work available to others as provided herein, then 

# Licensee hereby agrees to include in any such work a brief summary of 

# the changes made to Python. 

# 

# 4. PSF is making Python available to Licensee on an "AS IS" 

# basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR 

# IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND 

# DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS 

# FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT 

# INFRINGE ANY THIRD PARTY RIGHTS. 

# 

# 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 

# FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS 

# A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, 

# OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 

# 

# 6. This License Agreement will automatically terminate upon a material 

# breach of its terms and conditions. 

# 

# 7. Nothing in this License Agreement shall be deemed to create any 

# relationship of agency, partnership, or joint venture between PSF and 

# Licensee. This License Agreement does not grant permission to use PSF 

# trademarks or trade name in a trademark sense to endorse or promote 

# products or services of Licensee, or any third party. 

# 

# 8. By copying, installing or otherwise using Python, Licensee 

# agrees to be bound by the terms and conditions of this License 

# Agreement. 

# 

# Original Python Recipe for Proxy: 

# http://code.activestate.com/recipes/496741-object-proxying/ 

# Author: Tomer Filiba 

 

from __future__ import (absolute_import, division, print_function) 

__metaclass__ = type 

 

import json 

 

from ansible.module_utils.six import string_types, text_type 

from ansible.module_utils._text import to_text 

 

 

__all__ = ['UnsafeProxy', 'AnsibleUnsafe', 'AnsibleJSONUnsafeEncoder', 'AnsibleJSONUnsafeDecoder', 'wrap_var'] 

 

 

class AnsibleUnsafe(object): 

__UNSAFE__ = True 

 

 

class AnsibleUnsafeText(text_type, AnsibleUnsafe): 

pass 

 

 

class UnsafeProxy(object): 

def __new__(cls, obj, *args, **kwargs): 

# In our usage we should only receive unicode strings. 

# This conditional and conversion exists to sanity check the values 

# we're given but we may want to take it out for testing and sanitize 

# our input instead. 

if isinstance(obj, string_types): 

obj = to_text(obj, errors='surrogate_or_strict') 

return AnsibleUnsafeText(obj) 

return obj 

 

 

class AnsibleJSONUnsafeEncoder(json.JSONEncoder): 

def encode(self, obj): 

if isinstance(obj, AnsibleUnsafe): 

return super(AnsibleJSONUnsafeEncoder, self).encode(dict(__ansible_unsafe=True, 

value=to_text(obj, errors='surrogate_or_strict', nonstring='strict'))) 

else: 

return super(AnsibleJSONUnsafeEncoder, self).encode(obj) 

 

 

class AnsibleJSONUnsafeDecoder(json.JSONDecoder): 

def decode(self, obj): 

value = super(AnsibleJSONUnsafeDecoder, self).decode(obj) 

if isinstance(value, dict) and '__ansible_unsafe' in value: 

return UnsafeProxy(value.get('value', '')) 

else: 

return value 

 

 

def _wrap_dict(v): 

for k in v.keys(): 

if v[k] is not None: 

v[wrap_var(k)] = wrap_var(v[k]) 

return v 

 

 

def _wrap_list(v): 

for idx, item in enumerate(v): 

112 ↛ 111line 112 didn't jump to line 111, because the condition on line 112 was never false if item is not None: 

v[idx] = wrap_var(item) 

return v 

 

 

def wrap_var(v): 

if isinstance(v, dict): 

v = _wrap_dict(v) 

elif isinstance(v, list): 

v = _wrap_list(v) 

else: 

if v is not None and not isinstance(v, AnsibleUnsafe): 

v = UnsafeProxy(v) 

return v