summaryrefslogtreecommitdiff
path: root/lib/ansible/plugins/action/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ansible/plugins/action/__init__.py')
-rw-r--r--lib/ansible/plugins/action/__init__.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/ansible/plugins/action/__init__.py b/lib/ansible/plugins/action/__init__.py
index 436fb65ae8..5ded3a8aa3 100644
--- a/lib/ansible/plugins/action/__init__.py
+++ b/lib/ansible/plugins/action/__init__.py
@@ -39,6 +39,18 @@ from ansible.utils.plugin_docs import get_versioned_doclink
display = Display()
+def _validate_utf8_json(d):
+ if isinstance(d, text_type):
+ # Purposefully not using to_bytes here for performance reasons
+ d.encode(encoding='utf-8', errors='strict')
+ elif isinstance(d, dict):
+ for o in d.items():
+ _validate_utf8_json(o)
+ elif isinstance(d, (list, tuple)):
+ for o in d:
+ _validate_utf8_json(o)
+
+
class ActionBase(ABC):
'''
@@ -1232,6 +1244,18 @@ class ActionBase(ABC):
display.warning(w)
data = json.loads(filtered_output)
+
+ if C.MODULE_STRICT_UTF8_RESPONSE and not data.pop('_ansible_trusted_utf8', None):
+ try:
+ _validate_utf8_json(data)
+ except UnicodeEncodeError:
+ # When removing this, also remove the loop and latin-1 from ansible.module_utils.common.text.converters.jsonify
+ display.deprecated(
+ f'Module "{self._task.resolved_action or self._task.action}" returned non UTF-8 data in '
+ 'the JSON response. This will become an error in the future',
+ version='2.18',
+ )
+
data['_ansible_parsed'] = True
except ValueError:
# not valid json, lets try to capture error