U
    ø¹Ö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%   ú@./venv/lib/python3.8/site-packages/passlib/tests/test_context.pyÚmerge_dicts&   s    
r'   c                       st  e Zd ZdZddddg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ddd dd!gdgd!d"d#d$d%d&d%d'd(d)Z‡ fd*d+„Zd,d-„ Z d.d/„ Z!d0d1„ Z"d2d3„ Z#d4d5„ Z$d6d7„ Z%d8d9„ Z&d:d;„ Z'd<d=„ Z(d>d?„ Z)d@dA„ Z*dBdC„ Z+dDdE„ Z,d}dGdH„Z-dIdJ„ Z.dKdL„ Z/dMdN„ Z0dOdP„ Z1dQdR„ Z2dSdT„ Z3dFi fdFdUdifdVi fdWi fgZ4dXdY„ Z5dZd[„ 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>çš™™™™™¹?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.cfgiIq  i¹ˆ  iy  iÈ¯  )Z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
©r4   ÚphpassÚsha256_crypté   é   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&   rP   ²   s    zCryptContextTest.setUpc                 C   s²   t ƒ }|  | ¡ i ¡ t f | jŽ}|  | ¡ | j¡ t f | jŽ}|  | ¡ | j¡ t f | jŽ}|  | ¡ | j¡ t f | jŽ}|  | ¡ | j¡ t tdƒgd}|  | ¡ d¡ dS )ztest class constructorr@   r:   )r@   N)	r   ÚassertEqualÚto_dictÚsample_1_dictÚsample_1_resolved_dictÚsample_2_dictÚsample_3_dictr   r3   ©rT   Ú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©rc   )r   Úfrom_stringÚsample_1_unicoderW   rX   rY   Ú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: %rra   r=   rb   zsample1xxx.cfgre   rf   N)ÚosÚpathÚexistsÚsample_1_pathÚRuntimeErrorr   Z	from_pathrW   rX   rY   Úsample_1b_pathÚsample_1c_pathrm   ÚEnvironmentErrorÚjoinÚherer   r]   r%   r%   r&   Útest_03_from_pathó   s"    
ÿ
ÿ
 ÿz"CryptContextTest.test_03_from_pathc                 C   sþ   t f | jŽ}|jf | jŽ}|  | ¡ | j¡ |  | ¡ | j¡ |jf | jŽ}|  | ¡ | j¡ |  | ¡ | j¡ |jf | jŽ}|  | ¡ | j¡ | ¡ }|  	||¡ |  | ¡ | j¡ |  | ¡ | j¡ |j
