
    Vh?                     |    d dl mZmZmZ eZdZdZdZd dl	m
Z
mZmZmZmZmZ d dlmZ d dlZd Zed	k(  r e        yy)
    )absolute_importdivisionprint_functionat  
module: keycloak_user
short_description: Create and configure a user in Keycloak
description:
  - This module creates, removes, or updates Keycloak users.
version_added: 7.1.0
options:
  auth_username:
    aliases: []
  realm:
    description:
      - The name of the realm in which is the client.
    default: master
    type: str
  username:
    description:
      - Username for the user.
    required: true
    type: str
  id:
    description:
      - ID of the user on the Keycloak server if known.
    type: str
  enabled:
    description:
      - Enabled user.
    type: bool
  email_verified:
    description:
      - Check the validity of user email.
    default: false
    type: bool
    aliases:
      - emailVerified
  first_name:
    description:
      - The user's first name.
    required: false
    type: str
    aliases:
      - firstName
  last_name:
    description:
      - The user's last name.
    required: false
    type: str
    aliases:
      - lastName
  email:
    description:
      - User email.
    required: false
    type: str
  federation_link:
    description:
      - Federation Link.
    required: false
    type: str
    aliases:
      - federationLink
  service_account_client_id:
    description:
      - Description of the client Application.
    required: false
    type: str
    aliases:
      - serviceAccountClientId
  client_consents:
    description:
      - Client Authenticator Type.
    type: list
    elements: dict
    default: []
    aliases:
      - clientConsents
    suboptions:
      client_id:
        description:
          - Client ID of the client role. Not the technical ID of the client.
        type: str
        required: true
        aliases:
          - clientId
      roles:
        description:
          - List of client roles to assign to the user.
        type: list
        required: true
        elements: str
  groups:
    description:
      - List of groups for the user.
        Groups can be referenced by their name, like V(staff), or their path, like V(/staff/engineering).
        The path syntax allows you to reference subgroups, which is not possible otherwise.
        This is possible since community.general 10.6.0.
    type: list
    elements: dict
    default: []
    suboptions:
      name:
        description:
          - Name of the group.
        type: str
      state:
        description:
          - Control whether the user must be member of this group or not.
        choices: ["present", "absent"]
        default: present
        type: str
  credentials:
    description:
      - User credentials.
    default: []
    type: list
    elements: dict
    suboptions:
      type:
        description:
          - Credential type.
        type: str
        required: true
      value:
        description:
          - Value of the credential.
        type: str
        required: true
      temporary:
        description:
          - If V(true), the users are required to reset their credentials at next login.
        type: bool
        default: false
  required_actions:
    description:
      - RequiredActions user Auth.
    default: []
    type: list
    elements: str
    aliases:
      - requiredActions
  federated_identities:
    description:
      - List of IDPs of user.
    default: []
    type: list
    elements: str
    aliases:
      - federatedIdentities
  attributes:
    description:
      - List of user attributes.
    required: false
    type: list
    elements: dict
    suboptions:
      name:
        description:
          - Name of the attribute.
        type: str
      values:
        description:
          - Values for the attribute as list.
        type: list
        elements: str
      state:
        description:
          - Control whether the attribute must exists or not.
        choices: ["present", "absent"]
        default: present
        type: str
  access:
    description:
      - List user access.
    required: false
    type: dict
  disableable_credential_types:
    description:
      - List user Credential Type.
    default: []
    type: list
    elements: str
    aliases:
      - disableableCredentialTypes
  origin:
    description:
      - User origin.
    required: false
    type: str
  self:
    description:
      - User self administration.
    required: false
    type: str
  state:
    description:
      - Control whether the user should exists or not.
    choices: ["present", "absent"]
    default: present
    type: str
  force:
    description:
      - If V(true), allows to remove user and recreate it.
    type: bool
    default: false
extends_documentation_fragment:
  - community.general.keycloak
  - community.general.keycloak.actiongroup_keycloak
  - community.general.attributes
attributes:
  check_mode:
    support: full
  diff_mode:
    support: full
  action_group:
    version_added: 10.2.0
notes:
  - The module does not modify the user ID of an existing user.
author:
  - Philippe Gauthier (@elfelip)
