diff options
Diffstat (limited to 'lib/ansible/plugins/action/__init__.py')
-rw-r--r-- | lib/ansible/plugins/action/__init__.py | 24 |
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 |