f | jŽ |  | ¡ | j¡ |  | ¡ | j¡ dS )ztest copy() methodN)r   rY   r   r[   rW   rX   Úsample_12_dictr\   Úsample_123_dictZassertIsNotr   )rT   Úcc1Úcc2Zcc2bÚcc3Úcc4r%   r%   r&   Útest_04_copy  s     zCryptContextTest.test_04_copyc                 C   s    t f | jŽ}|  t|ƒd¡ dS )ztest repr()z!^<CryptContext at 0x-?[0-9a-f]+>$N)r   rY   ÚassertRegexÚrepr)rT   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 f | jŽ}|ji dd |  | ¡ | j¡ t ƒ }| | j¡ | | j	¡ |  | ¡ | j	¡ dS )z test load() / load_path() methodr`   NT)r   )
r   ÚloadrY   rW   rX   rh   rj   rm   rn   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)   r@   iˆ  r1   )rK   r5   T)Ztoo__many__key__parts)Zfake_context_optioni'  ©rJ   N)r   Ú	to_stringrm   rn   r   rW   ÚKeyErrorÚ
ValueError)rT   ÚccÚresultr%   r%   r&   Útest_11_load_rollback_  s    þz&CryptContextTest.test_11_load_rollbackc                 C   s  t f | jŽ}| ¡  |  | ¡ | j¡ t f | jŽ}|jf | jŽ |  | ¡ | j¡ |jf | jŽ |  | ¡ | j¡ t f | jŽ}| | j¡ |  | ¡ | j¡ t f | jŽ}| | j	¡ |  | ¡ | j¡ |  
t|ji i ¡ | j
t|ji dgd |  
t|jd¡ dS )ztest update() methodr)   r:   N)r   rY   r   rW   rX   r[   r{   r\   r|   Úsample_2_unicoderm   rn   r]   r%   r%   r&   Útest_12_updatew  s"    zCryptContextTest.test_12_updatec                 C   s  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ddiŽ tf dddœŽ}|  | d¡d¡ tdd}|  |dd|¡ |  |dd|¡ |  |dd|¡ |  |f ddiŽ|¡ |  |f ddiŽ|¡ tdd}|  |dd|¡ |  |f ddiŽ|¡ tdd}|  |dd|¡ |  |dd|¡ |  |f ddiŽ|¡ |  |f ddiŽ|¡ tdd}|  |dd|¡ |  |f 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 f | Ž ¡ S r   ©r   rX   )r"   r%   r%   r&   Úparsež  s    z/CryptContextTest.test_20_options.<locals>.parser1   )Ú__Úx)Zdefault__scheme__)Z__option)Zdefault____option)Z__scheme__optioni0u  )Z!category__scheme__option__invalidzadmin.context__schemesr*   úmd5_crypt,des_cryptr)   )r3   zadmin.context__defaultÚadminr>   )Zcontext__default)Zdefault__context__defaultzcontext.defaultzdefault.context.default©Úadmin__context__defaultzadmin.context.default©r5   )Zdefault__all__vary_roundszall.vary_roundszdefault.all.vary_rounds)Úadmin__all__vary_roundszadmin.all.vary_roundsr?   ÚP)rL   )Zmd5_crypt__identZxx)r3   Zdes_crypt__salt)r3   Z	all__saltN)rm   rn   r   r‰   rW   Údefault_schemeÚdictr   )rT   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ÿ  s   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£     s   r£   )Zadmin__context__schemes)r   rW   r3   r   r)   r*   rm   rn   ÚuhÚStaticHandlerrŠ   r‰   )rT   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	ddd
g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                    s   ‡ ‡fdd„ˆ  ¡ D ƒS )Nc                    s   g | ]}ˆ  |ˆ ¡jr|‘qS r%   ©ÚhandlerrG   r-   ©Úcategoryr^   r%   r&   r0     s    ÿzGCryptContextTest.test_22_deprecated.<locals>.getdep.<locals>.<listcomp>r:   ©r^   rª   r%   r©   r&   Úgetdep  s    z3CryptContextTest.test_22_deprecated.<locals>.getdepr*   ©rG   r)   r:   )rG   r3   r”   r@   ©r3   rG   )r3   Úadmin__context__deprecated)r3   r4   rG   )r3   r4   r¯   )r3   r—   rG   )r3   r—   r¯   )r3   rG   r—   r¯   é{   )rG   r3   r¯   Úuserr•   )N)	r   r   rW   rm   rn   r   r*   r‰   rŠ   )rT   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)rW   r   rX   rœ   r›   r   r*   r   rm   r‰   rn   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‘     s    z3CryptContextTest.test_24_vary_rounds.<locals>.parser1   z0.1z10%iè  Z1000N)rW   )rT   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   )rT   r¨   Úbaser·   r%   r%   r&   ÚassertHandlerDerivedFrom¡  s    z)CryptContextTest.assertHandlerDerivedFromc                 C   s¶   t ƒ }|  | ¡ d¡ |  |jddd¡ t f | jŽ}|  | ¡ t| jƒ¡ |  |jdddt| jƒ¡ t|jdd| jƒD ]\}}|  t	||ƒ¡ q|t f | j
Ž}|  | ¡ d¡ dS )ztest schemes() methodr%   T©Úresolve©r¼   ÚunconfiguredN)r   rW   r3   rY   ÚtupleÚsample_1_schemesÚsample_1_handlersÚzipr¸   r   r[   )rT   r^   rŒ   Zcorrectr%   r%   r&   Útest_30_schemes¤  s    z CryptContextTest.test_30_schemesc                 C   s˜   t ƒ }|  t|j¡ t f | jŽ}|  | ¡ d¡ |  |jdddtj¡ |  |jddtj¡ t f | j	Ž}|  t|j¡ t | j
d}|  | ¡ d¡ dS )ztest default_scheme() methodr*   Tr½   r»   r:   r)   N)r   rm   r‰   r›   rY   rW   r   r*   rº   r[   rÀ   r]   r%   r%   r&   Útest_31_default_scheme¸  s    z'CryptContextTest.test_31_default_schemec                 C   sf  t ƒ }|  t|j¡ |  t|jd¡ t f | 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rb|  |jtdƒdd	tj
¡ |  |jtdƒdd	tj¡ dS )ztest handler() methodr*   T)r¾   r)   Úmysql323úsha256_crypt,md5_cryptr–   Ústaff)rª   r¾   ©rª   r•   N)r   rm   r‰   r¨   rY   rW   r   r*   rº   r)   r@   r   r   r]   r%   r%   r&   Útest_32_handlerÐ  s&    z CryptContextTest.test_32_handlerc                 C   s>  ddd„}t ddddg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   )Ú_configZ_get_record_options_with_flag)r^   Úschemerª   r%   r%   r&   Úoptions÷  s    z1CryptContextTest.test_33_options.<locals>.optionsTr,   r)   r+   r1   çš™™™™™É?i N  çš™™™™™©?g333333Ó?r2   )
Útruncate_errorr3   rG   r5   rH   r8   r¯   r™   Zadmin__bsdi_crypt__vary_roundsZadmin__sha512_crypt__max_rounds)r•   )rG   Úvary_roundsÚ
max_roundsr±   r•   )rÐ   rÑ   )rG   rÏ   )rÐ   )rÐ   rG   )N)r   rW   rÊ   Ú
categoriesrœ   )rT   rÌ   r€   r%   r%   r&   Útest_33_optionsô  sd    
öýýý
þþþÿÿþz CryptContextTest.test_33_optionsc                 C   s8   t f | jŽ}|  | ¡ | j¡ |  |jdd| j¡ dS )ztest to_dict() methodTr»   N)r   rY   rW   rX   rZ   r]   r%   r%   r&   Útest_34_to_dictC  s    z CryptContextTest.test_34_to_dictc                 C   s’   t f | 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-securityrf   r<   z[password-security]r   )ÚUnsaltedHashr*   zM# NOTE: the 'unsalted_test_hash' handler\(s\) are not registered with PasslibN)r   rY   rˆ   r   rW   rh   rg   rX   ÚreplaceZ!passlib.tests.test_utils_handlersrÕ   r‚   )rT   r^   ÚdumpÚctx2ÚotherrÕ   Z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 ]z}|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/   rW   Úidentifyrº   r¸   ÚverifyÚassertFalseÚgenhashÚ	genconfigrm   rŠ   )rT   Úhandlersr‹   Z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rÖ|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?   rE   rF   rš   )r3   rL   rM   Z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å   Ú
startswithrW   r   r   r   rm   r‰   rn   ©rT   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|Ž qt dgƒ}| jD ](\}}|dkr\qJ| jt|jd|f|Ž qJt 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_vectorsrm   rn   rä   r‰   rå   )rT   r‹   r   rà   r"   Zconfigr%   r%   r&   Útest_42_genhash½  s    



z CryptContextTest.test_42_genhashc                 C   s´   t f | jŽ}| d¡}|  | d¡¡ |  | d|¡¡ |  | d|¡¡ | jt|j	dd t dgƒ}| j
D ]\}}| jt|j|f|Ž ql|  tt ƒ jd¡ | jt|jddd	 d
S )ztest hash() methodÚpasswordz$5$rounds=3000$Z	passwordxi   ©rK   r)   rà   r³   rÈ   N)r   Úsample_4_dictr   r¸   rï   râ   rã   rm   rŠ   r   rô   rn   r‰   )rT   r‹   r   rà   r"   r%   r%   r&   Útest_43_hashá  s    

ÿ
zCryptContextTest.test_43_hashFc              	   C   sú   t f | jŽ}|  dg¡ |  |jddddd¡ W 5 Q R X |  dg¡  |  |jdddddd	¡ W 5 Q R X |  dg¡ |  |jdd
ddd¡ W 5 Q R X |  dg¡ |  |jddddd¡ W 5 Q R X | 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/rš   )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³   N)r   rø   ÚassertWarningListrW   r   rm   r‰   rn   )rT   Zuse_16_legacyr‹   r%   r%   r&   Útest_43_hash_legacyý  s.    þþþþz$CryptContextTest.test_43_hash_legacyc                 C   s®   dddg}t |dd}|  | d¡d¡ | jt|jddd	 t dgƒ}| jD ]\}}| jt|j|f|Ž qLt ƒ }|  | d
¡d¡ | jt|jd
dd	 | jt|jddd dS )ztest identify() border casesr*   r)   r+   rÛ   rÜ   z$9$232323123$1287319827NT)Úrequiredr   r³   rÈ   )	r   rW   rá   rm   rŠ   rô   rn   ÚassertIsr‰   )rT   ræ   r‹   r   r"   r%   r%   r&   Útest_44_identify.  s    

z!CryptContextTest.test_44_identifyc                 C   s„  dddg}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|Ž q¼|  	| |d¡¡ t dgƒ}| jD ]*\}}|dkrqþ| jt|jd|f|Ž 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$1287319827Nrà   r   rî   r³   rÈ   )r   r   r*   r¸   râ   rm   rŠ   rô   rn   rã   r‰   )rT   ræ   r‹   rç   Úrefhashrà   r"   r%   r%   r&   Útest_45_verifyH  s.    



zCryptContextTest.test_45_verifyc                    s¬  t f | 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|Ž 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() methodZ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à   ©Z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   )Úmd5r`   )Úhashlibr  Ú
isinstancer   rj   r   Ú	hexdigest)rT   rà   r  r%   r%   r&   Ú_calc_checksum˜  s    