ad  
- name: Create a user user1
  community.general.keycloak_user:
    auth_keycloak_url: http://localhost:8080/auth
    auth_username: admin
    auth_password: password
    realm: master
    username: user1
    firstName: user1
    lastName: user1
    email: user1
    enabled: true
    emailVerified: false
    credentials:
      - type: password
        value: password
        temporary: false
    attributes:
      - name: attr1
        values:
          - value1
        state: present
      - name: attr2
        values:
          - value2
        state: absent
    groups:
      - name: group1
        state: present
    state: present

- name: Re-create a User
  community.general.keycloak_user:
    auth_keycloak_url: http://localhost:8080/auth
    auth_username: admin
    auth_password: password
    realm: master
    username: user1
    firstName: user1
    lastName: user1
    email: user1
    enabled: true
    emailVerified: false
    credentials:
      - type: password
        value: password
        temporary: false
    attributes:
      - name: attr1
        values:
          - value1
        state: present
      - name: attr2
        values:
          - value2
        state: absent
    groups:
      - name: group1
        state: present
    state: present

- name: Re-create a User
  community.general.keycloak_user:
    auth_keycloak_url: http://localhost:8080/auth
    auth_username: admin
    auth_password: password
    realm: master
    username: user1
    firstName: user1
    lastName: user1
    email: user1
    enabled: true
    emailVerified: false
    credentials:
      - type: password
        value: password
        temporary: false
    attributes:
      - name: attr1
        values:
          - value1
        state: present
      - name: attr2
        values:
          - value2
        state: absent
    groups:
      - name: group1
        state: present
    state: present
    force: true

- name: Remove User
  community.general.keycloak_user:
    auth_keycloak_url: http://localhost:8080/auth
    auth_username: admin
    auth_password: password
    realm: master
    username: user1
    state: absent
a_  
msg:
  description: Message as to what action was taken.
  returned: always
  type: str
  sample: User f18c709c-03d6-11ee-970b-c74bf2721112 created
proposed:
  description: Representation of the proposed user.
  returned: on success
  type: dict
existing:
  description: Representation of the existing user.
  returned: on success
  type: dict
end_state:
  description: Representation of the user after module execution.
  returned: on success
  type: dict
changed:
  description: Return V(true) if the operation changed the user on the keycloak server, V(false) otherwise.
  returned: always
  type: bool
)KeycloakAPIcamelkeycloak_argument_spec	get_tokenKeycloakErroris_struct_included)AnsibleModuleNc                     t               } g | d   d<   t        t        dd      t        dd      t        dd      	      }t        t        ddd
g      t        ddd            }t        t        d      t        dd      t        dddgd            }t        t        d      t        dddgd            }t        d[i dt        dd      dt        d      dt        d      dt        dd      dt        ddg      dt        ddg      d t        d      d!t        d      d"t        ddd#g$      d%t        dd&g      d't        dd(g      d)t        dd*|+      d,t        d*      d-t        dg d*|.      d/t        dg d0gd1      d2t        dg d3gd1      d4t        dg d*|.      d5t        dg d6gd1      d7t        dg d8gd*|9      d:t        d      d;t        ddgd<      d=t        dd      }| j                  |       t        | dg d>gg d?gd@dAiB      }t        ddCi i i i D      }	 t	        |j
                        }t        |      }
|j
                  j                  d      }|j
                  j                  d;      }|j
                  j                  d=      }|j
                  j                  d      }|j
                  j                  d-      }|j
                  D cg c]G  }|t        t               j                               g dFz   vr|j
                  j                  |      |I }}|
