
    Vh"Y                         d dl mZmZmZ eZdZdZdZd dl	m
Z
 d dlmZ d dlmZ d dlmZmZmZmZmZ  G d	 d
e      Zd Zd Zedk(  r e        yy)    )absolute_importdivisionprint_functiona  
module: gitlab_user
short_description: Creates/updates/deletes/blocks/unblocks GitLab Users
description:
  - When the user does not exist in GitLab, it will be created.
  - When the user exists and state=absent, the user will be deleted.
  - When the user exists and state=blocked, the user will be blocked.
  - When changes are made to user, the user will be updated.
notes:
  - From community.general 0.2.0 and onwards, name, email and password are optional while deleting the user.
author:
  - Werner Dijkerman (@dj-wasabi)
  - Guillaume Martinez (@Lunik)
  - Lennert Mertens (@LennertMertens)
  - Stef Graces (@stgrace)
requirements:
  - python-gitlab python module
  - administrator rights on the GitLab server
extends_documentation_fragment:
  - community.general.auth_basic
  - community.general.gitlab
  - community.general.attributes

attributes:
  check_mode:
    support: full
  diff_mode:
    support: none

options:
  name:
    description:
      - Name of the user you want to create.
      - Required only if O(state=present).
    type: str
  username:
    description:
      - The username of the user.
    required: true
    type: str
  password:
    description:
      - The password of the user.
      - GitLab server enforces minimum password length to 8, set this value with 8 or more characters.
    type: str
  reset_password:
    description:
      - Whether the user can change its password or not.
    default: false
    type: bool
    version_added: 3.3.0
  email:
    description:
      - The email that belongs to the user.
      - Required only if O(state=present).
    type: str
  sshkey_name:
    description:
      - The name of the SSH public key.
    type: str
  sshkey_file:
    description:
      - The SSH public key itself.
    type: str
  sshkey_expires_at:
    description:
      - The expiration date of the SSH public key in ISO 8601 format C(YYYY-MM-DDTHH:MM:SSZ).
      - This is only used when adding new SSH public keys.
    type: str
    version_added: 3.1.0
  group:
    description:
      - ID or Full path of parent group in the form of group/name.
      - Add user as a member to this group.
    type: str
  access_level:
    description:
      - The access level to the group.
      - The value V(master) is an alias for V(maintainer).
    default: guest
    type: str
    choices: ["guest", "reporter", "developer", "master", "maintainer", "owner"]
  state:
    description:
      - Create, delete or block a user.
    default: present
    type: str
    choices: ["present", "absent", "blocked", "unblocked"]
  confirm:
    description:
      - Require confirmation.
    type: bool
    default: true
  isadmin:
    description:
      - Grant admin privileges to the user.
    type: bool
    default: false
  external:
    description:
      - Define external parameter for this user.
    type: bool
    default: false
  identities:
    description:
      - List of identities to be added/updated for this user.
      - To remove all other identities from this user, set O(overwrite_identities=true).
    type: list
    elements: dict
    suboptions:
      provider:
        description:
          - The name of the external identity provider.
        type: str
      extern_uid:
        description:
          - User ID for external identity.
        type: str
    version_added: 3.3.0
  overwrite_identities:
    description:
      - Overwrite identities with identities added in this module.
      - This means that all identities that the user has and that are not listed in O(identities) are removed from the user.
      - This is only done if a list is provided for O(identities). To remove all identities, provide an empty list.
    type: bool
    default: false
    version_added: 3.3.0
a  
- name: "Delete GitLab User"
  community.general.gitlab_user:
    api_url: https://gitlab.example.com/
    api_token: "{{ access_token }}"
    username: myusername
    state: absent

- name: "Create GitLab User"
  community.general.gitlab_user:
    api_url: https://gitlab.example.com/
    validate_certs: true
    api_username: dj-wasabi
    api_password: "MySecretPassword"
    name: My Name
    username: myusername
    password: mysecretpassword
    email: me@example.com
    sshkey_name: MySSH
    sshkey_file: ssh-rsa AAAAB3NzaC1yc...
    state: present
    group: super_group/mon_group
    access_level: owner

- name: "Create GitLab User using external identity provider"
  community.general.gitlab_user:
    api_url: https://gitlab.example.com/
    validate_certs: true
    api_token: "{{ access_token }}"
    name: My Name
    username: myusername
    password: mysecretpassword
    email: me@example.com
    identities:
      - provider: Keycloak
        extern_uid: f278f95c-12c7-4d51-996f-758cc2eb11bc
    state: present
    group: super_group/mon_group
    access_level: owner

- name: "Block GitLab User"
  community.general.gitlab_user:
    api_url: https://gitlab.example.com/
    api_token: "{{ access_token }}"
    username: myusername
    state: blocked