zCCryptContextTest.test_46_needs_update.<locals>.dummy._calc_checksum)N)rŸ   r    r¡   r/   Ú_hash_prefixÚclassmethodr  r  r%   r  r%   r&   r    s
   r  rÝ   NZbob)rà   r  r)   r   rî   rÞ   r³   rÈ   )r   rø   r¸   r  rã   r¤   r¥   r   rW   rô   rm   rn   r‰   )rT   r‹   r  r^   r   r  r"   r%   r  r&   Útest_46_needs_update{  s6    




z%CryptContextTest.test_46_needs_updatec           
      C   s¶  t f | jŽ}| d¡ d¡}| d¡ d¡}| d|¡\}}|  |¡ |  |d¡ | d|¡\}}|  |¡ |  |d¡ | d|¡\}}|  |¡ |  | |¡d¡ | d|¡\}}|  |¡ |  |d¡ t dgƒ}| d¡ }}| j	D ]\}}	| j
t|j||f|	Ž qè|  | |d¡d¡ t dgƒ}| j	D ].\}}	|dkrBq,| j
t|jd|f|	Ž 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ö   r@   Z	wrongpassNró   ©FNrà   r   rî   rÞ   r³   rÈ   )r   rø   r¨   r   Úverify_and_updaterã   r  r¸   rá   rô   rm   rn   rW   r‰   )
rT   r‹   Zh1Zh2ÚokZ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 5 Q R X | 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 5 Q R X | 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ú   r±   )ZbadkwdÚautor­   r  TN)Úpasslib.hashr)   r*   r  r   r   rW   Zcontext_kwdsÚsetr¸   rá   râ   r  rÿ   rm   rn   )
rT   r)   r*   r  Zdes_hashZpg_root_hashZpg_admin_hashr}   r~   r   r%   r%   r&   Útest_48_context_kwdsü  sJ    
ÿz%CryptContextTest.test_48_context_kwdsc              	   C   s  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 5 Q R X |  |j	ddd| ¡ |  g ¡  |  |j	dddd| ¡ W 5 Q R X |  |j	dddd| ¡ |  |j	dddd| ¡ |  tgd ¡& |jt
dƒd	 dt
dƒd	 d}W 5 Q R X |  |j	ddd| ¡ |  g ¡  |  |j	dddd| ¡ W 5 Q R X |  |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 limitsr@   rD   rC   iÄ	  ©r3   rJ   rI   rK   z+...........................................Né   iô  )rJ   rI   rK   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)rI   rJ   rK   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³   )rK   rI   z$5$rounds=%d$nacl$%sr÷   r:   )rJ   rI   r“   r‡   )rI   r˜   )r   Ú_get_recordrW   Zmin_desired_roundsZmax_desired_roundsZdefault_roundsrÿ   r
   r   rå   Úintr   r@   rm   rŠ   ÚdatetimeZnowrn   )rT   r‹   ZSTUBZcustom_handlerrñ   ZdfZ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 roundsr@   iË  iÕ  rD   r  éÿÿÿÿr˜   ú-1%ú101%r   Nú0%r³   rû   rþ   éd   z0.1%gü©ñÒMbP?iÎ  iÒ  ú100%ç      ð?©r   rm   rŠ   r   rW   r"  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 roundsZbcrypté   rB   é   )r3   Zbcrypt__min_roundsZbcrypt__max_roundsZbcrypt__default_roundsr&  r˜   r'  r(  r   Nr)  r³   é   é   r*  z1%g{®Gáz„?z49%g\Âõ(\ß?z50%g      à?r+  r,  r-  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,  r!  z"vary_rounds had wrong lower limit:z"vary_rounds had wrong upper limit:N)r¨   Zdefault_salt_charsZmax_salt_sizer  r   rå   rg   rì   ÚaddrW   ÚminÚmax)rT   ÚcontextrË   ÚlowerÚupperr¨   rë   ÚseenÚirç   Úrr%   r%   r&   r.    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 -- parsingrN   z.*harden_verify.*rÈ   r@   r:   NÚ )Úharden_verifyÚtrueZfalse)rQ   rR   ÚDeprecationWarningr   rW   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:   )ZdeltaN)Ú	DelayHashrB  Údelayr   Zdummy_verifyr   ZassertAlmostEqual)rT   ZexpectedZ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ƒdddg¡ |  ||d	ƒdddg¡ |jd
