
     h<                        d Z ddlmZ ddlZ ej                  e      ZddlZddlZddl	m
Z
 ddlmZ ddlmZ ddlmZmZmZmZ ddlmZmZ dd	lmZmZmZ  ed
      Zd Z G d de      Z G d de      Z G d dee      Z G d dee      Z  G d dee      Z! G d dee      Z" G d dee      Z# ee
jH                  jK                         d       G d dee             Z& ee
jH                  jK                         d       G d dee             Z'ddl(m)Z)  ee
jT                  jK                         d        G d! d"ee             Z+y)#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    dj                  d | D              S )N.c              3   2   K   | ]  }t        |        y wN)str).0es     d/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/passlib/tests/test_handlers_django.py	<genexpr>zvstr.<locals>.<genexpr>   s     ,qCF,s   )join)versions    r   vstrr      s    88,G,,,    c                   R    e Zd ZdZdZeZdZd Ze	j                  dz   Zd Zd Zd Zy)	_DjangoHelperzi
    mixin for HandlerCase subclasses that are testing a hasher
    which is also present in django.
    TNc                 n   t         | j                  k  r'| j                  dt        | j                        z        | j                  r:t         | j                  kD  r'| j                  dt        | j                        z        | j
                  j                  }t        |      s| j                  d|z        y)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_supportz%_DjangoHelper._require_django_support0   s    D333-- <tDD[D[?\ \]]""~8O8O'O-- <tDD[D[?\ \]] ||''.t4-- @4 GHHr   )fuzz_verifier_djangoc                 b     	  j                          ddlm  fd}|S # t        $ r Y y w xY w)Nr   check_passwordc                     j                   j                  dk(  r% |j                  d      r |j                  dd      }t	        | t
              r| j                  d      }  | |      S )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_djangoz9_DjangoHelper.fuzz_verifier_django.<locals>.verify_djangoI   sY    ||  O38V#t||GW5&%(w/!&$//r   )r'   r
   django.contrib.auth.hashersr+   )r%   r5   r+   s   ` @r   r(   z"_DjangoHelper.fuzz_verifier_djangoB   s:    	((* 	?	0   		s   " 	..c           	         | j                          ddlm} | j                  sJ | j	                         D ]H  \  }}| j                   |||      d|d|d       | j                   |d|z   |      d|d|d       J y	)
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'   r6   r+   known_correct_hashesiter_known_hashes
assertTrueassertFalse)r%   r+   r4   r   s       r   test_90_django_referencez&_DjangoHelper.test_90_django_referenceR   s    $$& 	?((( 224 	,LFDOON648#T+, ^C&L$?#T+,		,r   c                 H   | j                          ddlm} ddlm} | j
                  j                  } |       | j                  dz  z   }| j                  | | j                               } |       |k  r|j                         \  }}|s t        |t              r|j                  d      } |||      }| j                  | j                  |             | j                  | j!                  ||             | j#                  | j!                  ||              |       |k  ryy)z/test against output of Django's make_password()r   )tick)make_password   r.   )hasherN)r'   passlib.utilsr?   r6   r@   r#   r$   max_fuzz_timeFuzzHashGenerator	getRandomrandom_password_pairr1   r2   r3   r;   do_identify	do_verifyr<   )	r%   r?   r@   r&   end	generatorr4   otherr   s	            r   test_91_django_generationz'_DjangoHelper.test_91_django_generationa   s    $$& 	'=||''ft))!++**41AB	fsl%::<MFE&%(w/ 5DOOD,,T23OODNN6489T^^E489 fslr   )__name__
__module____qualname____doc___DjangoHelper__unittest_skipr   r    r"   r'   r   fuzz_verifiersextra_fuzz_verifiersr(   r=   rM    r   r   r   r      sJ     O ,  '55 9  ,:r   r   c                   @    e Zd ZdZej
                  ZdZddedfgZ	dgZ
y)django_disabled_testztest django_disabledT)password!) rY   rY   )z!9wa845vn7098ythaehasldkfjrX   rY   N)rN   rO   rP   rQ   r   django_disabledr#   disabled_contains_saltr   r9   known_alternate_hashesrU   r   r   rW   rW   v   s;    ""G! 		c	 	8r   rW   c                   j    e Zd ZdZej
                  ZdZdddedfe	df e
d      d	fd
gZdgZdgZg dZy)django_des_crypt_testztest django_des_crypt   	   )rX   crypt$c2$c2M87q...WWcU)rX   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...WWcUrX   rc   
sha1$aa$bb)zcrypt$c2$c2M87qzcrypt$f$c2M87q...WWcUzcrypt$ffe86$c2M87q...WWcUN)rN   rO   rP   rQ   r   django_des_cryptr#   r"   r   r   r   r9   r]   known_unidentified_hashesknown_malformed_hashesrU   r   r   r_   r_      sr    ##G 	799 
/0	12	
<23 	5$ 	G 	!	r   r_   c                   v    e Zd ZdZej
                  ZdZddedfe	dfgZ
dgZdgZ G d	 d
ej                        Zy)django_salted_md5_testztest django_salted_md5r`   )rX   z.md5$123abcdef$c8272612932975ee80e8a35995708e80)testz1md5$3OpqnFAHW5CT$54b29300675271049a1ebae07b395e20z*md5$c2e86$92105508419a81a6babfaecf876a2fa0z*md5$d9eb8$01495b32852bffb27cf5d4394fe7a54crf   	md5$aa$bbc                       e Zd Zd Zy)(django_salted_md5_test.FuzzHashGeneratorc                     | j                   }|j                  }|j                  dk(  sJ d}|j                  xs |dz  }| j	                  ||||dz        S )Nr   ra      g      ?)r#   default_salt_sizemin_salt_sizemax_salt_sizerandintgauss)r%   r#   defaultloweruppers        r   random_salt_sizez9django_salted_md5_test.FuzzHashGenerator.random_salt_size   s]    
 llG//G((A--E))6WQYE$$UE7GBJGGr   N)rN   rO   rP   ry   rU   r   r   rE   ro      s    
	Hr   rE   N)rN   rO   rP   rQ   r   django_salted_md5r#   r"   r   r   r9   rh   ri   r   rE   rU   r   r   rk   rk      sl     $$G 	J 	F 
