o
    5Îh2# ã                   @   sŠ  d Z ddlmZ ddlmZ erddlmZ nddlmZ ddlZddl	m
Z
 ddlZe e¡ZddlZddlZddlmZ ddlmZmZ dd	lmZmZ dd
lmZmZ ddlmZmZmZmZm Z m!Z! ddl"m#  m$Z% ddl&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z.m/Z0m1Z2m3Z3 ej4 5ej4 6e7¡¡Z8dd„ Z9G dd„ de'ƒZ:ddl;Z;ddl<Z<G dd„ de%j=ƒZ>G dd„ de%j=ƒZ?G dd„ de'ƒZ@dS )ztests for passlib.contexté    )Úwith_statement)ÚPY3)ÚNoSectionErrorN)Úpartial)Úhash)ÚCryptContextÚLazyCryptContext)ÚPasslibConfigWarningÚPasslibHashWarning)ÚtickÚ
to_unicode)ÚirangeÚuÚunicodeÚstr_to_uasciiÚPY2ÚPY26)ÚTestCaseÚset_fileÚTICK_RESOLUTIONÚ
quicksleepÚ	time_callÚhandler_derived_from)Úregister_crypt_handler_pathÚ_has_crypt_handlerÚ_unload_handler_nameÚget_crypt_handlerc                 O   s.   |   ¡ }|D ]}| |¡ q|r| |¡ |S ©N)ÚcopyÚupdate)ÚfirstÚargsÚkwdsÚtargetÚarg© r%   ún/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/passlib/tests/test_context.pyÚmerge_dicts&   s   
r'   c                       sl  e Zd ZdZg d¢Zdd„ eD ƒZeeddddd	d
dZeeedZ	e
dƒZe
dƒZej ed¡Ze e
dƒe
dƒ¡Zej ed¡Ze e
dƒe
dƒ¡ d¡Zej ed¡Z	 edddddZdZeeeƒZeddZeeeƒZeg d ¢d!gd"d#d$d%d&d'd&d(d)d*Z‡ fd+d,„Zd-d.„ Z d/d0„ Z!d1d2„ Z"d3d4„ Z#d5d6„ Z$d7d8„ Z%d9d:„ Z&d;d<„ Z'd=d>„ Z(d?d@„ Z)dAdB„ Z*dCdD„ Z+dEdF„ Z,d}dHdI„Z-dJdK„ Z.dLdM„ Z/dNdO„ Z0dPdQ„ Z1dRdS„ Z2dTdU„ Z3dGi fdGdVd!ifdWi fdXi fgZ4dYdZ„ Z5d[d\„ Z6d]d^„ Z7d_d`„ Z8d~dadb„Z9dcdd„ Z:dedf„ Z;dgdh„ Z<didj„ Z=dkdl„ Z>dmdn„ Z?dodp„ Z@dqdr„ ZAdsdt„ ZBdudv„ ZCdwdx„ ZDdydz„ ZEd{d|„ ZF‡  ZGS )ÚCryptContextTestr   )Ú	des_cryptÚ	md5_cryptÚ
bsdi_cryptÚsha512_cryptc                 C   s   g | ]}t |ƒ‘qS r%   )r   ©Ú.0Únamer%   r%   r&   Ú
<listcomp>?   s    zCryptContextTest.<listcomp>r*   çš™™™™™¹?i1u  i©a  iPÃ  é@œ  )ÚschemesÚdefaultÚall__vary_roundsÚbsdi_crypt__max_roundsÚbsdi_crypt__default_roundsÚsha512_crypt__max_roundsÚsha512_crypt__min_rounds©r3   a  [passlib]
schemes = des_crypt, md5_crypt, bsdi_crypt, sha512_crypt
default = md5_crypt
; this is using %...
all__vary_rounds = 10%%
bsdi_crypt__default_rounds = 25001
bsdi_crypt__max_rounds = 30001
sha512_crypt__max_rounds = 50000
sha512_crypt__min_rounds = 40000
zó[passlib]
schemes = des_crypt, md5_crypt, bsdi_crypt, sha512_crypt
default = md5_crypt
all__vary_rounds = 0.1
bsdi_crypt__default_rounds = 25001
bsdi_crypt__max_rounds = 30001
sha512_crypt__max_rounds = 50000
sha512_crypt__min_rounds = 40000

zsample1.cfgÚ
z
zsample1b.cfgú	[passlib]z
[mypolicy]úutf-16zsample1c.cfgFiIq  i¹ˆ  iy  iÈ¯  )Úbsdi_crypt__min_roundsr6   r7   r9   zŒ[passlib]
bsdi_crypt__min_rounds = 29001
bsdi_crypt__max_rounds = 35001
bsdi_crypt__default_rounds = 31001
sha512_crypt__min_rounds = 45000
r,   ©r4   )r)   r*   Úphpassr+   Úsha256_cryptr)   rA   é   é   r   é¸  éÐ  ÚHé   )r3   Ú
deprecatedr4   r6   r7   Úbsdi_crypt__vary_roundsÚsha256_crypt__max_roundsÚsha256_crypt__min_roundsÚsha256_crypt__default_roundsÚphpass__identÚphpass__default_roundsc                    s*   t t| ƒ ¡  t dd¡ t dd¡ d S )NÚignorez The 'all' scheme is deprecated.*z4.*'scheme' keyword is deprecated as of Passlib 1.7.*)Úsuperr(   ÚsetUpÚwarningsÚfilterwarnings©Úself©Ú	__class__r%   r&   rQ   ²   s   zCryptContextTest.setUpc                 C   sÂ   t ƒ }|  | ¡ i ¡ t di | j¤Ž}|  | ¡ | j¡ t di | j¤Ž}|  | ¡ | j¡ t di | j¤Ž}|  | ¡ | j¡ t di | j¤Ž}|  | ¡ | j¡ t tdƒgd}|  | ¡ d¡ dS )ztest class constructorrA   r:   )rA   Nr%   )	r   ÚassertEqualÚto_dictÚsample_1_dictÚsample_1_resolved_dictÚsample_2_dictÚsample_3_dictr   r3   ©rU   Úctxr%   r%   r&   Útest_01_constructorº   s   z$CryptContextTest.test_01_constructorc                 C   sÌ   t  | j¡}|  | ¡ | j¡ t  | j¡}|  | ¡ | j¡ t  | j d¡¡}|  | ¡ | j¡ t  | j¡}|  | ¡ | j¡ t j| j	ddd}|  | ¡ | j¡ |  
tt jd¡ | j
tt j| jdd dS )ztest from_string() constructorúutf-8Úmypolicyr=   ©ÚsectionÚencodingNÚfakesection©rd   )r   Úfrom_stringÚsample_1_unicoderX   rY   rZ   Úsample_1_unnormalizedÚencodeÚsample_1b_unicodeÚsample_1c_bytesÚassertRaisesÚ	TypeErrorr   r^   r%   r%   r&   Útest_02_from_stringÕ   s    
ÿ