d |  ||dƒdddg¡ |  ||d	ƒdddg¡ |jdd |  ||dƒdddg¡ |  ||d	ƒdddg¡ 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                    s   ‡ ‡fdd„ˆ  ¡ D ƒS )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  s    z8CryptContextTest.test_61_autodeprecate.<locals>.getstatez sha256_crypt,md5_crypt,des_cryptr  r­   FTr•   r*   r>   r)   r–   r@   rÆ   zauto,md5_cryptzmd5_crypt,auto)N)r   rW   r   rm   rŠ   )rT   rI  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)   rL  Zfoozno disabled hasher presentr>  Nzcannot restore original hash)Úpasslib.excrK  r  r*   rL  r   r   ZassertRaisesRegexrt   ÚdisablerW   Zdefault_markerr¸   Z
is_enabledrm   rã   Úenablern   rŠ   )rT   rK  r*   rL  r^   rØ   Zh_refZh_otherZh_disZ	h_dis_refZh_dis_otherr%   r%   r&   Útest_disabled_hashesm  s^    


ÿ ÿ ÿ

 ÿz%CryptContextTest.test_disabled_hashes)N)F)HrŸ   r    r¡   ÚdescriptionPrefixrÀ   rÁ   rœ   rY   r'   rZ   r   ri   rh   rp   rq   rx   ry   rs   rÖ   rk   ru   rj   rl   rv   r   r[   rŽ   r{   r\   r|   rø   rP   r_   ro   rz   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  r  r%  r/  r4  r.  rC  rH  rJ  rP  Ú__classcell__r%   r%   rU   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 )	rD  z-dummy hasher which delays by specified amountZ