DE	DE
 	! 	
HK99 Hr   rk   c                   f    e Zd ZdZej
                  ZdZddedfe	dfdgZ
dgZd	gZej                  Zy
)django_salted_sha1_testztest django_salted_sha1r`   )rX   z7sha1$123abcdef$e4a1877b0e35c47329e7ed7e58014276168a37ba)rl   z:sha1$bcwHF9Hy8lxS$6b4cfa0651b43161c6f1471ce9523acf1f751ba3z3sha1$c2e86$0f75c5d7fbd100d587c127ef0b693cde611b4adaz3sha1$6d853$ef13a4d8fb57aed0cb573fe9c82e28dc7fd372d4)
MyPasswordz3sha1$54123$893cf12e134c3c215f3a76bd50d13f92404a54d3rm   zsha1$c2e86$0f75N)rN   rO   rP   rQ   r   django_salted_sha1r#   r"   r   r   r9   rh   ri   rk   rE   rU   r   r   r|   r|      sl    !%%G 	O 	O 
MN	MN 	O  	! 	 /@@r   r|   c                   4    e Zd ZdZej
                  ZdedfgZy)django_pbkdf2_sha256_testztest django_pbkdf2_sha256)not a passwordzMpbkdf2_sha256$10000$kjVJaVz6qsnJ$5yPHw3rwJGECpUf70daLGhOrQ5+AMxIJdz1c3bqK1Rs=zMpbkdf2_sha256$10000$bEwAfNrH1TlQ$OgYUblFNUX1B8GfMqaCYUK/iHyO0pa7STTDdaEJBuY0=N)	rN   rO   rP   rQ   r   django_pbkdf2_sha256r#   r   r9   rU   r   r   r   r      s*    #''G	Z		X	Zr   r   c                   4    e Zd ZdZej
                  ZdedfgZy)django_pbkdf2_sha1_testztest django_pbkdf2_sha1)r   z;pbkdf2_sha1$10000$wz5B6WkasRoF$atJmJ1o+XfJxKq1+Nu1f1i57Z5I=z;pbkdf2_sha1$10000$KZKWwvqb8BfL$rw5pWsxJEU4JrZAQhHTCO+u0f5Y=N)	rN   rO   rP   rQ   r   django_pbkdf2_sha1r#   r   r9   rU   r   r   r   r     s*    !%%G	H		F	Hr   r   zno bcrypt backends availablec                   z     e Zd ZdZej
                  ZdZdZdde	dfgZ
 fdZ G d d	ej                        Z xZS )
django_bcrypt_testtest django_bcrypt)rA   r   T)rZ   zCbcrypt$$2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.)abcdefghijklmnopqrstuvwxyzzCbcrypt$$2a$10$fVH8e28OQRj9tqiDXs1e1uxpsjN0c7II7YPKXua2NAKYvM6iQk7dqzCbcrypt$$2a$05$Z17AXnnlpzddNUvnC6cZNOSwMA/8oNiKnHTHTwLlBijfucQQlHjaGc                 P    |j                  dd       t        t        |   |       y Nroundsrq   )
setdefaultsuperr   populate_settingsr%   kwds	__class__s     r   r   z$django_bcrypt_test.populate_settings*  s!    !$ $9$?r   c                       e Zd Zd Zd Zy)$django_bcrypt_test.FuzzHashGeneratorc                 *    | j                  dddd      S N         ra   ru   r%   s    r   random_roundsz2django_bcrypt_test.FuzzHashGenerator.random_rounds1      $$Q1a00r   c                      y r   rU   r   s    r   random_identz1django_bcrypt_test.FuzzHashGenerator.random_ident5       r   NrN   rO   rP   r   r   rU   r   r   rE   r   /      	1	r   rE   )rN   rO   rP   rQ   r   r-   r#   r"   fuzz_salts_need_bcrypt_repairr   r9   r   r   rE   __classcell__r   s   @r   r   r     sZ      G$(! 	T	T	U	W
@
	K99 	 	r   r   c            	            e Zd ZdZej
                  ZdZdZde	dfe
df edd      d	f edd      d
z   df edd      dz   dfgZdgZ fdZ G d dej                         Z xZS )django_bcrypt_sha256_testztest django_bcrypt_sha256NT)rZ   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    |j                  dd       t        t        |   |       y r   )r   r   r   r   r   s     r   r   z+django_bcrypt_sha256_test.populate_settings\  s!    !$'@Fr   c                       e Zd Zd Zd Zy)+django_bcrypt_sha256_test.FuzzHashGeneratorc                 *    | j                  dddd      S r   r   r   s    r   r   z9django_bcrypt_sha256_test.FuzzHashGenerator.random_roundsc  r   r   c                      y r   rU   r   s    r   r   z8django_bcrypt_sha256_test.FuzzHashGenerator.random_identg  r   r   Nr   rU   r   r   rE   r   a  r   r   rE   )rN   rO   rP   rQ   r   django_bcrypt_sha256r#   forbidden_charactersr   UPASS_LETMEINr   r   r9   known_malformed_hashersr   r   rE   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                        e Zd ZdZej
                  ZddedfgZ fdZ	d
dZ
d Z G d d	ej                        Z xZS )django_argon2_testr   )rX   zDargon2$argon2i$v=19$m=256,t=1,p=1$c29tZXNhbHQ$AJFIsNZTMKTAewB4+ETN1A)rX   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                 V    t         t        |           t        j                  dd       y )Nignorez.*Using argon2pure backend.*)r   r   setUpWarningswarningsfilterwarnings)r%   r   s    r   r   z django_argon2_test.setUpWarnings  s"     $57*HIr   c                      |xs | j                   j                  di |}|j                  d      } | j                  | _        | j                  sJ |j                  | j                               S )NT)use_defaultsrU   )r#   usingwrapped_stub_checksumchecksum
_wrap_hash	to_string)r%   r#   settingss      r   do_stub_encryptz"django_argon2_test.do_stub_encrypt  sa     27*dll11=H=D1++}}!!$.."233r   c                 $    | j                  d      )Nz!legacy 1.6 workflow not supported)r!   r   s    r   test_03_legacy_hash_workflowz/django_argon2_test.test_03_legacy_hash_workflow  s    mm?@@r   c                       e Zd Zd Zd Zy)$django_argon2_test.FuzzHashGeneratorc                      y)NIrU   r   s    r   random_typez0django_argon2_test.FuzzHashGenerator.random_type  s    r   c                 *    | j                  dddd      S )Nra      rA   r   r   s    r   r   z2django_argon2_test.FuzzHashGenerator.random_rounds  r   r   N)rN   rO   rP   r   r   rU   r   r   rE   r     s    		1r   rE   r   )rN   rO   rP   rQ   r   django_argon2r#   r   r9   r   r   r   r   rE   r   r   s   @r   r   r   n  sY      G 	] 	] 
cd	J4A1-?? 1 1r   r   ),rQ   
__future__r   logging	getLoggerrN   logrer   passlibr   rC   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   rW   r_   rk   r|   r   r   bcrypthas_backendr   r   "passlib.tests.test_handlers_argon2r   argon2r   rU   r   r   <module>r      s]   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   