- name: "Unblock GitLab User"
  community.general.gitlab_user:
    api_url: https://gitlab.example.com/
    api_token: "{{ access_token }}"
    username: myusername
    state: unblocked
a  
msg:
  description: Success or failure message.
  returned: always
  type: str
  sample: "Success"

result:
  description: JSON-parsed response from the server.
  returned: always
  type: dict

error:
  description: The error message returned by the GitLab API.
  returned: failed
  type: str
  sample: "400: path is already in use"

user:
  description: API object.
  returned: always
  type: dict
)basic_auth_argument_spec)AnsibleModule)	to_native)auth_argument_spec
find_groupgitlab_authenticationgitlablist_all_kwargsc                       e Zd Zd Z	 d Z	 d Z	 d Z	 d Z	 d Z	 d Z		 d Z
	 d	 Z	 d
 Z	 d Z	 ddZ	 d Z	 d Z	 d Z	 d Zd Zd Zd Zy)
GitLabUserc                 j   || _         || _        d | _        t        j                  j
                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  d| _
        y )N)guestreporter	developermaster
maintainerowner)_module_gitlabuser_objectr   constGUEST_ACCESSREPORTER_ACCESSDEVELOPER_ACCESSMAINTAINER_ACCESSOWNER_ACCESSACCESS_LEVEL)selfmodulegitlab_instances      q/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/gitlab_user.py__init__zGitLabUser.__init__   sp    &\\..4466ll44 ,,88\\..
    c                 B   d}d}| j                   7| j                  |d   ||d   |d   |d   |d    |d   |d   |d	   d
	      }d}n\| j                  | j                   d|d   id|d   i|d   ddd|d   id|d	   idd|d    id|d   id|d   id|d   id      \  }}d}|d   r*|d   r%| j                  ||d   |d   |d   d      }|xs |}|d   r| j	                  ||d   |d         }|xs |}|| _         |s|r'| j
                  j                  s	 |j                          |r7| j
                  j                  r | j
                  j                  dd|z         yy# t        $ r2}| j
                  j                  dt        |      z         Y d }~pd }~ww xY w)NFnamepasswordreset_passwordemailconfirmisadminexternal
