
    Vh +                         d dl mZmZmZ eZdZdZdZd dl	Z
d dlZd dlmZ d dlmZ d dlmZ  G d	 d
e      Zd Zedk(  r e        yy)    )absolute_importdivisionprint_functiona'	  
module: pacman_key
author:
  - George Rawlinson (@grawlinson)
version_added: "3.2.0"
short_description: Manage pacman's list of trusted keys
description:
  - Add or remove gpg keys from the pacman keyring.
notes:
  - Use full-length key ID (40 characters).
  - Keys will be verified when using O(data), O(file), or O(url) unless O(verify) is overridden.
  - Keys will be locally signed after being imported into the keyring.
  - If the key ID exists in the keyring, the key will not be added unless O(force_update) is specified.
  - O(data), O(file), O(url), and O(keyserver) are mutually exclusive.
requirements:
  - gpg
  - pacman-key
extends_documentation_fragment:
  - community.general.attributes
attributes:
  check_mode:
    support: full
  diff_mode:
    support: none
options:
  id:
    description:
      - The 40 character identifier of the key.
      - Including this allows check mode to correctly report the changed state.
      - Do not specify a subkey ID, instead specify the primary key ID.
    required: true
    type: str
  data:
    description:
      - The keyfile contents to add to the keyring.
      - Must be of C(PGP PUBLIC KEY BLOCK) type.
    type: str
  file:
    description:
      - The path to a keyfile on the remote server to add to the keyring.
      - Remote file must be of C(PGP PUBLIC KEY BLOCK) type.
    type: path
  url:
    description:
      - The URL to retrieve keyfile from.
      - Remote file must be of C(PGP PUBLIC KEY BLOCK) type.
    type: str
  keyserver:
    description:
      - The keyserver used to retrieve key from.
    type: str
  verify:
    description:
      - Whether or not to verify the keyfile's key ID against specified key ID.
    type: bool
    default: true
  force_update:
    description:
      - This forces the key to be updated if it already exists in the keyring.
    type: bool
    default: false
  keyring:
    description:
      - The full path to the keyring folder on the remote server.
      - If not specified, module will use pacman's default (V(/etc/pacman.d/gnupg)).
      - Useful if the remote system requires an alternative gnupg directory.
    type: path
    default: /etc/pacman.d/gnupg
  state:
    description:
      - Ensures that the key is present (added) or absent (revoked).
    default: present
    choices: [absent, present]
    type: str
a  
- name: Import a key via local file
  community.general.pacman_key:
    id: 01234567890ABCDE01234567890ABCDE12345678
    data: "{{ lookup('file', 'keyfile.asc') }}"
    state: present

- name: Import a key via remote file
  community.general.pacman_key:
    id: 01234567890ABCDE01234567890ABCDE12345678
    file: /tmp/keyfile.asc
    state: present

- name: Import a key via url
  community.general.pacman_key:
    id: 01234567890ABCDE01234567890ABCDE12345678
    url: https://domain.tld/keys/keyfile.asc
    state: present

- name: Import a key via keyserver
  community.general.pacman_key:
    id: 01234567890ABCDE01234567890ABCDE12345678
    keyserver: keyserver.domain.tld

- name: Import a key into an alternative keyring
  community.general.pacman_key:
    id: 01234567890ABCDE01234567890ABCDE12345678
    file: /tmp/keyfile.asc
    keyring: /etc/pacman.d/gnupg-alternative

- name: Remove a key from the keyring
  community.general.pacman_key:
    id: 01234567890ABCDE01234567890ABCDE12345678
    state: absent
z # N)AnsibleModule)	fetch_url)	to_nativec                   N    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y)	PacmanKeyc                    || _         |j                  dd      | _        |j                  dd      | _        |j                  d   }|j                  d   }|j                  d   }|j                  d   }|j                  d	   }|j                  d
   }|j                  d   }|j                  d   }	|j                  d   }
d| _        | j                  |      }| j                  |	|      }|j                  rN|
dk(  r|xr |xs | }|j                  |       n+|
dk(  r&|r|j                  d       |j                  d       |
dk(  r|r|s|j                  d       |r8| j                  |      }| j                  |	|||       |j                  d       y |r'| j                  |	|||       |j                  d       y |rI| j                  |      }| j                  |      }| j                  |	|||       |j                  d       y |r&| j                  |	||       |j                  d       y y |
dk(  r9|r$| j                  |	|       |j                  d       |j                  d       y y )NgpgT)requiredz
pacman-keyidurldatafile	keyserververifyforce_updatekeyringstate(   present)changedabsentF)moduleget_bin_pathr   
pacman_keyparams	keylengthsanitise_keyidkey_in_keyring
check_mode	exit_jsonsave_keyadd_key	fetch_keyrecv_key
remove_key)selfr   keyidr   r   r   r   r   r   r   r   key_presentr   s                p/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/pacman_key.py__init__zPacmanKey.__init__   si   &&ut&< --lT-J d#mmE"}}V$}}V$MM+.	x(}}^4--	*g& ##E*))'59 	!&7<KO   1("$$T$2   /I<   /}}T*WdE6:   .WdE6:   .~~c*}}T*WdE6:   .gui8   .  h/   .U+	     c                 <    	 t        |d       y# t        $ r Y yw xY w)z,Check if a given string is valid hexadecimal   FT)int
ValueError)r)   strings     r,   is_hexadecimalzPacmanKey.is_hexadecimal   s)    	O   		s    	c                 P   |j                         j                         j                  dd      j                  dd      }t        |      | j                  k7  r| j
                  j                  d|z         | j                  |      s| j
                  j                  d|z         |S )zoSanitise given key ID.

        Strips whitespace, uppercases all characters, and strips leading `0X`.
          0Xzkey ID is not full-length: %smsgzkey ID is not hexadecimal: %s)stripupperreplacelenr   r   	fail_jsonr4   )r)   r*   sanitised_keyids      r,   r    zPacmanKey.sanitise_keyid   s    
  ++---/77R@HHrR4>>1KK!!&E&W!X""?3KK!!&E&W!Xr.   c                     t        | j                  |      \  }}|d   dk7  r%| j                  j                  d|d|d          t        |j	                               S )zDownloads a key from urlstatus   zfailed to fetch key at z, error was r:   r9   )r   r   r?   r   read)r)   r   responseinfos       r,   r&   zPacmanKey.fetch_key   sU    "4;;4$>S KK!!SVX\]bXc&d!e))r.   c                     | j                   d|d|d|g}| j                  j                  |d       | j                  ||       y)zReceives key via keyserver--gpgdirz--keyserverz--recv-keysTcheck_rcN)r   r   run_command	lsign_key)r)   r   r*   r   cmds        r,   r'   zPacmanKey.recv_key   s@    
