mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-06-22 00:00:22 -07:00
User module - allow bang and exclamation in password field without warning (#46498)
* Allow bang and exclamation without warning Allow the password field to be ! or * without warning when using this feature to create accounts that are locked. Add documentation and tests to cover this. * Use set() rather than braces for Python 2.6
This commit is contained in:
parent
1c777976c5
commit
066af3b6ca
3 changed files with 52 additions and 22 deletions
|
@ -98,6 +98,7 @@ options:
|
|||
description:
|
||||
- Optionally set the user's password to this crypted value.
|
||||
- On macOS systems, this value has to be cleartext. Beware of security issues.
|
||||
- To create a disabled account or Linux systems, set this to C('!') or C('*').
|
||||
- See U(https://docs.ansible.com/ansible/faq.html#how-do-i-generate-crypted-passwords-for-the-user-module)
|
||||
for details on various ways to generate these password values.
|
||||
state:
|
||||
|
@ -448,32 +449,37 @@ class User(object):
|
|||
self.ssh_file = os.path.join('.ssh', 'id_%s' % self.ssh_type)
|
||||
|
||||
def check_password_encrypted(self):
|
||||
# darwin need cleartext password, so no check
|
||||
# Darwin needs cleartext password, so skip validation
|
||||
if self.module.params['password'] and self.platform != 'Darwin':
|
||||
maybe_invalid = False
|
||||
# : for delimiter, * for disable user, ! for lock user
|
||||
# these characters are invalid in the password
|
||||
if any(char in self.module.params['password'] for char in ':*!'):
|
||||
maybe_invalid = True
|
||||
if '$' not in self.module.params['password']:
|
||||
maybe_invalid = True
|
||||
|
||||
# Allow setting the password to * or ! in order to disable the account
|
||||
if self.module.params['password'] in set(['*', '!']):
|
||||
maybe_invalid = False
|
||||
else:
|
||||
fields = self.module.params['password'].split("$")
|
||||
if len(fields) >= 3:
|
||||
# contains character outside the crypto constraint
|
||||
if bool(_HASH_RE.search(fields[-1])):
|
||||
maybe_invalid = True
|
||||
# md5
|
||||
if fields[1] == '1' and len(fields[-1]) != 22:
|
||||
maybe_invalid = True
|
||||
# sha256
|
||||
if fields[1] == '5' and len(fields[-1]) != 43:
|
||||
maybe_invalid = True
|
||||
# sha512
|
||||
if fields[1] == '6' and len(fields[-1]) != 86:
|
||||
maybe_invalid = True
|
||||
else:
|
||||
# : for delimiter, * for disable user, ! for lock user
|
||||
# these characters are invalid in the password
|
||||
if any(char in self.module.params['password'] for char in ':*!'):
|
||||
maybe_invalid = True
|
||||
if '$' not in self.module.params['password']:
|
||||
maybe_invalid = True
|
||||
else:
|
||||
fields = self.module.params['password'].split("$")
|
||||
if len(fields) >= 3:
|
||||
# contains character outside the crypto constraint
|
||||
if bool(_HASH_RE.search(fields[-1])):
|
||||
maybe_invalid = True
|
||||
# md5
|
||||
if fields[1] == '1' and len(fields[-1]) != 22:
|
||||
maybe_invalid = True
|
||||
# sha256
|
||||
if fields[1] == '5' and len(fields[-1]) != 43:
|
||||
maybe_invalid = True
|
||||
# sha512
|
||||
if fields[1] == '6' and len(fields[-1]) != 86:
|
||||
maybe_invalid = True
|
||||
else:
|
||||
maybe_invalid = True
|
||||
if maybe_invalid:
|
||||
self.module.warn("The input password appears not to have been hashed. "
|
||||
"The 'password' argument must be encrypted for this module to work properly.")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue