U
    ÝÁ]ÊW  ã                   @   sÂ  d Z ddlZddlZddlZddlZz ddlZddlZddlZdZW n e	k
r\   dZY nX ddl
m  mZ ddlmZ ddlmZ ddlmZ ddlmZ dd	l
mZ d
ZdZdZejeddG dd„ deƒƒZG dd„ deƒZejeddG dd„ deƒƒZejeddG dd„ dejƒƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG d d!„ d!ejƒZ ej!d"d#„ ƒZ"d$d%„ Z#d&d'„ Z$d(d)„ Z%d*d+„ Z&e'd,kr¾e (¡  dS )-z#Tests for certbot.compat.filesystemé    NFT)Úlock)Úutil)Úos)Ú
filesystem)ÚTempDirTestCasezS-1-1-0zS-1-5-18zS-1-5-32-544z"Tests specific to Windows security©Úreasonc                       sp   e Zd ZdZ‡ f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‡  ZS )ÚWindowsChmodTestsz:Unit tests for Windows chmod function in filesystem modulec                    s   t t| ƒ ¡  t| jƒ| _d S ©N)Úsuperr	   ÚsetUpÚ_create_probeÚtempdirÚ
probe_path©Úself©Ú	__class__© úF/usr/lib/python3/dist-packages/certbot/tests/compat/filesystem_test.pyr   "   s    zWindowsChmodTests.setUpc                 C   s†   t j | jd¡}t  | j|¡ t| jƒ ¡ }t|ƒ ¡ }t 	|d¡ t| jƒ ¡ }t|ƒ ¡ }|  
t ||¡¡ |  t ||¡¡ d S )NÚlinkéÀ  )r   ÚpathÚjoinr   Úsymlinkr   Ú_get_security_daclÚGetSecurityDescriptorDaclr   ÚchmodÚassertFalseÚ_compare_daclsÚ
assertTrue)r   Ú	link_pathÚref_dacl_probeZref_dacl_linkÚcur_dacl_probeZcur_dacl_linkr   r   r   Útest_symlink_resolution&   s    z)WindowsChmodTests.test_symlink_resolutionc                    sŽ   t  t¡‰t | jd¡ t| jƒ ¡ ‰ |  ‡ ‡fdd„t	dˆ  
¡ ƒD ƒ¡ t | jd¡ t| jƒ ¡ ‰ |  ‡ ‡fdd„t	dˆ  
¡ ƒD ƒ¡ d S )Nr   c                    s(   g | ] }ˆ   |¡d  ˆkrˆ   |¡‘qS ©é   ©ZGetAce©Ú.0Úindex©ÚdaclZ	everybodyr   r   Ú
<listcomp>;   s    ÿz;WindowsChmodTests.test_world_permission.<locals>.<listcomp>r   iÄ  c                    s(   g | ] }ˆ   |¡d  ˆkrˆ   |¡‘qS r%   r'   r(   r+   r   r   r-   A   s    ÿ)Úwin32securityÚConvertStringSidToSidÚEVERYBODY_SIDr   r   r   r   r   r   ÚrangeÚGetAceCountr    r   r   r+   r   Útest_world_permission5   s    
$z'WindowsChmodTests.test_world_permissionc                 C   sN   t  | jd¡ t| jƒ ¡ }t  | jd¡ t| jƒ ¡ }|  t  ||¡¡ d S )Nr   ià  )r   r   r   r   r   r    r   )r   r"   r#   r   r   r   Útest_group_permissions_noopD   s
    z-WindowsChmodTests.test_group_permissions_noopc                    s¼   t  t¡‰t  t¡‰ t | jd¡ t| jƒ ¡ ‰‡‡fdd„t	dˆ 
¡ ƒD ƒ}‡ ‡fdd„t	dˆ 
¡ ƒD ƒ}|  t|ƒd¡ |  t|ƒd¡ |  |d d tj¡ |  |d d tj¡ d S )Né   c                    s(   g | ] }ˆ   |¡d  ˆkrˆ   |¡‘qS r%   r'   r(   )r,   Úsystemr   r   r-   T   s    ÿz<WindowsChmodTests.test_admin_permissions.<locals>.<listcomp>r   c                    s(   g | ] }ˆ  |¡d  ˆ krˆ  |¡‘qS r%   r'   r(   )Úadminsr,   r   r   r-   V   s    ÿé   )r.   r/   Ú
SYSTEM_SIDÚ
ADMINS_SIDr   r   r   r   r   r1   r2   ÚassertEqualÚlenÚntsecurityconÚFILE_ALL_ACCESS)r   Zsystem_acesZ
admin_acesr   )r7   r,   r6   r   Útest_admin_permissionsM   s    

