U
    øÐLaør  ã                   @   s  d Z ddlmZ ddlmZ ddlZddlZddlmZm	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 ddlmZ ddlmZ eeƒZddd„Zej d¡p¼dZddd„Z dd„ Z!dd„ Z"e"ƒ \Z#Z$e %e#d¡Z&G dd„ deƒZ'G dd„ deƒZ(dS )z@tests for passlib.apache -- (c) Assurance Technologies 2008-2011é    )Úwith_statement)Ú	getLoggerN)ÚapacheÚregistry)ÚMissingBackendError)Úirange)Úunittest)ÚTestCaseÚget_fileÚset_fileÚensure_mtime_changed)Úu)Úto_bytes)Úto_unicode_for_identifyé
   c                 C   s0   t j | ¡}t j | ¡| }t  | ||f¡ dS )z)backdate file's mtime by specified amountN)ÚosÚpathÚgetatimeÚgetmtimeÚutime)r   ÚoffsetÚatimeÚmtime© r   ú=/tmp/pip-unpacked-wheel-8v2dfbvt/passlib/tests/test_apache.pyÚbackdate_file_mtime   s    r   ZPASSLIB_TEST_HTPASSWD_PATHZhtpasswdc                 C   sb   |dk	r|  d¡}tjtg|  tjtj|r0tjndd}| |¡\}}| ¡ }t|pVdƒ}||fS )z$
    helper to run htpasswd cmd
    Núutf-8)ÚstdoutÚstderrÚstdinÚ )	ÚencodeÚ
subprocessÚPopenÚhtpasswd_pathÚPIPEÚSTDOUTÚcommunicateÚwaitr   )Úargsr   ÚprocÚoutÚerrÚrcr   r   r   Ú_call_htpasswd+   s    
 ÿr.   c                 C   s   t d| |g|ƒ\}}| S )z%
    wrapper for htpasswd verify
    z-vi)r.   )r   ÚuserÚpasswordr+   r-   r   r   r   Ú_call_htpasswd_verify9   s    r1   c                  C   sF   zt g ƒ\} }W n tk
r&   Y dS X |s6t d¡ d| k}d|fS )z0
    helper to check if htpasswd is present
    )FFz htpasswd test returned with rc=0z -B T)r.   ÚOSErrorÚlogÚwarning)r+   r-   Zhave_bcryptr   r   r   Ú_detect_htpasswdA   s    
r5   z requires `htpasswd` cmdline toolc                   @   sê   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zed.d/„ ƒZee  !e" #d0¡d1¡d2d3„ ƒƒZ$d4S )5ÚHtpasswdFileTestztest HtpasswdFile classÚHtpasswdFilest   user2:2CHkkwa2AtqGs
user3:{SHA}3ipNV1GrBtxPmHFC21fCbVCSXIo=
user4:pass4
user1:$apr1$t4tc7jTh$GPIWVUo8sQKJlUdV8V5vu0
s4   user3:{SHA}3ipNV1GrBtxPmHFC21fCbVCSXIo=
user4:pass4
sy   user2:pass2x
user3:{SHA}3ipNV1GrBtxPmHFC21fCbVCSXIo=
user4:pass4
user1:$apr1$t4tc7jTh$GPIWVUo8sQKJlUdV8V5vu0
user5:pass5
s   userÃ¦:2CHkkwa2AtqGs
s   useræ:2CHkkwa2AtqGs
s   user1:pass1
user1:pass2
s  user2:2CHkkwa2AtqGs
user3:{SHA}3ipNV1GrBtxPmHFC21fCbVCSXIo=
user4:pass4
user1:$apr1$t4tc7jTh$GPIWVUo8sQKJlUdV8V5vu0
user5:$2a$12$yktDxraxijBZ360orOyCOePFGhuis/umyPNJoL5EbsLk.s6SWdrRO
user6:$5$rounds=110000$cCRp/xUUGVgwR4aP$p0.QKFS5qLNRqw1/47lXYiAcgIjJK.WjCO8nrEKuUK.
c              	   C   s  |   ¡ }t|| jƒ t |¡}|  | ¡ | j¡ |  |j|¡ |  |j	¡ |d |_|  |j|d ¡ |  
|j	¡ tj|dd}|  | ¡ d¡ |  |j|¡ |  
|j	¡ |  d¡ tj|dd}W 5 Q R X |  | ¡ d¡ |  |j|¡ |  
|j	¡ t |¡ |  ttj|¡ dS )	útest constructor autoloadÚxT©Únewó    z ``autoload=False`` is deprecatedF)ZautoloadN)Úmktempr   Ú	sample_01r   r7   ÚassertEqualÚ	to_stringr   Ú
assertTruer   ÚassertFalseÚassertWarningListr   ÚremoveÚassertRaisesÚIOError©Úselfr   Úhtr   r   r   Útest_00_constructor_autoload}   s(    


z-HtpasswdFileTest.test_00_constructor_autoloadc                 C   sP   |   ¡ }t|| jƒ tj |¡}|  | ¡ | j¡ |  |jd ¡ |  	|j
¡ d S ©N)r=   r   r>   r   r7   Ú	from_pathr?   r@   r   rB   r   rG   r   r   r   Útest_00_from_pathŸ   s    z"HtpasswdFileTest.test_00_from_pathc                 C   sd   t j | j¡}|  | d¡¡ |  | d¡¡ |  | d¡¡ |  | ¡ | j	¡ |  
t|jd¡ dS )útest delete()Úuser1Úuser2Úuser5úuser:N)r   r7   Úfrom_stringr>   rA   ÚdeleterB   r?   r@   Ú	sample_02rE   Ú
ValueError©rH   rI   r   r   r   Útest_01_delete§   s    zHtpasswdFileTest.test_01_deletec                 C   sf   |   ¡ }d}t||ƒ t |¡}| d¡ |  t|ƒ|¡ tj|dd}| d¡ |  t|ƒd¡ d S )Ns   user1:pass1
user2:pass2
rO   T)Úautosaves   user2:pass2
)r=   r   r   r7   rT   r?   r
   ©rH   r   ÚsamplerI   r   r   r   Útest_01_delete_autosave²   s    



