diff --git a/salt/renderers/gpg.py b/salt/renderers/gpg.py index c006f42dab5..e861da81615 100644 --- a/salt/renderers/gpg.py +++ b/salt/renderers/gpg.py @@ -295,7 +295,7 @@ def _decrypt_ciphertext(cipher): return decrypted_data -def _decrypt_ciphertexts(cipher, translate_newlines=False): +def _decrypt_ciphertexts(cipher, translate_newlines=False, encoding=None): to_bytes = salt.utils.stringutils.to_bytes cipher = to_bytes(cipher) if translate_newlines: @@ -314,14 +314,14 @@ def _decrypt_ciphertexts(cipher, translate_newlines=False): ret = cipher try: - ret = salt.utils.stringutils.to_unicode(ret) + ret = salt.utils.stringutils.to_unicode(ret, encoding=encoding) except UnicodeDecodeError: # decrypted data contains some sort of binary data - not our problem pass return ret -def _decrypt_object(obj, translate_newlines=False): +def _decrypt_object(obj, translate_newlines=False, encoding=None): ''' Recursively try to decrypt any object. If the object is a six.string_types (string or unicode), and it contains a valid GPG header, decrypt it, @@ -330,7 +330,7 @@ def _decrypt_object(obj, translate_newlines=False): if salt.utils.stringio.is_readable(obj): return _decrypt_object(obj.getvalue(), translate_newlines) if isinstance(obj, six.string_types): - return _decrypt_ciphertexts(obj, translate_newlines=translate_newlines) + return _decrypt_ciphertexts(obj, translate_newlines=translate_newlines, encoding=encoding) elif isinstance(obj, dict): for key, value in six.iteritems(obj): obj[key] = _decrypt_object(value, @@ -355,4 +355,4 @@ def render(gpg_data, saltenv='base', sls='', argline='', **kwargs): log.debug('Reading GPG keys from: %s', _get_key_dir()) translate_newlines = kwargs.get('translate_newlines', False) - return _decrypt_object(gpg_data, translate_newlines=translate_newlines) + return _decrypt_object(gpg_data, translate_newlines=translate_newlines, encoding=kwargs.get('encoding', None)) diff --git a/tests/unit/renderers/test_gpg.py b/tests/unit/renderers/test_gpg.py index c02a1ba9588..9099b4262e0 100644 --- a/tests/unit/renderers/test_gpg.py +++ b/tests/unit/renderers/test_gpg.py @@ -143,7 +143,7 @@ class GPGTestCase(TestCase, LoaderModuleMockMixin): with patch('salt.renderers.gpg._get_gpg_exec', MagicMock(return_value=True)): with patch('salt.renderers.gpg._get_key_dir', MagicMock(return_value=key_dir)): with patch('salt.renderers.gpg._decrypt_ciphertext', MagicMock(return_value=secret)): - self.assertEqual(gpg.render(crypted), expected) + self.assertEqual(gpg.render(crypted, encoding='utf-8'), expected) def test_render_with_translate_newlines_should_translate_newlines(self): key_dir = '/etc/salt/gpgkeys' @@ -165,6 +165,6 @@ class GPGTestCase(TestCase, LoaderModuleMockMixin): with patch('salt.renderers.gpg._get_key_dir', MagicMock(return_value=key_dir)): with patch('salt.renderers.gpg._decrypt_ciphertext', MagicMock(return_value=secret)): self.assertEqual( - gpg.render(crypted, translate_newlines=True), + gpg.render(crypted, translate_newlines=True, encoding='utf-8'), expected, )