z(WindowsChmodTests.test_admin_permissionsc                 C   s   |   dtj¡ d S )Né   )Ú
_test_flagr=   ÚFILE_GENERIC_READr   r   r   r   Útest_read_flag_   s    z WindowsChmodTests.test_read_flagc                 C   s   |   dtj¡ d S ©Nr8   )rA   r=   ÚFILE_GENERIC_EXECUTEr   r   r   r   Útest_execute_flagb   s    z#WindowsChmodTests.test_execute_flagc                 C   s   |   dtjtjA tjA ¡ d S )Nr&   )rA   r=   r>   rB   rE   r   r   r   r   Útest_write_flage   s
    
ÿþz!WindowsChmodTests.test_write_flagc                 C   s   |   dtj¡ d S )Né   )rA   r=   r>   r   r   r   r   Útest_full_flagj   s    z WindowsChmodTests.test_full_flagc                    st   t  | jd|B ¡ t| jƒ ¡ ‰ t t¡‰‡ ‡fdd„tdˆ  	¡ ƒD ƒ}|  
t|ƒd¡ |d }|  
|d |¡ d S )Nr   c                    s(   g | ] }ˆ   |¡d  ˆkrˆ   |¡‘qS r%   r'   r(   r+   r   r   r-   u   s    ÿz0WindowsChmodTests._test_flag.<locals>.<listcomp>r   r8   )r   r   r   r   r   r.   r/   r0   r1   r2   r;   r<   )r   Zeveryone_modeZwindows_flagZacls_everybodyr   r+   r   rA   m   s    
zWindowsChmodTests._test_flagc                 C   s¬   t  dt ¡ ¡\}}}t| jƒ}t| j||ƒ t | jd¡ t	| jƒ}|  
| ¡  ¡ d¡ t  t¡}t| jƒ}t| j||ƒ t | jd¡ t	| jƒ}|  
| ¡  ¡ d¡ d S )NÚ r   é   r&   )r.   ZLookupAccountNameÚwin32apiZGetUserNameÚ_get_security_ownerr   Ú
_set_ownerr   r   r   r;   r   r2   r/   r:   )r   Zauthenticated_userÚ_Úsecurity_ownerZsecurity_daclZ
admin_userr   r   r   Ú test_user_admin_dacl_consistency~   s    




z2WindowsChmodTests.test_user_admin_dacl_consistency)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r$   r3   r4   r?   rC   rF   rG   rI   rA   rQ   Ú__classcell__r   r   r   r   r	      s   	r	   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚComputePrivateKeyModeTestc                    s   t t| ƒ ¡  t| jƒ| _d S r
   )r   rW   r   r   r   r   r   r   r   r   r   ˜   s    zComputePrivateKeyModeTest.setUpc                 C   s>   t  | jd¡ t  | jd¡}tr.|  |d¡ n|  |d¡ d S )Niÿ  i€  i¼  )r   r   r   Zcompute_private_key_modeÚ
POSIX_MODEr;   )r   Znew_moder   r   r   Útest_compute_private_key_modeœ   s
    z7ComputePrivateKeyModeTest.test_compute_private_key_mode)rR   rS   rT   r   rY   rV   r   r   r   r   rW   —   s   rW   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚWindowsOpenTestc                    st   t j | jd¡}t |t jt jB t jB d¡}t  	|¡ t
|ƒ ¡ ‰ t t¡‰|  ‡ ‡fdd„tdˆ  ¡ ƒD ƒ¡ d S )NÚfiler   c                    s(   g | ] }ˆ   |¡d  ˆkrˆ   |¡‘qS r%   r'   r(   r+   r   r   r-   ´   s    ÿzEWindowsOpenTest.test_new_file_correct_permissions.<locals>.<listcomp>r   )r   r   r   r   r   ÚopenÚO_CREATÚO_EXCLÚO_RDWRÚcloser   r   r.   r/   r0   r   r1   r2   ©r   r   Zdescr   r+   r   Ú!test_new_file_correct_permissions«   s    