ÿz$CryptContextTest.test_02_from_stringc                 C   s°   t j | j¡std| j ƒ‚t | j¡}|  | ¡ | j	¡ t | j
¡}|  | ¡ | j	¡ tj| jddd}|  | ¡ | j	¡ |  ttjt j td¡¡ | jttj| jdd dS )	ztest from_path() constructorzcan't find data file: %rrb   r=   rc   zsample1xxx.cfgrf   rg   N)ÚosÚpathÚexistsÚsample_1_pathÚRuntimeErrorr   Ú	from_pathrX   rY   rZ   Úsample_1b_pathÚsample_1c_pathrn   ÚEnvironmentErrorÚjoinÚherer   r^   r%   r%   r&   Útest_03_from_pathó   s    
ÿ
ÿ

ÿz"CryptContextTest.test_03_from_pathc                 C   s  t di | j¤Ž}|jdi | j¤Ž}|  | ¡ | j¡ |  | ¡ | j¡ |jdi | j¤Ž}|  | ¡ | j¡ |  | ¡ | j¡ |jdi | j¤Ž}|  | ¡ | j¡ | ¡ }|  	||¡ |  | ¡ | j¡ |  | ¡ | j¡ |j
di | j¤Ž |  | ¡ | j¡ |  | ¡ | j¡ dS )ztest copy() methodNr%   )r   rZ   r   r\   rX   rY   Úsample_12_dictr]   Úsample_123_dictÚassertIsNotr   )rU   Úcc1Úcc2Úcc2bÚcc3Úcc4r%   r%   r&   Útest_04_copy  s    zCryptContextTest.test_04_copyc                 C   s$   t di | j¤Ž}|  t|ƒd¡ dS )ztest repr()z!^<CryptContext at 0x-?[0-9a-f]+>$Nr%   )r   rZ   ÚassertRegexÚrepr)rU   r€   r%   r%   r&   Útest_09_repr+  s   zCryptContextTest.test_09_reprc                 C   sÚ   t ƒ }| | j¡ |  | ¡ | j¡ | | j¡ |  | ¡ | j¡ | | j d¡¡ |  | ¡ | j¡ |  t|jd¡ t di | j¤Ž}|ji dd |  | ¡ | j¡ t ƒ }| | j¡ | | j	¡ |  | ¡ | j	¡ dS )z test load() / load_path() methodra   NT)r   r%   )
r   ÚloadrZ   rX   rY   ri   rk   rn   ro   r\   r^   r%   r%   r&   Útest_10_load4  s   
zCryptContextTest.test_10_loadc                 C   s„   t ddgddd}| ¡ }| jt|jdd |  | ¡ |¡ | jt|jdd |  | ¡ |¡ | jt|jd	d
 |  | ¡ |¡ dS )z$test load() errors restore old stater)   rA   iˆ  r1   )rL   r5   T)Útoo__many__key__parts)Úfake_context_optioni'  ©rK   N)r   Ú	to_stringrn   ro   r   rX   ÚKeyErrorÚ
ValueError)rU   ÚccÚresultr%   r%   r&   Útest_11_load_rollback_  s   þz&CryptContextTest.test_11_load_rollbackc                 C   s  t di | j¤Ž}| ¡  |  | ¡ | j¡ t di | j¤Ž}|jdi | j¤Ž |  | ¡ | j¡ |jdi | j¤Ž |  | ¡ | j¡ t di | j¤Ž}| | j¡ |  | ¡ | j¡ t di | j¤Ž}| | j	¡ |  | ¡ | j¡ |  
t|ji i ¡ | j
t|ji dgd |  
t|jd¡ dS )ztest update() methodr)   r:   Nr%   )r   rZ   r   rX   rY   r\   r}   r]   r~   Úsample_2_unicodern   ro   r^   r%   r%   r&   Útest_12_updatew  s"   zCryptContextTest.test_12_updatec                 C   s6  dd„ }| j ttdd | j ttdd | j ttdd | j ttdd | j ttdd	 | j ttd
d | j t|fi ddi¤Ž td'i dddœ¤Ž}|  | d¡d¡ tdd}|  |dd|¡ |  |dd|¡ |  |dd|¡ |  |d'i ddi¤Ž|¡ |  |d'i ddi¤Ž|¡ tdd}|  |dd|¡ |  |d'i ddi¤Ž|¡ tdd}|  |dd|¡ |  |dd|¡ |  |d'i ddi¤Ž|¡ |  |d'i ddi¤Ž|¡ tdd}|  |dd|¡ |  |d'i ddi¤Ž|¡ tddgd d!}| j t|jd d" | j ttdgd#d$ | j ttdgd#d% d&S )(ztest basic option parsingc                  [   s   t di | ¤Ž ¡ S )Nr%   ©r   rY   )r"   r%   r%   r&   Úparsež  ó   z/CryptContextTest.test_20_options.<locals>.parser1   )Ú__Úx)Údefault__scheme__)Ú__option)Údefault____option)Ú__scheme__optioni0u  )Ú!category__scheme__option__invalidzadmin.context__schemesr*   úmd5_crypt,des_cryptr)   )r3   zadmin.context__defaultÚadminr?   )Úcontext__default)Údefault__context__defaultzcontext.defaultzdefault.context.default©Úadmin__context__defaultzadmin.context.default©r5   )Údefault__all__vary_roundszall.vary_roundszdefault.all.vary_rounds)Úadmin__all__vary_roundszadmin.all.vary_roundsr@   ÚP)rM   )Úmd5_crypt__identÚxx)r3   Údes_crypt__salt)r3   Ú	all__saltNr%   )rn   ro   r   r   rX   Údefault_schemeÚdictr   )rU   r—   r_   r’   r%   r%   r&   Útest_20_optionsœ  sR   	ÿÿ
ÿ



