o nnh5 @sZddlmZddlZddlZddlmZddlmZddl m Z m Z ddl m Z ddlmZmZddlmZdZd Zz,ddlZddlZdd lmZmZzdd lmZWneybdd lmZYnwd ZWneyzZzeZWYdZ[ndZ[wweZ d gZ!dZ"e"ej#dfddZ$dddZ%Gddde&Z'Gddde'Z(dddZ)ddd Z*dS)) annotationsN) namedtuple) constants) AnsibleErrorAnsibleAssertionError) text_type)to_textto_bytes)DisplayF) HasRawSalt PrefixWrapper)bcrypt64T do_encryptcsXttstdtf|durtnt|dfddt|DS)aReturn 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%s (%s) is not a text_typeNc3s|]}VqdSN)choice).0dummycharsrandom_generator@/usr/local/lib/python3.10/dist-packages/ansible/utils/encrypt.py 5sz"random_password..) isinstancerrtyperandom SystemRandomRandomjoinrange)lengthrseedrrrrandom_password's   r$cCstjtjd}t||dS)zhReturn a text string suitable for use as a salt for the hash functions we use to encrypt passwords. z./)r"r)string ascii_lettersdigitsr$)r" salt_charsrrr random_salt8s r*c @sheZdZedgdZeddddddeddd d dded d d dddedd dddddZddZdS)BaseHashalgo)crypt_id salt_sizeimplicit_rounds salt_exactimplicit_ident1r%NF2b T5i)6i ) md5_cryptbcrypt sha256_crypt sha512_cryptcCs ||_dSr) algorithmselfr=rrr__init__Js zBaseHash.__init__)__name__ __module__ __qualname__rr, algorithmsr@rrrrr+As r+csFeZdZfddZdddZddZdd Zd d Zd d ZZ S) PasslibHashcsbtt||tstd|tdtd|z tt j ||_ WdSt y0td|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) superrEr@PASSLIB_AVAILABLEr PASSLIB_Edisplayvvgetattrpasslibhash crypt_algo Exceptionr> __class__rrr@Os  zPasslibHash.__init__NcCs2||}||}||}|j|||||dS)Nsaltr.roundsident) _clean_salt _clean_rounds _clean_ident_hash)r?secretrUr.rVrWrrrrO[s   zPasslibHash.hashcCs:d}|s|j|jvr|j|jjS|S|jdkr|S|S)Nr:)r=rDgetr1)r?rWretrrrrZas  zPasslibHash._clean_identcCs^|sdStt|jtr|jjn|jtrt|ddd}nt|ddd}|jdkr-t |}|S)Nasciistrict)encodingerrorsr:) issubclassrrPr wrappedr r rr=r repair_unused)r?rUr^rrrrXks   zPasslibHash._clean_saltcCs*|j|j}|r |S|r|jr|jSdSr)rDr]r=r/)r?rV algo_datarrrrYys  zPasslibHash._clean_roundsc Csi}|r||d<|r||d<|r||d<|r||d<z-t|jdr.|jjd i||}nt|jdr?|jj|fi|}ntdtjWntyY}ztd|d d}~ww|sctd |j t |d d S)NrUr.rVrWrOencryptz*installed passlib version %s not supportedzCould not hash the secret.rFz"failed to hash with algorithm '%s'r`)rbr) hasattrrPusingrOrgrrN __version__ ValueErrorr=r) r?r\rUr.rVrWsettingsresulterrrr[s.    zPasslibHash._hashNNNN) rArBrCr@rOrZrXrYr[ __classcell__rrrRrrENs    rEcCs"tjdddt||||||dS)Nz9passlib_or_crypt API is deprecated in favor of do_encryptz2.20)versionrT)rK deprecatedr)r\r=rUr.rVrWrrrpasslib_or_cryptsrscCs(trt|j|||||dStdtd)NrTz5Unable to encrypt nor hash, passlib must be installedrF)rIrErOrrJ)rmrgr.rUrWrVrrrrs )r%ro)+ __future__rrr& collectionsransiblerCansible.errorsrransible.module_utils.sixr+ansible.module_utils.common.text.convertersrr ansible.utils.displayr rJrIrN passlib.hashpasslib.utils.handlersr r passlib.utils.binaryr ImportError passlib.utilsrQrnrK__all__DEFAULT_PASSWORD_LENGTHDEFAULT_PASSWORD_CHARSr$r*objectr+rErsrrrrrsD         \