pwpolicy: Allow clearing policy values.

All values for pwpolicy can be cleared with an empty string in IPA CLI,
and this behavior was missing in ansible-freeipa.

As of today, there is an issue in FreeIPA that does not allow clearing
'minlength' policy. The is is tracked by the FreeIPA project through
https://pagure.io/freeipa/issue/9297

Fixes https://bugzilla.redhat.com/show_bug.cgi?id=2150334
This commit is contained in:
Rafael Guterres Jeffman
2023-01-04 18:58:27 -03:00
parent 82e176af95
commit 410682a01d
3 changed files with 313 additions and 32 deletions

View File

@@ -121,7 +121,75 @@
register: result
failed_when: result.changed or result.failed
- name: Ensure presence of pwpolicies for group ops
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
minlife: 7
maxlife: 49
history: 5
priority: 1
lockouttime: 300
minlength: 8
minclasses: 5
maxfail: 3
failinterval: 5
- name: Ensure policies are cleared
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
minlife: ""
maxlife: ""
history: ""
# priority: ""
lockouttime: ""
minclasses: ""
maxfail: ""
failinterval: ""
register: result
failed_when: not result.changed or result.failed
- name: Ensure policies are cleared, again
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
minlife: ""
maxlife: ""
history: ""
# priority: ""
lockouttime: ""
minclasses: ""
maxfail: ""
failinterval: ""
register: result
failed_when: result.changed or result.failed
- name: Ensure minlength is not cleared due to FreeIPA issue
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
minlength: ""
register: result
failed_when: result.changed or (result.failed and "int() argument must be a string, a bytes-like object" not in result.msg)
when: ipa_version is version("4.9", ">=")
- name: Ensure minlength is not cleared due to FreeIPA issue
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
minlength: ""
register: result
failed_when: not result.changed or result.failed
when: ipa_version is version("4.7", "<")
- name: Execute tests if ipa_version >= 4.9.0
when: ipa_version is version("4.9", ">=")
block:
- name: Ensure maxrepeat of 2 for global_policy
ipapwpolicy:
@@ -171,6 +239,13 @@
register: result
failed_when: not result.changed or result.failed
- name: Ensure usercheck and dictcheck have known values
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
dictcheck: false
usercheck: false
- name: Ensure dictcheck is set for global_policy
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
@@ -219,9 +294,26 @@
register: result
failed_when: not result.changed or result.failed
when: ipa_version is version("4.9", ">=")
- name: Ensure usercheck and dictcheck are cleared for global_policy
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
dictcheck: ""
usercheck: ""
register: result
failed_when: not result.changed or result.failed
- name: Ensure usercheck and dictcheck are cleared for global_policy, again
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
dictcheck: ""
usercheck: ""
register: result
failed_when: result.changed or result.failed
- name: Execute tests if ipa_version >= 4.9.10
when: ipa_version is version("4.9.10", ">=")
block:
- name: Ensure grace limit is set to 10 for global_policy
ipapwpolicy:
@@ -255,6 +347,22 @@
register: result
failed_when: not result.changed or result.failed
- name: Ensure grace limit is cleared for global_policy
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
gracelimit: ""
register: result
failed_when: not result.changed or result.failed
- name: Ensure grace limit is cleared for global_policy, again
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
gracelimit: ""
register: result
failed_when: result.changed or result.failed
- name: Ensure grace limit is not set to -2 for global_policy
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
@@ -262,5 +370,3 @@
gracelimit: -2
register: result
failed_when: not result.failed and "must be at least -1" not in result.msg
when: ipa_version is version("4.9.10", ">=")

View File

@@ -0,0 +1,134 @@
---
- name: Test pwpolicy invalid data types
hosts: "{{ ipa_test_host | default('ipaserver') }}"
become: true
gather_facts: false
tasks:
- name: Setup FreeIPA test facts.
ansible.builtin.import_tasks: ../env_freeipa_facts.yml
- name: Ensure presence of group ops
ipagroup:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
state: present
- name: Ensure invalid values raise proper error for argument minlife
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
minlife: "error"
register: result
failed_when: result.changed or (result.failed and "Invalid value 'error' for argument 'minlife'" not in result.msg)
- name: Ensure invalid values raise proper error for argument maxlife
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
maxlife: "error"
register: result
failed_when: result.changed or (result.failed and "Invalid value 'error' for argument 'maxlife'" not in result.msg)
- name: Ensure invalid values raise proper error for argument history
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
history: "error"
register: result
failed_when: result.changed or (result.failed and "Invalid value 'error' for argument 'history'" not in result.msg)
- name: Ensure invalid values raise proper error for argument priority
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
priority: "error"
register: result
failed_when: result.changed or (result.failed and "Invalid value 'error' for argument 'priority'" not in result.msg)
- name: Ensure invalid values raise proper error for argument lockouttime
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
lockouttime: "error"
register: result
failed_when: result.changed or (result.failed and "Invalid value 'error' for argument 'lockouttime'" not in result.msg)
- name: Ensure invalid values raise proper error for argument minlength
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
minlength: "error"
register: result
failed_when: result.changed or (result.failed and "Invalid value 'error' for argument 'minlength'" not in result.msg)
- name: Ensure invalid values raise proper error for argument minclasses
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
minclasses: "error"
register: result
failed_when: result.changed or (result.failed and "Invalid value 'error' for argument 'minclasses'" not in result.msg)
- name: Ensure invalid values raise proper error for argument maxfail
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
maxfail: "error"
register: result
failed_when: result.changed or (result.failed and "Invalid value 'error' for argument 'maxfail'" not in result.msg)
- name: Ensure invalid values raise proper error for argument failinterval
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
failinterval: "error"
register: result
failed_when: result.changed or (result.failed and "Invalid value 'error' for argument 'failinterval'" not in result.msg)
- name: Ensure invalid values for dictcheck raise proper error.
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
dictcheck: "error"
register: result
failed_when: result.changed or (result.failed and "Invalid value 'error' for argument 'dictcheck" not in result.msg)
when: ipa_version is version("4.9", ">=")
- name: Ensure invalid values for usercheck raise proper error.
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
usercheck: "error"
register: result
failed_when: result.changed or (result.failed and "Invalid value 'error' for argument 'usercheck'" not in result.msg)
when: ipa_version is version("4.9", ">=")
- name: Ensure invalid values for gracelimit raise proper error.
ipapwpolicy:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
gracelimit: "error"
register: result
failed_when: result.changed or (result.failed and "Invalid value 'error' for argument 'gracelimit'" not in result.msg)
when: ipa_version is version("4.9.10", ">=")
- name: Ensure absence of group ops
ipagroup:
ipaadmin_password: SomeADMINpassword
ipaapi_context: "{{ ipa_context | default(omit) }}"
name: ops
state: absent