ÿ
ÿz CryptContextTest.test_20_optionsc                 C   sè   t dd}|  | ¡ d¡ t ddgd}|  | ¡ d¡ t dd}|  | ¡ d¡ t tjtjgd}|  | ¡ d¡ | jtt tj	gd G dd	„ d	tj	ƒ}| jt
t |gd G d
d„ dtj	ƒ}| jtt ||gd | jtt dgd dS )z%test 'schemes' context option parsingNr:   r%   r)   r*   )r)   r*   z des_crypt, md5_crypt, c                   @   s   e Zd ZdZdS )z2CryptContextTest.test_21_schemes.<locals>.namelessN©Ú__name__Ú
__module__Ú__qualname__r/   r%   r%   r%   r&   Únamelessÿ  ó    rµ   c                   @   s   e Zd ZdZdS )z1CryptContextTest.test_21_schemes.<locals>.dummy_1Údummy_1Nr±   r%   r%   r%   r&   r·     r¶   r·   )Úadmin__context__schemes)r   rX   r3   r   r)   r*   rn   ro   ÚuhÚStaticHandlerr   r   )rU   r‘   rµ   r·   r%   r%   r&   Útest_21_schemesè  s    


ÿz CryptContextTest.test_21_schemesc                 C   s  ddd„}t dgd}|jddgd |  ||ƒdg¡ t dgddgd}|  ||ƒdg¡ | jtt tjgddgd t d	g d
¢d}|  ||ƒddg¡ | jtt dgdgd | jtt dgdgd | jtt ddgddgd | jtt ddgddd | jtt ddgddd | jtt ddgddd | jtt ddgddd t ddgddg d | jtt dd t dgddgdgd}|  ||ƒdg¡ |  ||dƒdg¡ |  ||dƒdg¡ t dgddgg d}|  ||ƒdg¡ |  ||dƒdg¡ |  ||dƒg ¡ dS )z(test 'deprecated' context option parsingNc                    ó   ‡ ‡fdd„ˆ  ¡ D ƒS )Nc                    s   g | ]}ˆ  |ˆ ¡jr|‘qS r%   ©ÚhandlerrH   r-   ©Úcategoryr_   r%   r&   r0     s    
ÿzGCryptContextTest.test_22_deprecated.<locals>.getdep.<locals>.<listcomp>r:   ©r_   rÀ   r%   r¿   r&   Úgetdep  ó   z3CryptContextTest.test_22_deprecated.<locals>.getdepr*   ©rH   r)   r:   )rH   r3   r    )r*   r)   rA   ©r3   rH   )r3   Úadmin__context__deprecated)r3   r4   rH   )r3   r4   rÆ   )r3   r¥   rH   )r3   r¥   rÆ   )r3   rH   r¥   rÆ   é{   )rH   r3   rÆ   Úuserr¡   r   )	r   r   rX   rn   ro   r   r*   r   r   )rU   rÂ   r‘   r%   r%   r&   Útest_22_deprecated  s~   
ÿÿþþýýýýüþþz#CryptContextTest.test_22_deprecatedc                 C   s  |   tdd ¡ tdd¡ tdddgd}|   | ¡ d¡ ttjddgd}|   | ¡ d¡ tddgd}|   | ¡ d¡ |jdd |   | ¡ d¡ | jt	tdgdd | jt
tdd tdddgdd	}|   | ¡ d¡ |   | d
¡d¡ |   | d¡d¡ dS )z%test 'default' context option parsingr*   r?   r)   )r4   r3   r:   rÄ   )r3   r4   é   )r4   r3   r¥   rÈ   r¡   N)rX   r   rY   r¯   r®   r   r*   r   rn   r   ro   r^   r%   r%   r&   Útest_23_defaulth  s,   ÿÿþz CryptContextTest.test_23_defaultc                 C   s\   dd„ }|   |dƒd¡ |   |dƒd¡ |   |dƒd¡ |   |dƒd¡ |   |dƒd¡ dS )	z&test 'vary_rounds' hash option parsingc                 S   s   t | d ¡ d S )Nr¦   r5   r–   )Úvr%   r%   r&   r—     r˜   z3CryptContextTest.test_24_vary_rounds.<locals>.parser1   z0.1z10%iè  Ú1000N)rX   )rU   r—   r%   r%   r&   Útest_24_vary_rounds  s   z$CryptContextTest.test_24_vary_roundsNc                 C   s   | j t||ƒ|d d S )N)Úmsg)Ú
assertTruer   )rU   r¾   ÚbaserÏ   r%   r%   r&   ÚassertHandlerDerivedFrom¡  rÃ   z)CryptContextTest.assertHandlerDerivedFromc                 C   s¾   t ƒ }|  | ¡ d¡ |  |jddd¡ t di | j¤Ž}|  | ¡ t| jƒ¡ |  |jdddt| jƒ¡ t|jdd| jƒD ]\}}|  t	||ƒ¡ q@t di | j
¤Ž}|  | ¡ d¡ dS )ztest schemes() methodr%   T©Úresolve©rÔ   ÚunconfiguredN)r   rX   r3   rZ   ÚtupleÚsample_1_schemesÚsample_1_handlersÚziprÐ   r   r\   )rU   r_   r’   Úcorrectr%   r%   r&   Útest_30_schemes¤  s   z CryptContextTest.test_30_schemesc                 C   s    t ƒ }|  t|j¡ t di | j¤Ž}|  | ¡ d¡ |  |jdddtj¡ |  |jddtj¡ t di | j	¤Ž}|  t|j¡ t | j
d}|  | ¡ d¡ dS )	ztest default_scheme() methodr*   TrÕ   rÓ   r:   r)   Nr%   )r   rn   r   r®   rZ   rX   r   r*   rÒ   r\   rØ   r^   r%   r%   r&   Útest_31_default_scheme¸  s   z'CryptContextTest.test_31_default_schemec                 C   sl  t ƒ }|  t|j¡ |  t|jd¡ t di | j¤Ž}|  |jddtj¡ |  | ¡ tj¡ |  |jdddtj	¡ |  | d¡tj	¡ |  t|jd¡ t ddd}|  |jddtj
¡ |  | ¡ tj
¡ |  |jddd	tj
¡ |  |jdd
tj
¡ |  |jddd	tj¡ |  |jdd
tj
¡ tr´|  |jtdƒdd	tj
¡ |  |jtdƒdd	tj¡ dS dS )ztest handler() methodr*   T)rÖ   r)   Úmysql323úsha256_crypt,md5_cryptr¤   Ústaff)rÀ   rÖ   ©rÀ   r¡   Nr%   )r   rn   r   r¾   rZ   rX   r   r*   rÒ   r)   rA   r   r   r^   r%   r%   r&   Útest_32_handlerÐ  s(    þz CryptContextTest.test_32_handlerc                 C   s<  ddd„}t dg d¢ddgdd	d
ddgdddd
}|  |jjd¡ |  ||dƒtddd
d¡ |  ||ddƒtddd
d¡ |  ||ddƒtddd¡ |  ||dƒtddd¡ |  ||ddƒtddd¡ |  ||ddƒtddd¡ |  ||dƒtd	d¡ |  ||ddƒtd	d¡ |  ||ddƒtddd¡ dS )z*test internal _get_record_options() methodNc                 S   s   | j  ||¡d S )Nr   )Ú_configÚ_get_record_options_with_flag)r_   ÚschemerÀ   r%   r%   r&   Úoptions÷  r˜   z1CryptContextTest.test_33_options.<locals>.optionsT)r,   r)   r+   r,   r)   r1   çš™™™™™É?i N  r+   çš™™™™™©?g333333Ó?r2   )
Útruncate_errorr3   rH   r5   rI   r8   rÆ   r¨   Úadmin__bsdi_crypt__vary_roundsÚadmin__sha512_crypt__max_rounds)r¡   )rH   Úvary_roundsÚ
max_roundsrÈ   r¡   )rì   rí   )rH   ré   )rì   )rì   rH   r   )r   rX   rã   Ú
categoriesr¯   )rU   ræ   r„   r%   r%   r&   Útest_33_optionsô  sd   
öýýý
þþþÿÿþz CryptContextTest.test_33_optionsc                 C   s<   t di | j¤Ž}|  | ¡ | j¡ |  |jdd| j¡ dS )ztest to_dict() methodTrÓ   Nr%   )r   rZ   rX   rY   r[   r^   r%   r%   r&   Útest_34_to_dictC  s   z CryptContextTest.test_34_to_dictc                 C   s–   t d
i | j¤Ž}| ¡ }ts|  || j¡ t  |¡}|  | ¡ | j¡ |jdd}|  || dd¡¡ ddl	m
} t |dgƒ}| ¡ }|  |d¡ d	S )ztest to_string() methodzpassword-securityrg   r<   z[password-security]r   )ÚUnsaltedHashr*   zM# NOTE: the 'unsalted_test_hash' handler\(s\) are not registered with PasslibNr%   )r   rZ   rŽ   r   rX   ri   rh   rY   ÚreplaceÚ!passlib.tests.test_utils_handlersrñ   r†   )rU   r_   ÚdumpÚctx2Úotherrñ   Úctx3r%   r%   r&   Útest_35_to_stringJ  s   
z"CryptContextTest.test_35_to_stringrå   rÊ   r%   c                 C   s  t jt jt jg}t|dd}|D ]=}|j d|jd}|  | |¡|j¡ |  |j|ddd|¡ |  |j|dd|¡ |  	| 
d|¡¡ |  | 
d|¡¡ q|  d¡}|  | |¡d	¡ | d
| ¡ ¡}|  | |¡d	¡ |jd
| ¡ d	d}|  | |¡d	¡ | jt|jd
| ¡ dd dS )z-test basic hash/identify/verify functionalityé   ©r7   Útest©rå   TrÕ   rÓ   Únotestr*   Úsecretr)   N)r   r*   r)   r+   r   r/   rX   ÚidentifyrÒ   rÐ   ÚverifyÚassertFalseÚgenhashÚ	genconfigrn   r   )rU   Úhandlersr‘   ÚcryptÚhr%   r%   r&   Útest_40_basicq  s    
zCryptContextTest.test_40_basicc                 C   sH  t ddgdddd}|  | ¡  d¡¡ |  |jdd d	¡¡ |  |jdd
d d¡¡ |  |jddd d	¡¡ |  |jdddddd¡ trk|jdd}|  |jtd
ƒd d¡¡ |  |jtdƒd d	¡¡ |  t	t ƒ j¡ | jt	t ƒ jdd | jt	|jdd | jt
|jddd | jt
|jdd | jt
|jdd dS )ztest genconfig() methodr*   r@   rF   rG   r©   )r3   rM   rN   Úadmin__phpass__identz$1$rü   z$H$5r¡   )rå   rÀ   z$P$5rà   ú........é   )rå   ÚsaltÚroundsÚidentz"$P$6........22zGEuacuPOqEpYPDeR0R/r?   rá   ÚfakerÊ   N)r   rÐ   r  Ú
startswithrX   r   r   r   rn   r   ro   ©rU   r‘   Úc2r%   r%   r&   Útest_41_genconfigŒ  s.   ýþz"CryptContextTest.test_41_genconfigc                 C   sò   t dgƒ}| d¡}| jD ]\}}| jt|j||fi |¤Ž qt dgƒ}| jD ]\}}|du r0q'| jt|jd|fi |¤Ž q't dgƒ}|  t|jdd¡ |  tt ƒ jdd¡ | jt|jd|dd | jt|jd|d	d | jt|jd|d	d
 dS )ztest genhash() methodr)   ÚstubNrþ   rÞ   r   r  rü   rÊ   rá   )r   r   Únonstring_vectorsrn   ro   r  r   r  )rU   r‘   r   rþ   r"   Úconfigr%   r%   r&   Útest_42_genhash½  s   



