o
    _6d<                     @   s  d Z ddlmZ ddlZe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d ZG dd deZG dd deZG dd deeZG dd deeZ G dd deeZ!G dd deeZ"G dd deeZ#ee
j$% dG dd deeZ&ee
j$% dG dd deeZ'dd l(m)Z) ee
j*% d!G d"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                 C   s   d dd | D S )N.c                 s   s    | ]}t |V  qd S N)str).0e r   yC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\passlib/tests/test_handlers_django.py	<genexpr>   s    zvstr.<locals>.<genexpr>)join)versionr   r   r   vstr   s   r   c                   @   sF   e Zd ZdZdZeZdZdd Ze	j
d Zdd Zd	d
 Zdd ZdS )_DjangoHelperzi
    mixin for HandlerCase subclasses that are testing a hasher
    which is also present in django.
    TNc                 C   sd   t | jk r| dt| j | jr!t | jkr!| dt| j | jj}t|s0| d| 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namer   r   r   _require_django_support0   s   
z%_DjangoHelper._require_django_support)fuzz_verifier_djangoc                    s@   z   W n
 ty   Y d S w ddlm   fdd}|S )Nr   check_passwordc                    s@   j jdkr|dr|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    r   r   verify_djangoI   s
   


z9_DjangoHelper.fuzz_verifier_django.<locals>.verify_django)r"   r	   django.contrib.auth.hashersr%   )r    r/   r   r.   r   r#   B   s   z"_DjangoHelper.fuzz_verifier_djangoc                 C   sl   |    ddlm} | jsJ |  D ] \}}| |||d||f  | |d| |d||f  qdS )z:run known correct hashes through Django's check_password()r   r$   z"secret=%r hash=%r failed to verifyxz,mangled secret=%r hash=%r incorrect verifiedN)r"   r0   r%   known_correct_hashesZiter_known_hashes
assertTrueassertFalse)r    r%   r-   r   r   r   r   test_90_django_referenceR   s   
z&_DjangoHelper.test_90_django_referencec           	      C   s   |    ddlm} ddlm} | jj}| | jd  }| | | 	 }| |k rc|
 \}}|s2q$t|tr<|d}|||d}| | | | | || | | || | |k s)dS dS )z/test against output of Django's make_password()r   )tick)make_password   r'   )ZhasherN)r"   passlib.utilsr6   r0   r7   r   r   Zmax_fuzz_timeFuzzHashGeneratorZ	getRandomZrandom_password_pairr*   r+   r,   r3   Zdo_identifyZ	do_verifyr4   )	r    r6   r7   r!   end	generatorr-   otherr   r   r   r   test_91_django_generationa   s"   


z'_DjangoHelper.test_91_django_generation)__name__
__module____qualname____doc__Z_DjangoHelper__unittest_skipr   r   r   r"   r   Zfuzz_verifiersZextra_fuzz_verifiersr#   r5   r>   r   r   r   r   r      s    
r   c                   @   s.   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!) rE   rE   )z!9wa845vn7098ythaehasldkfjrD   rE   N)r?   r@   rA   rB   r   Zdjango_disabledr   Zdisabled_contains_saltr   r2   known_alternate_hashesr   r   r   r   rC   v   s    	rC   c                   @   sP   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   	   )rD   crypt$c2$c2M87q...WWcU)rD   zcrypt$c2e86$c2M87q...WWcU)Zpasswordignoremezcrypt$c2.AZ$c2M87q...WWcUzcrypt$c2e86$c2hN1Bxd6ZiWszcrypt$0.aQs$0.wB.TT0Czvlou   hellÖzcrypt$sa$saykDgk3BPZ9E)Zfooz!crypt$MNVY.9ajgdvDQ$MNVY.9ajgdvDQ)zcrypt$$c2M87q...WWcUrD   rL   
sha1$aa$bb)zcrypt$c2$c2M87qzcrypt$f$c2M87q...WWcUzcrypt$ffe86$c2M87q...WWcUN)r?   r@   rA   rB   r   Zdjango_des_cryptr   r   r
   r   r   r2   rG   known_unidentified_hashesknown_malformed_hashesr   r   r   r   rH      s"    