j                  ||G      }|i }i }|D ]  }|j
                  j                  |      }|d)k(  r||v r|
j                  |d)   H      }n||v r||   nd }||k7  sN|J|d)k(  rE|D ]@  }d}|D ]  }|dI   |dI   k(  sd} |r|j                  t!        j"                  |             B t%        |t              r"t!        j"                  |      |t'        |      <   ||t'        |      <    t!        j"                  |      }|j                  |       ||dJ<   ||dK<   d}|dk(  rf|s?|j(                  rt        dCdCL      |dM<   d|dN<   i |dO<   dP|dQ<    |j*                  d[i | n7|
j-                  |d   |R       dS|d   z  |dQ<   d}ni }|r|r|
j-                  |d   |R       |r|rwd}||j                  dTE       |j(                  rt        dC|L      |dM<   |j.                  r |j*                  d[i | |
j1                  ||U      }dV|d   z  |dQ<   |d   |d<   n.g dW}|d   |d<   t3        |||      s|
j5                  ||U      }d}|
j7                  |||X      rd}|
j9                  |d   |R      |d-<   ||dO<   |rdY|d   z  |dQ<   ndZ|d   z  |dQ<   ||dN<    |j*                  d[i | y # t        $ r&}	|j                  t        |	      E       Y d }	~	d }	~	ww xY wc c}w )\Nauth_usernamealiasesstrT)typerequiredboolF)r   default)r   value	temporaryclientId)r   r   r   list)r   elementsr   )	client_idroles)r   )r   r   presentabsent)r   choicesr   )namevaluesstate)r   r!   realmmasterselfidusername
first_name	firstName)r   r   	last_namelastNameemailenabledemail_verifiedemailVerified)r   r   r   federation_linkfederationLinkservice_account_client_idserviceAccountClientId
attributesdict)r   r   optionsaccessgroups)r   r   r   r5   disableable_credential_typesdisableableCredentialTypes)r   r   r   r   required_actionsrequiredActionscredentialsfederated_identitiesfederatedIdentitiesclient_consentsclientConsents)r   r   r   r   r5   originr!   )r   r   force)token
auth_realmr   auth_password)rD   r   rE   refresh_tokenrD   )argument_specsupports_check_moderequired_one_ofrequired_togetherrequired_by )changedmsgdiffproposedexisting	end_state)rN   )r!   r"   rB   r7   )r&   r"   )r3   r   rP   rQ   )beforeafterrO   rM   rR   z#Role does not exist, doing nothing.rN   )user_idr"   zUser %s deletedz3username must be specified when creating a new user)userrepr"   zUser %s created)
r6   	notBeforecreatedTimestamptotpr<   r9   r7   r@   r>   r;   )rV   r7   r"   zUser %s updatedzNo changes made for user %s )r   r4   updater   r	   paramsr
   	fail_jsonr   r   getr   keysget_user_by_username4convert_keycloak_user_attributes_dict_to_module_listappendcopydeepcopy
isinstancer   _diff	exit_jsondelete_user
check_modecreate_userr   update_userupdate_user_groups_membershipget_user_groups)rG   credential_specclient_consents_specattributes_specgroups_spec	meta_argsmoduleresultconnection_headerekcr"   r!   rB   r&   r7   xuser_paramsbefore_user	changesetparamnew_param_value	old_valueold_attributeold_attribute_foundnew_attributedesired_userrM   
after_userexcludess                                 s/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/keycloak_user.pymainr   l  s#   *,M02M/"9-ut,-FE2O
  ED:,G> u%0	8'<iPO
 u	8'<iPK  x0u U 540	
 U[M: EJ<8  &! @QR %2B1CD #'E<T;U"V VfoN   fkR &*vrLhKity%z  62@Q?R]bc!" fb6?[#$ "vrDYCZejk%& &"?O>P[ak  A'( )* Hi0)D+, .-I0 #/3-f,g/_.`(7'F	F %Rb2VXYF%%fmm4 
V.	/BMMg&EMMg&EMMg&E}}  ,H]]x(F %mm 5t$:$<$A$A$CDGlll==$$Q'3  5K 5 ))85)IKI : --++E2L Uk%9OO[fgs[tOuI.3{.BE*Ii'$,)>%. MM*/')8 7(0M&4II26/7 /'..t}}]/KLM /40*.--*H	%,'*9	%,'%:( ==-L	""F:$F:G ||!%Rr!:v %F9"$F;AF5MF&v& NN;t#4ENB-Z1HIF5MG 
[NN;t#4ENBeG  %Z [||!%R|!Dv     *6*EJJ-j1IJF5M!+D!1L
#H "-T!2L '|[(K^^L^N
 ++LW\+]G!11,t:LTY1Z
8({-j1IJF5M9\*=UVF5MF9Fvw  %SV$$%5s   
X  AX>	X;X66X;__main__)
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLESRETURNUansible_collections.community.general.plugins.module_utils.identity.keycloak.keycloakr   r   r   r	   r
   r   ansible.module_utils.basicr   rc   r   __name__rZ       r   <module>r      sY    A @ZxdL
0I I 4 vr zF r   