z CryptContextTest.test_42_genhashc                 C   s¼   t di | j¤Ž}| d¡}|  | d¡¡ |  | d|¡¡ |  | d|¡¡ | jt|j	dd t dgƒ}| j
D ]\}}| jt|j|fi |¤Ž q8|  tt ƒ jd¡ | jt|jddd	 d
S )ztest hash() methodÚpasswordz$5$rounds=3000$Ú	passwordxi   ©rL   r)   rþ   rÊ   rá   Nr%   )r   Úsample_4_dictr   rÐ   r  r   r  rn   r   r   r  ro   r   )rU   r‘   r   rþ   r"   r%   r%   r&   Útest_43_hashá  s   

ÿ
zCryptContextTest.test_43_hashc              	   C   sN  t di | j¤Ž}|  dg¡ |  |jddddd¡ W d  ƒ n1 s%w   Y  |  dg¡ |  |jddddd	d
¡ W d  ƒ n1 sHw   Y  |  dg¡ |  |jddddd¡ W d  ƒ n1 sjw   Y  |  dg¡ |  |jddddd¡ W d  ƒ n1 sŒw   Y  | jt|jddd | jt|jddd dS )z;test hash() method -- legacy 'scheme' and settings keywordsú"passing settings to.*is deprecatedr  r@   r	  )rå   r  z"$H$5........De04R5Egz0aq8Tf.1eVhY/Nr©   )rå   r  r  z"$P$5........De04R5Egz0aq8Tf.1eVhY/éÏ  Únacl©r  r  z?$5$rounds=1999$nacl$nmfwJIxqj0csloAAvSER0B8LU0ERCAbhmMug4Twl609éÑ  z?$5$rounds=2001$nacl$8PdeoPL4aXQnJ0woHhqgIw/efyfCKC2WHneOpnvF.31rþ   r  rü   rÊ   r%   )r   r  ÚassertWarningListrX   r   rn   r   ro   )rU   Úuse_16_legacyr‘   r%   r%   r&   Útest_43_hash_legacyý  s6   þÿþÿ	þÿþÿz$CryptContextTest.test_43_hash_legacyc                 C   s°   g d¢}t |dd}|  | d¡d¡ | jt|jddd t dgƒ}| jD ]\}}| jt|j|fi |¤Ž q%t ƒ }|  | d	¡d¡ | jt|jd	dd | jt|jdd
d dS )ztest identify() border cases©r*   r)   r+   rù   rú   z$9$232323123$1287319827NT)Úrequiredr)   r   rÊ   rá   )	r   rX   rÿ   rn   r   r  ro   ÚassertIsr   )rU   r  r‘   r   r"   r%   r%   r&   Útest_44_identify.  s   
z!CryptContextTest.test_44_identifyc                 C   sˆ  g d¢}t |dd}tj d¡}|  | d|¡¡ |  | d|¡ ¡ |  |jd|dd¡ |  |jd|dd ¡ | jt|jd|dd |  t|jd	d
¡ t dgƒ}| d	¡ }}| jD ]\}}| jt|j||fi |¤Ž q]|  	| |d¡¡ t dgƒ}| jD ]\}}|du r‰q€| jt|jd|fi |¤Ž q€|  t
t ƒ jdd¡ | jt
|jd|dd | jt|jd|dd | jt|jd|dd dS )ztest verify() scheme kwdr$  rù   rú   rû   rý   r*   rü   r+   r  z$6$232323123$1287319827r)   Nrþ   r   r  rÊ   rá   )r   r   r*   rÐ   r   rn   r   r  ro   r  r   )rU   r  r‘   r  Úrefhashrþ   r"   r%   r%   r&   Útest_45_verifyH  s.   