z1WindowsOpenTest.test_new_file_correct_permissionsc                    s|   t j | jd¡}t|dƒ ¡  t |t jt jB d¡}t  |¡ t	|ƒ 
¡ ‰ t t¡‰|  ‡ ‡fdd„tdˆ  ¡ ƒD ƒ¡ d S )Nr[   Úwr   c                    s(   g | ] }ˆ   |¡d  ˆkrˆ   |¡‘qS r%   r'   r(   r+   r   r   r-   Á   s    ÿzJWindowsOpenTest.test_existing_file_correct_permissions.<locals>.<listcomp>r   )r   r   r   r   r\   r`   r   r^   r_   r   r   r.   r/   r0   r   r1   r2   ra   r   r+   r   Ú&test_existing_file_correct_permissions·   s    

z6WindowsOpenTest.test_existing_file_correct_permissionsc              	   C   s  | j ddtjtjB d |  t¡}| j ddtjtjB d W 5 Q R X |  |jjtj	¡ | j ddtjd | j ddtjd tj
 | jd¡}t|d	ƒ ¡  t |¡}z>|  t¡}| j d
dtjd W 5 Q R X |  |jjtj¡ W 5 | ¡  X |  t¡ | j ddtjd W 5 Q R X d S )Nr8   F)Ú
file_existÚflagsr&   TrK   r@   Ú5rc   é   é   )Ú_test_one_creationr   r]   r^   ÚassertRaisesÚOSErrorr;   Ú	exceptionÚerrnoZEEXISTr   r   r   r\   r`   r   ZLockFileÚreleaseZEACCESÚO_RDONLY)r   Zraisedr   Zfilelockr   r   r   Útest_create_file_on_openÄ   s     "

z(WindowsOpenTest.test_create_file_on_openc              	   C   sd   t j | jt|ƒ¡}|r:t j |¡s:t|dƒ W 5 Q R X d }zt ||¡}W 5 |r^t  |¡ X d S )Nrc   )	r   r   r   r   ÚstrÚexistsr\   r`   r   )r   Znumre   rf   Zone_fileZhandlerr   r   r   rj   â   s    
z"WindowsOpenTest._test_one_creationN)rR   rS   rT   rb   rd   rq   rj   r   r   r   r   rZ   ©   s   rZ   ú!Test specific to Windows securityc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚWindowsMkdirTestszFUnit tests for Windows mkdir + makedirs functions in filesystem modulec                    sZ   t j | jd¡}t |d¡ t t¡‰t	|ƒ 
¡ ‰ |  ‡ ‡fdd„tdˆ  ¡ ƒD ƒ¡ d S )NÚdirr   c                    s(   g | ] }ˆ   |¡d  ˆkrˆ   |¡‘qS r%   r'   r(   r+   r   r   r-   û   s    ÿzDWindowsMkdirTests.test_mkdir_correct_permissions.<locals>.<listcomp>r   )r   r   r   r   r   Úmkdirr.   r/   r0   r   r   r   r1   r2   )r   r   r   r+   r   Útest_mkdir_correct_permissionsó   s
    
z0WindowsMkdirTests.test_mkdir_correct_permissionsc                    sh   t j | jd¡}t j |d¡}t |d¡ t t¡‰t	|ƒ 
¡ ‰ |  ‡ ‡fdd„tdˆ  ¡ ƒD ƒ¡ d S )Nrv   Úsubpathr   c                    s(   g | ] }ˆ   |¡d  ˆkrˆ   |¡‘qS r%   r'   r(   r+   r   r   r-     s    ÿzGWindowsMkdirTests.test_makedirs_correct_permissions.<locals>.<listcomp>r   )r   r   r   r   r   Úmakedirsr.   r/   r0   r   r   r   r1   r2   )r   r   ry   r   r+   r   Ú!test_makedirs_correct_permissionsþ   s    
z3WindowsMkdirTests.test_makedirs_correct_permissionsc                 C   sl   t j | jd¡}dd l }|j}t |¡ |  ||j¡ zt |¡ W n tk
rX   Y nX |  ||j¡ d S )Nrv   r   )	r   r   r   r   rw   r   rz   r;   rl   )r   r   Ústd_osZoriginal_mkdirr   r   r   Útest_makedirs_switch_os_mkdir
  s    
