U
    ÝÁ]„¦  ã                   @   s  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	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 e d¡Zdd	„ Zd
d„ ZG dd„ dejƒZG dd„ dejƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZedkre  ¡  dS )úTests for certbot.storage.é    N)Úerrors)Úos)Ú
filesystem)ÚALL_FOURúcert_512.pemc                 C   s   t D ]}t t| |ƒ¡ qdS )z9Unlink all four items associated with this RenewableCert.N)r   r   ÚunlinkÚgetattr)Ú	rc_objectÚkind© r   ú</usr/lib/python3/dist-packages/certbot/tests/storage_test.pyÚ
unlink_all   s    r   c              
   C   s4   t D ]*}tt| |ƒdƒ}| |¡ W 5 Q R X qdS )z9Put dummy data into all four files of this RenewableCert.ÚwN)r   Úopenr	   Úwrite)r
   r   Úfr   r   r   Úfill_with_sample_data   s    r   c                   @   s`   e Zd ZdZdd„ Zdd„ Ze d¡e d¡dd	„ ƒƒZe d¡d
d„ ƒZ	e d¡dd„ ƒZ
dS )ÚRelevantValuesTestz*Tests for certbot.storage.relevant_values.c                 C   s   ddi| _ d S )NÚserverúexample.org)Úvalues©Úselfr   r   r   ÚsetUp'   s    zRelevantValuesTest.setUpc                 O   s   ddl m} |||ŽS )Nr   )Úrelevant_values)Úcertbot.storager   )r   ÚargsÚkwargsr   r   r   r   Ú_call*   s    zRelevantValuesTest._callzcertbot.cli.option_was_setz.certbot.plugins.disco.PluginsRegistry.find_allc                 C   s6   dg|_ d|_ d| jd< |  |  | j ¡ ¡| j¡ d S )Nzcertbot-foo:barTé*   zcertbot_foo:bar_baz)Úreturn_valuer   ÚassertEqualr   Úcopy)r   Zmock_find_allÚmock_option_was_setr   r   r   Útest_namespace.   s    
 ÿz!RelevantValuesTest.test_namespacec                 C   sP   d|_ d| jd< d| jd< d| jd< | j ¡ }d| jd< |  |  | j¡|¡ d S )	NTZallow_subset_of_namesZapacheZauthenticatori9  Úrsa_key_sizeZthereZhello©r!   r   r#   r"   r   ©r   r$   Zexpected_relevant_valuesr   r   r   Útest_option_set8   s    




z"RelevantValuesTest.test_option_setc                 C   s2   d|_ | j ¡ }d| jd< |  |  | j¡|¡ d S )NFi   r&   r'   r(   r   r   r   Útest_option_unsetD   s    

z$RelevantValuesTest.test_option_unsetN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚmockÚpatchr%   r)   r*   r   r   r   r   r   $   s   
r   c                       s2   e Zd ZdZ‡ fdd„Zd	dd„Zdd„ Z‡  ZS )
ÚBaseRenewableCertTestz¿Base class for setting up Renewable Cert tests.

    .. note:: It may be required to write out self.config for
    your test.  Check :class:`.cli_test.DuplicateCertTest` for an example.

    c              	      s^  ddl m} tt| ƒ ¡  t tj 	| j
jdd¡¡ tj 	| j
jdd¡}t |¡ t tj 	| j
jd¡¡ t ¡ }tD ]&}tj 	| j
jdd|d ¡}|||< qvttj 	| j
jddd¡d	ƒ W 5 Q R X ||d< tj 	| j
jdd
¡|_| ¡  || _ttj 	| j
jdd¡dƒ}| d¡ W 5 Q R X t ¡ | _t d¡}d|_| |j| j
¡| _W 5 Q R X d S )Nr   ©ÚstorageÚliver   ÚarchiveZrenewalú.pemÚREADMEÚaúexample.org.confzIGNORE.THISr   zThis file should be ignored!z-certbot.storage.RenewableCert._check_symlinksT)Úcertbotr3   Úsuperr1   r   r   Úmakedirsr   ÚpathÚjoinÚconfigÚ
config_dirÚ	configobjÚ	ConfigObjr   r   Úfilenamer   Úconfig_fileÚdefaultsr/   r0   r!   ÚRenewableCertÚtest_rc)r   r3   Úarchive_pathrD   r   Ú	kind_pathZjunkZcheck©Ú	__class__r   r   r   V   s<    
ÿ
ÿÿ
ÿ
zBaseRenewableCertTest.setUpNc                 C   s˜   t | j|ƒ}tj |¡r"t |¡ t tj tjjtjjddd 	||¡¡|¡ t
|dƒ"}| |d krp| d¡n|¡ W 5 Q R X |dkr”t |d¡ d S )Nr5   r   z
{0}{1}.pemÚwbÚasciiÚprivkeyé€  )r	   rG   r   r=   Úlexistsr   Úsymlinkr>   ÚpardirÚformatr   r   Úencoder   Úchmod)r   r   ÚverÚvalueÚlinkr   r   r   r   Ú_write_out_kind|   s    
 
ÿþ&z%BaseRenewableCertTest._write_out_kindc                 C   s&   t D ]}|  |d¡ |  |d¡ qd S )Né   é   )r   rY   ©r   r   r   r   r   Ú_write_out_ex_kindsˆ   s    z)BaseRenewableCertTest._write_out_ex_kinds)N)r+   r,   r-   r.   r   rY   r]   Ú__classcell__r   r   rJ   r   r1   N   s   &
r1   c                   @   s¢  e 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e d¡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'¡e d(¡d)d*„ ƒƒZd+d,„ Ze d'¡e d-¡d.d/„ ƒƒZe d0¡d1d2„ ƒZe d3¡e d0¡d4d5„ ƒƒZe d0¡e d6¡d7d8„ ƒƒZe d0¡d9d:„ ƒZ e d0¡d;d<„ ƒZ!e d=¡d>d?„ ƒZ"d@dA„ Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)dNS )OÚRenewableCertTestsr   c                 C   sH   |   | jjd¡ tD ].}|   t| j|ƒtj | jj	dd|d ¡¡ qd S )Nr   r4   r6   )
r"   rG   Úlineagenamer   r	   r   r=   r>   r?   r@   r\   r   r   r   Útest_initialization’   s    
    ÿÿz&RenewableCertTests.test_initializationc              	   C   sx   ddl m} tj | jjd¡}t|dƒ}| d¡ W 5 Q R X |  	t
j|j|| j¡ t |¡ |  	t
j|jd| j¡ dS )z€Test that the RenewableCert constructor will complain if
        the renewal configuration file doesn't end in ".conf"

        r   r2   zbroken.confr   z[No closing bracket for you!ZfunN)r:   r3   r   r=   r>   r?   r@   r   r   ÚassertRaisesr   ÚCertStorageErrorrF   r   )r   r3   Zbrokenr   r   r   r   Útest_renewal_bad_config™   s     ÿ
 ÿz*RenewableCertTests.test_renewal_bad_configc                 C   sd   ddl m} t ¡ }d|d< d|d< d|d< tj | jjd	¡|_	| 
¡  |  tj|j|j	| j¡ d
S )zƒTest that the RenewableCert constructor will complain if
        the renewal configuration file is missing a required file element.r   r2   zimaginary_cert.pemÚcertzimaginary_chain.pemÚchainzimaginary_fullchain.pemÚ	fullchainzimaginary_config.confN)r:   r3   rA   rB   r   r=   r>   r?   r@   rC   r   rb   r   rc   rF   )r   r3   r?   r   r   r   Útest_renewal_incomplete_config¨   s     ÿz1RenewableCertTests.test_renewal_incomplete_configc              	   C   s^   ddl m} |  ¡  |  d| jk¡ t d¡}| | jj| j	¡ W 5 Q R X |  
|jj¡ d S )Nr   r2   Úversionúcertbot.storage.logger)r:   r3   r]   Ú
assertTruerD   r/   r0   rF   rC   r?   ÚassertFalseÚwarningÚcalled©r   r3   Úmock_loggerr   r   r   Útest_no_renewal_version¶   s    z*RenewableCertTests.test_no_renewal_versionc              	   C   s|   ddl m} |  ¡  d| jd< | j ¡  t d¡}| | jj| j	¡ W 5 Q R X |  
|jj¡ |  
d|jjd d k¡ d S )Nr   r2   z99.99.99ri   rj   )r:   r3   r]   rD   r   r/   r0   rF   rC   r?   rk   Úinforn   Z	call_argsro   r   r   r   Útest_renewal_newer_versionÀ   s    

z-RenewableCertTests.test_renewal_newer_versionc                 C   s®  | j j}d| j _|  | j  ¡ ¡ || j _|  | j  ¡ ¡ t| j ƒ |  | j  ¡ ¡ t| j ƒ tD ]&}t tj	 
d|d ¡t| j |ƒ¡ q`|  | j  ¡ ¡ t| j ƒ tD ]*}t tj	 
| jj|d ¡t| j |ƒ¡ q¦|  | j  ¡ ¡ t| j ƒ tD ],}t tj	 
dddd|d ¡t| j |ƒ¡ qð|  | j  ¡ ¡ t| j ƒ |  | j  ¡ ¡ t | j j¡ t tj	 
ddddd¡| j j¡ t| j jdƒ}| d¡ W 5 Q R X |  | j  ¡ ¡ d S )	Nzrelative/pathú..z17.pemr5   r   zfullchain_17.pemr   zwrongly-named fullchain)rG   re   rl   Ú_consistentr   r   r   r   rQ   r=   r>   r	   r?   r@   rk   r   rg   r   r   )r   Zoldcertr   r   r   r   r   Útest_consistentÌ   sL    