zCryptContextTest.test_45_verifyc                    s²  t di | j¤Ž}|  | d¡¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ |  | d¡¡ g ‰ G ‡ fdd„dtjƒ}t |gƒ}| d	¡ }}|  | |¡¡ |  ˆ |d
fg¡ ˆ d
d
…= |  |j|dd¡ |  ˆ |dfg¡ ˆ d
d
…= |  |j|dd¡ |  ˆ |dfg¡ ˆ d
d
…= t dgƒ}| j	D ]\}}| j
t|j|fi |¤Ž qŸ|  
tt ƒ jd¡ | j
t|j|dd | j
t|j|dd | j
t|j|dd d
S )ztest needs_update() methodÚ9XXD4trGYeGJAz"$1$J8HC2RCr$HcmM.7NxB2weSvlw2FgzU0zK$5$rounds=1999$jD81UCoo.zI.UETs$Y7qSTQ6mTiU9qZB4fRr43wRgQq4V.5AAf7F97Pzxey/zK$5$rounds=2000$228SSRje04cnNCaQ$YGV4RYu.5sNiBvorQDlO0WWQjyJVGKBcJXz3OtyQ2u8zK$5$rounds=3000$fS9iazEwTKi7QPW4$VasgBC8FqlOvD7x2HhABaMXCTh9jwHclPA9j5YQdns.zK$5$rounds=3001$QlFHHifXvpFX4PLs$/0ekt7lSs/lOikSerQ0M/1porEHxYq7W/2hdFpxA3fAc                       s.   e Zd ZdZdZed‡ fdd„	ƒZdd„ ZdS )	z4CryptContextTest.test_46_needs_update.<locals>.dummyÚdummyú@Nc                    s   ˆ   ||f¡ |dkS )NÚnu)Úappend)Úclsr   rþ   ©Úcheck_stater%   r&   Úneeds_update“  s   zACryptContextTest.test_46_needs_update.<locals>.dummy.needs_updatec                 S   s0   ddl m} t|tƒr| d¡}t||ƒ ¡ ƒS )Nr   )Úmd5ra   )Úhashlibr3  Ú
isinstancer   rk   r   Ú	hexdigest)rU   rþ   r3  r%   r%   r&   Ú_calc_checksum˜  s   