rH   c                   @   sL   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
 d
ejZdS )django_salted_md5_testztest django_salted_md5rI   )rD   z.md5$123abcdef$c8272612932975ee80e8a35995708e80)testz1md5$3OpqnFAHW5CT$54b29300675271049a1ebae07b395e20z*md5$c2e86$92105508419a81a6babfaecf876a2fa0z*md5$d9eb8$01495b32852bffb27cf5d4394fe7a54crM   	md5$aa$bbc                   @   s   e Zd Zdd ZdS )z(django_salted_md5_test.FuzzHashGeneratorc                 C   s@   | j }|j}|jdksJ d}|jp|d }| ||||d S )Nr   rJ      g      ?)r   Zdefault_salt_sizeZmin_salt_sizeZmax_salt_sizerandintgauss)r    r   defaultlowerupperr   r   r   random_salt_size   s   z9django_salted_md5_test.FuzzHashGenerator.random_salt_sizeN)r?   r@   rA   rX   r   r   r   r   r:      s    r:   N)r?   r@   rA   rB   r   Zdjango_salted_md5r   r   r
   r   r2   rN   rO   r   r:   r   r   r   r   rP      s    rP   c                   @   sB   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_sha1rI   )rD   z7sha1$123abcdef$e4a1877b0e35c47329e7ed7e58014276168a37ba)rQ   z:sha1$bcwHF9Hy8lxS$6b4cfa0651b43161c6f1471ce9523acf1f751ba3z3sha1$c2e86$0f75c5d7fbd100d587c127ef0b693cde611b4adaz3sha1$6d853$ef13a4d8fb57aed0cb573fe9c82e28dc7fd372d4)Z
MyPasswordz3sha1$54123$893cf12e134c3c215f3a76bd50d13f92404a54d3rR   zsha1$c2e86$0f75N)r?   r@   rA   rB   r   Zdjango_salted_sha1r   r   r
   r   r2   rN   rO   rP   r:   r   r   r   r   rY      s    
rY   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)	r?   r@   rA   rB   r   Zdjango_pbkdf2_sha256r   r   r2   r   r   r   r   r[          r[   c                   @   rZ   )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)	r?   r@   rA   rB   r   Zdjango_pbkdf2_sha1r   r   r2   r   r   r   r   r^     r]   r^   zno bcrypt backends availablec                       sN   e Zd ZdZejZdZdZdde	dfgZ
 fddZG d	d
 d