z(HtpasswdFileTest.test_01_delete_autosavec              	   C   sð   t jj| jdd}|  | dd¡¡ |  | dd¡¡ |  | ¡ | j	¡ |  
d¡ t jj| jdd}W 5 Q R X |  | dd¡¡ |  | dd¡¡ |  | ¡ | j	¡ |  t|jd	d
¡ |  
d¡ | dd¡ W 5 Q R X |  | dd¡¡ dS )ztest set_password()Ú	plaintext©Údefault_schemerP   Úpass2xrQ   Úpass5z``default`` is deprecated)ÚdefaultrR   Úpassúupdate\(\) is deprecatedÚtestN)r   r7   rS   r>   rA   Úset_passwordrB   r?   r@   Ú	sample_03rC   rE   rV   ÚupdateÚcheck_passwordrW   r   r   r   Útest_02_set_password¿   s      ÿz%HtpasswdFileTest.test_02_set_passwordc                 C   sl   |   ¡ }d}t||ƒ t |¡}| dd¡ |  t|ƒ|¡ tj|ddd}| dd¡ |  t|ƒd¡ d S )Nó   user1:pass1
rO   Úpass2r]   T)r_   rY   s   user1:pass2
)r=   r   r   r7   rf   r?   r
   rZ   r   r   r   Útest_02_set_password_autosaveÖ   s    

z.HtpasswdFileTest.test_02_set_password_autosavec                 C   s’   dd„ }|   |dƒd¡ |   |dƒd¡ |  t|d¡ |   |dƒtjd ¡ |   |dƒtjd ¡ |   |dƒtjd ¡ |   |d	ƒtjd ¡ d	S )
z%test set_password() -- default_schemec                 S   s*   t j| d}| dd¡ |j | d¡¡S )Nr^   rO   Úpass1)r   r7   rf   ÚcontextÚidentifyÚget_hash)ÚschemerI   r   r   r   Úcheckæ   s    zCHtpasswdFileTest.test_02_set_password_default_scheme.<locals>.checkZsha256_cryptZ	des_cryptZxxxZportableZportable_apache_22Úhost_apache_22N)r?   rE   ÚKeyErrorr   Úhtpasswd_defaults)rH   rs   r   r   r   Ú#test_02_set_password_default_schemeã   s    z4HtpasswdFileTest.test_02_set_password_default_schemec                 C   sR   t j | j¡}| dd¡ | d¡ | dd¡ |  t| ¡ ƒdddddg¡ dS )	útest users()rQ   ra   Úuser3Úpass3rO   rP   Úuser4N)	r   r7   rS   r>   rf   rT   r?   ÚsortedÚusersrW   r   r   r   Útest_03_usersú   s
    
