1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

java_keystore: overwrite instead of fail when password or alias does not match (#2262)

* Overwrite instead of fail when password does not match.

* Update documentation.

* Fix tests.

* Update plugins/modules/system/java_keystore.py

Co-authored-by: Amin Vakil <info@aminvakil.com>

* Fix documentation.

* Apply suggestions from code review

Co-authored-by: quidame <quidame@poivron.org>

* Update tests/unit/plugins/modules/system/test_java_keystore.py

* One more.

Co-authored-by: Amin Vakil <info@aminvakil.com>
Co-authored-by: quidame <quidame@poivron.org>
This commit is contained in:
Felix Fontein 2021-04-19 06:59:52 +02:00 committed by GitHub
parent 6a8eb7b388
commit 91a0264f38
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 46 additions and 30 deletions

View file

@ -0,0 +1,8 @@
breaking_changes:
- "java_keystore - instead of failing, now overwrites keystore if the alias (name) is changed.
This was originally the intended behavior, but did not work due to a logic error. Make sure
that your playbooks and roles do not depend on the old behavior of failing instead of
overwriting (https://github.com/ansible-collections/community.general/issues/1671)."
- "java_keystore - instead of failing, now overwrites keystore if the passphrase is changed.
Make sure that your playbooks and roles do not depend on the old behavior of failing instead
of overwriting (https://github.com/ansible-collections/community.general/issues/1671)."

View file

@ -19,8 +19,9 @@ options:
name: name:
description: description:
- Name of the certificate in the keystore. - Name of the certificate in the keystore.
- If the provided name does not exist in the keystore, the module fails. - If the provided name does not exist in the keystore, the module
This behavior will change in a next release. will re-create the keystore. This behavior changed in community.general 3.0.0,
before that the module would fail when the name did not match.
type: str type: str
required: true required: true
certificate: certificate:
@ -60,7 +61,9 @@ options:
description: description:
- Password that should be used to secure the keystore. - Password that should be used to secure the keystore.
- If the provided password fails to unlock the keystore, the module - If the provided password fails to unlock the keystore, the module
fails. This behavior will change in a next release. will re-create the keystore with the new passphrase. This behavior
changed in community.general 3.0.0, before that the module would fail
when the password did not match.
type: str type: str
required: true required: true
dest: dest:
@ -187,16 +190,11 @@ def read_stored_certificate_fingerprint(module, keytool_bin, alias, keystore_pat
(rc, stored_certificate_fingerprint_out, stored_certificate_fingerprint_err) = run_commands( (rc, stored_certificate_fingerprint_out, stored_certificate_fingerprint_err) = run_commands(
module, stored_certificate_fingerprint_cmd, environ_update=dict(STOREPASS=keystore_password)) module, stored_certificate_fingerprint_cmd, environ_update=dict(STOREPASS=keystore_password))
if rc != 0: if rc != 0:
# First intention was to not fail, and overwrite the keystore instead, if "keytool error: java.lang.Exception: Alias <%s> does not exist" % alias in stored_certificate_fingerprint_out:
# in case of alias mismatch; but an issue in error handling caused the return "alias mismatch"
# module to fail anyway. if re.match(r'keytool error: java\.io\.IOException: [Kk]eystore( was tampered with, or)? password was incorrect',
# See: https://github.com/ansible-collections/community.general/issues/1671 stored_certificate_fingerprint_out):
# And: https://github.com/ansible-collections/community.general/pull/2183 return "password mismatch"
# if "keytool error: java.lang.Exception: Alias <%s> does not exist" % alias in stored_certificate_fingerprint_out:
# return "alias mismatch"
# if re.match(r'keytool error: java\.io\.IOException: [Kk]eystore( was tampered with, or)? password was incorrect',
# stored_certificate_fingerprint_out):
# return "password mismatch"
return module.fail_json(msg=stored_certificate_fingerprint_out, return module.fail_json(msg=stored_certificate_fingerprint_out,
err=stored_certificate_fingerprint_err, err=stored_certificate_fingerprint_err,
cmd=stored_certificate_fingerprint_cmd, cmd=stored_certificate_fingerprint_cmd,

View file

@ -64,7 +64,6 @@
loop: "{{ java_keystore_new_certs }}" loop: "{{ java_keystore_new_certs }}"
check_mode: yes check_mode: yes
register: result_alias_change_check register: result_alias_change_check
when: false # FIXME: module currently crashes
- name: Create a Java keystore for the given certificates (alias changed) - name: Create a Java keystore for the given certificates (alias changed)
community.general.java_keystore: community.general.java_keystore:
@ -72,7 +71,6 @@
name: foobar name: foobar
loop: "{{ java_keystore_new_certs }}" loop: "{{ java_keystore_new_certs }}"
register: result_alias_change register: result_alias_change
when: false # FIXME: module currently crashes
- name: Create a Java keystore for the given certificates (password changed, check mode) - name: Create a Java keystore for the given certificates (password changed, check mode)
@ -83,7 +81,6 @@
loop: "{{ java_keystore_new_certs }}" loop: "{{ java_keystore_new_certs }}"
check_mode: yes check_mode: yes
register: result_pw_change_check register: result_pw_change_check
when: false # FIXME: module currently crashes
- name: Create a Java keystore for the given certificates (password changed) - name: Create a Java keystore for the given certificates (password changed)
community.general.java_keystore: community.general.java_keystore:
@ -92,7 +89,6 @@
password: hunter2 password: hunter2
loop: "{{ java_keystore_new_certs }}" loop: "{{ java_keystore_new_certs }}"
register: result_pw_change register: result_pw_change
when: false # FIXME: module currently crashes
- name: Check that the remote certificates have not been removed - name: Check that the remote certificates have not been removed
ansible.builtin.file: ansible.builtin.file:
@ -117,7 +113,7 @@
- result_idem_check is not changed - result_idem_check is not changed
- result_change is changed - result_change is changed
- result_change_check is changed - result_change_check is changed
# - result_alias_change is changed # FIXME: module currently crashes - result_alias_change is changed
# - result_alias_change_check is changed # FIXME: module currently crashes - result_alias_change_check is changed
# - result_pw_change is changed # FIXME: module currently crashes - result_pw_change is changed
# - result_pw_change_check is changed # FIXME: module currently crashes - result_pw_change_check is changed

View file

@ -250,20 +250,34 @@ class TestCertChanged(ModuleTestCase):
supports_check_mode=self.spec.supports_check_mode supports_check_mode=self.spec.supports_check_mode
) )
module.fail_json = Mock()
with patch('os.remove', return_value=True): with patch('os.remove', return_value=True):
self.create_file.side_effect = ['/tmp/placeholder'] self.create_file.side_effect = ['/tmp/placeholder']
self.run_commands.side_effect = [(0, 'foo=abcd:1234:efgh', ''), self.run_commands.side_effect = [(0, 'foo=abcd:1234:efgh', ''),
(1, 'keytool error: java.lang.Exception: Alias <foo> does not exist', '')] (1, 'keytool error: java.lang.Exception: Alias <foo> does not exist', '')]
cert_changed(module, "openssl", "keytool", "/path/to/keystore.jks", "changeit", 'foo') result = cert_changed(module, "openssl", "keytool", "/path/to/keystore.jks", "changeit", 'foo')
module.fail_json.assert_called_once_with( self.assertTrue(result, 'Alias mismatch detected')
cmd=["keytool", "-list", "-alias", "foo", "-keystore", "/path/to/keystore.jks", "-storepass:env", "STOREPASS", "-v"],
msg='keytool error: java.lang.Exception: Alias <foo> does not exist', def test_cert_changed_password_mismatch(self):
err='', set_module_args(dict(
rc=1 certificate='cert-foo',
private_key='private-foo',
dest='/path/to/keystore.jks',
name='foo',
password='changeit'
))
module = AnsibleModule(
argument_spec=self.spec.argument_spec,
supports_check_mode=self.spec.supports_check_mode
) )
with patch('os.remove', return_value=True):
self.create_file.side_effect = ['/tmp/placeholder']
self.run_commands.side_effect = [(0, 'foo=abcd:1234:efgh', ''),
(1, 'keytool error: java.io.IOException: Keystore password was incorrect', '')]
result = cert_changed(module, "openssl", "keytool", "/path/to/keystore.jks", "changeit", 'foo')
self.assertTrue(result, 'Password mismatch detected')
def test_cert_changed_fail_read_cert(self): def test_cert_changed_fail_read_cert(self):
set_module_args(dict( set_module_args(dict(
certificate='cert-foo', certificate='cert-foo',