ejZ  ZS )django_bcrypt_testtest django_bcrypt)r8   r   T)rF   zCbcrypt$$2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.)abcdefghijklmnopqrstuvwxyzzCbcrypt$$2a$10$fVH8e28OQRj9tqiDXs1e1uxpsjN0c7II7YPKXua2NAKYvM6iQk7dqzCbcrypt$$2a$05$Z17AXnnlpzddNUvnC6cZNOSwMA/8oNiKnHTHTwLlBijfucQQlHjaGc                        | dd tt| | d S NroundsrS   )
setdefaultsuperr_   populate_settingsr    kwds	__class__r   r   rg   *     z$django_bcrypt_test.populate_settingsc                   @      e Zd Zdd Zdd ZdS )z$django_bcrypt_test.FuzzHashGeneratorc                 C      |  ddddS N         rJ   rT   r    r   r   r   random_rounds1     z2django_bcrypt_test.FuzzHashGenerator.random_roundsc                 C      d S r   r   rt   r   r   r   random_ident5     z1django_bcrypt_test.FuzzHashGenerator.random_identNr?   r@   rA   ru   rx   r   r   r   r   r:   /      r:   )r?   r@   rA   rB   r   r&   r   r   fuzz_salts_need_bcrypt_repairr   r2   rg   r   r:   __classcell__r   r   rj   r   r_     s    r_   c                       s   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
 dfeddd dfgZdgZ fddZG dd dejZ  ZS )django_bcrypt_sha256_testztest django_bcrypt_sha256NT)rF   zJbcrypt_sha256$$2a$06$/3OeRpbOf8/l6nPPRdZPp.nRiyYqPobEZGdNRBWihQhiFDh1ws1tuzJbcrypt_sha256$$2a$08$NDjSAIcas.EcoxCRiArvT.MkNiPYVhrsrnJsRkLueZOoV1bsQqlmCzJbcrypt_sha256$$2a$06$kCXUnRFQptGg491siDKNTu8RxjBGSjALHRuvhPYNFsa4Ea5d9M48uZabc123H   zJbcrypt_sha256$$2a$06$Tg/oYyZTyAf.Nb3qSgN61OySmyXA8FoY4PjGizjE1QSDfuL5MXNniZqwrzJbcrypt_sha256$$2a$06$Tg/oYyZTyAf.Nb3qSgN61Ocy0BEz1RK6xslSNi8PlaLX2pe7x/KQGZxyzzJbcrypt_sha256$$2a$06$Tg/oYyZTyAf.Nb3qSgN61OvY2zoRVUa2Pugv2ExVOUT2YmhvxUFUazMbcrypt_sha256$xyz$2a$06$/3OeRpbOf8/l6nPPRdZPp.nRiyYqPobEZGdNRBWihQhiFDh1ws1tuc                    rb   rc   )re   rf   r~   rg   rh   rj   r   r   rg   \  rl   z+django_bcrypt_sha256_test.populate_settingsc                   @   rm   )z+django_bcrypt_sha256_test.FuzzHashGeneratorc                 C   rn   ro   rs   rt   r   r   r   ru   c  rv   z9django_bcrypt_sha256_test.FuzzHashGenerator.random_roundsc                 C   rw   r   r   rt   r   r   r   rx   g  ry   z8django_bcrypt_sha256_test.FuzzHashGenerator.random_identNrz   r   r   r   r   r:   a  r{   r:   )r?   r@   rA   rB   r   Zdjango_bcrypt_sha256r   Zforbidden_charactersr|   UPASS_LETMEINr   r   r2   Zknown_malformed_hashersrg   r   r:   r}   r   r   rj   r   r~   :  s4    r~   )_base_argon2_testzno argon2 backends availablec                       sX   e Zd ZdZejZddedfgZ fddZ	ddd	Z
d
d ZG dd dejZ  ZS )django_argon2_testr`   )rD   zDargon2$argon2i$v=19$m=256,t=1,p=1$c29tZXNhbHQ$AJFIsNZTMKTAewB4+ETN1A)rD   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                    s   t t|   tdd d S )Nignorez.*Using argon2pure backend.*)rf   r   setUpWarningswarningsfilterwarningsrt   rj   r   r   r     s   z django_argon2_test.setUpWarningsNc                 K   sB   |p| j jdi |}|jdd} | j| _| jsJ ||  S )NT)Zuse_defaultsr   )r   usingwrappedZ_stub_checksumZchecksumZ
_wrap_hashZ	to_string)r    r   settingsr   r   r   do_stub_encrypt  s
   
z"django_argon2_test.do_stub_encryptc                 C   s
   |  d)Nz!legacy 1.6 workflow not supported)r   rt   r   r   r   test_03_legacy_hash_workflow  s   
z/django_argon2_test.test_03_legacy_hash_workflowc                   @   rm   )z$django_argon2_test.FuzzHashGeneratorc                 C   s   dS )NIr   rt   r   r   r   random_type  s   z0django_argon2_test.FuzzHashGenerator.random_typec                 C   s   |  ddddS )NrJ      r8   rs   rt   r   r   r   ru     rv   z2django_argon2_test.FuzzHashGenerator.random_roundsN)r?   r@   rA   r   ru   r   r   r   r   r:     r{   r:   r   )r?   r@   rA   rB   r   Zdjango_argon2r   r   r2   r   r   r   r   r:   r}   r   r   rj   r   r   n  s    
	r   ),rB   
__future__r   logging	getLoggerr?   logrer   Zpasslibr   r9   r   Zpasslib.utils.compatr   Zpasslib.tests.utilsr   r   r   r	   Zpasslib.tests.test_handlersr
   r   Zpasslib.tests.test_ext_djangor   r   r   r   r   r   rC   rH   rP   rY   r[   r^   ZbcryptZhas_backendr_   r~   Z"passlib.tests.test_handlers_argon2r   Zargon2r   r   r   r   r   <module>   s6    	W)( %1