zHtpasswdFileTest.test_03_usersc              	   C   s   t j | j¡}|  t|jdd¡ |  | dd¡dk¡ tddƒD ]h}t	|ƒ}z8|  | d| d| ¡¡ |  | d| d¡dk¡ W q@ t
k
r¦   |d	kr Y q@‚ Y q@X q@|  t|jd
d¡ |  dgd ¡* |  | dd¡¡ |  | dd¡¡ W 5 Q R X dS )útest check_password()é   Zpass9Zuser9Né   r/   rc   FÚ5rR   úverify\(\) is deprecatedé   rO   rn   rl   )r   r7   rS   Ú	sample_05rE   Ú	TypeErrorri   rA   r   Ústrr   rV   rC   ÚverifyrB   ©rH   rI   Úir   r   r   Útest_04_check_password  s     
z'HtpasswdFileTest.test_04_check_passwordc                 C   s  |   ¡ }t|dƒ t|dƒ tj|dd}|  | ¡ d¡ | dd¡ | ¡  |  | ¡ d¡ t|| j	ƒ | ¡  |  | ¡ | j	¡ | d	d
¡ | 
¡  |  | ¡ | j	¡ t ¡ }|  t|j
¡ |  t|j¡ t|| jƒ t ¡ }| 
|¡ |  | dd¡¡ dS )útest load()r    é   r]   r^   r<   rO   rn   rk   rQ   ra   N)r=   r   r   r   r7   r?   r@   rf   Úload_if_changedr>   ÚloadrE   ÚRuntimeErrorÚ
sample_duprA   ri   ©rH   r   ZhaÚhbZhcr   r   r   Útest_05_load  s*    


zHtpasswdFileTest.test_05_loadc                 C   s   |   ¡ }t|| jƒ t |¡}| d¡ | d¡ | ¡  |  t|ƒ| j	¡ tjdd}| 
dd¡ |  t|j¡ | |¡ |  t|ƒd¡ dS )útest save()rO   rP   r]   r^   rn   rk   N)r=   r   r>   r   r7   rT   Úsaver?   r
   rU   rf   rE   r   ©rH   r   rI   r“   r   r   r   Útest_06_saveA  s    



zHtpasswdFileTest.test_06_savec              	   C   s¤   | j ttjdd tjj| jddd}|  | ¡ tdƒg¡ |  	d¡ tjj| jdd}W 5 Q R X |  | ¡ d	g¡ tjj| j
d
dd}|  | ¡ tdƒg¡ dS )ztest 'encoding' kwdúutf-16©Úencodingr   T©r›   Zreturn_unicodeõ   userÃ¦z``encoding=None`` is deprecatedNs   userÃ¦úlatin-1)rE   rV   r   r7   rS   Úsample_04_utf8r?   r}   r   rC   Úsample_04_latin1rW   r   r   r   Útest_07_encodingsW  s    ÿ
 ÿz"HtpasswdFileTest.test_07_encodingsc              	   C   sp   t j | j¡}|  | d¡d¡ |  | d¡d¡ |  | d¡d¡ |  d¡ |  | d¡d¡ W 5 Q R X dS )útest get_hash()ry   s!   {SHA}3ipNV1GrBtxPmHFC21fCbVCSXIo=r{   s   pass4rQ   Núfind\(\) is deprecated)r   r7   rS   r>   r?   rq   rC   ÚfindrW   r   r   r   Útest_08_get_hashk  s    z!HtpasswdFileTest.test_08_get_hashc                 C   s<   t j | j¡}|  | ¡ | j¡ t  ¡ }|  | ¡ d¡ dS )ztest to_stringr<   N)r   r7   rS   r>   r?   r@   rW   r   r   r   Útest_09_to_stringu  s    z"HtpasswdFileTest.test_09_to_stringc                 C   s   t jddddd}t|ƒ d S )NZfakepathTrž   )rY   r;   r›   )r   r7   ÚreprrW   r   r   r   Útest_10_repr€  s    zHtpasswdFileTest.test_10_reprc                 C   s(   |   ttjjd¡ |   ttjjd¡ d S )Ns   realm:user1:pass1