zCCryptContextTest.test_46_needs_update.<locals>.dummy._calc_checksumr   )r²   r³   r´   r/   Ú_hash_prefixÚclassmethodr2  r7  r%   r0  r%   r&   r+    s    r+  rû   NÚbob)rþ   r-  r)   r   r  rü   rÊ   rá   r%   )r   r  rÐ   r2  r  r¹   rº   r   rX   r  rn   ro   r   )rU   r‘   r+  r_   r   r(  r"   r%   r0  r&   Útest_46_needs_update{  s6   




z%CryptContextTest.test_46_needs_updatec           
      C   s¼  t di | j¤Ž}| d¡ d¡}| d¡ d¡}| d|¡\}}|  |¡ |  |d¡ | d|¡\}}|  |¡ |  |d¡ | d|¡\}}|  |¡ |  | |¡d¡ | d|¡\}}|  |¡ |  |d¡ t dgƒ}| d¡ }}| j	D ]\}}	| j
t|j||fi |	¤Ž qv|  | |d¡d¡ t dgƒ}| j	D ]\}}	|du r£qš| j
t|jd|fi |	¤Ž qš|  
tt ƒ jdd	¡ | j
t|jd|d
d | j
t|jd|dd | j
t|jd|dd dS )ztest verify_and_update()r)   r  rA   Ú	wrongpassNr  ©FNrþ   r   r  rü   rÊ   rá   r%   )r   r  r¾   r   Úverify_and_updater  r&  rÐ   rÿ   r  rn   ro   rX   r   )
rU   r‘   Úh1Úh2ÚokÚnew_hashr   r(  rþ   r"   r%   r%   r&   Útest_47_verify_and_updateÂ  s:   





z*CryptContextTest.test_47_verify_and_updatec           
      C   sè  ddl m}m}m} | d¡}|jddd}|jddd}t||gƒ}|  |jtƒ ¡ |  	| 
| d¡¡d¡ |  	| d|¡¡ |  | d|¡d¡ |  d	g¡ | jt|jddd W d
  ƒ n1 sew   Y  | jt|jd|dd | jt|jd|dd t||gƒ}|  |jtdgƒ¡ |  	| 
| d¡¡d¡ |  	| d|¡¡ |  | d|¡d¡ |  	| 
|jddd¡d¡ |  	|jd|dd¡ |  |jd|ddd¡ |  d	g¡ | jt|jddd W d
  ƒ n1 sïw   Y  | jt|jd|dd | jt|jd|dd t||gdd}	|  |	jtdgƒ¡ |  t|	jd¡ |  t|	jd|¡ |  t|	jd|¡ |  |	jddd|¡ |  	|	jd|dd¡ |  |	jd|ddd¡ |  |	jd|ddd¡ |  |	jd|ddd|f¡ d
S )zLhash(), verify(), and verify_and_update() -- discard unused context keywordsr   )r)   r*   Úpostgres_md5r  Úroot)rÈ   r¡   r)   )TNr  NrÈ   )ÚbadkwdÚautorÄ   r=  T)Úpasslib.hashr)   r*   rD  r   r   rX   Úcontext_kwdsÚsetrÐ   rÿ   r   r>  r!  rn   ro   )
rU   r)   r*   rD  Údes_hashÚpg_root_hashÚpg_admin_hashr€   r   rƒ   r%   r%   r&   Útest_48_context_kwdsü  sN   
ÿÿÿz%CryptContextTest.test_48_context_kwdsc                 C   sb  t dgdddd}d}| dd¡}|  |jd¡ |  |jd¡ |  |jd¡ |  tgd ¡ |jd	dd	d
}W d  ƒ n1 sAw   Y  |  |j	ddd| ¡ |  g ¡ |  |j	dddd| ¡ W d  ƒ n1 sow   Y  |  |j	dddd| ¡ |  |j	dddd| ¡ |  tgd ¡ |jt
dƒd	 dt
dƒd	 d}W d  ƒ n1 s±w   Y  |  |j	ddd| ¡ |  g ¡ |  |j	dddd| ¡ W d  ƒ n1 sßw   Y  |  |j	dddd| ¡ |  |j	dddd| ¡ |  |j	ddd| ¡ tjj}|jd|d> d}|  |j	ddd||f ¡ |jddd}|  |j	ddd| ¡ | jt|jdd  |jdd  |jdd  | jt|jdd  t dgd!}| jt|jddd" | jtt d#d$ | jtt d#d% | jtt d#d& | jtt d#d  tj ¡ }| jtt d|d$ | jtt d|d% | jtt d|d& | jtt d|d  dS )'ztest rounds limitsrA   rE   rD   iÄ	  ©r3   rK   rJ   rL   z+...........................................Né   iô  )rK   rJ   rL   r  ©r  z$5$rounds=1000$nacl$r  r  z$5$rounds=1999$nacl$z$5$rounds=2000$nacl$r   z$5$rounds=2001$nacl$g    eÍÍA)rJ   rK   rL   z$5$rounds=999999999$nacl$i¹  z$5$rounds=3001$nacl$z$5$rounds=3000$nacl$i·  z$5$rounds=2999$nacl$z$5$rounds=2500$nacl$rÊ   )rL   rJ   z$5$rounds=%d$nacl$%sr  r:   )rK   rJ   rš   r   )rJ   r¦   )r   Ú_get_recordrX   Úmin_desired_roundsÚmax_desired_roundsÚdefault_roundsr!  r
   r   r  Úintr   rA   rn   r   ÚdatetimeÚnowro   )rU   r‘   ÚSTUBÚcustom_handlerr  ÚdfÚbadr%   r%   r&   Útest_50_rounds_limitsQ  s†   ýÿÿÿÿÿÿ