ÿ

ÿ
ÿ
þ
ÿÿz"RenewableCertTests.test_consistentc                 C   sÀ   |   dd¡ |  tj | j d¡tj | jj	ddd¡¡¡ t 
| jj¡ t tj | jj	ddd¡| jj¡ t| jjdƒ}| d¡ W 5 Q R X |  tj | j d¡tj | jj	ddd¡¡¡ d S )Nre   é   r5   r   z
cert17.pemr   )rY   rk   r   r=   ÚsamefilerG   Úcurrent_targetr>   r?   r@   r   re   rQ   r   r   )r   r   r   r   r   Útest_current_targetö   s*    þÿÿÿþÿz&RenewableCertTests.test_current_targetc              	   C   s\   dD ]}|   d|¡ qt | jj¡ t tj ddddd¡| jj¡ |  | j 	d¡d¡ d S )N)é   é   é
   é   re   rt   r5   r   z
cert10.pemr}   )
rY   r   r   rG   re   rQ   r=   r>   r"   Úcurrent_version)r   rV   r   r   r   Útest_current_version  s    ÿÿz'RenewableCertTests.test_current_versionc                 C   s   |   | j d¡d ¡ d S )Nre   )r"   rG   r   r   r   r   r   Útest_no_current_version  s    z*RenewableCertTests.test_no_current_versionc                 C   sæ   t j dd¡D ]}tD ]}|  ||¡ qq|  | j ¡ d¡ |  | j ¡ d¡ |  dd¡ |  | j ¡ d¡ |  | j ¡ d¡ |  dd¡ |  dd¡ |  | j ¡ d¡ tD ]}|  |d	¡ q¬|  | j ¡ d	¡ |  | j ¡ d
¡ d S )Nr{   é   r|   rN   é   é   re   rg   rw   é   )	ÚsixÚmovesÚranger   rY   r"   rG   Úlatest_common_versionZnext_free_version©r   rV   r   r   r   r   Útest_latest_and_next_versions  s    z0RenewableCertTests.test_latest_and_next_versionsrj   c                 C   sœ   t  ¡  }| j_t  ¡  }| j_t  ¡ | j_d|_|  | j ¡ d¡ |  |j	d¡ |  |j
j	d¡ d|_|  | j ¡ d¡ |  |j	d¡ |  |j
j	d¡ d S )NFTr   r{   )r/   ZMockrG   Úupdate_all_links_toÚhas_pending_deploymentr‰   r!   r"   Zensure_deployedZ
call_countrm   )r   rp   Zmock_updateZmock_has_pendingr   r   r   Útest_ensure_deployed*  s    z'RenewableCertTests.test_ensure_deployedc                 C   sÚ   t j dd¡D ].}tD ]$}|  ||¡ |  || j |¡¡ qq| j dd¡ | j dd¡ |  d| j d¡¡ |  d| j d¡¡ |  d| j d¡¡ |  d| j d	¡¡ | j dd
¡ |  t	j
 t	 | jj¡¡d¡ d S )Nr{   r‚   re   é   rN   é   r|   rf   rg   i¸  zchain3000.pem)r†   r‡   rˆ   r   rY   r"   rG   r   Ú_update_link_tor   r=   ÚbasenameÚreadlinkrf   rŠ   r   r   r   Útest_update_link_to;  s    ÿz&RenewableCertTests.test_update_link_toc              	   C   s.   |   dd¡ |  dtj | j dd¡¡¡ d S )Nre   rZ   z	cert8.pemr„   )rY   r"   r   r=   r’   rG   ri   r   r   r   r   Útest_versionN  s    ÿzRenewableCertTests.test_versionc                 C   s¤   t j dd¡D ].}tD ]$}|  ||¡ |  || j |¡¡ qq|  | j ¡ d¡ t j dd¡D ]@}| j 	|¡ tD ]}|  || j |¡¡ qr|  | j ¡ d¡ q^d S ©Nr{   r‚   r|   )