identities)	r(   usernamer)   r*   r+   skip_confirmationadminr.   r/   Tvaluer2   )r3   setter)r(   r+   is_adminr.   r/   overwrite_identities)skip_reconfirmationr)   r*   r6   sshkey_namesshkey_filesshkey_expires_at)r(   file
expires_at
group_pathaccess_levelzFailed to update user: %s msg+Successfully created or updated the user %schangedr@   )r   create_userupdate_useradd_ssh_key_to_userassign_user_to_groupr   
check_modesave	Exception	fail_jsonr   	exit_json)	r!   r0   optionsrC   potentionally_changeduserkey_changedgroup_changedes	            r$   create_or_update_userz GitLabUser.create_or_update_user   sG    % ###$#J/")*:"; ))0);%; +#J/%l3
% 
D G ,,   %gfo6%ww'78 ")!3w! ")'**= >#*GL,A"B#( -49K5K+L!('**= >'.8H0I&J-4g>T6U,V#MGT@ %)! =!gm&<224..%&9::< =K ,G <  55dGL<QSZ[iSjkM.G,dll6M6MX		 ||&&&&t9fiq9q&r  X&&+G)TU,+V&WWXs   E# #	F,(FFc                      ||j                   S y N)idr!   rO   s     r$   get_user_idzGitLabUser.get_user_idL  s    77Nr&   c                 h    t        fd |j                  j                  di t        D              S )Nc              3   <   K   | ]  }|j                   k(    y wrU   )title).0kr8   s     r$   	<genexpr>z,GitLabUser.ssh_key_exists.<locals>.<genexpr>V  s"      
 GG{"
s    )anykeyslistr   )r!   rO   r8   s     `r$   ssh_key_existszGitLabUser.ssh_key_existsU  s/     
#TYY^^6o6
 
 	
r&   c                 j   | j                  ||d         sL| j                  j                  ry	 |d   |d   d}|d   |d   |d<   |j                  j	                  |       yy# t
        j                  j                  $ r2}| j                  j                  dt        |      z         Y d }~yd }~ww xY w)	Nr(   Tr;   )r[   keyr<   z#Failed to assign sshkey to user: %sr?   F)
rc   r   rH   ra   creater   
exceptionsGitlabCreateErrorrK   r   )r!   rO   sshkey	parameterrR   s        r$   rF   zGitLabUser.add_ssh_key_to_user_  s    ""48||&&	a#F^!&>	 ,'3.4\.BIl+		  +  $$66 a&&+PS\]^S_+_&``as   3A# #B2 (B--B2c                     	 |j                   j                  |      }|S # t        j                  j                  $ r Y y w xY wrU   )membersgetr   rg   GitlabGetErrorr!   groupuser_idmembers       r$   find_memberzGitLabUser.find_memberu  sB    	]]&&w/F    // 		s    ??c                 .    | j                  ||      }|d uS rU   )rs   ro   s       r$   member_existszGitLabUser.member_exists  s    !!%1T!!r&   c                 D    | j                  ||      }|j                  |k(  S rU   )rs   r>   )r!   rp   rq   r>   rr   s        r$   member_as_good_access_levelz&GitLabUser.member_as_good_access_level  s%    !!%1""l22r&   c                    t        | j                  |      }| j                  j                  ry|y| j	                  || j                  |            rq| j                  || j                  |            }| j                  ||j                  | j                  |         s%| j                  |   |_
        |j                          yy	 |j                  j                  | j                  |      | j                  |   d       y# t        j                  j                   $ r2}| j                  j#                  dt%        |      z         Y d }~yd }~ww xY w)NTF)rq   r>   z"Failed to assign user to group: %sr?   )r
   r   r   rH   ru   rX   rs   rw   rV   r    r>   rI   rl   rf   r   rg   rh   rK   r   )r!   rO   group_identifierr>   rp   rr   rR   s          r$   rG   zGitLabUser.assign_user_to_group  s1   4<<)9:<<""=eT%5%5d%;<%%eT-=-=d-CDF33E699dFWFWXdFef&*&7&7&E# `$$#//5$($5$5l$C&E F
  $$66 `&&+OR[\]R^+^&__`s   :C? ?E(E		Ec                 d   d}|j                         D ][  \  }}|d   }||dk(  r| j                  |||d   d         }-t        ||      |k7  s=t        ||j	                  d|      |       d}] |j                         D ]*  \  }}|d   }|t        ||j	                  d|      |       , ||fS )NFr3   r/   r6   r4   T)itemsadd_identitiesgetattrsetattrrm   )r!   rO   	argumentsuncheckable_argsrC   arg_key	arg_valueavs           r$   rE   zGitLabUser.update_user  s    "+//"3 		#GY7#B~l*"11$<LMc<del<mnGT7+r1D)--'"BBG"G		# #3"8"8": 	DGY7#B~immHg>C		D r&   c                 j   | j                   j                  ryd }d|v r|d   }|d= 	 | j                  j                  j	                  |      }|r| j                  ||       |S # t        j                  j                  $ r3}| j                   j                  dt        |      z         Y d }~S d }~ww xY w)NTr/   zFailed to create user: %s r?   )r   rH   r   usersrf   r|   r   rg   rh   rK   r   )r!   r   r/   rO   rR   s        r$   rD   zGitLabUser.create_user  s    <<""
9$"<0J,'	T<<%%,,Y7D##D*5
  !!33 	TLL""'CiPQl'R"SS	Ts   9A" "B2?(B--B2c                     d}|r| j                  ||      }|D ]Y  }||j                  vst        |d|d          t        |d|d          | j                  j                  s|j                          d}[ |S )NFprovider
extern_uidT)delete_identitiesr/   r~   r   rH   rI   )r!   rO   r/   r6   rC   identitys         r$   r|   zGitLabUser.add_identities  s{    ,,T:>G" 	Ht.j(:*>?lH\,BC||..IIK	 r&   c                     d}|j                   D ]=  }||vs| j                  j                  s|j                  j	                  |d          d}? |S )NFr   T)r/   r   rH   identityprovidersdelete)r!   rO   r/   rC   r   s        r$   r   zGitLabUser.delete_identities  sT     	Hz)||..**11(:2FG		
 r&   c                     t        fd | j                  j                  j                  ddit        D        d       S )Nc              3   @   K   | ]  }|j                   k(  r|  y wrU   )r0   )r\   rO   r0   s     r$   r^   z'GitLabUser.find_user.<locals>.<genexpr>  s%      ==H, s   searchr_   )nextr   r   rb   r   )r!   r0   s    `r$   	find_userzGitLabUser.find_user   sA    !8!3!3!8!8!\!\O!\ 
 	