delay_hashé(   r   z$x$c                 C   s6   t  | j¡ t|tƒr | d¡}tt d| ¡ 	¡ ƒS )Nr`   s   prefix)
ÚtimeÚsleeprE  r  r   rj   r   r  Zsha1r  )rT   rà   r%   r%   r&   r  Å  s    

zDelayHash._calc_checksumN)rŸ   r    r¡   Ú__doc__r/   r¤   ZLOWER_HEX_CHARSZchecksum_charsZchecksum_sizerE  r   r  r  r%   r%   r%   r&   rD  ½  s   rD  c                   @   s   e Zd Zd ZdS )Údummy_2Nrž   r%   r%   r%   r&   rW  Î  s   rW  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 )NrW  )Úunload_handler_nameZ
addCleanuprS   r%   r%   r&   rP   Ô  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 kwdsrW  úpasslib.tests.test_contextr)   r­   T©rW  r)   N)
rã   Úhas_crypt_handlerr   r   ÚiterrW   r3   r¸   r¨   rG   )rT   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 )NrW  rZ  Fc                    s    ˆ   | ¡ ttddgƒdgdS )NrW  r)   r®   )r¸   rœ   r]  )ÚflagrS   r%   r&   Úonloadë  s    
z>LazyCryptContextTest.test_callable_constructor.<locals>.onloadT)r`  r_  r[  r)   )F)	rã   r\  r   r   rW   r3   r¸   r¨   rG   )rT   r`  r‹   r%   rS   r&   Útest_callable_constructorç  s    
z.LazyCryptContextTest.test_callable_constructorN)rŸ   r    r¡   rQ  rP   r^  ra  r%   r%   r%   r&   rX  Ñ  s   rX  )ArV  Z
__future__r   Zpasslib.utils.compatr   Úconfigparserr   ÚConfigParserr$  Ú	functoolsr   ZloggingZ	getLoggerrŸ   Úlogrp   rQ   Zpasslibr   Zpasslib.contextr   r   rM  r	   r
   Zpasslib.utilsr   r   r   r   r   r   r   r   Zpasslib.utils.handlersZutilsræ   r¤   Zpasslib.tests.utilsr   r   r   r   r   r   Zpasslib.registryr   r   r\  r   rY  r   rq   ÚabspathÚdirnameÚ__file__ry   r'   r(   r  rT  r¥   rD  rW  rX  r%   r%   r%   r&   Ú<module>   sN    
  	             