r†   r‡   rˆ   r   rY   r"   rG   r   r‰   rŒ   rŠ   r   r   r   Ú test_update_all_links_to_successV  s    z3RenewableCertTests.test_update_all_links_to_successc              	   C   sf   t jfdd„}|  ¡  t d¡}||_|  t| jj	d¡ W 5 Q R X t
D ]}|  | j |¡d¡ qHd S )Nc                 S   s0   t j | ¡}d|kr$| d¡r$t‚n|| ƒ d S )Nrg   Úprev)r   r=   r’   Ú
startswithÚ
ValueError)r=   Úreal_unlinkr’   r   r   r   Úunlink_or_raisec  s    zTRenewableCertTests.test_update_all_links_to_partial_failure.<locals>.unlink_or_raiseúcertbot.storage.os.unlinkrZ   ©r   r   r]   r/   r0   Úside_effectrb   rš   rG   rŒ   r   r"   r   ©r   rœ   Zmock_unlinkr   r   r   r   Ú(test_update_all_links_to_partial_failureb  s    z;RenewableCertTests.test_update_all_links_to_partial_failurec              	   C   sf   t jfdd„}|  ¡  t d¡}||_|  t| jj	d¡ W 5 Q R X t
D ]}|  | j |¡d¡ qHd S )Nc                 S   s"   dt j | ¡krt‚n|| ƒ d S )Nrg   )r   r=   r’   rš   )r=   r›   r   r   r   rœ   t  s    zQRenewableCertTests.test_update_all_links_to_full_failure.<locals>.unlink_or_raiser   rZ   r[   rž   r    r   r   r   Ú%test_update_all_links_to_full_failures  s    z8RenewableCertTests.test_update_all_links_to_full_failurec                 C   sª   t j dd¡D ].}tD ]$}|  ||¡ |  || j |¡¡ qqt j dd¡D ]X}| j |¡ tD ]}|  || j |¡¡ q`|dk r”|  	| j 
¡ ¡ qL|  | j 
¡ ¡ qLd S r–   )r†   r‡   rˆ   r   rY   r"   rG   r   rŒ   rk   r   rl   rŠ   r   r   r   Útest_has_pending_deploymentƒ  s    z.RenewableCertTests.test_has_pending_deploymentc                 C   s²   |   ddt d¡¡ |  | j ¡ ddg¡ |   ddt d¡¡ |  | j d¡ddg¡ |   ddt d¡¡ |  | j d¡dgd	d
„ dD ƒ ¡ t | jj¡ |  	t
j| jj¡ d S )Nre   rZ   zcert-san_512.pemúexample.comzwww.example.comé   r   zcert-5sans_512.pemc                 S   s   g | ]}d   |¡‘qS )z{0}.example.com)rS   )Ú.0Úcr   r   r   Ú
<listcomp>¤  s     z1RenewableCertTests.test_names.<locals>.<listcomp>Zabcd)rY   Ú	test_utilÚload_vectorr"   rG   Únamesr   r   re   rb   r   rc   r   r   r   r   Ú
test_names‘  s&    ÿÿ  ÿ
þzRenewableCertTests.test_nameszcertbot.storage.clizcertbot.storage.datetimec           	   	   C   sâ   t  d¡}|  ¡  | j d¡ t| jjdƒ}| |¡ W 5 Q R X | j d¡ t| jjdƒ}| |¡ W 5 Q R X tj	|_	d|j
_i | jjd< dD ]J\}}}tj |¡}||jj_|| jjd< || jjd	< |  | j ¡ |¡ q’d
S )z<Test should_autorenew() on the basis of expiry time windows.r   rZ   rL   r[   FÚrenewalparams))é@*ŒTz2 monthsT)r®   z1 weekT)r®   z4 daysF)r®   ú2 daysF)é@äúIz7 yearsT)r°   z11 years 2 monthsT)r°   z8 hoursF)r°   r¯   F)r°   z40 daysF)r°   z9 monthsF)é Ž¤Tz	0 secondsT)r±   z
10 secondsT)r±   z
10 minutesT)r±   z10 weeksT)r±   z	10 monthsT)r±   z10 yearsT)r±   z	99 monthsTZdeploy_before_expiryZrenew_before_expiryN)r©   rª   r]   rG   rŒ   r   re   r   ÚdatetimeÚ	timedeltaÚ
set_by_clir!   ÚconfigurationZutcfromtimestampZutcnowr"   Úshould_autorenew)	r   Zmock_datetimeÚmock_cliZ	test_certr   Zcurrent_timeÚintervalÚresultZsometimer   r   r   Útest_time_interval_judgmentsª  s"    