ÿÿÿÿÿÿÿ
z&CryptContextTest.test_50_rounds_limitsc                 C   sx  t dgdddd}| jt|jdd | jt|jdd | jt|jd	d |jd
d}|  | dd¡jd
¡ |  |ddd¡ |jdd}|  | dd¡jd
¡ |  |ddd¡ |jdd}|  | dd¡jd¡ |  |ddd¡ |jdd}|  | dd¡jd¡ |  |ddd¡ |jdd}|  | dd¡jd¡ |  |ddd¡ |jdd}|  | dd¡jd¡ |  |ddd¡ dS )ztest linear vary roundsrA   iË  iÕ  rE   rO  éÿÿÿÿr¦   ú-1%ú101%r   Nú0%rÊ   r  r   éd   z0.1%gü©ñÒMbP?iÎ  iÒ  ú100%ç      ð?©r   rn   r   r   rX   rR  rì   Úassert_rounds_ranger  r%   r%   r&   Útest_51_linear_vary_roundsÇ  s4   ýz+CryptContextTest.test_51_linear_vary_roundsc                 C   sÜ  t dgdddd}| jt|jdd | jt|jdd | jt|jd	d |jd
d}|  | dd¡jd
¡ |  |ddd¡ |jdd}|  | dd¡jd
¡ |  |ddd¡ |jdd}|  | dd¡jd¡ |  |ddd¡ |jdd}|  | dd¡jd¡ |  |ddd¡ |jdd}|  | dd¡jd¡ |  |ddd¡ |jdd}|  | dd¡jd¡ |  |ddd¡ |jdd}|  | dd¡jd¡ |  |ddd¡ |jdd}|  | dd¡jd¡ |  |ddd¡ dS )ztest log2 vary roundsÚbcrypté   rC   é   )r3   Úbcrypt__min_roundsÚbcrypt__max_roundsÚbcrypt__default_roundsr^  r¦   r_  r`  r   Nra  rÊ   é   é   rb  z1%g{®Gáz„?z49%g\Âõ(\ß?z50%g      à?rc  rd  re  r  r%   r%   r&   Útest_52_log2_vary_roundsí  s@   ýz)CryptContextTest.test_52_log2_vary_roundsc                 C   s~   |  |¡}|jdd… |j }tƒ }tdƒD ]}|j||d}	| |	¡j}
| |
¡ q|  	t
|ƒ|d¡ |  	t|ƒ|d¡ dS )z2helper to check vary_rounds covers specified ranger   rÊ   i,  rQ  z"vary_rounds had wrong lower limit:z"vary_rounds had wrong upper limit:N)r¾   Údefault_salt_charsÚmax_salt_sizerJ  r   r  rh   r  ÚaddrX   ÚminÚmax)rU   Úcontextrå   ÚlowerÚupperr¾   r  ÚseenÚir  Úrr%   r%   r&   rf    s   
z$CryptContextTest.assert_rounds_rangec                 C   sp   t jddtd tdgd}|  |jd¡ |  |jddjd¡ |  |jd	djd¡ |  |jd
djd¡ dS )zharden_verify -- parsingrO   z.*harden_verify.*rá   rA   r:   NÚ )Úharden_verifyÚtrueÚfalse)rR   rS   ÚDeprecationWarningr   rX   r}  Úusingr^   r%   r%   r&   Útest_harden_verify_parsing-  s   ÿz+CryptContextTest.test_harden_verify_parsingc                 C   sP   d}d}t  ¡ }||_t|gd}| ¡  t|jƒ\}}| j|||| d dS )z'
        dummy_verify() method
        rè   rç   r:   )ÚdeltaN)Ú	DelayHashr  Údelayr   Údummy_verifyr   ÚassertAlmostEqual)rU   ÚexpectedÚaccuracyr¾   r_   ÚelapsedÚ_r%   r%   r&   Útest_dummy_verify9  s   z"CryptContextTest.test_dummy_verifyc                 C   s  ddd„}t ddd}|  ||dƒg d¢¡ |  ||dƒg d¢¡ |jd	d
 |  ||dƒg d¢¡ |  ||dƒg d¢¡ |jdd |  ||dƒg d¢¡ |  ||dƒg d¢¡ t dgdd}|  ||dƒdg¡ |  ||dƒdg¡ | jtt ddd | jtt ddd dS )z+test deprecated='auto' is handled correctlyNc                    r¼   )Nc                    s   g | ]	}ˆ  |ˆ ¡j‘qS r%   r½   )r.   rå   r¿   r%   r&   r0   Q  s    zLCryptContextTest.test_61_autodeprecate.<locals>.getstate.<locals>.<listcomp>r:   rÁ   r%   r¿   r&   ÚgetstateP  rÃ   z8CryptContextTest.test_61_autodeprecate.<locals>.getstatez sha256_crypt,md5_crypt,des_cryptrG  rÄ   )FTTr¡   r*   r?   )TFTr)   r¤   )TTFrA   Frß   zauto,md5_cryptzmd5_crypt,autor   )r   rX   r   rn   r   )rU   r  r_   r%   r%   r&   Útest_61_autodeprecateM  s&   

ÿ

ÿz&CryptContextTest.test_61_autodeprecatec                 C   s&  ddl m} ddlm}m} tdgƒ}tddgƒ}| d¡}| d¡}|  td|j	¡ |  td|j	|¡ |  td|j	|¡ | 	¡ }|  
||j¡ | 	|¡}	|  
|	|j| ¡ | 	|¡}
|  
|
|j| ¡ |  
| 	|	¡|	¡ |  | |¡¡ |  ||j|¡ |  ||j|¡ |  ||j|	¡ |  | |¡¡ |  ||j|¡ |  | |¡¡ |  | |	¡¡ |  ||jd¡ |  t|jd	¡ |  
| |¡|¡ |  ||j|¡ |  ||j|¡ |  ||j|	¡ |  ||jd¡ |  t|jd	¡ |  
| |¡|¡ |  ||j|¡ |  td
|j|¡ |  
| |	¡|¡ d	S )zdisabled hash supportr   )ÚUnknownHashError)r*   Úunix_disabledr)   r  Úfoozno disabled hasher presentr|  Nzcannot restore original hash)Úpasslib.excr  rH  r*   r  r   r   ÚassertRaisesRegexru   ÚdisablerX   Údefault_markerrÐ   Ú
is_enabledrn   r  Úenablero   r   )rU   r  r*   r  r_   rõ   Úh_refÚh_otherÚh_disÚ	h_dis_refÚh_dis_otherr%   r%   r&   Útest_disabled_hashesm  sX   


ÿÿÿ

ÿz%CryptContextTest.test_disabled_hashesr   ©F)Hr²   r³   r´   ÚdescriptionPrefixrØ   rÙ   r¯   rZ   r'   r[   r   rj   ri   rq   rr   rz   r{   rt   rò   rl   rw   rk   rm   rx   r   r\   r”   r}   r]   r~   r  rQ   r`   rp   r|   r…   rˆ   rŠ   r“   r•   r°   r»   rÉ   rË   rÎ   rÒ   rÜ   rÝ   râ   rï   rð   rø   r  r  r  r  r  r#  r'  r)  r;  rC  rN  r]  rg  rp  rf  r‚  rŒ  rŽ  r  Ú__classcell__r%   r%   rV   r&   r(   1   sÂ    ù
ÿ
ÿÿú	
	ÿ
