a fŸWc2#ã@sŠdZddlmZddlmZer.ddlmZn ddlmZddlZddl m Z ddl Z e   e ¡ZddlZddlZddlmZddlmZmZdd lmZmZdd lmZmZdd lmZmZmZmZm Z m!Z!ddl"m#m$Z%dd l&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,dd l-m.Z.m/Z0m1Z2m3Z3ej4 5ej4 6e7¡¡Z8dd„Z9Gdd„de'ƒZ:ddl;Z;ddlGdd„de%j=ƒZ?Gdd„de'ƒZ@dS)ztests 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_handlercOs.| ¡}|D]}| |¡q |r*| |¡|S©N)ÚcopyÚupdate)ÚfirstÚargsÚkwdsÚtargetÚarg©r%ú>/usr/lib/python3.9/site-packages/passlib/tests/test_context.pyÚ merge_dicts&s   r'c sjeZdZdZgd¢Zdd„eDƒZeeddddd d d Zeeed Z e d ƒZ e dƒZ e j ed¡Ze  e dƒe dƒ¡Ze j ed¡Ze  e dƒe dƒ¡ d¡Ze j ed¡ZedddddZdZeeeƒZeddZeeeƒZegd¢d gd!d"d#d$d%d&d%d'd(d) Z‡fd*d+„Zd,d-„Z d.d/„Z!d0d1„Z"d2d3„Z#d4d5„Z$d6d7„Z%d8d9„Z&d:d;„Z'dd?„Z)d@dA„Z*dBdC„Z+dDdE„Z,d}dGdH„Z-dIdJ„Z.dKdL„Z/dMdN„Z0dOdP„Z1dQdR„Z2dSdT„Z3dFifdFdUd ifdVifdWifgZ4dXdY„Z5dZd[„Z6d\d]„Z7d^d_„Z8d~dadb„Z9dcdd„Z:dedf„Z;dgdh„Zdmdn„Z?dodp„Z@dqdr„ZAdsdt„ZBdudv„ZCdwdx„ZDdydz„ZEd{d|„ZF‡ZGS)ÚCryptContextTestr)Ú des_cryptÚ md5_cryptÚ bsdi_cryptÚ sha512_cryptcCsg|] }t|ƒ‘qSr%)r©Ú.0Únamer%r%r&Ú ?ózCryptContextTest.r*çš™™™™™¹?i1ui©aiPÃé@œ)ÚschemesÚdefaultÚall__vary_roundsÚbsdi_crypt__max_roundsÚbsdi_crypt__default_roundsÚsha512_crypt__max_roundsÚsha512_crypt__min_rounds©r4a[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.cfgiIqi¹ˆiyiȯ)Zbsdi_crypt__min_roundsr7r8r:zŒ[passlib] bsdi_crypt__min_rounds = 29001 bsdi_crypt__max_rounds = 35001 bsdi_crypt__default_rounds = 31001 sha512_crypt__min_rounds = 45000 r,©r5)r)r*Úphpassr+Ú sha256_cryptr)rAééré¸ éÐÚHé) r4Ú deprecatedr5r7r8Úbsdi_crypt__vary_roundsÚsha256_crypt__max_roundsÚsha256_crypt__min_roundsÚsha256_crypt__default_roundsÚ phpass__identÚphpass__default_roundscs*tt|ƒ ¡t dd¡t dd¡dS)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 zCryptContextTest.setUpcCsÂtƒ}| | ¡i¡tfi|j¤Ž}| | ¡|j¡tfi|j¤Ž}| | ¡|j¡tfi|j¤Ž}| | ¡|j¡tfi|j¤Ž}| | ¡|j¡ttdƒgd}| | ¡d¡dS)ztest class constructorrAr;)rAN) rÚ assertEqualÚto_dictÚ sample_1_dictÚsample_1_resolved_dictÚ sample_2_dictÚ sample_3_dictrr4©rUÚctxr%r%r&Útest_01_constructorºsz$CryptContextTest.test_01_constructorcCsÌt |j¡}| | ¡|j¡t |j¡}| | ¡|j¡t |j d¡¡}| | ¡|j¡t |j¡}| | ¡|j¡tj|j ddd}| | ¡|j¡|  t tjd¡|j t tj|jdddS)ztest from_string() constructorúutf-8Úmypolicyr>©ÚsectionÚencodingNÚ fakesection©rd) rÚ from_stringÚsample_1_unicoderXrYrZÚsample_1_unnormalizedÚencodeÚsample_1b_unicodeÚsample_1c_bytesÚ assertRaisesÚ TypeErrorrr^r%r%r&Útest_02_from_stringÕs     ÿ ÿz$CryptContextTest.test_02_from_stringcCs°tj |j¡std|jƒ‚t |j¡}| | ¡|j ¡t |j ¡}| | ¡|j ¡tj|j ddd}| | ¡|j ¡|  t tjtj td¡¡|j ttj|jdddS) ztest from_path() constructorzcan't find data file: %rrbr>rczsample1xxx.cfgrfrgN)ÚosÚpathÚexistsÚ sample_1_pathÚ RuntimeErrorrZ from_pathrXrYrZÚsample_1b_pathÚsample_1c_pathrnÚEnvironmentErrorÚjoinÚhererr^r%r%r&Útest_03_from_pathós    ÿ  ÿ ÿz"CryptContextTest.test_03_from_pathcCstfi|j¤Ž}|jfi|j¤Ž}| | ¡|j¡| | ¡|j¡|jfi|j¤Ž}| | ¡|j¡| | ¡|j¡|jfi|j¤Ž}| | ¡|j¡| ¡}|  ||¡| | ¡|j¡| | ¡|j¡|j fi|j¤Ž| | ¡|j¡| | ¡|j¡dS)ztest copy() methodN) rrZrr\rXrYÚsample_12_dictr]Úsample_123_dictZ assertIsNotr)rUÚcc1Úcc2Zcc2bÚcc3Úcc4r%r%r&Ú test_04_copys  zCryptContextTest.test_04_copycCs$tfi|j¤Ž}| t|ƒd¡dS)z test repr()z!^$N)rrZÚ assertRegexÚrepr)rUr~r%r%r&Ú test_09_repr+szCryptContextTest.test_09_reprcCsÚtƒ}| |j¡| | ¡|j¡| |j¡| | ¡|j¡| |j d¡¡| | ¡|j¡| t|jd¡tfi|j¤Ž}|jidd| | ¡|j¡tƒ}| |j¡| |j ¡| | ¡|j ¡dS)z test load() / load_path() methodraNT)r) rÚloadrZrXrYrirkrnror\r^r%r%r&Ú test_10_load4s     zCryptContextTest.test_10_loadcCs„tddgddd}| ¡}|jt|jdd| | ¡|¡|jt|jdd| | ¡|¡|jt|jd d | | ¡|¡d S) z$test load() errors restore old stater)rAiˆr2)rLr6T)Ztoo__many__key__parts)Zfake_context_optioni'©rKN)rÚ to_stringrnrorrXÚKeyErrorÚ ValueError)rUÚccÚresultr%r%r&Útest_11_load_rollback_sþz&CryptContextTest.test_11_load_rollbackcCstfi|j¤Ž}| ¡| | ¡|j¡tfi|j¤Ž}|jfi|j¤Ž| | ¡|j¡|jfi|j¤Ž| | ¡|j¡tfi|j¤Ž}| |j¡| | ¡|j¡tfi|j¤Ž}| |j ¡| | ¡|j¡|  t |jii¡|j t |jidgd|  t |jd¡dS)ztest update() methodr)r;N) rrZrrXrYr\r|r]r}Úsample_2_unicodernror^r%r%r&Útest_12_updatews"  zCryptContextTest.test_12_updatecCs6dd„}|jttdd|jttdd|jttdd|jttdd|jttdd |jttd d |jt|fid d i¤Žtfidddœ¤Ž}| | d¡d¡td d}| |d d|¡| |d d|¡| |d d|¡| |fidd i¤Ž|¡| |fidd i¤Ž|¡td d}| |d d|¡| |fidd i¤Ž|¡tdd}| |dd|¡| |dd|¡| |fiddi¤Ž|¡| |fiddi¤Ž|¡tdd}| |dd|¡| |fiddi¤Ž|¡tdd gd d!}|jt|jd d"|jttdgd#d$|jttdgd#d%d&S)'ztest basic option parsingc[stfi|¤Ž ¡Sr©rrY)r"r%r%r&Úparsežsz/CryptContextTest.test_20_options..parser2)Ú__Úx)Zdefault__scheme__)Z__option)Zdefault____option)Z__scheme__optioni0u)Z!category__scheme__option__invalidzadmin.context__schemesr*úmd5_crypt,des_cryptr))r4zadmin.context__defaultÚadminr?)Zcontext__default)Zdefault__context__defaultzcontext.defaultzdefault.context.default©Úadmin__context__defaultzadmin.context.default©r6)Zdefault__all__vary_roundszall.vary_roundszdefault.all.vary_rounds)Úadmin__all__vary_roundszadmin.all.vary_roundsr@ÚP)rM)Zmd5_crypt__identÚxx)r4Zdes_crypt__salt)r4Z all__saltN)rnrorrŠrXÚdefault_schemeÚdictr)rUr’r_rr%r%r&Útest_20_optionsœsR ÿ ÿÿ      ÿ ÿz CryptContextTest.test_20_optionscCsètdd}| | ¡d¡tddgd}| | ¡d¡tdd}| | ¡d¡ttjtjgd}| | ¡d¡|jtttj gdGdd „d tj ƒ}|jt t|gdGd d „d tj ƒ}|jt t||gd|jt tdgd dS) z%test 'schemes' context option parsingNr;r%r)r*)r)r*z des_crypt, md5_crypt, c@seZdZdZdS)z2CryptContextTest.test_21_schemes..namelessN©Ú__name__Ú __module__Ú __qualname__r/r%r%r%r&Únamelessÿsr¤c@seZdZdZdS)z1CryptContextTest.test_21_schemes..dummy_1Údummy_1Nr r%r%r%r&r¥sr¥)Zadmin__context__schemes) rrXr4rr)r*rnroÚuhÚ StaticHandlerr‹rŠ)rUrŒr¤r¥r%r%r&Útest_21_schemesès   ÿz CryptContextTest.test_21_schemescCsddd„}tdgd}|jddgd| ||ƒdg¡tdgddgd}| ||ƒdg¡|jtttjgddgdtd gd ¢d}| ||ƒddg¡|jttdgdgd |jttdgdgd |jttddgddgd |jttddgddd |jttddgddd|jttddgddd|jttddgdddtddgddgd|jttddtdgddgdgd}| ||ƒdg¡| ||dƒdg¡| ||dƒdg¡tdgddggd}| ||ƒdg¡| ||dƒdg¡| ||dƒg¡dS)z(test 'deprecated' context option parsingNcs‡‡fdd„ˆ ¡DƒS)Ncsg|]}ˆ |ˆ¡jr|‘qSr%©ÚhandlerrHr-©Úcategoryr_r%r&r0sÿzGCryptContextTest.test_22_deprecated..getdep..r;©r_r¬r%r«r&Úgetdepsz3CryptContextTest.test_22_deprecated..getdepr*©rHr)r;)rHr4r•)r*r)rA©r4rH)r4Úadmin__context__deprecated)r4r5rH)r4r5r±)r4r˜rH)r4r˜r±)r4rHr˜r±é{)rHr4r±Úuserr–)N) rrrXrnrorr*rŠr‹)rUr®rŒr%r%r&Útest_22_deprecated s~  ÿ ÿþþýýýýüþþz#CryptContextTest.test_22_deprecatedcCs| tdd ¡tdd¡tdddgd}| | ¡d¡ttjddgd}| | ¡d¡tddgd}| | ¡d¡|jdd| | ¡d¡|jt tdgdd|jt tddtdddgdd }| | ¡d¡| | d ¡d¡| | d ¡d¡d S) z%test 'default' context option parsingr*r?r))r5r4r;r¯)r4r5é)r5r4r˜r³r–N) rXrrYržrrr*rrnrŠror^r%r%r&Útest_23_defaulths,ÿ  ÿþz CryptContextTest.test_23_defaultcCs\dd„}| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd¡| |dƒd¡dS) z&test 'vary_rounds' hash option parsingcSst|d ¡dS)Nr™r6r‘)Úvr%r%r&r’sz3CryptContextTest.test_24_vary_rounds..parser2z0.1z10%ièZ1000N)rX)rUr’r%r%r&Útest_24_vary_roundss z$CryptContextTest.test_24_vary_roundsNcCs|jt||ƒ|ddS)N)Úmsg)Ú assertTruer)rUrªÚbaser¹r%r%r&ÚassertHandlerDerivedFrom¡sz)CryptContextTest.assertHandlerDerivedFromcCs¾tƒ}| | ¡d¡| |jddd¡tfi|j¤Ž}| | ¡t|jƒ¡| |jdddt|jƒ¡t|jdd|jƒD]\}}| t ||ƒ¡q€tfi|j ¤Ž}| | ¡d¡dS)ztest schemes() methodr%T©Úresolve©r¾Ú unconfiguredN) rrXr4rZÚtupleÚsample_1_schemesÚsample_1_handlersÚziprºrr\)rUr_rZcorrectr%r%r&Útest_30_schemes¤sz CryptContextTest.test_30_schemescCs tƒ}| t|j¡tfi|j¤Ž}| | ¡d¡| |jdddtj¡| |jddtj¡tfi|j ¤Ž}| t|j¡t|j d}| | ¡d¡dS)ztest default_scheme() methodr*Tr¿r½r;r)N) rrnrŠrrZrXrr*r¼r\rÂr^r%r%r&Útest_31_default_scheme¸s z'CryptContextTest.test_31_default_schemecCsjtƒ}| t|j¡| t|jd¡tfi|j¤Ž}| |jddtj¡| | ¡tj¡| |jdddtj ¡| | d¡tj ¡| t|jd¡tddd}| |jddtj ¡| | ¡tj ¡| |jddd tj ¡| |jdd tj ¡| |jd dd tj¡| |jdd tj ¡t rf| |jt dƒdd tj ¡| |jt d ƒdd tj¡d S) ztest handler() methodr*T)rÀr)Úmysql323úsha256_crypt,md5_cryptr—Ústaff)r¬rÀ©r¬r–N) rrnrŠrªrZrXrr*r¼r)rArrr^r%r%r&Útest_32_handlerÐs& z CryptContextTest.test_32_handlerc Cs<ddd„}tdgd¢ddgdd d dd gd d dd }| |jjd¡| ||dƒtddd d¡| ||ddƒtddd d¡| ||ddƒtd dd¡| ||dƒtddd¡| ||ddƒtddd¡| ||ddƒtddd¡| ||d ƒtd d¡| ||d dƒtd d¡| ||d dƒtd dd¡dS)z*test internal _get_record_options() methodNcSs|j ||¡dS)Nr)Ú_configZ_get_record_options_with_flag)r_Úschemer¬r%r%r&Úoptions÷sz1CryptContextTest.test_33_options..optionsT)r,r)r+r,r)r2çš™™™™™É?i Nr+çš™™™™™©?g333333Ó?r3) Útruncate_errorr4rHr6rIr9r±ršZadmin__bsdi_crypt__vary_roundsZadmin__sha512_crypt__max_rounds)r–)rHÚ vary_roundsÚ max_roundsr³r–)rÒrÓ)rHrÑ)rÒ)rÒrH)N)rrXrÌÚ categoriesrž)rUrÎrr%r%r&Útest_33_optionsôsd ö ýýý þþþÿÿþz CryptContextTest.test_33_optionscCs<tfi|j¤Ž}| | ¡|j¡| |jdd|j¡dS)ztest to_dict() methodTr½N)rrZrXrYr[r^r%r%r&Útest_34_to_dictCsz CryptContextTest.test_34_to_dictcCs–tfi|j¤Ž}| ¡}ts*| ||j¡t |¡}| | ¡|j¡|jdd}| || dd¡¡ddl m }t|dgƒ}| ¡}|  |d¡d S) ztest to_string() methodzpassword-securityrgr=z[password-security]r)Ú UnsaltedHashr*zM# NOTE: the 'unsalted_test_hash' handler\(s\) are not registered with PasslibN) rrZr‰rrXrirhrYÚreplaceZ!passlib.tests.test_utils_handlersr×rƒ)rUr_ÚdumpÚctx2Úotherr×Zctx3r%r%r&Útest_35_to_stringJs    z"CryptContextTest.test_35_to_stringrÍrµr%cCstjtjtjg}t|dd}|D]z}|jd|jd}| | |¡|j¡| |j|ddd|¡| |j|dd|¡|  |  d|¡¡|  |  d|¡¡q | d¡}| | |¡d ¡|  d |  ¡¡}| | |¡d ¡|j d |  ¡d d}| | |¡d ¡|jt|j d |  ¡d dd S) z-test basic hash/identify/verify functionalityé©r8Útest©rÍTr¿r½Únotestr*Úsecretr)N)rr*r)r+rr/rXÚidentifyr¼rºÚverifyÚ assertFalseÚgenhashÚ genconfigrnr‹)rUÚhandlersrŒZcryptÚhr%r%r&Ú test_40_basicqs   zCryptContextTest.test_40_basiccCsHtddgdddd}| | ¡ d¡¡| |jdd d ¡¡| |jdd d  d ¡¡| |jdd d  d ¡¡| |jdddddd¡trÖ|jdd}| |jtd ƒd d ¡¡| |jtd ƒd d ¡¡| t tƒj¡|jt tƒjdd|jt |jdd|jt |jdd d |jt |jdd|jt |jdddS)ztest genconfig() methodr*r@rFrGr›)r4rMrNZadmin__phpass__identz$1$ràz$H$5r–)rÍr¬z$P$5rÉú........é)rÍÚsaltÚroundsÚidentz"$P$6........22zGEuacuPOqEpYPDeR0R/r?rÊÚfakerµN) rrºrçÚ startswithrXrrrrnrŠro©rUrŒÚc2r%r%r&Útest_41_genconfigŒs.ýþ  z"CryptContextTest.test_41_genconfigcCsòtdgƒ}| d¡}|jD]"\}}|jt|j||fi|¤Žqtdgƒ}|jD],\}}|dur`qN|jt|jd|fi|¤ŽqNtdgƒ}| t|jdd¡| ttƒjdd¡|jt|jd|dd|jt|jd|d d|jt|jd|d d dS) ztest genhash() methodr)ÚstubNrârÇrrðràrµrÊ)rrÚnonstring_vectorsrnrorærŠrç)rUrŒrrâr"Zconfigr%r%r&Útest_42_genhash½s    z CryptContextTest.test_42_genhashcCs¼tfi|j¤Ž}| d¡}| | d¡¡| | d|¡¡| | d|¡¡|jt|j ddtdgƒ}|j D] \}}|jt |j|fi|¤Žqp| t tƒjd¡|jt |jddd d S) ztest hash() methodÚpasswordz$5$rounds=3000$Z passwordxi ©rLr)rârµrÊN) rÚ sample_4_dictrrºrñrärårnr‹rrörorŠ)rUrŒrrâr"r%r%r&Ú test_43_hashás  ÿ zCryptContextTest.test_43_hashFc CsPtfi|j¤Ž}| dg¡(| |jddddd¡Wdƒn1sJ0Y| dg¡*| |jddddd d ¡Wdƒn1s0Y| dg¡(| |jdd d d d¡Wdƒn1sÔ0Y| dg¡(| |jddd d d¡Wdƒn1s0Y|jt|jddd|jt|jddddS)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µ)rrúÚassertWarningListrXrrnrŠro)rUZ use_16_legacyrŒr%r%r&Útest_43_hash_legacyýs.þ"þ"þ"þ$z$CryptContextTest.test_43_hash_legacycCs°gd¢}t|dd}| | d¡d¡|jt|jdddtdgƒ}|jD] \}}|jt|j|fi|¤ŽqJtƒ}| | d ¡d¡|jt|jd dd|jt|jdd d dS) ztest identify() border cases©r*r)r+rÝrÞz$9$232323123$1287319827NT)Úrequiredr)rrµrÊ) rrXrãrnr‹röroÚassertIsrŠ)rUrèrŒrr"r%r%r&Útest_44_identify.s  z!CryptContextTest.test_44_identifycCsŽgd¢}t|dd}tj d¡}| | d|¡¡| | d|¡ ¡| |jd|dd¡| |jd|dd ¡|jt|jd|dd| t|jd d ¡td gƒ}| d ¡}}|jD]"\}}|jt|j||fi|¤Žqº|  | |d ¡¡td gƒ}|jD]2\}}|d urq|jt|jd |fi|¤Žq| t tƒjd d¡|jt |jd |dd|jt|jd |dd|jt|jd |ddd S)ztest verify() scheme kwdrrÝrÞrßrár*ràr+rõz$6$232323123$1287319827r)NrârrðrµrÊ) rrr*rºrärnr‹rörorårŠ)rUrèrŒréÚrefhashrâr"r%r%r&Útest_45_verifyHs.     zCryptContextTest.test_45_verifycs´tfi|j¤Ž}| | d¡¡| | d¡¡| | d¡¡| | d¡¡| | d¡¡| | d¡¡g‰G‡fdd„dtjƒ}t|gƒ}| d ¡}}| | |¡¡| ˆ|d fg¡ˆd d …=| |j|d d ¡| ˆ|d fg¡ˆd d …=| |j|d d ¡| ˆ|d fg¡ˆd d …=tdgƒ}|j D]"\}}|j t |j|fi|¤Žq>|  t tƒjd¡|j t |j|dd|j t |j|dd|j t |j|ddd S)ztest 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/2hdFpxA3fAcs.eZdZdZdZed‡fdd„ ƒZdd„ZdS) z4CryptContextTest.test_46_needs_update..dummyÚdummyú@Ncsˆ ||f¡|dkS)NÚnu)Úappend)Úclsrrâ©Z check_stater%r&Ú needs_update“szACryptContextTest.test_46_needs_update..dummy.needs_updatecSs0ddlm}t|tƒr | d¡}t||ƒ ¡ƒS)Nr)Úmd5ra)ÚhashlibrÚ isinstancerrkrÚ hexdigest)rUrârr%r%r&Ú_calc_checksum˜s   zCCryptContextTest.test_46_needs_update..dummy._calc_checksum)N)r¡r¢r£r/Ú _hash_prefixÚ classmethodrrr%rr%r&r s r rßNZbob)râr r)rrðràrµrÊ) rrúrºrrår¦r§rrXrörnrorŠ)rUrŒr r_rrr"r%rr&Útest_46_needs_update{s6     z%CryptContextTest.test_46_needs_updatec CsÂtfi|j¤Ž}| d¡ d¡}| d¡ d¡}| d|¡\}}| |¡| |d¡| d|¡\}}| |¡| |d¡| d|¡\}}| |¡| | |¡d¡| d|¡\}}| |¡| |d¡tdgƒ}| d¡}}|j D]"\}} |j t |j||fi| ¤Žqì|  | |d¡d¡tdgƒ}|j D]2\}} |durJq4|j t |jd|fi| ¤Žq4|  t tƒjdd ¡|j t |jd|d d |j t |jd|d d |j t |jd|d d dS)ztest verify_and_update()r)rørAZ wrongpassNrõ©FNrârrðràrµrÊ)rrúrªrÚverify_and_updaterårrºrãrörnrorXrŠ) rUrŒZh1Zh2ÚokZnew_hashrrrâr"r%r%r&Útest_47_verify_and_updateÂs:          z*CryptContextTest.test_47_verify_and_updatec Csêddlm}m}m}| d¡}|jddd}|jddd}t||gƒ}| |jtƒ¡|  |  | d¡¡d¡|  |  d|¡¡| |  d|¡d¡|  d g¡$|jt|jdddWd ƒn1sÊ0Y|jt|j d|dd|jt|j d|ddt||gƒ}| |jtd gƒ¡|  |  | d¡¡d¡|  |  d|¡¡| |  d|¡d¡|  |  |jddd¡d¡|  |j d|dd¡| |j d|ddd¡|  d g¡$|jt|jddd Wd ƒn1sà0Y|jt|j d|dd |jt|j d|dd t||gd d} | | jtd gƒ¡| t| jd¡| t| j d|¡| t| j d|¡| | jddd|¡|  | j d|dd¡| | j d|ddd¡| | j d|ddd¡| | j d|ddd|f¡d S)zLhash(), verify(), and verify_and_update() -- discard unused context keywordsr)r)r*Ú postgres_md5rõÚroot)r³r–r))TNrüNr³)ZbadkwdÚautor¯rT)Ú passlib.hashr)r*rrrrXZ context_kwdsÚsetrºrãrärrrnro) rUr)r*rZdes_hashZ pg_root_hashZ pg_admin_hashr~rr€r%r%r&Útest_48_context_kwdsüsJ  2 4ÿz%CryptContextTest.test_48_context_kwdscCsftdgdddd}d}| dd¡}| |jd¡| |jd¡| |jd¡| tgd¡ |jd dd d }Wdƒn1s‚0Y| |j d d d |¡| g¡*| |j dd dd|¡Wdƒn1sÞ0Y| |j dd dd|¡| |j dd dd|¡| tgd¡0|jt dƒd dt dƒd d}Wdƒn1sd0Y| |j d d d|¡| g¡*| |j dd dd|¡Wdƒn1sÂ0Y| |j dd dd|¡| |j dd dd|¡| |j d d d|¡t j j}|jd|d>d}| |j d d d||f¡|jddd}| |j d d d|¡|j t|jdd |jdd |jdd |j t|jdd tdgd!}|j t|jddd"|j ttd#d$|j ttd#d%|j ttd#d&|j ttd#d tj ¡}|j ttd|d$|j ttd|d%|j ttd|d&|j ttd|d dS)'ztest rounds limitsrArErDiÄ ©r4rKrJrLz+...........................................Néiô)rKrJrLrþ©ríz$5$rounds=1000$nacl$rýrÿz$5$rounds=1999$nacl$z$5$rounds=2000$nacl$rz$5$rounds=2001$nacl$geÍÍA)rJrKrLz$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µ)rLrJz$5$rounds=%d$nacl$%srùr;)rKrJr”rˆ)rJr™)rÚ _get_recordrXZmin_desired_roundsZmax_desired_roundsZdefault_roundsrr rrçÚintrrArnr‹ÚdatetimeZnowro)rUrŒZSTUBZcustom_handlerróZdfZbadr%r%r&Útest_50_rounds_limitsQs~ý ÿ$ ÿ"ÿÿ ÿ& ÿ$ÿÿ    ÿ z&CryptContextTest.test_50_rounds_limitscCsxtdgdddd}|jt|jdd|jt|jdd|jt|jd d|jd d}| | dd ¡jd ¡| |ddd¡|jd d}| | dd ¡jd ¡| |ddd¡|jd d}| | dd ¡jd ¡| |ddd¡|jdd}| | dd ¡jd¡| |ddd¡|jdd}| | dd ¡jd¡| |ddd¡|jdd}| | dd ¡jd¡| |ddd¡d S)ztest linear vary roundsrAiËiÕrEr"éÿÿÿÿr™ú-1%ú101%rNú0%rµrýrédz0.1%gü©ñÒMbP?iÎiÒú100%çð?©rrnr‹rrXr%rÒÚassert_rounds_rangeròr%r%r&Útest_51_linear_vary_roundsÇs4ý      z+CryptContextTest.test_51_linear_vary_roundscCsÜtdgdddd}|jt|jdd|jt|jdd|jt|jd d|jd d}| | dd ¡jd ¡| |ddd¡|jd d}| | dd ¡jd ¡| |ddd¡|jd d}| | dd ¡jd ¡| |ddd¡|jdd}| | dd ¡jd¡| |ddd¡|jdd}| | dd ¡jd¡| |ddd¡|jdd}| | dd ¡jd¡| |ddd¡|jdd}| | dd ¡jd¡| |ddd¡|jdd}| | dd ¡jd¡| |ddd¡d S)ztest log2 vary roundsZbcryptérCé)r4Zbcrypt__min_roundsZbcrypt__max_roundsZbcrypt__default_roundsr)r™r*r+rNr,rµéér-z1%g{®Gáz„?z49%g\Âõ(\ß?z50%gà?r.r/r0ròr%r%r&Útest_52_log2_vary_roundsís@ý        z)CryptContextTest.test_52_log2_vary_roundsc Cs~| |¡}|jdd…|j}tƒ}tdƒD](}|j||d} | | ¡j} | | ¡q,|  t |ƒ|d¡|  t |ƒ|d¡dS)z2helper to check vary_rounds covers specified rangerrµi,r$z"vary_rounds had wrong lower limit:z"vary_rounds had wrong upper limit:N) rªZdefault_salt_charsZ max_salt_sizer r rçrhrîÚaddrXÚminÚmax) rUÚcontextrÍÚlowerÚupperrªríÚseenÚiréÚrr%r%r&r1s    z$CryptContextTest.assert_rounds_rangecCsptjddtdtdgd}| |jd¡| |jddjd¡| |jd djd¡| |jd djd¡dS) zharden_verify -- parsingrOz.*harden_verify.*rÊrAr;NÚ)Ú harden_verifyÚtrueZfalse)rRrSÚDeprecationWarningrrXrBÚusingr^r%r%r&Útest_harden_verify_parsing-sÿ z+CryptContextTest.test_harden_verify_parsingcCsPd}d}t ¡}||_t|gd}| ¡t|jƒ\}}|j||||ddS)z' dummy_verify() method rÐrÏr;)ZdeltaN)Ú DelayHashrEÚdelayrZ dummy_verifyrZassertAlmostEqual)rUZexpectedZaccuracyrªr_ÚelapsedÚ_r%r%r&Útest_dummy_verify9s z"CryptContextTest.test_dummy_verifycCsddd„}tddd}| ||dƒgd¢¡| ||dƒgd¢¡|jd d | ||dƒgd ¢¡| ||dƒgd ¢¡|jd d | ||dƒgd ¢¡| ||dƒgd¢¡tdgdd}| ||dƒdg¡| ||dƒdg¡|jttddd|jttddddS)z+test deprecated='auto' is handled correctlyNcs‡‡fdd„ˆ ¡DƒS)Ncsg|]}ˆ |ˆ¡j‘qSr%r©)r.rÍr«r%r&r0Qr1zLCryptContextTest.test_61_autodeprecate..getstate..r;r­r%r«r&ÚgetstatePsz8CryptContextTest.test_61_autodeprecate..getstatez sha256_crypt,md5_crypt,des_cryptrr¯)FTTr–r*r?)TFTr)r—)TTFrAFrÈzauto,md5_cryptzmd5_crypt,auto)N)rrXrrnr‹)rUrLr_r%r%r&Útest_61_autodeprecateMs&     ÿ ÿz&CryptContextTest.test_61_autodeprecatec Cs&ddlm}ddlm}m}tdgƒ}tddgƒ}| d¡}| d¡}| td|j ¡| td|j |¡| td|j |¡|  ¡}|  ||j ¡|  |¡} |  | |j |¡|  |¡} |  | |j |¡|  |  | ¡| ¡|  |  |¡¡| ||j |¡| ||j |¡| ||j | ¡|  |  |¡¡| ||j |¡| |  |¡¡| |  | ¡¡| ||jd¡| t|jd ¡|  | |¡|¡| ||j|¡| ||j|¡| ||j| ¡| ||jd¡| t|jd ¡|  | |¡|¡| ||j|¡| td |j|¡|  | | ¡|¡d S) zdisabled hash supportr)ÚUnknownHashError)r*Ú unix_disabledr)rOZfoozno disabled hasher presentrANzcannot restore original hash)Ú passlib.excrNrr*rOrrZassertRaisesRegexruÚdisablerXZdefault_markerrºZ is_enabledrnråÚenableror‹) rUrNr*rOr_rÚZh_refZh_otherZh_disZ h_dis_refZ h_dis_otherr%r%r&Útest_disabled_hashesmsX     ÿÿÿ  ÿz%CryptContextTest.test_disabled_hashes)N)F)Hr¡r¢r£ÚdescriptionPrefixrÂrÃržrZr'r[rrjrirqrrryrzrtrØrlrvrkrmrwrr\rr|r]r}rúrQr`rpr{r‚r…r‡rŽrrŸr¨r´r¶r¸r¼rÅrÆrËrÕrÖrÜrörêrôr÷rûrrrrrr!r(r2r7r1rFrKrMrSÚ __classcell__r%r%rVr&r(1s¾ ù ÿ  ÿÿ ú  ÿ ô  +%L$\% $O! ü1$ 13G:Uv&/  r(c@s2eZdZdZdZejZdZdZ e dƒZ dd„Z dS) rGz-dummy hasher which delays by specified amountZ delay_hashé(rz$x$cCs6t |j¡t|tƒr | d¡}tt d|¡  ¡ƒS)Nrasprefix) ÚtimeÚsleeprHrrrkrrZsha1r)rUrâr%r%r&rÅs   zDelayHash._calc_checksumN) r¡r¢r£Ú__doc__r/r¦ZLOWER_HEX_CHARSZchecksum_charsZ checksum_sizerHrrrr%r%r%r&rG½srGc@seZdZdZdS)Údummy_2Nr r%r%r%r&rZÎsrZc@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚLazyCryptContextTestrcCstdƒ| td¡dS)NrZ)Úunload_handler_nameZ addCleanuprTr%r%r&rQÔszLazyCryptContextTest.setUpcCst| tdƒ¡tddƒttddgƒdgd}| tddƒ¡| | ¡d¡| | d¡j ¡| tddƒ¡dS)ztest plain kwdsrZúpasslib.tests.test_contextr)r¯T©rZr)N) råÚhas_crypt_handlerrrÚiterrXr4rºrªrH)rUrŒr%r%r&Útest_kwd_constructorÙs z)LazyCryptContextTest.test_kwd_constructorcsxˆ tdƒ¡tddƒd ‡fdd„ }t|dd}ˆ tddƒ¡ˆ | ¡d¡ˆ | d ¡j¡ˆ tddƒ¡dS) NrZr]Fcs ˆ |¡ttddgƒdgdS)NrZr)r°)rºržr`)ÚflagrTr%r&Úonloadës z>LazyCryptContextTest.test_callable_constructor..onloadT)rcrbr^r))F) rår_rrrXr4rºrªrH)rUrcrŒr%rTr&Útest_callable_constructorçs  z.LazyCryptContextTest.test_callable_constructorN)r¡r¢r£rTrQrardr%r%r%r&r[Ñsr[)ArYZ __future__rZpasslib.utils.compatrZ configparserrZ ConfigParserr'Ú functoolsrZloggingZ getLoggerr¡ÚlogrqrRZpasslibrZpasslib.contextrrrPr r Z passlib.utilsr r r rrrrrZpasslib.utils.handlersZutilsrèr¦Zpasslib.tests.utilsrrrrrrZpasslib.registryrrr_rr\rrrÚabspathÚdirnameÚ__file__rzr'r(rrWr§rGrZr[r%r%r%r&ÚsL