z/RenewableCertTests.test_time_interval_judgmentsc                 C   s`   i | j jd< |  | j  ¡ ¡ d| j jd d< |  | j  ¡ ¡ d| j jd d< |  | j  ¡ ¡ d S )Nr­   ÚTrueÚ	autorenewÚFalse)rG   rµ   rk   Zautorenewal_is_enabledrl   r   r   r   r   Útest_autorenewal_is_enabledØ  s    z.RenewableCertTests.test_autorenewal_is_enabledz*certbot.storage.RenewableCert.ocsp_revokedc                 C   sn   d|j _ddi| jjd< |  | j ¡ ¡ d| jjd d< tD ]}|  |d¡ q<d|_|  | j ¡ ¡ d|_dS )	zTTest should_autorenew on the basis of reasons other than
        expiry time window.Fr¼   r½   r­   r»   rZ   TN)	r´   r!   rG   rµ   rl   r¶   r   rY   rk   )r   Z	mock_ocspr·   r   r   r   r   Útest_should_autorenewá  s    z(RenewableCertTests.test_should_autorenewzcertbot.storage.relevant_valuesc                 C   s*  dd„ |_ tj dd¡D ]}tD ]}|  ||¡ q q| j d¡ |  d| j 	ddd d| j
¡¡ t| j dd¡ƒ}|  | ¡ d	¡ W 5 Q R X t| j d
d¡ƒ}|  | ¡ d¡ W 5 Q R X t| j dd¡ƒ}|  | ¡ d¡ W 5 Q R X |  tj | j dd¡¡¡ |  tj | j dd¡¡¡ |  d| j 	ddd d| j
¡¡ |  d| j 	ddd d| j
¡¡ dD ]F}|  tj | j d|¡¡¡ |  dtj t | j d|¡¡¡¡ q`tD ]<}|  | j |¡ttj dd¡ƒ¡ |  | j |¡d¡ q¬| j d¡ |  d| j 	ddd d| j
¡¡ tD ]<}|  | j |¡ttj dd¡ƒ¡ |  | j |¡d¡ qt| j dd¡ƒ}|  | ¡ d¡ W 5 Q R X tj | j
j| jj¡d }t|dƒ}| d¡ W 5 Q R X |  d| j 	ddd d!| j
¡¡ |  tj | j dd¡¡¡ |  tj | j dd¡¡¡ |  tj |¡¡ d S )"Nc                 S   s   | S ©Nr   ©Úxr   r   r   Ú<lambda>÷  ó    z8RenewableCertTests.test_save_successor.<locals>.<lambda>r{   r‚   r   s   new certó	   new chainre   znew certrf   z	new chainrg   znew certnew chainrN   rƒ   s   agains   newer chainr„   s   hellos   other chain)r‚   rƒ   r„   zprivkey3.pemé	   s   lasts   attemptr}   Zlastattemptz	.conf.newr   z)We previously crashed while writing me :(s   withó   as   key)rŸ   r†   r‡   rˆ   r   rY   rG   rŒ   r"   Úsave_successorr?   r   ri   Úreadrl   r   r=   Úislinkrk   r’   r“   Úavailable_versionsÚlistr   r>   Úrenewal_configs_dirr`   r   Úexists)r   Úmock_rvrV   r   r   ÚiZtemp_config_filer   r   r   Útest_save_successoró  s”    
  ÿÿ  ÿÿ  ÿÿÿ"  ÿÿÿÿÿ  ÿÿz&RenewableCertTests.test_save_successorz:Group/everybody permissions are not maintained on Windows.c                 C   s  dd„ |_ tD ]}|  |d¡ q| j d¡ |  t | j dd¡d¡¡ t 	| j dd¡d¡ | j 
ddd d| j¡ |  t | j dd	¡d¡¡ | j 
d	dd
d| j¡ |  t | j dd¡d¡¡ t 	| j dd¡d¡ | j 
ddd
d| j¡ |  t | j dd¡d¡¡ d S )Nc                 S   s   | S rÀ   r   rÁ   r   r   r   rÃ   7  rÄ   zMRenewableCertTests.test_save_successor_maintains_group_mode.<locals>.<lambda>r{   rN   rO   i$  ó   newcertrÅ   r   ó   new_privkeyr   i¤  é   é   )rŸ   r   rY   rG   rŒ   rk   r   Ú
check_moderi   rU   rÈ   r?   )r   rÏ   r   r   r   r   Ú(test_save_successor_maintains_group_mode2  s    
z;RenewableCertTests.test_save_successor_maintains_group_modez8certbot.storage.filesystem.copy_ownership_and_apply_modec                 C   st   dd„ |_ tD ]}|  |d¡ q| j d¡ | j ddd d| j¡ |  |j¡ | j dddd| j¡ |  	|j¡ d S )Nc                 S   s   | S rÀ   r   rÁ   r   r   r   rÃ   M  rÄ   zFRenewableCertTests.test_save_successor_maintains_gid.<locals>.<lambda>r{   rÒ   rÅ   r   rÓ   )
rŸ   r   rY   rG   rŒ   rÈ   r?   rl   rn   rk   )r   Zmock_ownershiprÏ   r   r   r   r   Ú!test_save_successor_maintains_gidH  s    
z4RenewableCertTests.test_save_successor_maintains_gidc              	   C   s¶  dd„ |_ ddlm} |j dddd| j¡}|  | ¡ ¡ |  tj	 
tj	 | jjd	¡¡¡ |  tj	 
tj	 | jjd
¡¡¡ |  tj	 
tj	 | jjdd
¡¡¡ |  t |jd¡¡ t|jdƒ}|  | ¡ d¡ W 5 Q R X |j dddd| j¡}|  tj	 
tj	 | jjd¡¡¡ |  tj	 
tj	 | jjdd
¡¡¡ t tj	 | jjd¡¡ |  tj|jjdddd| j¡ t tj	 | jjd¡¡ |  tj|jjdddd| j¡ |j dddd| j¡}dS )z$Test for new_lineage() class method.c                 S   s   | S rÀ   r   rÁ   r   r   r   rÃ   [  rÄ   z5RenewableCertTests.test_new_lineage.<locals>.<lambda>r   r2   úthe-lineage.coms   certs   privkeys   chainúthe-lineage.com.confr7   rO   Úrbs	   certchainó   cert2ó   privkey2ó   chain2zthe-lineage.com-0001.confzthe-lineage.com-0001zthe-lineage.com-0002s   cert3s   privkey3s   chain3zother-example.coms   cert4s   privkey4s   chain4N)rŸ   r:   r3   rF   Únew_lineager?   rk   ru   r   r=   rÎ   r>   rÍ   Úlive_dirr   rÖ   Zkey_pathr   rg   r"   rÉ   Úmkdirrb   r   rc   Údefault_archive_dir)r   rÏ   r3   r¹   r   r   r   r   Útest_new_lineageV  sŒ    
    ÿ ÿ ÿ  ÿ    ÿ ÿ  ÿ
 ÿ    þ   ý    ÿz#RenewableCertTests.test_new_lineagec              	   C   s¾   dd„ |_ ddlm} t | jj¡ t | jj¡ t | jj¡ |j	 
dddd| j¡ |  tj tj | jjd	¡¡¡ |  tj tj | jjdd
¡¡¡ |  tj tj | jjdd¡¡¡ dS )z9Test that directories can be created if they don't exist.c                 S   s   | S rÀ   r   rÁ   r   r   r   rÃ   Š  rÄ   zFRenewableCertTests.test_new_lineage_nonexistent_dirs.<locals>.<lambda>r   r2   rÙ   rÜ   rÝ   rÞ   rÚ   zprivkey.pemzprivkey1.pemN)rŸ   r:   r3   ÚshutilZrmtreer?   rÍ   râ   rà   rF   rß   rk   r   r=   rÎ   r>   )r   rÏ   r3   r   r   r   Ú!test_new_lineage_nonexistent_dirs…  s8    
    ÿ
 ÿÿ  ÿ  ÿz4RenewableCertTests.test_new_lineage_nonexistent_dirsz(certbot.storage.util.unique_lineage_namec              	   C   s4   ddl m} d|_|  tj|jjdddd| j¡ d S )Nr   r2   )Zthis_does_not_end_with_dot_confZyikesr¤   re   rN   rf   )	r:   r3   r!   rb   r   rc   rF   rß   r?   )r   Zmock_ulnr3   r   r   r   Útest_invalid_config_filename›  s        þz/RenewableCertTests.test_invalid_config_filenamec                 C   s€   |   tj| jjd¡ |   tj| jjd¡ |   tj| jjdd¡ |   tj| jjd¡ |   tj| jjd¡ |   tj| jj	dd¡ d S )NZelephantrw   )
rb   r   rc   rG   ry   r   ri   rË   Znewest_available_versionr‘   r   r   r   r   Útest_bad_kind£  s@      ÿ  ÿ   ÿ þ þ  þz RenewableCertTests.test_bad_kindc                 C   s   |   | j ¡ ¡ d S rÀ   )rl   rG   Zocsp_revokedr   r   r   r   Útest_ocsp_revokedµ  s    z$RenewableCertTests.test_ocsp_revokedc           
   )   C   sÔ  ddl m} tj t dddddd¡¡}tj t dd	d
ddd¡¡}t d¡ t dd	dddd¡¡}|df||df||df||df|t d¡ |df|t d¡ |df|t d¡ |df|t d¡ |df|t d¡ |df|t d¡ |df|t d¡ |df|t d¡ |df|t d¡ |df|t d¡ |df|t d¡ |df|t d¡ |d f|t d¡ |d f|t d!¡ |d"f|t d#¡ |d"f|t d#¡ i}| ¡ D ]&\}}|\}}	|  	| 
||	¡|¡ q¨d S )$Nr   r2   iÓ  r[   r~   é;   é   iÜ  r}   r…   é   é   zAsia/Shanghaiiß  é   é   é   é)   Ú z17 daysrw   Z30é   z7 weeksé1   z1 monthz1 yearin  im  z1 year 1 dayio  z1 year-1 dayil  z4 yearsiµ  )r:   r3   ÚpytzZUTCZfromutcr²   Útimezoner³   Úitemsr"   Zadd_time_interval)
r   r3   Ztime_1Ztime_2Ztime_3ZintendedZ
parametersZexceptedZ	base_timer¸   r   r   r   Útest_add_time_intervalº  sd    
ÿ                   ëÿz)RenewableCertTests.test_add_time_intervalc                 C   sŒ   i | j jd< | j jd }|  | j jd¡ d|d< |  | j jd¡ d|d< |  | j jd¡ d|d< |  | j jd¡ d|d< |  | j jd¡ d S )	Nr­   Fz6https://acme-staging-v02.api.letsencrypt.org/directoryr   Tz)https://staging.someotherca.com/directoryz.https://acme-v01.api.letsencrypt.org/directoryz.https://acme-v02.api.letsencrypt.org/directory)rG   rµ   r"   Zis_test_cert)r   Zrpr   r   r   Útest_is_test_certä  s    z$RenewableCertTests.test_is_test_certc                 C   sZ   ddl m} |  tj|j| jj| j¡ t	 
d| jtd  ¡ |  tj|j| jj| j¡ d S )Nr   r2   Zmissing)r:   r3   rb   r   rc   rF   rD   rC   r?   r   rQ   r   ©r   r3   r   r   r   Útest_missing_certñ  s     þ þz$RenewableCertTests.test_missing_certc           
   	   C   s  t j | jjd¡}t j | jjd¡}t|dƒ}| d¡ W 5 Q R X t |d¡ i }t	D ]}d||< qXd}dd	i}d
dl
m} | |||||¡ t|dƒ}| ¡ }	W 5 Q R X |  d|	k¡ |  d|	k¡ |  d|	k¡ |  d t
j¡|	k¡ |  t t  |¡j¡t t  |¡j¡¡ d S )Nzsample-filezsample-file.newr   zM[renewalparams]
useful = value # A useful value
useless = value # Not needed
i   Z	somewhereZthe_archiveZusefulZ	new_valuer   r2   Úrzuseful = new_valuezA useful valueZuselesszversion = {0})r   r=   r>   r?   r@   r   r   r   rU   r   r:   r3   Zwrite_renewal_configrÉ   rk   rS   Ú__version__r"   ÚstatÚS_IMODEÚlstatÚst_mode)
r   ZtempZtemp2r   ÚtargetrÂ   Úarchive_dirZrelevant_datar3   Zcontentr   r   r   Útest_write_renewal_configû  s*    
ÿz,RenewableCertTests.test_write_renewal_configc                 C   s¦   ddl m} tj | jjdd¡}tD ]L}| j| }|d }tj ||¡}t	|dƒ 
¡  t tj | jj|¡|¡ q$|  tj|j| jj| j¡ |j| jj| jdd d S )	Nr   r2   r5   r   z1.pemr8   T)Zupdate_symlinks)r:   r3   r   r=   r>   r?   r@   r   rD   r   ÚcloserQ   rb   r   rc   rF   rC   )r   r3   Zarchive_dir_pathr   Z	live_pathr’   rH   r   r   r   Útest_update_symlinks  s     
 þÿz'RenewableCertTests.test_update_symlinksN)*r+   r,   r-   r.   ra   rd   rh   rq   rs   rv   rz   r€   r   r‹   r/   r0   rŽ   r”   r•   r—   r¡   r¢   r£   r¬   rº   r¾   r¿   rÑ   r©   Zskip_on_windowsr×   rØ   rã   rå   ræ   rç   rè   r÷   rø   rú   r  r  r   r   r   r   r_   Ž   s`   