z/WindowsMkdirTests.test_makedirs_switch_os_mkdirN)rR   rS   rT   rU   rx   r{   r}   r   r   r   r   ru   ð   s   ru   c                       sT   e Zd ZdZ‡ fdd„Zejedddd„ ƒZej	eddd	d
„ ƒZ
dd„ Z‡  ZS )ÚOwnershipTestz@Tests about copy_ownership_and_apply_mode and has_same_ownershipc                    s   t t| ƒ ¡  t| jƒ| _d S r
   )r   r~   r   r   r   r   r   r   r   r   r     s    zOwnershipTest.setUprt   r   c              
      sú   t  t¡}t  ¡ j}| |d¡ t d¡8}t d¡"}||_t	j
d| jdddd W 5 Q R X W 5 Q R X |  |jd¡ |jd	 }|d	 d }|  || ¡ ¡ |jd
 }|d	 d }| ¡ ‰ t  t¡‰|  ˆ  ¡ ¡ |  ‡ ‡fdd„td	ˆ  ¡ ƒD ƒ¡ d S )NFúwin32security.GetFileSecurityzwin32security.SetFileSecurityÚdummyr   T©Z	copy_userZ
copy_groupr&   r   r8   c                    s(   g | ] }ˆ   |¡d  ˆkrˆ   |¡‘qS r%   r'   r(   r+   r   r   r-   6  s    ÿz=OwnershipTest.test_copy_ownership_windows.<locals>.<listcomp>)r.   r/   r9   ÚSECURITY_ATTRIBUTESÚSECURITY_DESCRIPTORÚSetSecurityDescriptorOwnerÚmockÚpatchÚreturn_valuer   Úcopy_ownership_and_apply_moder   r;   Z
call_countZcall_args_listZGetSecurityDescriptorOwnerr   r0   r    r2   r   r1   )r   r6   ÚsecurityÚmock_getZmock_setZ
first_callZsecond_callr   r+   r   Útest_copy_ownership_windows  s.    

    ÿ


