o
    Ԏj<                     @   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   b/home/air/Certificate/back/venv/lib/python3.10/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_hashes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'   )hasherN)r"   passlib.utilsr7   r0   r8   r   r   max_fuzz_timeFuzzHashGenerator	getRandomrandom_password_pairr*   r+   r,   r4   do_identify	do_verifyr5   )	r    r7   r8   r!   end	generatorr-   otherr   r   r   r   test_91_django_generationa   s"   


z'_DjangoHelper.test_91_django_generation)__name__
__module____qualname____doc___DjangoHelper__unittest_skipr   r   r   r"   r   fuzz_verifiersextra_fuzz_verifiersr#   r6   rE   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!) rO   rO   )z!9wa845vn7098ythaehasldkfjrN   rO   N)rF   rG   rH   rI   r   django_disabledr   disabled_contains_saltr   r2   known_alternate_hashesr   r   r   r   rM   v   s    	rM   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   	   )rN   crypt$c2$c2M87q...WWcU)rN   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...WWcUrN   rX   
sha1$aa$bb)zcrypt$c2$c2M87qzcrypt$f$c2M87q...WWcUzcrypt$ffe86$c2M87q...WWcUN)rF   rG   rH   rI   r   django_des_cryptr   r   r
   r   r   r2   rS   known_unidentified_hashesknown_malformed_hashesr   r   r   r   rT      s"    
rT   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_md5rU   )rN   z.md5$123abcdef$c8272612932975ee80e8a35995708e80)testz1md5$3OpqnFAHW5CT$54b29300675271049a1ebae07b395e20z*md5$c2e86$92105508419a81a6babfaecf876a2fa0z*md5$d9eb8$01495b32852bffb27cf5d4394fe7a54cr[   	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   rV      g      ?)r   default_salt_sizemin_salt_sizemax_salt_sizerandintgauss)r    r   defaultlowerupperr   r   r   random_salt_size   s   z9django_salted_md5_test.FuzzHashGenerator.random_salt_sizeN)rF   rG   rH   rj   r   r   r   r   r=      s    r=   N)rF   rG   rH   rI   r   django_salted_md5r   r   r
   r   r2   r]   r^   r   r=   r   r   r   r   r_      s    r_   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_sha1rU   )rN   z7sha1$123abcdef$e4a1877b0e35c47329e7ed7e58014276168a37ba)r`   z:sha1$bcwHF9Hy8lxS$6b4cfa0651b43161c6f1471ce9523acf1f751ba3z3sha1$c2e86$0f75c5d7fbd100d587c127ef0b693cde611b4adaz3sha1$6d853$ef13a4d8fb57aed0cb573fe9c82e28dc7fd372d4)
MyPasswordz3sha1$54123$893cf12e134c3c215f3a76bd50d13f92404a54d3ra   zsha1$c2e86$0f75N)rF   rG   rH   rI   r   django_salted_sha1r   r   r
   r   r2   r]   r^   r_   r=   r   r   r   r   rl      s    
rl   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)	rF   rG   rH   rI   r   django_pbkdf2_sha256r   r   r2   r   r   r   r   rp          rp   c                   @   ro   )django_pbkdf2_sha1_testztest django_pbkdf2_sha1)rq   z;pbkdf2_sha1$10000$wz5B6WkasRoF$atJmJ1o+XfJxKq1+Nu1f1i57Z5I=z;pbkdf2_sha1$10000$KZKWwvqb8BfL$rw5pWsxJEU4JrZAQhHTCO+u0f5Y=N)	rF   rG   rH   rI   r   django_pbkdf2_sha1r   r   r2   r   r   r   r   rt     rs   rt   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)r9   r   T)rP   zCbcrypt$$2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.)abcdefghijklmnopqrstuvwxyzzCbcrypt$$2a$10$fVH8e28OQRj9tqiDXs1e1uxpsjN0c7II7YPKXua2NAKYvM6iQk7dqzCbcrypt$$2a$05$Z17AXnnlpzddNUvnC6cZNOSwMA/8oNiKnHTHTwLlBijfucQQlHjaGc                        | dd tt| | d S Nroundsrb   )
setdefaultsuperrv   populate_settingsr    kwds	__class__r   r   r~   *     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         rV   rf   r    r   r   r   random_rounds1     z2django_bcrypt_test.FuzzHashGenerator.random_roundsc                 C      d S r   r   r   r   r   r   random_ident5     z1django_bcrypt_test.FuzzHashGenerator.random_identNrF   rG   rH   r   r   r   r   r   r   r=   /      r=   )rF   rG   rH   rI   r   r&   r   r   fuzz_salts_need_bcrypt_repairr   r2   r~   r   r=   __classcell__r   r   r   r   rv     s    rv   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)rP   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                    ry   rz   )r|   r}   r   r~   r   r   r   r   r~   \  r   z+django_bcrypt_sha256_test.populate_settingsc                   @   r   )z+django_bcrypt_sha256_test.FuzzHashGeneratorc                 C   r   r   r   r   r   r   r   r   c  r   z9django_bcrypt_sha256_test.FuzzHashGenerator.random_roundsc                 C   r   r   r   r   r   r   r   r   g  r   z8django_bcrypt_sha256_test.FuzzHashGenerator.random_identNr   r   r   r   r   r=   a  r   r=   )rF   rG   rH   rI   r   django_bcrypt_sha256r   forbidden_charactersr   UPASS_LETMEINr   r   r2   known_malformed_hashersr~   r   r=   r   r   r   r   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_testrw   )rN   zDargon2$argon2i$v=19$m=256,t=1,p=1$c29tZXNhbHQ$AJFIsNZTMKTAewB4+ETN1A)rN   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.*)r}   r   setUpWarningswarningsfilterwarningsr   r   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)use_defaultsr   )r   usingwrapped_stub_checksumchecksum
_wrap_hash	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   r   r   r   r   test_03_legacy_hash_workflow  s   
z/django_argon2_test.test_03_legacy_hash_workflowc                   @   r   )z$django_argon2_test.FuzzHashGeneratorc                 C   s   dS )NIr   r   r   r   r   random_type  s   z0django_argon2_test.FuzzHashGenerator.random_typec                 C   s   |  ddddS )NrV      r9   r   r   r   r   r   r     r   z2django_argon2_test.FuzzHashGenerator.random_roundsN)rF   rG   rH   r   r   r   r   r   r   r=     r   r=   r   )rF   rG   rH   rI   r   django_argon2r   r   r2   r   r   r   r   r=   r   r   r   r   r   r   n  s    
	r   ),rI   
__future__r   logging	getLoggerrF   logrer   passlibr   r;   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   rM   rT   r_   rl   rp   rt   bcrypthas_backendrv   r   "passlib.tests.test_handlers_argon2r   argon2r   r   r   r   r   <module>   s6    	W)( %1