
    K}bg<                        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
j$        %                                d           G d dee                      Z& ee
j$        %                                d           G d dee                      Z'ddl(m)Z)  ee
j*        %                                d            G d! d"ee                      Z+dS )#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                 @    d                     d | D                       S )N.c              3   4   K   | ]}t          |          V  d S N)str).0es     u/home/e360mart.nyusoft.in/public_html/e360mart_env/lib/python3.11/site-packages/passlib/tests/test_handlers_django.py	<genexpr>zvstr.<locals>.<genexpr>   s(      ,,qCFF,,,,,,    )join)versions    r   vstrr      s#    88,,G,,,,,,r   c                   J    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dS )	_DjangoHelperzi
    mixin for HandlerCase subclasses that are testing a hasher
    which is also present in django.
    TNc                 b   t           | j        k     r*|                     dt          | j                  z            | j        r:t           | j        k    r*|                     dt          | j                  z            | j        j        }t          |          s|                     d|z            dS )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[?\?\ \]]]" 	^~8O'O'O-- <tDD[?\?\ \]]] |'.t44 	I-- @4 GHHHtr   )fuzz_verifier_djangoc                 p     	                                    n# t          $ r Y d S w xY wddlm  fd}|S )Nr   check_passwordc                     j         j        dk    r! |j        d          r |j        dd          }t	          | t
                    r|                     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   sl    | O338V8V3#t|GW55&%(( 0w//!>&$///r   )r'   r
   django.contrib.auth.hashersr+   )r%   r5   r+   s   ` @r   r(   z"_DjangoHelper.fuzz_verifier_djangoB   sx    	((**** 	 	 	44	>>>>>>	0 	0 	0 	0 	0 	0 s    
''c           	      "   |                                   ddlm} | j        sJ |                                 D ]V\  }}|                      |||          d|d|d           |                      |d|z   |          d|d|d           Wd	S )
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4 	, 	,LFDOONN64888#VVTTT+, , , ^^C&L$???#VVTTT+, , , ,		, 	,r   c                    |                                   ddlm} ddlm} | j        j        } |            | j        dz  z   }|                     | | 	                                          } |            |k     r|
                                \  }}|s(t          |t                    r|                    d          } |||          }|                     |                     |                     |                     |                     ||                     |                     |                     ||                      |            |k     dS dS )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\   $$&&& 	'&&&&&======|'dfft)!++**41A1ABB	dffsll%::<<MFE &%(( 0w// =555DOOD,,T22333OODNN6488999T^^E488999 dffsllllllr   )__name__
__module____qualname____doc___DjangoHelper__unittest_skipr   r    r"   r'   r   fuzz_verifiersextra_fuzz_verifiersr(   r=   rM    r   r   r   r      s          O ,    '5 9    , , ,: : : : :r   r   c                   8    e Zd ZdZej        ZdZddedfgZ	dgZ
dS )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   sI        "G! 		c	 	8r   rW   c                   h    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dS )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_      s        #G 	799 
/0	12	
<23 	5$ 	G 	!	 	 	r   r_   c                   j    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dS )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dS )(django_salted_md5_test.FuzzHashGeneratorc                     | j         }|j        }|j        dk    sJ d}|j        p|dz  }|                     ||||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[    
 lG/G(A----E)6WQYE$$UE7GBJGGGr   N)rN   rO   rP   ry   rU   r   r   rE   ro      s(        
	H 
	H 
	H 
	H 
	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      s          $G 	J 	F 
DE	DE
 	! 	
H H H H HK9 H H H H Hr   rk   c                   T    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d
S )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|      sw        !!%G 	O 	O 
MN	MN 	O  	! 	 /@r   r|   c                   ,    e Zd ZdZej        ZdedfgZdS )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      s8        ##'G	Z		X	Zr   r   c                   ,    e Zd ZdZej        ZdedfgZdS )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     s8        !!%G	H		F	Hr   r   zno bcrypt backends availablec                   l     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                     |                     dd           t          t          |                               |           d S Nroundsrq   )
setdefaultsuperr   populate_settingsr%   kwds	__class__s     r   r   z$django_bcrypt_test.populate_settings*  s<    !$$$ $''99$?????r   c                       e Zd Zd Zd ZdS )$django_bcrypt_test.FuzzHashGeneratorc                 2    |                      dddd          S N         ra   ru   r%   s    r   random_roundsz2django_bcrypt_test.FuzzHashGenerator.random_rounds1      $$Q1a000r   c                     d S r   rU   r   s    r   random_identz1django_bcrypt_test.FuzzHashGenerator.random_ident5  	     4r   NrN   rO   rP   r   r   rU   r   r   rE   r   /  2        	1 	1 	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     s         G$(! 	T	T	U	W
@ @ @ @ @
	 	 	 	 	K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                     |                     dd           t          t          |                               |           d S r   )r   r   r   r   r   s     r   r   z+django_bcrypt_sha256_test.populate_settings\  s<    !$$$'..@@FFFFFr   c                       e Zd Zd Zd ZdS )+django_bcrypt_sha256_test.FuzzHashGeneratorc                 2    |                      dddd          S r   r   r   s    r   r   z9django_bcrypt_sha256_test.FuzzHashGenerator.random_roundsc  r   r   c                     d S 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 G G G G
	 	 	 	 	K9 	 	 	 	 	 	 	r   r   )_base_argon2_testzno argon2 backends availablec                   r     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                     t          t          |                                            t          j        dd           d S )Nignorez.*Using argon2pure backend.*)r   r   setUpWarningswarningsfilterwarnings)r%   r   s    r   r   z django_argon2_test.setUpWarnings  s:     $''55777*HIIIIIr   Nc                      |p| j         j        di |}|                    d          } | j        | _        | j        s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  sk     27*dl1==H==D11+}}!!$.."2"2333r   c                 ,    |                      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dS )$django_argon2_test.FuzzHashGeneratorc                     dS )NIrU   r   s    r   random_typez0django_argon2_test.FuzzHashGenerator.random_type  s    3r   c                 2    |                      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     s2        	 	 		1 	1 	1 	1 	1r   rE   r   )rN   rO   rP   rQ   r   django_argon2r#   r   r9   r   r   r   r   rE   r   r   s   @r   r   r   n  s         G 	] 	] 
cd	J J J J J4 4 4 4A A A1 1 1 1 1-? 1 1 1 1 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      sz   L L & % % % % % 'g'11 				        ' ' ' ' ' ' " " " " " " K K K K K K K K K K K K > > > > > > > >$ $ $ $ $ $ $ $ $ $ ,- - -U: U: U: U: U:H U: U: U:n    ;   "' ' ' ' 'K ' ' 'R&H &H &H &H &H[- &H &H &HPA A A A Ak= A A A@    ]       k=    DK##%%'EFF# # # # #m # # GF#J DK##%%'EFF/ / / / /] / / GF/b A @ @ @ @ @DK##%%'EFF*1 *1 *1 *1 *1m *1 *1 GF*1 *1 *1r   