z)OwnershipTest.test_copy_ownership_windowsúTest specific to Linux securityc                 C   sŠ   t  d¡X}t  d¡B}t  d¡,}d|j_d|j_tjd| jdddd	 W 5 Q R X W 5 Q R X W 5 Q R X | | jdd¡ | | jd¡ d S )
Nzos.chownzos.chmodzos.staté2   é3   r€   r   Tr   )	r…   r†   r‡   Úst_uidÚst_gidr   rˆ   r   Zassert_called_once_with)r   Z
mock_chownZ
mock_chmodZ	mock_statr   r   r   Útest_copy_ownership_linux9  s        ÿ$z'OwnershipTest.test_copy_ownership_linuxc                 C   sV   t j | jd¡}t j | jd¡}t |d¡ ¡  t |d¡ ¡  |  t 	||¡¡ d S )NZtest1Ztest2rc   )
r   r   r   r   r   Ú	safe_openr`   r    r   Zhas_same_ownership)r   Zpath1Zpath2r   r   r   Útest_has_same_ownershipF  s
    z%OwnershipTest.test_has_same_ownership)rR   rS   rT   rU   r   ÚunittestÚskipIfrX   r‹   Ú
skipUnlessr‘   r“   rV   r   r   r   r   r~     s   

r~   c                       sl   e Zd ZdZ‡ fdd„Zdd„ Zejedddd	„ ƒZ	ej
ed
ddd„ ƒZdd„ Zdd„ Zdd„ Z‡  ZS )ÚCheckPermissionsTestz-Tests relative to functions that check modes.c                    s   t t| ƒ ¡  t| jƒ| _d S r
   )r   r—   r   r   r   r   r   r   r   r   r   R  s    zCheckPermissionsTest.setUpc                 C   s:   |   t | jd¡¡ t | jd¡ |  t | jd¡¡ d S ©Néä  r   )r    r   Z
check_moder   r   r   r   r   r   r   Útest_check_modeV  s    z$CheckPermissionsTest.test_check_modert   r   c              	   C   sd   |   t | j¡¡ t t¡}t ¡ j}| 	|d¡ t
 d¡}||_|  t | j¡¡ W 5 Q R X d S )NFr   )r    r   Úcheck_ownerr   r.   r/   r9   r‚   rƒ   r„   r…   r†   r‡   r   )r   r6   r‰   rŠ   r   r   r   Útest_check_owner_windows\  s    

z-CheckPermissionsTest.test_check_owner_windowsrŒ   c              	   C   sX   |   t | j¡¡ dd l}| ¡ }t d¡"}|d |_|  	t | j¡¡ W 5 Q R X d S )Nr   z	os.getuidr8   )
r    r   r›   r   r   Úgetuidr…   r†   r‡   r   )r   r|   ZuidZmock_uidr   r   r   Útest_check_owner_linuxh  s    
z+CheckPermissionsTest.test_check_owner_linuxc              	   C   sx   |   t | jd¡¡ t d¡ }d|_|  t | jd¡¡ W 5 Q R X t d¡ }d|_|  t | jd¡¡ W 5 Q R X d S )Nr™   z$certbot.compat.filesystem.check_modeFz%certbot.compat.filesystem.check_owner)r    r   Zcheck_permissionsr   r…   r†   r‡   r   )r   Z	mock_modeZ
mock_ownerr   r   r   Útest_check_permissionss  s    z+CheckPermissionsTest.test_check_permissionsc                 C   sj   t  | jd¡ |  t  | jd¡¡ t  | jd¡ |  t  | jd¡¡ t  | jd¡ |  t  | jd¡¡ d S )Nr™   r   iá  )r   r   r   r    Zhas_min_permissionsr   r   r   r   r   Útest_check_min_permissions~  s    z/CheckPermissionsTest.test_check_min_permissionsc                 C   sD   t  | jd¡ |  t  | j¡¡ t  | jd¡ |  t  | j¡¡ d S r˜   )r   r   r   r    Zhas_world_permissionsr   r   r   r   r   Útest_is_world_reachableˆ  s    z,CheckPermissionsTest.test_is_world_reachable)rR   rS   rT   rU   r   rš   r”   r•   rX   rœ   r–   rž   rŸ   r    r¡   rV   r   r   r   r   r—   P  s   



r—   c                   @   s   e Zd ZdZdd„ ZdS )ÚOsReplaceTestz3Test to ensure consistent behavior of rename methodc                 C   sp   t j | jd¡}t j | jd¡}t|dƒ ¡  t|dƒ ¡  t ||¡ |  t j 	|¡¡ |  
t j 	|¡¡ dS )zKEnsure that replace will effectively rename src into dst for all platforms.ÚsrcÚdstrc   N)r   r   r   r   r\   r`   r   Úreplacer   rs   r    )r   r£   r¤   r   r   r   Ú test_os_replace_to_existing_file’  s    z.OsReplaceTest.test_os_replace_to_existing_fileN)rR   rS   rT   rU   r¦   r   r   r   r   r¢     s   r¢   c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚRealpathTestzTests for realpath methodc                    s   t t| ƒ ¡  t| jƒ| _d S r
   )r   r§   r   r   r   r   r   r   r   r   r   ¢  s    zRealpathTest.setUpc              	   C   sÚ   t  | j¡| _tj | jd¡}t | j|¡ |  | jt  | j¡¡ |  | jt  |¡¡ t 	¡ }tj | jd¡}tj 