ô	+%L$\%
$O!
ü1$
13G:Uv&/ r(   c                   @   s2   e Zd ZdZdZejZdZdZ	e
dƒZdd„ ZdS )	r„  z-dummy hasher which delays by specified amountÚ
delay_hashé(   r   z$x$c                 C   s6   t  | j¡ t|tƒr| d¡}tt d| ¡ 	¡ ƒS )Nra   s   prefix)
ÚtimeÚsleepr…  r5  r   rk   r   r4  Úsha1r6  )rU   rþ   r%   r%   r&   r7  Å  s   

zDelayHash._calc_checksumN)r²   r³   r´   Ú__doc__r/   r¹   ÚLOWER_HEX_CHARSÚchecksum_charsÚchecksum_sizer…  r   r8  r7  r%   r%   r%   r&   r„  ½  s    r„  c                   @   s   e Zd Zd ZdS )Údummy_2Nr±   r%   r%   r%   r&   rª  Î  r¶   rª  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚLazyCryptContextTestr   c                 C   s   t dƒ |  t d¡ d S )Nrª  )Úunload_handler_nameÚ
addCleanuprT   r%   r%   r&   rQ   Ô  s   zLazyCryptContextTest.setUpc                 C   st   |   tdƒ¡ tddƒ ttddgƒdgd}|   tddƒ¡ |  | ¡ d¡ |  | d¡j	¡ |  tddƒ¡ dS )ztest plain kwdsrª  úpasslib.tests.test_contextr)   rÄ   T©rª  r)   N)
r  Úhas_crypt_handlerr   r   ÚiterrX   r3   rÐ   r¾   rH   )rU   r‘   r%   r%   r&   Útest_kwd_constructorÙ  s   
z)LazyCryptContextTest.test_kwd_constructorc                    sx   ˆ   tdƒ¡ tddƒ d
‡ fdd„	}t|dd}ˆ   tddƒ¡ ˆ  | ¡ d¡ ˆ  | d	¡j¡ ˆ  tddƒ¡ d S )Nrª  r®  Fc                    s    ˆ   | ¡ ttddgƒdgdS )Nrª  r)   rÅ   )rÐ   r¯   r±  )ÚflagrT   r%   r&   Úonloadë  s   
z>LazyCryptContextTest.test_callable_constructor.<locals>.onloadT)r´  r³  r¯  r)   rž  )	r  r°  r   r   rX   r3   rÐ   r¾   rH   )rU   r´  r‘   r%   rT   r&   Útest_callable_constructorç  s   
z.LazyCryptContextTest.test_callable_constructorN)r²   r³   r´   rŸ  rQ   r²  rµ  r%   r%   r%   r&   r«  Ñ  s
    r«  )Ar¦  Ú
__future__r   Úpasslib.utils.compatr   Úconfigparserr   ÚConfigParserrW  Ú	functoolsr   ÚloggingÚ	getLoggerr²   Úlogrq   rR   Úpasslibr   Úpasslib.contextr   r   r’  r	   r
   Úpasslib.utilsr   r   r   r   r   r   r   r   Úpasslib.utils.handlersÚutilsr  r¹   Úpasslib.tests.utilsr   r   r   r   r   r   Úpasslib.registryr   r   r°  r   r¬  r   rr   ÚabspathÚdirnameÚ__file__r{   r'   r(   r4  r£  rº   r„  rª  r«  r%   r%   r%   r&   Ú<module>   sN      	             