o
    5Îh²<  ã                   @   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   úv/var/www/html/construction_image-detection-poc/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Úabc123éH   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