| j¡}zLt tj | j¡¡ t ||¡ |  | jt  |¡¡ |  | jt  |¡¡ W 5 t |¡ X d S )NZlink_absZlink_rel)r   Úrealpathr   r   r   r   r   r   r;   ÚgetcwdÚbasenameÚchdirÚdirname)r   r!   ÚcurdirZ
probe_namer   r   r   r$   ¦  s    z$RealpathTest.test_symlink_resolutionc              	   C   sŒ   t j | jd¡}t j | jd¡}t j | jd¡}t  ||¡ t  ||¡ t  ||¡ |  t¡}t |¡ W 5 Q R X |  	dt
|jƒk¡ d S )NZlink1Zlink2Zlink3zlink1 is a loop!)r   r   r   r   r   rk   ÚRuntimeErrorr   r¨   r    rr   rm   )r   Z
link1_pathZ
link2_pathZ
link3_pathÚerrorr   r   r   Útest_symlink_loop_mitigation½  s    z)RealpathTest.test_symlink_loop_mitigation)rR   rS   rT   rU   r   r$   r°   rV   r   r   r   r   r§      s   r§   c                   @   sl   e Zd ZdZdd„ Ze d¡e d¡dd„ ƒƒZe d¡e d¡dd	„ ƒƒZe d¡e d¡d
d„ ƒƒZ	dS )ÚIsExecutableTestzTests for is_executable methodc              	      sr   t j | jd¡}ddlm‰  ‡ fdd„}tjd|d" t  t	 
|t jt jB d¡¡ W 5 Q R X |  t	 |¡¡ d S )	NZfoor   ©Ú_generate_daclc                    s,   ˆ | |ƒ}t d| ¡ ƒD ]}| d¡ q|S rD   )r1   r2   Z	DeleteAce)Zuser_sidÚmoder,   rO   r²   r   r   Ú_execute_mockÙ  s    
z;IsExecutableTest.test_not_executable.<locals>._execute_mockz(certbot.compat.filesystem._generate_dacl)Zside_effecti¶  )r   r   r   r   Zcertbot.compat.filesystemr³   r…   r†   r`   r   r\   r]   ÚO_WRONLYr   Úis_executable)r   Z	file_pathrµ   r   r²   r   Útest_not_executableÌ  s    
&z$IsExecutableTest.test_not_executablez(certbot.compat.filesystem.os.path.isfilez#certbot.compat.filesystem.os.accessc              	   C   s2   t ƒ " d|_d|_|  t d¡¡ W 5 Q R X d S )NTz/path/to/exe©Ú_fix_windows_runtimer‡   r    r   r·   ©r   Zmock_accessZmock_isfiler   r   r   Útest_full_pathå  s    zIsExecutableTest.test_full_pathc              	   C   s2   t ƒ " d|_d|_|  t d¡¡ W 5 Q R X d S )NTÚexer¹   r»   r   r   r   Útest_rel_pathí  s    zIsExecutableTest.test_rel_pathc              	   C   s2   t ƒ " d|_d|_|  t d¡¡ W 5 Q R X d S )NTFr½   )rº   r‡   r   r   r·   r»   r   r   r   Útest_not_foundõ  s    zIsExecutableTest.test_not_foundN)
rR   rS   rT   rU   r¸   r…   r†   r¼   r¾   r¿   r   r   r   r   r±   Ê  s   r±   c               	   c   sJ   t jdkrd V  n4t d¡$} | jj}|jj}tj|_d V  W 5 Q R X d S )NÚntr   )	r   Únamer…   r†   r‡   r   ZGetEffectiveRightsFromAclr=   rE   )rŠ   Z	dacl_mockZ	mode_mockr   r   r   rº   þ  s    
rº   c                 C   s   t  | t j¡S r
   )r.   ÚGetFileSecurityZDACL_SECURITY_INFORMATION©Útargetr   r   r   r   
  s    r   c                 C   s   t  | t j¡S r
   )r.   rÂ   ÚOWNER_SECURITY_INFORMATIONrÃ   r   r   r   rM     s    rM   c                 C   s    |  |d¡ t | tj|¡ d S )NF)r„   r.   ZSetFileSecurityrÅ   )rÄ   rP   Úuserr   r   r   rN     s      ÿrN   c                 C   s2   t  | d¡ tj | d¡}tj|ddd ¡  |S )Nr™   Zproberc   )r   )r   r   r   r   r   r   r’   r`   )r   r   r   r   r   r     s    r   Ú__main__))rU   Ú
contextlibrn   r”   r…   rL   r.   r=   rX   ÚImportErrorZcertbot.tests.utilZtestsr   Z	test_utilZcertbotr   Zcertbot.compatr   r   r   r0   r9   r:   r•   r	   rW   rZ   ru   r~   r—   r¢   r§   r±   Úcontextmanagerrº   r   rM   rN   r   rR   Úmainr   r   r   r   Ú<module>   sP   
wF(7@*4