s   pass1
)rE   rV   r   r7   rS   ©rH   r   r   r   Útest_11_malformed„  s    ÿÿz"HtpasswdFileTest.test_11_malformedc                 C   s   | j ttjjdd d d S )Nr<   )r   )rE   r†   r   r7   rS   r©   r   r   r   Útest_12_from_stringŠ  s     ÿz$HtpasswdFileTest.test_12_from_stringc              	   C   sÌ   t dƒ}tj |¡}|  t| ¡ ƒdddddg¡ | dd¡ |  t| ¡ ƒdddddg¡ | dd	¡ |  t| ¡ ƒddddddg¡ | d¡ |  t| ¡ ƒdddddg¡ t d
ƒ}|  | 	¡ |¡ dS )zwhitespace & comment handlingz`
user2:pass2
user4:pass4
user7:pass7
 	 
user1:pass1
 # legacy users
#user6:pass6
user5:pass5

rO   rP   r{   rQ   Zuser7Zalthash4Zuser6Zalthash6zd
user2:pass2
user4:althash4
 	 
user1:pass1
 # legacy users
#user6:pass6
user5:pass5
user6:althash6
N)
r   r   r7   rS   r?   r|   r}   Úset_hashrT   r@   )rH   ÚsourcerI   Útargetr   r   r   Útest_13_whitespace  s    ÿ 
ÿz#HtpasswdFileTest.test_13_whitespacec                    s  |   ¡ }tj|dd‰ ‡ fdd„}ˆ  d|ddƒ¡ tjd }ˆ  d	|d|ƒ¡ tjd
 }ˆ  d|d|ƒ¡ ˆ  dd¡ ˆ  ¡  |  t|ddƒ¡ |  t|d	dƒ¡ |  t|ddƒ¡ |  t|ddƒ¡ |  t|ddƒ¡ |  t|d	dƒ¡ |  t|ddƒ¡ dS )z;
        verify "htpasswd" command can read output
        T©r   r;   c                    s   ˆ j  |¡ | ¡S rK   ©ro   ÚhandlerÚhash©Úpwdrr   ©rI   r   r   Úhash_schemeÆ  s    z>HtpasswdFileTest.test_htpasswd_cmd_verify.<locals>.hash_schemerO   r0   Zapr_md5_cryptrt   rP   Úhostry   r{   z$xxx$foo$bar$bazÚwrongN)	r=   r   r7   r¬   rv   r–   rB   r1   rA   )rH   r   r·   Zhost_no_bcryptZ	host_bestr   r¶   r   Útest_htpasswd_cmd_verify¾  s"    

z)HtpasswdFileTest.test_htpasswd_cmd_verifyÚbcryptzbcrypt support requiredc                    s|   |   ¡ }tj|dd‰ ‡ fdd„}ˆ  d|ddƒ¡ ˆ  ¡  |  t|ddƒ¡ trf|  t|ddƒ¡ n|  t|ddƒ¡ d	S )
zµ
        verify "htpasswd" command can read bcrypt format

        this tests for regression of issue 95, where we output "$2b$" instead of "$2y$";
        fixed in v1.7.2.
        Tr°   c                    s   ˆ j  |¡ | ¡S rK   r±   r´   r¶   r   r   r·   î  s    zEHtpasswdFileTest.test_htpasswd_cmd_verify_bcrypt.<locals>.hash_schemerO   r0   r»   r¹   N)	r=   r   r7   r¬   r–   rB   r1   ÚHAVE_HTPASSWD_BCRYPTrA   )rH   r   r·   r   r¶   r   Útest_htpasswd_cmd_verify_bcryptã  s    	z0HtpasswdFileTest.test_htpasswd_cmd_verify_bcryptN)%Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚdescriptionPrefixr>   rU   rg   rŸ   r    r‘   r…   rJ   rM   rX   r\   rj   rm   rw   r~   r‹   r”   r˜   r¡   r¥   r¦   r¨   rª   r«   r¯   Úrequires_htpasswd_cmdrº   r   Ú
skipUnlessr   Zhas_backendr½   r   r   r   r   r6   Z   s@   "%
/
$r6   c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dd	„ Z
d
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"S )#ÚHtdigestFileTestztest HtdigestFile classÚHtdigestFiles´   user2:realm:549d2a5f4659ab39a80dac99e159ab19
user3:realm:a500bb8c02f6a9170ae46af10c898744
user4:realm:ab7b5d5f28ccc7666315f508c7358519
user1:realm:2a6cf53e7d8f8cf39d946dc880b14128
sZ   user3:realm:a500bb8c02f6a9170ae46af10c898744
user4:realm:ab7b5d5f28ccc7666315f508c7358519
sá   user2:realm:5ba6d8328943c23c64b50f8b29566059
user3:realm:a500bb8c02f6a9170ae46af10c898744
user4:realm:ab7b5d5f28ccc7666315f508c7358519
user1:realm:2a6cf53e7d8f8cf39d946dc880b14128
user5:realm:03c55fdc6bf71552356ad401bdb9af19
s0   userÃ¦:realmÃ¦:549d2a5f4659ab39a80dac99e159ab19
s.   useræ:realmæ:549d2a5f4659ab39a80dac99e159ab19
c                 C   sl   |   ¡ }t|| jƒ t |¡}|  | ¡ | j¡ tj|dd}|  | ¡ d¡ t |¡ |  	t
tj|¡ dS )r8   Tr:   r<   N)r=   r   r>   r   rÆ   r?   r@   r   rD   rE   rF   rG   r   r   r   rJ     s    

z-HtdigestFileTest.test_00_constructor_autoloadc                 C   s   t j | j¡}|  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | ¡ | j	¡ |  
t|jdd¡ |  
t|jdd	¡ d
S )rN   rO   ÚrealmrP   rQ   ry   Úrealm5rR   r/   úrealm:N)r   rÆ   rS   r>   rA   rT   rB   r?   r@   rU   rE   rV   rW   r   r   r   rX   +  s    zHtdigestFileTest.test_01_deletec                 C   s”   |   ¡ }t|| jƒ t |¡}|  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  t	|ƒ| j¡ d|_
|  | dd¡¡ |  t	|ƒ| j¡ d S )NrO   rÇ   ry   rÈ   rQ   TrP   )r=   r   r>   r   rÆ   rA   rT   rB   r?   r
   rY   rU   rG   r   r   r   r\   :  s    
z(HtdigestFileTest.test_01_delete_autosavec              	   C   s  t j | j¡}|  | ddd¡¡ |  | ddd¡¡ |  | ¡ | j	¡ |  
t|jdd¡ d|_| dd¡ | ddd¡ |  
t|jddd	¡ |  
t|jd
dd	¡ |  
t|jddd	¡ |  
t|jddd	¡ |  d¡ | ddd¡ W 5 Q R X |  | dd¡¡ dS )ztest update()rP   rÇ   r`   rQ   ra   rz   Zrealm2rR   rc   A   uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuur/   rÉ   A   rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrd   re   N)r   rÆ   rS   r>   rA   rf   rB   r?   r@   rg   rE   r†   Údefault_realmri   rV   rC   rh   rW   r   r   r   rj   H  s    z%HtdigestFileTest.test_02_set_passwordc                 C   sj   t j | j¡}| ddd¡ | dd¡ | ddd¡ |  t| d¡ƒdddddg¡ |  	t
|jd	¡ d
S )rx   rQ   rÇ   ra   ry   rz   rO   rP   r{   r€   N)r   rÆ   rS   r>   rf   rT   r?   r|   r}   rE   r†   rW   r   r   r   r~   d  s     zHtdigestFileTest.test_03_usersc              	   C   s4  t j | j¡}|  t|jddd¡ |  t|jddd¡ |  | ddd¡d¡ tddƒD ]B}t	|ƒ}|  
| d| dd| ¡¡ |  | d| dd¡d	¡ qV|  t|jdd¡ d|_|  
| d
d¡¡ |  | dd¡d¡ |  dgd ¡. |  
| d
dd¡¡ |  | d
dd¡¡ W 5 Q R X |  t|jddd¡ dS )r   r€   rÇ   ra   r/   rQ   Nr   rc   FrO   rn   rƒ   r„   rl   rR   )r   rÆ   rS   r>   rE   r†   ri   ZassertIsr   r‡   rA   rÊ   rC   rˆ   rB   rV   r‰   r   r   r   r‹   n  s     z'HtdigestFileTest.test_04_check_passwordc              	   C   s:  |   ¡ }t|dƒ t|dƒ t |¡}|  | ¡ d¡ | ddd¡ | ¡  |  | ¡ d¡ t|| j	ƒ | ¡  |  | ¡ | j	¡ | ddd	¡ | 
¡  |  | ¡ | j	¡ t ¡ }|  t|j
¡ |  t|j¡ t ¡ }| 
|¡ |  | ¡ | j	¡ t|ƒ t|dƒ |  d
¡ |j
dd W 5 Q R X |  | ¡ d¡ dS )rŒ   r    r   r<   rO   rÇ   rn   s-   user1:realm:2a6cf53e7d8f8cf39d946dc880b14128
rQ   ra   z!load\(force=False\) is deprecatedF)ÚforceN)r=   r   r   r   rÆ   r?   r@   rf   rŽ   r>   r   rE   r   r   rC   r’   r   r   r   r”   ‡  s2    