*
,	
>
.

*
!r_   c                       s`   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‡  ZS )ÚDeleteFilesTestz&Tests for certbot.storage.delete_filesc              
      s¸   t t| ƒ ¡  tD ]4}tj | jjdd|d ¡}t	|dƒ W 5 Q R X q| j
 ¡  |  tj tj | jjd¡¡¡ |  tj tj | jjd¡¡¡ |  tj tj | jjdd¡¡¡ d S )Nr4   r   r6   r8   r9   r5   )r;   r  r   r   r   r=   r>   r?   r@   r   rD   r   rk   rÎ   rÍ   rà   )r   r   rI   rJ   r   r   r   -  s*    ÿ
 ÿ ÿ  ÿzDeleteFilesTest.setUpc              	   C   s4   ddl m} t d¡ | | jd¡ W 5 Q R X d S )Nr   r2   rj   r   )r:   r3   r/   r0   Zdelete_filesr?   rù   r   r   r   r   =  s    zDeleteFilesTest._callc              	   C   sn   |   ¡  |  tj tj | jjd¡¡¡ |  tj tj | jjd¡¡¡ |  tj tj | jj	dd¡¡¡ d S )Nr9   r   r5   )
r   rl   r   r=   rÎ   r>   r?   rÍ   rà   r@   r   r   r   r   Útest_delete_all_filesB  s     ÿ ÿ  ÿz%DeleteFilesTest.test_delete_all_filesc              	   C   sx   t | jjdƒ}| d¡ W 5 Q R X |  tj| j¡ |  t	j
 t	j
 | jjd¡¡¡ |  t	j
 t	j
 | jjd¡¡¡ d S )Nr8   Zasdfasfasdfasdfr   r9   )r   rD   rC   r   rb   r   rc   r   rk   r   r=   rÎ   r>   r?   rà   rl   rÍ   )r   rD   r   r   r   Útest_bad_renewal_configL  s     ÿ ÿz'DeleteFilesTest.test_bad_renewal_configc                 C   sX   t  | jj¡ |  tj| j¡ |  t j	 
t j	 | jjd¡¡¡ |  t j	 
| jj¡¡ d S )Nr   )r   ÚremoverD   rC   rb   r   rc   r   rk   r=   rÎ   r>   r?   rà   rl   r   r   r   r   Útest_no_renewal_configV  s     ÿz&DeleteFilesTest.test_no_renewal_configc              	   C   s~   t  t j | jjdd¡¡ |  ¡  |  t j | j	j
¡¡ |  t j t j | jjd¡¡¡ |  t j t j | jjdd¡¡¡ d S )Nr   zcert.pemr5   ©r   r	  r=   r>   r?   rà   r   rl   rÎ   rD   rC   r@   r   r   r   r   Útest_no_cert_file]  s     
  ÿ ÿ  ÿz!DeleteFilesTest.test_no_cert_filec              	   C   s~   t  t j | jjdd¡¡ |  ¡  |  t j | j	j
¡¡ |  t j t j | jjd¡¡¡ |  t j t j | jjdd¡¡¡ d S )Nr   r7   r5   r  r   r   r   r   Útest_no_readme_fileg  s     
  ÿ ÿ  ÿz#DeleteFilesTest.test_no_readme_filec              	   C   sŠ   t tj | jjdd¡dƒ W 5 Q R X |  ¡  |  tj | j	j
¡¡ |  tj tj | jjd¡¡¡ |  tj tj | jjdd¡¡¡ d S )Nr   Z
other_filer8   r5   )r   r   r=   r>   r?   rà   r   rl   rÎ   rD   rC   rk   r@   r   r   r   r   Útest_livedir_not_emptyq  s&      ÿÿ
 ÿ  ÿz&DeleteFilesTest.test_livedir_not_emptyc                 C   sr   t j | jjdd¡}t  |¡ |  ¡  |  t j | j	j
¡¡ |  t j t j | jjd¡¡¡ |  t j |¡¡ d S )Nr5   r   )r   r=   r>   r?   r@   Úrmdirr   rl   rÎ   rD   rC   rà   )r   r  r   r   r   Útest_no_archive|  s    
 ÿzDeleteFilesTest.test_no_archive)r+   r,   r-   r.   r   r   r  r  r
  r  r  r  r  r^   r   r   rJ   r   r  +  s   



r  c                       s8   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Z‡  ZS )
ÚCertPathForCertNameTestz0Test for certbot.storage.cert_path_for_cert_namec                    sJ   t t| ƒ ¡  | j ¡  |  ¡  tj | j	j
ddd¡| _| jdf| j	_d S )Nr4   r   zfullchain.pemrñ   )r;   r  r   rD   r   r]   r   r=   r>   r?   r@   rg   Z	cert_pathr   rJ   r   r   r   ‡  s    
ÿzCertPathForCertNameTest.setUpc                 C   s   ddl m} |||ƒS )Nr   )Úcert_path_for_cert_name)r   r  )r   Z
cli_configZcertnamer  r   r   r   r     s    zCertPathForCertNameTest._callc                 C   s    |   |  | jd¡| jdf¡ d S )Nr   rg   )r"   r   r?   rg   r   r   r   r   Útest_simple_cert_name“  s    z-CertPathForCertNameTest.test_simple_cert_namec                 C   s   |   tj| j| jd¡ d S )Nzfake-example.org)rb   r   rc   r   r?   r   r   r   r   Útest_no_such_cert_name–  s    z.CertPathForCertNameTest.test_no_such_cert_name)	r+   r,   r-   r.   r   r   r  r  r^   r   r   rJ   r   r  …  s
   r  Ú__main__)!r.   r²   rä   rý   ZunittestrA   r/   rô   r†   r:   Zcertbot.tests.utilZtestsÚutilr©   r   Zcertbot.compatr   r   r   r   Z	load_certZCERTr   r   ZTestCaser   ZConfigTestCaser1   r_   r  r  r+   Úmainr   r   r   r   Ú<module>   s:   
*@     "Z
