U
    ÓZjÊ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__© úg/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-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   Ú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@   Ú5rd   é   é   )Ú_test_one_creationr   r]   r^   ÚassertRaisesÚOSErrorr;   Ú	exceptionÚerrnoÚEEXISTr   r   r   r\   r`   r   ZLockFileÚreleaseÚEACCESÚO_RDONLY)r   Zraisedr   Ú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 )Nrd   )	r   r   r   r   ÚstrÚexistsr\   r`   r   )r   Únumrf   rg   Zone_fileÚhandlerr   r   r   rk   â   s    
z"WindowsOpenTest._test_one_creationN)rR   rS   rT   rc   re   ru   rk   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 )Nr|   Ú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   r   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 )Nr|   r   )	r   r   r   r   r}   r   r€   r;   rm   )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   r~   r�   rƒ   r   r   r   r   r{   ð   s   r{   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.setUprz   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test2rd   )
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_moderz   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‚   Ú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Údstrd   N)r   r   r   r   r\   r`   r   Úreplacer   rw   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 )NÚlink1Úlink2Zlink3zlink1 is a loop!)r   r   r   r   r   rl   ÚRuntimeErrorr   r¯   r    rv   rn   )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   Ú	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proberd   )r   )r   r   r   r   r   r   r˜   r`   )r   r   r   r   r   r     s    r   Ú__main__))rU   Ú
contextlibro   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   r{   r„   r�   r©   r®   rº   ÚcontextmanagerrÄ   r   rM   rN   r   rR   Úmainr   r   r   r   Ú<module>   sP   
wF(7@*4