zHtdigestFileTest.test_05_loadc                 C   s–   |   ¡ }t|| jƒ t |¡}| dd¡ | dd¡ | ¡  |  t|ƒ| j	¡ t ¡ }| 
ddd¡ |  t|j¡ | |¡ |  t|ƒ| ¡ ¡ dS )r•   rO   rÇ   rP   rn   N)r=   r   r>   r   rÆ   rT   r–   r?   r
   rU   rf   rE   r   r@   r—   r   r   r   r˜   °  s    

zHtdigestFileTest.test_06_savec                 C   sh   t j | j¡}|  | d¡d¡ |  | ¡ dg¡ |  | d¡d¡ |  | ¡ g ¡ |  | ¡ d¡ dS )ztest realms() & delete_realm()r9   r   rÇ   é   r<   N)r   rÆ   rS   r>   r?   Zdelete_realmÚrealmsr@   rW   r   r   r   Útest_07_realmsÆ  s    zHtdigestFileTest.test_07_realmsc              	   C   sx   t j | j¡}|  | dd¡d¡ |  | dd¡d¡ |  | dd¡d¡ |  d¡ |  | dd¡d¡ W 5 Q R X dS )	r¢   ry   rÇ   Z a500bb8c02f6a9170ae46af10c898744r{   Z ab7b5d5f28ccc7666315f508c7358519rQ   Nr£   )r   rÆ   rS   r>   r?   rq   rC   r¤   rW   r   r   r   r¥   Ñ  s    z!HtdigestFileTest.test_08_get_hashc                 C   s¢   | j ttjdd tjj| jddd}|  | ¡ tdƒg¡ |  | 	tdƒ¡tdƒg¡ tjj| j
ddd}|  | ¡ tdƒg¡ |  | 	tdƒ¡tdƒg¡ d	S )
ztest encoding parameterr™   rš   r   Trœ   u   realmÃ¦r   rž   N)rE   rV   r   rÆ   rS   rŸ   r?   rÍ   r   r}   r    rW   r   r   r   Útest_09_encodingsÛ  s    z"HtdigestFileTest.test_09_encodingsc                 C   s<   t j | j¡}|  | ¡ | j¡ t  ¡ }|  | ¡ d¡ dS )ztest to_string()r<   N)r   rÆ   rS   r>   r?   r@   rW   r   r   r   Útest_10_to_stringê  s    z"HtdigestFileTest.test_10_to_stringc                 C   s(   |   ttjjd¡ |   ttjjd¡ d S )Ns   realm:user1:pass1:other
rk   )rE   rV   r   rÆ   rS   r©   r   r   r   rª   õ  s    ÿÿz"HtdigestFileTest.test_11_malformedN)r¾   r¿   rÀ   rÁ   rÂ   r>   rU   rg   rŸ   r    rJ   rX   r\   rj   r~   r‹   r”   r˜   rÎ   r¥   rÏ   rÐ   rª   r   r   r   r   rÅ      s(   
)
rÅ   )r   )N))rÁ   Ú
__future__r   Úloggingr   r   r"   Zpasslibr   r   Zpasslib.excr   Zpasslib.utils.compatr   Zpasslib.tests.backportsr   Zpasslib.tests.utilsr	   r
   r   r   r   Zpasslib.utilsr   Zpasslib.utils.handlersr   r¾   r3   r   ÚenvironÚgetr$   r.   r1   r5   ZHAVE_HTPASSWDr¼   rÄ   rÃ   r6   rÅ   r   r   r   r   Ú<module>   s2   


   )