G]I}^cdd3w&r.   c                 f    | j                   d|g}| j                  j                  |d|gz   d       y)zLocally sign keyrH   z--lsign-keyTrI   Nr   r   rK   r)   r   r*   rM   s       r,   rL   zPacmanKey.lsign_key   s3    
G4}e&< <tLr.   c                     t        j                         \  }}| j                  j                  |       t	        j
                  |d      }|j                  |       |j                          |S )z"Saves key data to a temporary filew)tempfilemkstempr   add_cleanup_fileosfdopenwriteclose)r)   r   tmpfdtmpnametmpfiles        r,   r$   zPacmanKey.save_key   sP    !))+w$$W-))E3'dr.   c                     |r| j                  ||       | j                  d|d|g}| j                  j                  |d       | j	                  ||       y)zAdd key to pacman's keyringrH   z--addTrI   N)verify_keyfiler   r   rK   rL   )r)   r   keyfiler*   r   rM   s         r,   r%   zPacmanKey.add_key   sN    /
GWgFd3w&r.   c                 `    | j                   d|d|g}| j                  j                  |d       y)z Remove key from pacman's keyringrH   z--deleteTrI   NrO   rP   s       r,   r(   zPacmanKey.remove_key   s-    
GZGd3r.   c           	         || j                   j                  d       n|| j                   j                  d       | j                   j                  | j                  ddddd	|gd
      \  }}}d}|j	                         D ])  }|j                  d      s|j                  d      d   } n ||k7  r#| j                   j                  d|d|       yy)z0Verify that keyfile matches the specified key IDNzexpected a key, got noner9   zexpected a key ID, got none--with-colonsz--with-fingerprint--batch--no-ttyz--show-keysTrI   zfpr::	   z key ID does not match. expected z, got )r   r?   rK   r   
splitlines
startswithsplit)r)   r_   r*   rcstdoutstderrextracted_keyidlines           r,   r^   zPacmanKey.verify_keyfile   s    ?KK!!&@!A]KK!!&C!D![[44$  5 
FF %%' 	Dv&"&**S/!"4	
 e#KK!!V[]l&m!n $r.   c           
          | j                   j                  | j                  ddddd|z  d|gd      \  }}}|d	k7  r4|j                  d
      d	k\  ry| j                   j	                  d|z         y)z*Check if the key ID is in pacman's keyringrb   rc   rd   z--no-default-keyringz--keyring=%s/pubring.gpgz--list-keysFrI   r   zNo public keyzgpg returned an error: %sr9   T)r   rK   r   findr?   )r)   r   r*   rj   rk   rl   s         r,   r!   zPacmanKey.key_in_keyring  s    ![[44&*W4u  5 
FF 7{{?+q0%%*E*N%Or.   N)__name__
__module____qualname__r-   r4   r    r&   r'   rL   r$   r%   r(   r^   r!    r.   r,   r
   r
      s<    7,r
*'M
'4
o:r.   r
   c                  "   t        t        t        dd      t        d      t        d      t        d      t        d      t        dd      t        dd      t        dd	      t        dd
dd
g      	      dddg      } t        |        y )NstrT)typer   )rw   pathbool)rw   defaultFz/etc/pacman.d/gnupgr   r   )rw   rz   choices)	r   r   r   r   r   r   r   r   r   )r   r   r   r   )r   r   r|   T)argument_specsupports_check_modemutually_exclusiverequired_if)r   dictr
   )r   s    r,   mainr   -  s    .5!6"% &VT2659f.CDE9x>ST

 !BUVF  fr.   __main__)
__future__r   r   r   rw   __metaclass__DOCUMENTATIONEXAMPLESRETURNos.pathrV   rS   ansible.module_utils.basicr   ansible.module_utils.urlsr   +ansible.module_utils.common.text.convertersr   objectr
   r   rq   rt   r.   r,   <module>r      sb    C BJX"H 
   4 / Af fR( zF r.   