
    g<                        S r SSKJr  SSKr\R                  " \5      rSSKrSSKrSSK	J
r
  SSKJr  SSKJr  SSKJrJrJrJr  SSKJrJr  SS	KJrJrJr  \" S
5      rS r " S S\5      r " S S\5      r " S S\\5      r " S S\\5      r  " S S\\5      r! " S S\\5      r" " S S\\5      r#\" \
RH                  RK                  5       S5       " S S\\5      5       r&\" \
RH                  RK                  5       S5       " S S\\5      5       r'SSK(J)r)  \" \
RT                  RK                  5       S 5       " S! S"\\5      5       r+g)#zFpasslib.tests.test_handlers_django - tests for passlib hash algorithms    )with_statementN)hash)repeat_string)u)TestCaseHandlerCase
skipUnlessSkipTest)	UPASS_USDUPASS_TABLE)DJANGO_VERSIONMIN_DJANGO_VERSIONcheck_django_hasher_has_backendu   lètmeinc                 2    SR                  S U  5       5      $ )N.c              3   8   #    U  H  n[        U5      v   M     g 7fN)str).0es     [/home/matz/Project1/venv/lib/python3.13/site-packages/passlib/tests/test_handlers_django.py	<genexpr>vstr.<locals>.<genexpr>   s     ,GqCFFGs   )join)versions    r   vstrr      s    88,G,,,    c                   Z    \ rS rSrSrSr\rSrS r	\
R                  S-   rS rS rS	 rS
rg)_DjangoHelper   z]
mixin for HandlerCase subclasses that are testing a hasher
which is also present in django.
TNc                    [         U R                  :  a'  U R                  S[        U R                  5      -  5      eU R                  (       a;  [         U R                  :  a'  U R                  S[        U R                  5      -  5      eU R
                  R                  n[        U5      (       d  U R                  SU-  5      eg)NzDjango >= %s not installedzDjango <= %s not installedzdjango hasher %r not availableT)r   min_django_versionskipTestr   max_django_versionhandlerdjango_namer   )selfnames     r   _require_django_support%_DjangoHelper._require_django_support0   s    D333-- <tDD[D[?\ \]]""~8O8O'O-- <tDD[D[?\ \]] ||''.t44-- @4 GHHr   )fuzz_verifier_djangoc                 f   ^ ^  T R                  5         SSKJm  UU 4S jnU$ ! [         a     g f = f)Nr   check_passwordc                    > TR                   R                  S:X  a*  UR                  " S5      (       a  UR                  " SS5      n[	        U [
        5      (       a  U R                  S5      n T" X5      $ )zdjango/check_passworddjango_bcryptzbcrypt$$2y$z$$2y$z$$2a$utf-8)r%   r(   
startswithreplace
isinstancebytesdecode)secretr   r.   r'   s     r   verify_django9_DjangoHelper.fuzz_verifier_django.<locals>.verify_djangoI   sY    ||  O38V8V||GW5&%((w/!&//r   )r)   r
   django.contrib.auth.hashersr.   )r'   r8   r.   s   ` @r   r+   "_DjangoHelper.fuzz_verifier_djangoB   s:    	((* 	?	0   		s   # 
