
    Vh5                    t   d dl mZ d dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZmZ d dlmZ dZd	Z	 d dlZd dlZd d
lmZmZ 	 d dlmZ dZ e       Z dgZ!dZ"e"ejF                  dfdZ$ddZ% G d de&      Z' G d de'      Z(ddZ)ddZ*y# e$ r	 d dlmZ Y Ow xY w# e$ rZeZY dZ[]dZ[ww xY w)    )annotationsN)
namedtuple)	constants)AnsibleErrorAnsibleAssertionError)	text_type)to_textto_bytes)DisplayF)
HasRawSaltPrefixWrapper)bcrypt64T
do_encrypt   c                    t        t              st        dt              d      |t	        j
                         nt	        j                  |      dj                  fdt        |       D              S )a  Return a random password string of length containing only chars

    :kwarg length: The number of characters in the new password.  Defaults to 20.
    :kwarg chars: The characters to choose from.  The default is all ascii
        letters, ascii digits, and these symbols ``.,:-_``
    z (z) is not a text_type c              3  @   K   | ]  }j                          y wN)choice).0dummycharsrandom_generators     E/home/dcms/DCMS/lib/python3.12/site-packages/ansible/utils/encrypt.py	<genexpr>z"random_password.<locals>.<genexpr>5   s     Nu$++E2Ns   )	
isinstancer   r   typerandomSystemRandomRandomjoinrange)lengthr   seedr   s    ` @r   random_passwordr%   '   s`     eY'#E4PU;$WXX|!..0!==.88NfNNN    c                d    t         j                  t         j                  z   dz   }t        | |      S )zhReturn a text string suitable for use as a salt for the hash functions we use to encrypt passwords.
    z./)r#   r   )stringascii_lettersdigitsr%   )r#   
salt_charss     r   random_saltr,   8   s*    
 %%5=J&
;;r&   c            
          e Zd Z edg d      Z eddddd       eddd	d
d       eddddd       eddddd      dZd Zy)BaseHashalgo)crypt_id	salt_sizeimplicit_rounds
salt_exactimplicit_ident1   NF2b      T5   i) 6i
 )	md5_cryptbcryptsha256_cryptsha512_cryptc                    || _         y r   )	algorithm)selfrB   s     r   __init__zBaseHash.__init__J   s	    "r&   )__name__
__module____qualname__r   r/   
algorithmsrD    r&   r   r.   r.   A   sc    fjkD3!TV[lpqBSWhlmcR\arvwcR\arvw	J#r&   r.   c                  >     e Zd Z fdZddZd Zd Zd Zd Z xZ	S )PasslibHashc                   t         t        |   |       t        st	        d|z  t
              t        j                  d|z         	 t        t        j                  |      | _        y # t        $ r t	        d|z        w xY w)Nz6passlib must be installed and usable to hash with '%s'orig_excz%Using passlib to hash input with '%s'z'passlib does not support '%s' algorithm)superrK   rD   PASSLIB_AVAILABLEr   	PASSLIB_Edisplayvvgetattrpasslibhash
crypt_algo	Exception)rC   rB   	__class__s     r   rD   zPasslibHash.__init__O   sv    k4))4 WZccnwxx

:YFG	V%gllI>DO 	VH9TUU	Vs   A( (B c                    | j                  |      }| j                  |      }| j                  |      }| j                  |||||      S )Nsaltr1   roundsident)_clean_salt_clean_rounds_clean_ident_hash)rC   secretr\   r1   r]   r^   s         r   rV   zPasslibHash.hash[   sL    %##F+!!%(zz&tyW\z]]r&   c                    d }|sI| j                   | j                  v r/| j                  j                  | j                         j                  S |S | j                   dk(  r|S |S )Nr>   )rB   rH   getr4   )rC   r^   rets      r   ra   zPasslibHash._clean_identa   sT    ~~0**4>>:IIIJ>>X%L
r&   c                "   |sy t        t        | j                  t              r| j                  j                  n| j                  t
              rt        |dd      }nt        |dd      }| j                  dk(  rt        j                  |      }|S )Nasciistrict)encodingerrorsr>   )
issubclassr   rW   r   wrappedr   r
   r	   rB   r   repair_unused)rC   r\   rf   s      r   r_   zPasslibHash._clean_saltk   sr    :doo}3]//cgcrcrt~4'(CC$BC >>X%((-C
r&   c                    | j                   j                  | j                        }|r|S |r|j                  r|j                  S y r   )rH   re   rB   r2   )rC   r]   	algo_datas      r   r`   zPasslibHash._clean_roundsy   s>    OO''7	M944 ,,,r&   c                   i }|r||d<   |r||d<   |r||d<   |r||d<   	 t        | j                  d      r, | j                  j                  di |j                  |      }nPt        | j                  d      r | j                  j                  |fi |}nt        dt        j                  z        |st        d
| j                  z        t        |d      S # t        $ r}t        d|	      d }~ww xY w)Nr\   r1   r]   r^   rV   encryptz*installed passlib version %s not supportedzCould not hash the secret.rM   z"failed to hash with algorithm '%s'ri   )rk   rI   )hasattrrW   usingrV   rr   r   rU   __version__
ValueErrorrB   r	   )	rC   rc   r\   r1   r]   r^   settingsresultes	            r   rb   zPasslibHash._hash   s    #HV$-H[!!'HX %HW	It/...::??G)4000D8D"#ORYReRe#eff CdnnTUU vh//  	I;aHH	Is   BC 	C4"C//C4NNNN)
rE   rF   rG   rD   rV   ra   r_   r`   rb   __classcell__)rY   s   @r   rK   rK   N   s#    
V^
"0r&   rK   c                R    t         j                  dd       t        | |||||      S )Nz9passlib_or_crypt API is deprecated in favor of do_encryptz2.20)versionr[   )rR   
deprecatedr   )rc   rB   r\   r1   r]   r^   s         r   passlib_or_cryptr      s.    R\bcfidiPV^cddr&   c                n    t         rt        |      j                  | ||||      S t        dt              )Nr[   z5Unable to encrypt nor hash, passlib must be installedrM   )rP   rK   rV   r   rQ   )rx   rr   r1   r\   r^   r]   s         r   r   r      s7    7#((diX^fk(ll
NYb
ccr&   )r6   rz   )+
__future__r   r   r(   collectionsr   ansibler   Cansible.errorsr   r   ansible.module_utils.sixr   +ansible.module_utils.common.text.convertersr	   r
   ansible.utils.displayr   rQ   rP   rU   passlib.hashpasslib.utils.handlersr   r   passlib.utils.binaryr   ImportErrorpasslib.utilsrX   ry   rR   __all__DEFAULT_PASSWORD_LENGTHDEFAULT_PASSWORD_CHARSr%   r,   objectr.   rK   r   r   rI   r&   r   <module>r      s    #   " " > . I )	 
@+1 
 ).  3!:R:RY] O"<
#v 
#Y0( Y0xe
dm  +*+  Is;   B& B B& B# B& "B##B& &B7+B22B7