r&   c                 :    | j                  |      }|r|| _        yy)NTF)r   r   r!   r0   rO   s      r$   exists_userzGitLabUser.exists_user  s!    ~~h'#Dr&   c                 H    | j                  |      }|j                  d   dk(  S )Nstateactive)r   
attributesr   s      r$   	is_activezGitLabUser.is_active  s$    ~~h'w'833r&   c                 h    | j                   j                  ry| j                  }|j                         S NT)r   rH   r   r   rW   s     r$   delete_userzGitLabUser.delete_user  s)    <<""{{}r&   c                 h    | j                   j                  ry| j                  }|j                         S r   )r   rH   r   blockrW   s     r$   
block_userzGitLabUser.block_user#  s)    <<""zz|r&   c                 h    | j                   j                  ry| j                  }|j                         S r   )r   rH   r   unblockrW   s     r$   unblock_userzGitLabUser.unblock_user+  s)    <<""||~r&   N)F)__name__
__module____qualname__r%   rS   rX   rc   rF   rs   ru   rw   rG   rE   rD   r|   r   r   r   r   r   r   r   r_   r&   r$   r   r      s    
N`

$"

3

2,&

4r&   r   c                 T    t        | j                               D ]  \  }}|	| |=  | S rU   )rb   r{   )r   re   r3   s      r$   sanitize_argumentsr   4  s5    9??,- 
U=# r&   c                     t               } | j                  t                      | j                  t        d7i dt        d      dt        ddg d      dt        dd	
      dt        dd	      dt        ddd      dt        d      dt        d      dt        dd      dt        dd      dt        d      dt        ddg d      dt        dd	      dt        dd      dt        dd      dt        dd       d!t        dd             t	        | d"d#gd"d$gd"d%gd#d$gd#d%ggd"d&ggg d'gd	ddddgff(      }t        |      }|j                  d   }|j                  d   }|j                  d   j                         }|j                  d   }|j                  d   }|j                  d   }|j                  d   }	|j                  d   }
|j                  d   }|j                  d   }|j                  d   }|j                  d   }|j                  d   }|j                  d   }|j                  d   }|j                  d!   }t        ||      }|j                  |      }|r|j                  |      }nd}|d)k(  r<|r'|j                          |j                  d	d*|z  +       n|j                  dd,+       |d-k(  r>|r)|r'|j                          |j                  d	d.|z  +       n|j                  dd/+       |d0k(  r>|r)|s'|j                          |j                  d	d1|z  +       n|j                  dd2+       |dk(  ry|j                  ||||||	|
||||||||d3      r,|j                  d	d4|z  |j                   j"                  5       y |j                  dd6|z  |j                   j"                  5       y y )8Nr(   str)typer   present)absentr   blocked	unblocked)r   defaultchoicesr0   T)r   requiredr)   )r   no_logr*   boolF)r   r   r   r+   r8   r9   r:   rp   r>   r   )r   r   r   r   r   r   r,   )r   r   r-   r.   r/   rb   dict)r   elementsr6   api_username	api_tokenapi_oauth_tokenapi_job_tokenapi_password)r   r   r   r   )argument_specmutually_exclusiverequired_togetherrequired_one_ofsupports_check_moderequired_ifr   zSuccessfully deleted user %srB   zUser deleted or does not existsr   zSuccessfully blocked user %sz'User already blocked or does not existsr   zSuccessfully unblocked user %sz&User is not blocked or does not exists)r(   r)   r*   r+   r8   r9   r:   r=   r>   r,   r-   r.   r/   r6   rA   )rC   r@   rO   zNo need to update the user %sr_   )r   updater	   r   r   r   paramslowerr   r   r   r   rL   r   r   rS   r   _attrs)r   r"   r#   	user_namer   user_usernameuser_passworduser_reset_password
user_emailuser_sshkey_nameuser_sshkey_fileuser_sshkey_expires_atr=   r>   r,   user_isadminuser_externaluser_identitiesr6   gitlab_useruser_existsuser_is_actives                         r$   mainr   ;  sw   ,.M+-. uy:gh 540 5.	
 uE  e$ eE2 E%8  ug  @C  D &$/ &%0 651 Vf5  "vu=! & #[)./_-+,/*
 ^,
 N
 !i&'!23
!F, ,F3Of%IMM'"EMM*-335MMM*-M --(89w'J}}]3}}]3#]]+>?w'J==0LmmI&G==+LMM*-MmmL1O!==)?@V_5K))-8K$..}=##%T/MP]/]^U0QR	>""$T/MP]/]^U0YZ~$$&T/OR_/_`U0XY	,,]%1++!7$(#%)$8=
   T/\_l/ls~  tK  tK  tR  tR  SU0OR_0_fqf}f}  gE  gE  F' r&   __main__N)
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLESRETURNansible.module_utils.apir   ansible.module_utils.basicr   +ansible.module_utils.common.text.convertersr   Aansible_collections.community.general.plugins.module_utils.gitlabr	   r
   r   r   r   objectr   r   r   r   r_   r&   r$   <module>r      sp    A @B5n
2 > 4 A 
J JZ
nFb zF r&   