a fWc<@sdZddlmZddlZeeZddlZddlZddl m Z ddl m Z ddl mZddlmZmZmZmZddlmZmZdd lmZmZmZed Zd d ZGd ddeZGdddeZGdddeeZGdddeeZ GdddeeZ!GdddeeZ"GdddeeZ#ee j$%dGdddeeZ&ee j$%dGdddeeZ'dd l(m)Z)ee j*%d!Gd"d#d#eeZ+dS)$zFpasslib.tests.test_handlers_django - tests for passlib hash algorithms)with_statementN)hash) repeat_string)u)TestCase HandlerCase skipUnlessSkipTest) UPASS_USD UPASS_TABLE)DJANGO_VERSIONMIN_DJANGO_VERSIONcheck_django_hasher_has_backendulètmeincCsddd|DS)N.css|]}t|VqdSN)str).0erF/usr/lib/python3.9/site-packages/passlib/tests/test_handlers_django.py zvstr..)join)versionrrrvstrsrc@sFeZdZdZdZeZdZddZe j dZ ddZ d d Z d d ZdS) _DjangoHelperzi mixin for HandlerCase subclasses that are testing a hasher which is also present in django. TNcCsdt|jkr|dt|j|jrBt|jkrB|dt|j|jj}t|s`|d|dS)NzDjango >= %s not installedzDjango <= %s not installedzdjango hasher %r not availableT)r min_django_versionskipTestrmax_django_versionhandler django_namer)selfnamerrr_require_django_support0s z%_DjangoHelper._require_django_support)fuzz_verifier_djangocs@z Wnty YdS0ddlmfdd}|S)Nrcheck_passwordcs@jjdkr"|dr"|dd}t|tr6|d}||S)zdjango/check_password django_bcryptz bcrypt$$2y$z$$2y$z$$2a$utf-8)rr" startswithreplace isinstancebytesdecode)secretrr&r!rr verify_djangoIs    z9_DjangoHelper.fuzz_verifier_django..verify_django)r#r django.contrib.auth.hashersr&)r!r0rr/rr$Bs   z"_DjangoHelper.fuzz_verifier_djangocCsl|ddlm}|jsJ|D]@\}}||||d||f||d||d||fq&dS)z:run known correct hashes through Django's check_password()rr%z"secret=%r hash=%r failed to verifyxz,mangled secret=%r hash=%r incorrect verifiedN)r#r1r&known_correct_hashesZiter_known_hashes assertTrue assertFalse)r!r&r.rrrrtest_90_django_referenceRs   z&_DjangoHelper.test_90_django_referencec Cs|ddlm}ddlm}|jj}||jd}||| }||kr| \}}|sdqHt |t rx| d}|||d}|||||||||||qHdS)z/test against output of Django's make_password()r)tick) make_passwordr()ZhasherN)r# passlib.utilsr7r1r8rr Z max_fuzz_timeFuzzHashGeneratorZ getRandomZrandom_password_pairr+r,r-r4Z do_identifyZ do_verifyr5) r!r7r8r"end generatorr.otherrrrrtest_91_django_generationas        z'_DjangoHelper.test_91_django_generation)__name__ __module__ __qualname____doc__Z_DjangoHelper__unittest_skipr rrr#rZfuzz_verifiersZextra_fuzz_verifiersr$r6r?rrrrrs rc@s.eZdZdZejZdZddedfgZ dgZ dS)django_disabled_testztest django_disabledT)password!)rFrF)z!9wa845vn7098ythaehasldkfjrErFN) r@rArBrCrZdjango_disabledrZdisabled_contains_saltr r3known_alternate_hashesrrrrrDvs rDc@sPeZdZdZejZdZdddedfe dfe dd fd gZ d gZ d gZ gd ZdS)django_des_crypt_testztest django_des_crypt )rEcrypt$c2$c2M87q...WWcU)rEzcrypt$c2e86$c2M87q...WWcU)Zpasswordignoremezcrypt$c2.AZ$c2M87q...WWcUzcrypt$c2e86$c2hN1Bxd6ZiWszcrypt$0.aQs$0.wB.TT0CzvlouhellÖzcrypt$sa$saykDgk3BPZ9E)Zfooz!crypt$MNVY.9ajgdvDQ$MNVY.9ajgdvDQ)zcrypt$$c2M87q...WWcUrErM sha1$aa$bb)zcrypt$c2$c2M87qzcrypt$f$c2M87q...WWcUzcrypt$ffe86$c2M87q...WWcUN)r@rArBrCrZdjango_des_cryptrrr r rr3rHknown_unidentified_hashesknown_malformed_hashesrrrrrIs  rIc@sLeZdZdZejZdZddedfe dfgZ dgZ dgZ Gd d d e jZd S) django_salted_md5_testztest django_salted_md5rJ)rEz.md5$123abcdef$c8272612932975ee80e8a35995708e80)testz1md5$3OpqnFAHW5CT$54b29300675271049a1ebae07b395e20z*md5$c2e86$92105508419a81a6babfaecf876a2fa0z*md5$d9eb8$01495b32852bffb27cf5d4394fe7a54crN md5$aa$bbc@seZdZddZdS)z(django_salted_md5_test.FuzzHashGeneratorcCs@|j}|j}|jdksJd}|jp*|d}|||||dS)NrrKg?)rZdefault_salt_sizeZ min_salt_sizeZ max_salt_size randintgauss)r!rdefaultlowerupperrrrrandom_salt_sizes z9django_salted_md5_test.FuzzHashGenerator.random_salt_sizeN)r@rArBrYrrrrr;sr;N)r@rArBrCrZdjango_salted_md5rrr r r3rOrPrr;rrrrrQs rQc@sBeZdZdZejZdZddedfe dfdgZ dgZ d gZ e jZd S) django_salted_sha1_testztest django_salted_sha1rJ)rEz7sha1$123abcdef$e4a1877b0e35c47329e7ed7e58014276168a37ba)rRz:sha1$bcwHF9Hy8lxS$6b4cfa0651b43161c6f1471ce9523acf1f751ba3z3sha1$c2e86$0f75c5d7fbd100d587c127ef0b693cde611b4adaz3sha1$6d853$ef13a4d8fb57aed0cb573fe9c82e28dc7fd372d4)Z MyPasswordz3sha1$54123$893cf12e134c3c215f3a76bd50d13f92404a54d3rSzsha1$c2e86$0f75N)r@rArBrCrZdjango_salted_sha1rrr r r3rOrPrQr;rrrrrZsrZc@s"eZdZdZejZdedfgZdS)django_pbkdf2_sha256_testztest django_pbkdf2_sha256)not a passwordzMpbkdf2_sha256$10000$kjVJaVz6qsnJ$5yPHw3rwJGECpUf70daLGhOrQ5+AMxIJdz1c3bqK1Rs=zMpbkdf2_sha256$10000$bEwAfNrH1TlQ$OgYUblFNUX1B8GfMqaCYUK/iHyO0pa7STTDdaEJBuY0=N) r@rArBrCrZdjango_pbkdf2_sha256rr r3rrrrr[sr[c@s"eZdZdZejZdedfgZdS)django_pbkdf2_sha1_testztest django_pbkdf2_sha1)r\z;pbkdf2_sha1$10000$wz5B6WkasRoF$atJmJ1o+XfJxKq1+Nu1f1i57Z5I=z;pbkdf2_sha1$10000$KZKWwvqb8BfL$rw5pWsxJEU4JrZAQhHTCO+u0f5Y=N) r@rArBrCrZdjango_pbkdf2_sha1rr r3rrrrr]sr]zno bcrypt backends availablecsNeZdZdZejZdZdZdde dfgZ fddZ Gd d d e j Z ZS) django_bcrypt_testtest django_bcrypt)r9rT)rGzCbcrypt$$2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.)ZabcdefghijklmnopqrstuvwxyzzCbcrypt$$2a$10$fVH8e28OQRj9tqiDXs1e1uxpsjN0c7II7YPKXua2NAKYvM6iQk7dqzCbcrypt$$2a$05$Z17AXnnlpzddNUvnC6cZNOSwMA/8oNiKnHTHTwLlBijfucQQlHjaGcs |ddtt||dSNroundsrT) setdefaultsuperr^populate_settingsr!kwds __class__rrrd*s z$django_bcrypt_test.populate_settingsc@seZdZddZddZdS)z$django_bcrypt_test.FuzzHashGeneratorcCs|ddddSNrKrUr!rrr random_rounds1sz2django_bcrypt_test.FuzzHashGenerator.random_roundscCsdSrrrnrrr random_ident5sz1django_bcrypt_test.FuzzHashGenerator.random_identNr@rArBrorprrrrr;/sr;)r@rArBrCrr'rrfuzz_salts_need_bcrypt_repairr r3rdrr; __classcell__rrrgrr^s r^cseZdZdZejZdZdZde dfe dfe ddd fe ddd d fe ddd d fgZ dgZ fddZGdddejZZS)django_bcrypt_sha256_testztest django_bcrypt_sha256NT)rGzJbcrypt_sha256$$2a$06$/3OeRpbOf8/l6nPPRdZPp.nRiyYqPobEZGdNRBWihQhiFDh1ws1tuzJbcrypt_sha256$$2a$08$NDjSAIcas.EcoxCRiArvT.MkNiPYVhrsrnJsRkLueZOoV1bsQqlmCzJbcrypt_sha256$$2a$06$kCXUnRFQptGg491siDKNTu8RxjBGSjALHRuvhPYNFsa4Ea5d9M48uZabc123HzJbcrypt_sha256$$2a$06$Tg/oYyZTyAf.Nb3qSgN61OySmyXA8FoY4PjGizjE1QSDfuL5MXNniZqwrzJbcrypt_sha256$$2a$06$Tg/oYyZTyAf.Nb3qSgN61Ocy0BEz1RK6xslSNi8PlaLX2pe7x/KQGZxyzzJbcrypt_sha256$$2a$06$Tg/oYyZTyAf.Nb3qSgN61OvY2zoRVUa2Pugv2ExVOUT2YmhvxUFUazMbcrypt_sha256$xyz$2a$06$/3OeRpbOf8/l6nPPRdZPp.nRiyYqPobEZGdNRBWihQhiFDh1ws1tucs |ddtt||dSr`)rbrcrtrdrergrrrd\s z+django_bcrypt_sha256_test.populate_settingsc@seZdZddZddZdS)z+django_bcrypt_sha256_test.FuzzHashGeneratorcCs|ddddSrirmrnrrrrocsz9django_bcrypt_sha256_test.FuzzHashGenerator.random_roundscCsdSrrrnrrrrpgsz8django_bcrypt_sha256_test.FuzzHashGenerator.random_identNrqrrrrr;asr;)r@rArBrCrZdjango_bcrypt_sha256rZforbidden_charactersrr UPASS_LETMEINr rr3Zknown_malformed_hashersrdrr;rsrrrgrrt:s2   rt)_base_argon2_testzno argon2 backends availablecsXeZdZdZejZddedfgZfddZ ddd Z d d Z Gd d d e j Z ZS)django_argon2_testr_)rEzDargon2$argon2i$v=19$m=256,t=1,p=1$c29tZXNhbHQ$AJFIsNZTMKTAewB4+ETN1A)rEzDargon2$argon2i$v=19$m=380,t=2,p=2$c29tZXNhbHQ$SrssP8n7m/12VWPM8dvNrwzIargon2$argon2i$v=19$m=512,t=2,p=2$V25jN1l4UUJZWkR1$MxpA1BD2Gh7+D79gaAw6sQcstt|tdddS)Nignorez.*Using argon2pure backend.*)rcrx setUpWarningswarningsfilterwarningsrnrgrrrzsz django_argon2_test.setUpWarningsNcKsB|p|jjfi|}|jdd}|j|_|js4J||S)NT)Z use_defaults)rZusingwrappedZ_stub_checksumZchecksumZ _wrap_hashZ to_string)r!rZsettingsrrrdo_stub_encrypts   z"django_argon2_test.do_stub_encryptcCs|ddS)Nz!legacy 1.6 workflow not supported)rrnrrrtest_03_legacy_hash_workflowsz/django_argon2_test.test_03_legacy_hash_workflowc@seZdZddZddZdS)z$django_argon2_test.FuzzHashGeneratorcCsdS)NIrrnrrr random_typesz0django_argon2_test.FuzzHashGenerator.random_typecCs|ddddS)NrKr9rmrnrrrrosz2django_argon2_test.FuzzHashGenerator.random_roundsN)r@rArBrrorrrrr;sr;)N)r@rArBrCrZ django_argon2rrvr3rzr~rrwr;rsrrrgrrxns  rx),rCZ __future__rZloggingZ getLoggerr@logrer{Zpasslibrr:rZpasslib.utils.compatrZpasslib.tests.utilsrrrr Zpasslib.tests.test_handlersr r Zpasslib.tests.test_ext_djangor r rrvrrrDrIrQrZr[r]ZbcryptZ has_backendr^rtZ"passlib.tests.test_handlers_argon2rwZargon2rxrrrrs4     W)( %1