00c           	         U R                  5         SSKJn  U R                  (       d   eU R	                  5        HK  u  p#U R                  U" X#5      SU< SU< S35        U R                  U" SU-   U5      SU< SU< S35        MM     g	)
z:run known correct hashes through Django's check_password()r   r-   zsecret=z hash=z failed to verifyxzmangled secret=z incorrect verifiedN)r)   r:   r.   known_correct_hashesiter_known_hashes
assertTrueassertFalse)r'   r.   r7   r   s       r   test_90_django_reference&_DjangoHelper.test_90_django_referenceR   s{    $$& 	?(((( 224LFOON68#T+, ^C&L$?#T+,	 5r   c                 T   U R                  5         SSKJn  SSKJn  U R
                  R                  nU" 5       U R                  S-  -   nU R                  X R                  5       5      nU" 5       U:  a  UR                  5       u  pgU(       d  M&  [        U[        5      (       a  UR                  S5      nU" XcS9nU R                  U R                  U5      5        U R                  U R!                  Xh5      5        U R#                  U R!                  Xx5      5        U" 5       U:  a  M  gg)z/test against output of Django's make_password()r   )tick)make_password   r1   )hasherN)r)   passlib.utilsrE   r:   rF   r%   r&   max_fuzz_timeFuzzHashGenerator	getRandomrandom_password_pairr4   r5   r6   r@   do_identify	do_verifyrA   )	r'   rE   rF   r(   end	generatorr7   otherr   s	            r   test_91_django_generation'_DjangoHelper.test_91_django_generationa   s    $$& 	'=||''ft))!++**41AB	fsl%::<MF&%((w/ 5DOOD,,T23OODNN689T^^E89 fslr    )__name__
__module____qualname____firstlineno____doc___DjangoHelper__unittest_skipr   r"   r$   r)   r   fuzz_verifiersextra_fuzz_verifiersr+   rB   rS   __static_attributes__rU   r   r   r   r      sJ     O ,  '55 9  ,:r   r   c                   H    \ rS rSrSr\R                  rSrSS\	S4/r
S/rSrg	)
django_disabled_testv   ztest django_disabledT)password!) rc   rc   )z!9wa845vn7098ythaehasldkfjrb   rc   rU   N)rV   rW   rX   rY   rZ   r   django_disabledr%   disabled_contains_saltr   r>   known_alternate_hashesr^   rU   r   r   r`   r`   v   s;    ""G! 		c	 	8r   r`   c                   r    \ rS rSrSr\R                  rSrSSS\	S4\
S4\" S	5      S
4S/rS/rS/r/ SQrSrg)django_des_crypt_test   ztest django_des_crypt   	   )rb   crypt$c2$c2M87q...WWcU)rb   zcrypt$c2e86$c2M87q...WWcU)passwordignoremezcrypt$c2.AZ$c2M87q...WWcUzcrypt$c2e86$c2hN1Bxd6ZiWszcrypt$0.aQs$0.wB.TT0Czvlou   hellÖzcrypt$sa$saykDgk3BPZ9E)fooz!crypt$MNVY.9ajgdvDQ$MNVY.9ajgdvDQ)zcrypt$$c2M87q...WWcUrb   rn   
sha1$aa$bb)zcrypt$c2$c2M87qzcrypt$f$c2M87q...WWcUzcrypt$ffe86$c2M87q...WWcUrU   N)rV   rW   rX   rY   rZ   r   django_des_cryptr%   r$   r   r   r   r>   rg   known_unidentified_hashesknown_malformed_hashesr^   rU   r   r   ri   ri      sr    ##G 	799 
/0	12	
<23 	5$ 	G 	!	r   ri   c                   ~    \ rS rSrSr\R                  rSrSS\	S4\
S4/rS/rS	/r " S
 S\R                  5      rSrg)django_salted_md5_test   ztest django_salted_md5rk   )rb   z.md5$123abcdef$c8272612932975ee80e8a35995708e80)testz1md5$3OpqnFAHW5CT$54b29300675271049a1ebae07b395e20z*md5$c2e86$92105508419a81a6babfaecf876a2fa0z*md5$d9eb8$01495b32852bffb27cf5d4394fe7a54crq   	md5$aa$bbc                       \ rS rSrS rSrg)(django_salted_md5_test.FuzzHashGenerator   c                     U R                   nUR                  nUR                  S:X  d   eSnUR                  =(       d    US-  nU R	                  X4X"S-  5      $ )Nr   rl      g      ?)r%   default_salt_sizemin_salt_sizemax_salt_sizerandintgauss)r'   r%   defaultloweruppers        r   random_salt_size9django_salted_md5_test.FuzzHashGenerator.random_salt_size   s\    
 llG//G((A---E))6WQYE$$U7BJGGr   rU   N)rV   rW   rX   rY   r   r^   rU   r   r   rK   r{      s    
	Hr   rK   rU   N)rV   rW   rX   rY   rZ   r   django_salted_md5r%   r$   r   r   r>   rs   rt   r   rK   r^   rU   r   r   rv   rv      sl     $$G 	J 	F 
DE	DE
 	! 	
HK99 Hr   rv   c                   n    \ rS rSrSr\R                  rSrSS\	S4\
S4S/rS	/rS
/r\R                  rSrg)django_salted_sha1_test   ztest django_salted_sha1rk   )rb   z7sha1$123abcdef$e4a1877b0e35c47329e7ed7e58014276168a37ba)rx   z:sha1$bcwHF9Hy8lxS$6b4cfa0651b43161c6f1471ce9523acf1f751ba3z3sha1$c2e86$0f75c5d7fbd100d587c127ef0b693cde611b4adaz3sha1$6d853$ef13a4d8fb57aed0cb573fe9c82e28dc7fd372d4)
MyPasswordz3sha1$54123$893cf12e134c3c215f3a76bd50d13f92404a54d3ry   zsha1$c2e86$0f75rU   N)rV   rW   rX   rY   rZ   r   django_salted_sha1r%   r$   r   r   r>   rs   rt   rv   rK   r^   rU   r   r   r   r      sl    !%%G 	O 	O 
MN	MN 	O  	! 	 /@@r   r   c                   <    \ rS rSrSr\R                  rS\S4/r	Sr
g)django_pbkdf2_sha256_test   ztest django_pbkdf2_sha256)not a passwordzMpbkdf2_sha256$10000$kjVJaVz6qsnJ$5yPHw3rwJGECpUf70daLGhOrQ5+AMxIJdz1c3bqK1Rs=zMpbkdf2_sha256$10000$bEwAfNrH1TlQ$OgYUblFNUX1B8GfMqaCYUK/iHyO0pa7STTDdaEJBuY0=rU   N)rV   rW   rX   rY   rZ   r   django_pbkdf2_sha256r%   r   r>   r^   rU   r   r   r   r      s*    #''G	Z		X	Zr   r   c                   <    \ rS rSrSr\R                  rS\S4/r	Sr
g)django_pbkdf2_sha1_testi  ztest django_pbkdf2_sha1)r   z;pbkdf2_sha1$10000$wz5B6WkasRoF$atJmJ1o+XfJxKq1+Nu1f1i57Z5I=z;pbkdf2_sha1$10000$KZKWwvqb8BfL$rw5pWsxJEU4JrZAQhHTCO+u0f5Y=rU   N)rV   rW   rX   rY   rZ   r   django_pbkdf2_sha1r%   r   r>   r^   rU   r   r   r   r     s*    !%%G	H		F	Hr   r   zno bcrypt backends availablec                      ^  \ rS rSrSr\R                  rSrSr	SS\
S4/rU 4S jr " S	 S
\R                  5      rSrU =r$ )django_bcrypt_testi  test django_bcrypt)rG   r   T)rd   zCbcrypt$$2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.)abcdefghijklmnopqrstuvwxyzzCbcrypt$$2a$10$fVH8e28OQRj9tqiDXs1e1uxpsjN0c7II7YPKXua2NAKYvM6iQk7dqzCbcrypt$$2a$05$Z17AXnnlpzddNUvnC6cZNOSwMA/8oNiKnHTHTwLlBijfucQQlHjaGc                 P   > UR                  SS5        [        [        U ]  U5        g Nroundsr~   )
setdefaultsuperr   populate_settingsr'   kwds	__class__s     r   r   $django_bcrypt_test.populate_settings*  s!    !$ $9$?r   c                        \ rS rSrS rS rSrg)$django_bcrypt_test.FuzzHashGeneratori/  c                 *    U R                  SSSS5      $ N         rl   r   r'   s    r   random_rounds2django_bcrypt_test.FuzzHashGenerator.random_rounds1      $$Q1a00r   c                     g r   rU   r   s    r   random_ident1django_bcrypt_test.FuzzHashGenerator.random_ident5       r   rU   NrV   rW   rX   rY   r   r   r^   rU   r   r   rK   r   /      	1	r   rK   rU   )rV   rW   rX   rY   rZ   r   r0   r%   r$   fuzz_salts_need_bcrypt_repairr   r>   r   r   rK   r^   __classcell__r   s   @r   r   r     sZ      G$(! 	T	T	U	W
@
	K99 	 	r   r   c            	          ^  \ rS rSrSr\R                  rSrSr	S\
S4\S4\" SS	5      S
4\" SS	5      S-   S4\" SS	5      S-   S4/rS/rU 4S jr " S S\R"                  5      rSrU =r$ )django_bcrypt_sha256_testi:  ztest django_bcrypt_sha256NT)rd   zJbcrypt_sha256$$2a$06$/3OeRpbOf8/l6nPPRdZPp.nRiyYqPobEZGdNRBWihQhiFDh1ws1tuzJbcrypt_sha256$$2a$08$NDjSAIcas.EcoxCRiArvT.MkNiPYVhrsrnJsRkLueZOoV1bsQqlmCzJbcrypt_sha256$$2a$06$kCXUnRFQptGg491siDKNTu8RxjBGSjALHRuvhPYNFsa4Ea5d9M48uabc123H   zJbcrypt_sha256$$2a$06$Tg/oYyZTyAf.Nb3qSgN61OySmyXA8FoY4PjGizjE1QSDfuL5MXNniqwrzJbcrypt_sha256$$2a$06$Tg/oYyZTyAf.Nb3qSgN61Ocy0BEz1RK6xslSNi8PlaLX2pe7x/KQGxyzzJbcrypt_sha256$$2a$06$Tg/oYyZTyAf.Nb3qSgN61OvY2zoRVUa2Pugv2ExVOUT2YmhvxUFUazMbcrypt_sha256$xyz$2a$06$/3OeRpbOf8/l6nPPRdZPp.nRiyYqPobEZGdNRBWihQhiFDh1ws1tuc                 P   > UR                  SS5        [        [        U ]  U5        g r   )r   r   r   r   r   s     r   r   +django_bcrypt_sha256_test.populate_settings\  s!    !$'@Fr   c                        \ rS rSrS rS rSrg)+django_bcrypt_sha256_test.FuzzHashGeneratoria  c                 *    U R                  SSSS5      $ r   r   r   s    r   r   9django_bcrypt_sha256_test.FuzzHashGenerator.random_roundsc  r   r   c                     g r   rU   r   s    r   r   8django_bcrypt_sha256_test.FuzzHashGenerator.random_identg  r   r   rU   Nr   rU   r   r   rK   r   a  r   r   rK   rU   )rV   rW   rX   rY   rZ   r   django_bcrypt_sha256r%   forbidden_charactersr   UPASS_LETMEINr   r   r>   known_malformed_hashersr   r   rK   r^   r   r   s   @r   r   r   :  s    #''G$(!	Z	X	Z	X	Z 
x	#X	Z	x	#E	)X	Z	x	#E	)X	Z!, 	XG
	K99 	 	r   r   )_base_argon2_testzno argon2 backends availablec                      ^  \ rS rSrSr\R                  rSS\S4/r	U 4S jr
SS jrS r " S	 S
\R                  5      rSrU =r$ )django_argon2_testin  r   )rb   zDargon2$argon2i$v=19$m=256,t=1,p=1$c29tZXNhbHQ$AJFIsNZTMKTAewB4+ETN1A)rb   zDargon2$argon2i$v=19$m=380,t=2,p=2$c29tZXNhbHQ$SrssP8n7m/12VWPM8dvNrwzIargon2$argon2i$v=19$m=512,t=2,p=2$V25jN1l4UUJZWkR1$MxpA1BD2Gh7+D79gaAw6sQc                 X   > [         [        U ]  5         [        R                  " SS5        g )Nignorez.*Using argon2pure backend.*)r   r   setUpWarningswarningsfilterwarnings)r'   r   s    r   r    django_argon2_test.setUpWarnings  s"     $57*HIr   c                     U=(       d    U R                   R                  " S0 UD6nUR                  SS9n U R                  U l        U R                  (       d   eUR                  U R                  5       5      $ )NT)use_defaultsrU   )r%   usingwrapped_stub_checksumchecksum
_wrap_hash	to_string)r'   r%   settingss      r   do_stub_encrypt"django_argon2_test.do_stub_encrypt  sa     *dll11=H=D1++}}}!!$.."233r   c                 $    U R                  S5      e)Nz!legacy 1.6 workflow not supported)r#   r   s    r   test_03_legacy_hash_workflow/django_argon2_test.test_03_legacy_hash_workflow  s    mm?@@r   c                        \ rS rSrS rS rSrg)$django_argon2_test.FuzzHashGeneratori  c                     g)NIrU   r   s    r   random_type0django_argon2_test.FuzzHashGenerator.random_type  s    r   c                 *    U R                  SSSS5      $ )Nrl      rG   r   r   s    r   r   2django_argon2_test.FuzzHashGenerator.random_rounds  r   r   rU   N)rV   rW   rX   rY   r   r   r^   rU   r   r   rK   r     s    		1r   rK   )r   r   )rV   rW   rX   rY   rZ   r   django_argon2r%   r   r>   r   r   r   r   rK   r^   r   r   s   @r   r   r   n  sY      G 	] 	] 
cd	J4A1-?? 1 1r   r   ),rZ   
__future__r   logging	getLoggerrV   logrer   passlibr   rI   r   passlib.utils.compatr   passlib.tests.utilsr   r   r	   r
   passlib.tests.test_handlersr   r   passlib.tests.test_ext_djangor   r   r   r   r   r   r`   ri   rv   r   r   r   bcrypthas_backendr   r   "passlib.tests.test_handlers_argon2r   argon2r   rU   r   r   <module>r      sZ   L & g''1 	   ' " K K >$ $ ,-U:H U:n; "'K 'R&H[- &HPAk= A@] k=  DKK##%'EF#m # G#J DKK##%'EF/] / G/b ADKK##%'EF*1m *1 G*1r   