
    M/e                       d Z ddlZddlZddlm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Z ddlZddlmZ ddlZddl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 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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dl)m*Z* ddl)m+Z+ ddl,m-Z- ddl.m/c mZ0  e0jb                  d      Z2 e0jb                  d      Z3 e0jb                  d      Z4 e0jb                  d      Z5ejl                  jo                   e0jp                  d            Z9 e0jb                  d      Z: e0jb                  d      Z; G d dejx                        Z= G d d e0j|                        Z? G d! d"ejx                        Z@ G d# d$ejx                        ZA G d% d&e0j                        ZC G d' d(e0j                        ZD G d) d*e0j|                        ZE G d+ d,e0j|                        ZF G d- d.e0j|                        ZG G d/ d0ejx                        ZH G d1 d2e0j|                        ZI G d3 d4e0j|                        ZJ G d5 d6e0j|                        ZK G d7 d8ejx                        ZL G d9 d:ejx                        ZM G d; d<e0j|                        ZN G d= d>e0j|                        ZO G d? d@      ZPeQdAk(  r4 e
j                   ejD                  e
j                  dBd eTgz                yy)Cz!Tests for certbot._internal.main.    N)reload)List)mock)Error)crypto_utilerrors)
interfaces)util)account)cli)	constants)main)updater)disco)manual)null)
standalone)
filesystem)os)enhancementscert_512.pemzcsr_512.derzrsa256_key.pemzrsa512_key.pemzrsa2048_key.pemzcert_2048.pemc                   $   e Zd ZdZ ej
                  d      d        Z ej
                  d       ej
                  d       ej
                  d      d                      Z ej
                  d      d        Z ej
                  d      d	        Z	y
)TestHandleCertsz1Test for certbot._internal.main._handle_* methods<certbot._internal.main._handle_unexpected_key_type_migrationc                     t        j                         }d|j                  _        t	        j
                  t        j                         |      }|d|fk(  sJ |j                  sJ y )NF	reinstall)r   Mockensure_deployedreturn_valuer   _handle_identical_cert_requestcalled)selfmock_handle_migrationmock_lineagerets       C/usr/lib/python3/dist-packages/certbot/_internal/tests/main_test.py*test_handle_identical_cert_request_pendingz:TestHandleCerts.test_handle_identical_cert_request_pending5   sU    yy{49$$111$))+|L{L1111$++++    &certbot._internal.renewal.should_renewzcertbot.display.util.menuc                 
   d|_         t        j                         }d|j                  _         d|_         t	        j
                  t        j                  dd      |      }|j                  sJ |j                  rJ |d|fk(  sJ y )NTFrun)verbr   renew)r    r   r   r   r   r!   	MagicMockr"   )r#   r$   	mock_menumock_should_renewr%   r&   s         r'   *test_handle_identical_cert_key_type_changez:TestHandleCerts.test_handle_identical_cert_key_type_change>   s    
 .2*yy{48$$1).&11$..eW\2]2>@$++++####w----r)   c                     t        j                         }d|_        t        j                         }ddg|j                  _        t        j                  |dg|      }|d|fk(  sJ |j                  sJ y )NTdummy1dummy2r.   )r   r   expandnamesr    r   _handle_subset_cert_requestr"   )r#   r$   mock_configr%   r&   s        r'   test_handle_subset_cert_requestz/TestHandleCerts.test_handle_subset_cert_requestM   sk    iik!yy{+3X*>'..{XJUw----$++++r)   z)certbot._internal.main.display_util.yesnoc                    t        j                         }t        j                         }||_        t        j                         }d|_        d|_        t        j                  ||       |j                          |j                  |j                  k(  sJ d|_        d|_        t        j                  ||       |j                  dk(  sJ |j                  dk(  sJ d|_        d|_        t        j                  ||       |j                  dk(  sJ d|_        t        j                  ||       |j                  dk(  sJ d|_        d |_
        t        j                  t        j                  d      5  t        j                  ||       d d d        d	 |_
        t        j                  ||       |j                  dk(  sJ y # 1 sw Y   9xY w)
NrsaecdsaT   Fc                     | dk7  S )Ncertname vars    r'   <lambda>zKTestHandleCerts.test_handle_unexpected_key_type_migration.<locals>.<lambda>{       3*+< r)   z.Please provide both --cert-name and --key-typematchc                     | dk7  S )Nkey_typerA   rB   s    r'   rD   zKTestHandleCerts.test_handle_unexpected_key_type_migration.<locals>.<lambda>   rE   r)   )r   r   set_by_userrI   private_key_typer   %_handle_unexpected_key_type_migrationassert_not_calledr    
call_countside_effectpytestraisesr	   r   )r#   
mock_yesnoconfigmock_setcerts        r'   )test_handle_unexpected_key_type_migrationz9TestHandleCerts.test_handle_unexpected_key_type_migrationW   s   99;%yy{   %2264@$$&$"7"7777 !("&
2264@""a'''%''' #(
 !%2264@%''' !&2264@')))  <]]6<</_` 	E66vtD	E  =2264@')))	E 	Es   0F??GN)
__name__
__module____qualname____doc__r   patchr(   r2   r:   rV   rA   r)   r'   r   r   3   s    ;TZZNO, P, TZZ89TZZ+,TZZNO
. P - :
. TZZNO, P, TZZ;<** =**r)   r   c                        e Zd ZdZ fdZd Zd Zd Zd Z e	j                  d      d        Z e	j                  d	      d
        Z e	j                  d      d        Z xZS )RunTestz%Tests for certbot._internal.main.run.c                    t         |           d| _        t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d	      t        j                  d
      g	}|d   j                         | _        |d   j                         | _        |d   j                         | _        |d   j                         | _	        |d   j                         | _
        |d   j                         | _        |d   j                         | _        |d   j                         | _        |d   j                         | _        |D ]  }| j                  |j                           y )Nzexample.org)certbot._internal.main._get_and_save_certz7certbot._internal.main.display_ops.success_installationz2certbot._internal.main.display_ops.success_renewal&certbot._internal.main._init_le_client7certbot._internal.main._suggest_donation_if_appropriate'certbot._internal.main._report_new_cert!certbot._internal.main._find_cert)certbot._internal.eff.handle_subscription)certbot._internal.main._report_next_stepsr      r>                     )supersetUpdomainr   r[   start	mock_authmock_success_installationmock_success_renewal	mock_initmock_suggest_donationmock_report_certmock_find_certmock_subscriptionmock_report_next_steps
addCleanupstop)r#   patchesr[   	__class__s      r'   rn   zRunTest.setUp   sk   #JJBCJJPQJJKLJJ?@JJPQJJ@AJJ:;JJBCJJBC

 !))+)0)9)9);&$+AJ$4$4$6! ))+%,QZ%5%5%7" '
 0 0 2%aj..0!(!1!1!3&-aj&6&6&8# 	(EOOEJJ'	(r)   c                     dj                  | j                        j                         }t        j                  j                         }t        j                  ||      }ddlm	}  |||       y )Nz-a webroot -i null -d {0}r   )r,   )
formatro   splitr   PluginsRegistryfind_allr   prepare_and_parse_argscertbot._internal.mainr,   )r#   argspluginsrS   r,   s        r'   _callzRunTest._call   sR    *11$++>DDF''002++GT:.FGr)   c                 N   t        j                         | j                  _        d| j                  _        | j                          | j                  j                  | j                  g       | j                  j                  t         j                  d t         j                  d       y )NTNTnew_or_renewed_cert)r   r   rq   r    rw   r   rr   assert_called_once_withro   ry   ANYr#   s    r'   test_newcert_successzRunTest.test_newcert_success   so    &*iik#+5(

&&>>}M##;;DHHdDHH $ 	< 	&r)   c                     t        j                         | j                  _        dt        j                         f| j                  _        | j                          | j                  j                  | j                  g       y NF)	r   r   rq   r    rw   r   rr   r   ro   r   s    r'   test_reinstall_successzRunTest.test_reinstall_success   sP    &*iik#+0$))++=(

&&>>}Mr)   c                     t        j                         | j                  _        dt        j                         f| j                  _        | j                          | j                  j                  | j                  g       y )NT)	r   r   rq   r    rw   r   rs   r   ro   r   s    r'   test_renewal_successzRunTest.test_renewal_success   sP    &*iik#+/+<(

!!994;;-Hr)   ;certbot._internal.main.plug_sel.choose_configurator_pluginsc                 `   t        j                  | j                  d      d f|_        t        j
                  j                         }d| j                  _        t        j                  t        j                        5  t        j                  | j                  |       d d d        y # 1 sw Y   y xY wNr   T)r   	InstallerrS   r    r   r   r   	auto_hstsrP   rQ   r	   NotSupportedErrorr   r,   r#   mock_chooser   s      r'   "test_run_enhancement_not_supportedz*RunTest.test_run_enhancement_not_supported   sw    $(NN4;;$G#N ''002 $]]6334 	+HHT[['*	+ 	+ 	+   :!B$$B-$certbot._internal.main._install_certc                    t        j                  d      |_        t        j                         | j
                  _        d| j                  _        t        j                  t         j                        5  | j                          d d d        | j                  j                  t        j                  |j                  t        j                  d       | j                  j                          y # 1 sw Y   ixY w)NzFake installation errorr   Tr   )r	   PluginErrorrO   r   r   rq   r    rw   rP   rQ   r   ry   r   r   rr   rM   )r#   mock_install_certs     r'   test_cert_success_install_errorz'RunTest.test_cert_success_install_error   s    (.(:(:;T(U%&*iik#+5(]]6--. 	JJL	 	##;;HH'33TXXSW 	< 	Y 	&&88:	 	s   2C++C4c                 `   t        j                  | j                  d      d f|_        t        j
                  j                         }d| j                  _        t        j                  t        j                        5  t        j                  | j                  |       d d d        y # 1 sw Y   y xY wr   )r   r   rS   r    r   r   r   must_staplerP   rQ   r	   r   r   r,   r   s      r'   "test_run_must_staple_not_supportedz*RunTest.test_run_must_staple_not_supported   sw    $(NN4;;$G#N ''002"&]]6334 	+HHT[['*	+ 	+ 	+r   )rW   rX   rY   rZ   rn   r   r   r   r   r   r[   r   r   r   __classcell__r}   s   @r'   r]   r]      s    /(6&NI TZZMN+ O+ TZZ67; 8; TZZMN+ O+r)   r]   c                      e Zd ZdZd Zd Zd Z ej                  d       ej                  d       ej                  d      d                      Z	d	 Z
 ej                  d
       ej                  d       ej                  d       ej                  d       ej                  d       ej                  d      d                                           Z ej                  d
       ej                  d       ej                  d       ej                  d       ej                  d      d                                    Z ej                  d
       ej                  d       ej                  d       ej                  d      d                             Z ej                  d
       ej                  d       ej                  d       ej                  d       ej                  d      d                                    Z ej                  d
       ej                  d       ej                  d       ej                  d       ej                  d      d                                    Z ej                  d
       ej                  d       ej                  d       ej                  d      d                             Zy)CertonlyTestz*Tests for certbot._internal.main.certonly.c                 t    t        j                         | _        | j                  j                         | _        y N)	test_utilpatch_display_utilget_utility_patchrp   mock_get_utilityr   s    r'   rn   zCertonlyTest.setUp   s*    !*!=!=!? $ 6 6 < < >r)   c                 8    | j                   j                          y r   r   r{   r   s    r'   tearDownzCertonlyTest.tearDown       ##%r)   c                    t         j                  j                         }t        j                  ||      }t        j                  d      5 }t        j                  d      5  t        j                  d      5  t        j                  ||       d d d        d d d        d d d         |       S # 1 sw Y    xY w# 1 sw Y   $xY w# 1 sw Y           S xY w)Nr`   ra   rd   )	r   r   r   r   r   r   r[   r   certonly)r#   r   r   rS   rt   s        r'   r   zCertonlyTest._call   s    ''002++GT:ZZ@A 	3YUV 3ZZ KL 3MM&'233	3
 {3 33 3	3
 {s<   
C B86B,B8C,B51B88C	=CCrc   r_   rb   c                     | j                         j                  }| j                  |_        t	        j
                         |_        d|_        | j                  dj                                y )N)FNz!certonly --webroot -d example.com)	r   notification_assert_no_pauserO   r   r   r    r   r   )r#   unused_reportrq   rw   mock_notifications        r'   test_no_reinstall_text_pausez)CertonlyTest.test_no_reinstall_text_pause   sT     !113@@(,(=(=%!%	&1#

6<<>?r)   c                 .    |j                  d      du sJ y )NpauseF)get)r#   r   kwargss      r'   r   zCertonlyTest._assert_no_pause   s    zz'"e+++r)   re   3certbot._internal.cert_manager.lineage_for_certname3certbot._internal.cert_manager.domains_for_certnamez$certbot._internal.renewal.renew_certr   c                 Z   ddg}||_         ||j                  _         | j                  dj                                |j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ |j                  t        j                  d t        j                  d       | j                  dj                                |j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ d	| j                         j                  _         t        j                  t        j                        5  | j                  dj                                d d d        y # 1 sw Y   y xY w)
Nexample.comztest.orgzEcertonly --webroot -d example.com -d test.org --cert-name example.comrf   Tr   Ecertonly --webroot -d example.com -d test.com --cert-name example.comr>   F)r    r7   r   r   rN   r   r   r   r   yesnorP   rQ   r	   ConfigurationError)r#   rv   mock_handle_typemock_renew_certmock_domainsr%   ry   domainss           r'   *test_find_lineage_for_domains_and_certnamez7CertonlyTest.test_find_lineage_for_domains_and_certname   s    !*-$+!*1'

 &',uw	0 &&!+++&&!+++))Q...**a///**a///66HHdDHH$ 	7 	@ 	

 &',uw	0&&!+++&&!+++))Q...**a///**a/// 6;%%2]]6445 	hJJ^ddfg	h 	h 	hs   8 F!!F* certbot.display.ops.choose_namesc                    d |_         | j                  dj                                |j                  dk(  sJ |j                  dk(  sJ dg|_         d |_         | j                  dj                                |j                  du sJ y )Nr   rf   somenamez*certonly --webroot --cert-name example.comT)r    r   r   rN   r"   )r#   rv   r%   mock_choose_namesmock_domains_for_certnameunused_mock_report_next_stepss         r'   *test_find_lineage_for_domains_new_certnamez7CertonlyTest.test_find_lineage_for_domains_new_certname#  s     %)! 	

 &',uw	0&&!+++**a/// +5&15!.

@GGIJ ''4///r)   z-certbot._internal.main._csr_get_and_save_certc                 $   d|_         d|_         dt         dfD ]t  }| j                  d| dj                                |j	                  t
        j                  t
        j                  t
        j                  d       |j                          v y)	zLcertonly --dry-run shouldn't report creation of a certificate in NEXT STEPS.N)z/certz/chainz
/fullchainz--csr z-d example.comz	certonly z, --webroot --cert-name example.com --dry-runFr   )r    CSRr   r   r   r   r   
reset_mock)r#   r%   mock_csr_get_certunused_mock_get_certry   flags         r'   $test_dryrun_next_steps_no_cert_savedz1CertonlyTest.test_dryrun_next_steps_no_cert_saved8  s     %)!)J&cU^%56 	0DJJ4&(TU[[]^"::$((DHH% ; I"--/		0r)   ?certbot._internal.plugins.selection.choose_configurator_pluginsc                     t        j                         }|d f|_        t        j                         |_        d|_        | j                  dj	                                |j
                  j                          y )Nr   zcertonly --nginx -d example.com)r   r/   r    r   r   restartassert_called_oncer#   mock_selmock_get_certrw   unused_report_newunused_report_nextmock_installers          r'   test_installer_runs_restartz(CertonlyTest.test_installer_runs_restartG  s\     )!/ 6%)^^%5"&2#

4::<=113r)   c                     t        j                         }|d f|_        t        j                         |_        d|_        | j                  dj	                                |j
                  j                          y )Nr   z)certonly --nginx -d example.com --dry-run)r   r/   r    r   r   r   rM   r   s          r'   $test_dryrun_installer_doesnt_restartz1CertonlyTest.test_dryrun_installer_doesnt_restartV  s\     )!/ 6%)^^%5"&2#

>DDFG002r)   c                     t        j                         |_        d|_        | j                  dt	        j
                          ddz   j                                y )Nr   zcertonly --webroot -w  z-i standalone -d example.com)r   r/   r    r   tempfile
gettempdirr   )r#   r   rw   r   r   s        r'   test_invalid_installerz#CertonlyTest.test_invalid_installere  sL     &*^^%5"&2#

,X-@-@-B,C1E2349EG	=r)   N)rW   rX   rY   rZ   rn   r   r   r   r[   r   r   r   r   r   r   r   r   rA   r)   r'   r   r      s   4?&	 TZZ34TZZ;<TZZ9:@ ; = 5@, TZZ;<TZZEFTZZEFTZZ67TZZNOTZZ9:h ; P 8 G G =h< TZZ;<TZZEFTZZ23TZZEFTZZ9:0 ; G 4 G =
0  TZZ;<TZZ;<TZZ?@TZZEF	0 G A = =	0 TZZ;<TZZ9:TZZ34TZZ;<TZZQR4 S = 5 ; =
4 TZZ;<TZZ9:TZZ34TZZ;<TZZQR3 S = 5 ; =
3 TZZ;<TZZ9:TZZ34TZZ;<= = 5 ; ==r)   r   c                       e Zd ZdZ ej
                  d      d        Z ej
                  d      d        Z ej
                  d      d        Zy)FindDomainsOrCertnameTestz;Tests for certbot._internal.main._find_domains_or_certname.r   c                 v    t        j                  d d       }d|_        t        j                  |d       dk(  sJ y )Nr   r@   
domainname)r   Nr   r   r    r   _find_domains_or_certnamer#   r   r9   s      r'   test_display_opsz*FindDomainsOrCertnameTest.test_display_opst  s7    iit<)5&--k4@DXXXXr)   c                     t        j                  d d       }g |_        t        j                  t
        j                        5  t        j                  |d        d d d        y # 1 sw Y   y xY w)Nr   )	r   r   r    rP   rQ   r	   r   r   r   r   s      r'   test_no_resultsz)FindDomainsOrCertnameTest.test_no_results{  sP    iit<)+&]]6<<( 	>**;=	> 	> 	>s   A""A+r   c                     t        j                  d d      }ddg|_        t        j                  |d       ddgdfk(  sJ y )Nzone.comr   ztwo.comr   )r#   r   r9   s      r'   test_grab_domainsz+FindDomainsOrCertnameTest.test_grab_domains  sK    iiyA%.	$:!--k4@#Y/0 	0 0r)   N)	rW   rX   rY   rZ   r   r[   r   r   r   rA   r)   r'   r   r   q  sf    ETZZ23Y 4Y TZZ23> 4> TZZEF0 G0r)   r   c                   F    e Zd ZdZ fdZddZ ej                  d       ej                  d      d               Z ej                  d       ej                  d       ej                  d       ej                  d	      d
                             Z	 ej                  d       ej                  d       ej                  d       ej                  d	      d                             Z
 ej                  d       ej                  d       ej                  d       ej                  d	      d                             Z ej                  d      d        Zd Z ej                  d       ej                  d       ej                         d                      Z xZS )
RevokeTestz(Tests for certbot._internal.main.revoke.c                    t         |           t        j                  t        | j
                         t        j                  j                  t        j                  j                  | j
                  d            | _
        t        j                  d      t        j                  d      t        j                  d      t        j                  d      g}|d   j                         j                  | _        |d   j                          |d   j                         | _        |d	   j                         | _        |D ]  }| j%                  |j&                          dd
lm} t        j,                         | _        |j1                  dt3        j2                  ddddddt4        j6                              | _         || j.                  t:        | j8                        | _        | j<                  d f| j                   _        y )Nr   z$certbot._internal.client.acme_clientzcertbot._internal.client.Client)certbot._internal.main._determine_accountz5certbot._internal.main.display_ops.success_revocationr   rf   r>   rg   )Accountztest.certbot.orgi  rk   rh      
   )tzinfo)creation_hostcreation_dt) rm   rn   shutilcopy	CERT_PATHtempdirr   pathabspathjointmp_cert_pathr   r[   rp   ClientV2mock_acme_clientmock_determine_accountmock_success_revokerz   r{   certbot._internal.accountr   r/   regrMetadatetimepytzUTCmetaJWKaccr    )r#   r|   r[   r   r}   s       r'   rn   zRevokeTest.setUp  sv   It||,WW__RWW\\$,,-WX JJ=>JJ89JJBCJJNO	
 !(
 0 0 2 ; ;
&-aj&6&6&8##*1:#3#3#5  	(EOOEJJ'	( 	6NN$	LL, ))aB2dhh8 ! 9	 499c499548HHd3C##0r)   c                     |s+d}|j                  | j                        j                         }t        j                  j                         }t        j                  ||      }ddlm	}  |||       y )Nzrevoke --cert-path={0} r   )revoke)
r   r  r   r   r   r   r   r   r   r  )r#   r   r   rS   r  s        r'   r   zRevokeTest._call  sZ    ,D;;t11288:D''002++GT:1vwr)   -certbot._internal.main._delete_if_appropriate)certbot._internal.main.client.acme_clientc                    d|_         |j                         j                  }g }t        j                  j                         D ]  \  }}dj                  | j                  |      j                         }| j                  |       |j                  t        j                  t        j                  |             dj                  | j                  |j                               j                         }| j                  |       |j                  t        j                  t        j                  |              ||j                  k(  sJ y )NFz#revoke --cert-path={0} --reason {1})r    r  r  r   REVOCATION_REASONSitemsr   r  r   r   appendr   callr   uppercall_args_list)r#   r  mock_delete_if_appropriatemock_revokeexpectedreasoncoder   s           r'   test_revoke_with_reasonz"RevokeTest.test_revoke_with_reason  s     38"/&//188%88>>@ 	7LFD8??@R@RTZ[aacDJJtOODIIdhh568??@R@RLLN$$)EG JJtOODIIdhh56	7 ;55555r)   'certbot._internal.storage.RenewableCert3certbot._internal.storage.renewal_file_for_certnamez-certbot._internal.client.acme_from_config_keyc                 T   | j                   |_        t        j                  | j                  d      |_        dj                         }d|_        | j                  |       |j                  d   d   d   j                  dk(  sJ | j                  j                  | j                         y )Nhttps://acme.example	cert_pathserverrevoke --cert-name=example.comFr   )r  r    r   r/   r  r   r   r#  r0  r  r   r#   mock_acme_from_config%unused_mock_renewal_file_for_certname	mock_certr$  r   s         r'   test_revoke_by_certnamez"RevokeTest.test_revoke_by_certname  s     .2-B-B*!%$:L:L7M"O	/55727"/

4$33A6q9!<CC/0 	0 0  889K9KLr)   c                 2   t        j                  | j                  d      |_        dj	                         }d|_        | j                  |       |j                  d   d   d   j                  dk(  sJ | j                  j                  | j                         y)z9Revoking with --server should use the server from the CLIr-  r.  z=revoke --cert-name=example.com --server https://other.exampleFr   zhttps://other.exampleN)
r   r/   r  r    r   r   r#  r0  r  r   r2  s         r'   "test_revoke_by_certname_and_serverz-RevokeTest.test_revoke_by_certname_and_server  s     "&$:L:L7M"O	NTTV27"/

4$33A6q9!<CC01 	1 1  889K9KLr)   c                 T   t        j                  | j                  d      |_        dj	                         }d|_        | j                  |       |j                  d   d   d   j                  t        j                  d   k(  sJ | j                  j                  | j                         y)zLRevoking with --cert-name where the lineage server is empty shouldn't crash Nr.  r1  Fr   r0  )r   r/   r  r    r   r   r#  r0  r   CLI_DEFAULTSr  r   r2  s         r'   $test_revoke_by_certname_empty_serverz/RevokeTest.test_revoke_by_certname_empty_server  s     "&$:L:LUY!Z	/55727"/

4$33A6q9!<CC"//9: 	: :  889K9KLr)   c                 |    | j                          d|_        | j                  j                  | j                         y r   )r   r    r  r   r  )r#   r$  s     r'   test_revocation_successz"RevokeTest.test_revocation_success  s.    

27"/  889K9KLr)   c                 
   ddl m} |j                         | j                  _        t        j                  |j                        5  | j                          d d d        | j                  j                          y # 1 sw Y   $xY w)Nr   r   )
acmer	   ClientErrorr  rO   rP   rQ   r   r  rM   )r#   acme_errorss     r'   test_revocation_errorz RevokeTest.test_revocation_error   s^    .,7,C,C,E)]];223 	JJL	  224	 	s   A99B%certbot._internal.cert_manager.deletec                 ~    d |       j                   _        d|_        | j                          |j                  du sJ y r   )r   r    r   r"   )r#   r   mock_deleter$  s       r'   test_revocation_with_promptz&RevokeTest.test_revocation_with_prompt  s<    
 16  -27"/

!!U***r)   r   )rW   rX   rY   rZ   rn   r   r   r[   r)  r6  r8  r;  r=  rB  r   r   rF  r   r   s   @r'   r   r     s   2D<  TZZ?@TZZ;<6 = A6 TZZ?@TZZ9:TZZEFTZZ?@M A G ; AM TZZ?@TZZ9:TZZEFTZZ?@M A G ; AM TZZ?@TZZ9:TZZEFTZZ?@
M A G ; A
M TZZ?@M AM
5 TZZ?@TZZ78!Y!!#+ $ 9 A+r)   r   c                       e Zd ZdZ fdZ fdZd Zd Z ej                  d      d        Z
d Zd	 Z ej                  d
      d        Zd Z ej                  d
      d        Zd Z ej                  d      d        Z xZS )ReconfigureTestz,Tests for certbot._internal.main.reconfigurec           
      
   t         |           t        j                         | _        | j                  j                         | _        t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      d	| _	        | j                  j                         D ci c]  \  }}||j                          c}}| _        d
g| j                  d   _        t        j                  j                  | j                   d      | _        t        j                  j                  | j"                  d      }t        j                  j%                  |      st'        j(                  |       t        j                  j                  |d      | _        d}t-        | j*                  d      5 }|j/                  |       d d d        t-        | j*                  d      5 }t1        j2                  |dd      | _        d d d        y c c}}w # 1 sw Y   LxY w# 1 sw Y   y xY w)Nz7certbot._internal.storage.RenewableCert._check_symlinksz-certbot._internal.storage.RenewableCert.namesz2certbot._internal.plugins.selection.pick_installerz6certbot._internal.plugins.selection.pick_authenticatorz9certbot._internal.plugins.disco.PluginsRegistry.find_initr_   r`   z"certbot._internal.hooks.list_hooks)check_symlinks
cert_namespick_installer	pick_auth	find_init_get_and_save_cert_init_le_client
list_hooksr   rK  rS   renewalzexample.com.confa  
            version = 1.32.0
            archive_dir = /etc/letsencrypt/archive/example.com
            cert = /etc/letsencrypt/live/example.com/cert.pem
            privkey = /etc/letsencrypt/live/example.com/privkey.pem
            chain = /etc/letsencrypt/live/example.com/chain.pem
            fullchain = /etc/letsencrypt/live/example.com/fullchain.pem

            # Options used in the renewal process
            [renewalparams]
            account = ee43634db0aa4e6804f152be39990e6a
            server = https://acme-v02.api.letsencrypt.org/directory
            authenticator = nginx
            installer = nginx
            key_type = rsa
        wrutf-8encodingdefault_encoding)rm   rn   r   r   r   rp   r   r   r[   patchersr  mocksr    r   r  r
  r  
config_direxistsr   makedirsrenewal_fileopenwrite	configobj	ConfigObjoriginal_config)r#   kvrenewal_configs_dirrc  fr}   s         r'   rn   zReconfigureTest.setUp  s   !*!=!=!? $ 6 6 < < >"jj)bc**%TU"jj)]^$\]$_`"&**-X"Y#zz*RS**%IJ	
 04}}/B/B/DEtq!alE
1>

< -'',,t||X> ggll4??IFww~~12 34GGLL)<>PQ  $##S) 	%QGGO$	%$##S) 	<Q#,#6#6q 7$<D 	< 	<5 F0	% 	%	< 	<s   I'I- I9-I69Jc                     t         |           | j                  j                          | j                  j                         D ]  }|j                           y r   )rm   r   r   r{   rY  values)r#   r[   r}   s     r'   r   zReconfigureTest.tearDownB  sE    ##%]]))+ 	EJJL	r)   c                 6   |d| j                   gz   }t        j                  j                         }t	        j
                  ||      }ddlm}  |||       t        | j                  d      5 }t        j                  |dd      }d d d        |S # 1 sw Y   S xY w)N--config-dirr   )reconfigurerT  rU  rV  )r[  r   r   r   r   r   r   rl  r_  r^  ra  rb  )r#   passed_args	full_argsr   rS   rl  rg  updated_confs           r'   r   zReconfigureTest._callH  s    >4??"CC	''002++GY?6FG$$##S) 	^Q$..q7U\]L	^ 	^ s   +BBc                     t        j                  t        j                        5  | j	                  dj                                d d d        y # 1 sw Y   y xY w)Nz!--cert-name cert1 -d one.cert.com)rP   rQ   r	   r   r   r   r   s    r'   test_domains_setz ReconfigureTest.test_domains_setU  sC    ]]6445 	DJJ:@@BC	D 	D 	Ds    AA,certbot._internal.cert_manager.get_certnamesc                 "   t        j                         }d|_        || j                  d   _        || j                  d   _        || j                  d   _        dg|_        | j                  dj                                |j                  dk(  sJ y )NnginxrL  rM  rN  r   --nginxrf   )r   r   namerZ  r    r   r   rN   )r#   mock_cert_manager
named_mocks      r'   test_asks_for_certnamez&ReconfigureTest.test_asks_for_certnameY  sz    YY[
!
4>

#$1/9

;,/9

;,*7&

9??$% ++q000r)   c                 
   t        j                         }d|_        || j                  d   _        || j                  d   _        || j                  d   _        | j                  dj                               }|d   d   dk(  sJ y )NapacherL  rM  rN   --cert-name example.com --apacherenewalparamsauthenticator)r   r   rv  rZ  r    r   r   r#   rx  
new_configs      r'   test_update_configuratorz(ReconfigureTest.test_update_configuratore  sx    YY[
"
4>

#$1/9

;,/9

;,ZZ B H H JK
/*?;xGGGr)   c                 b   t        j                         }d|_        || j                  d   _        || j                  d   _        || j                  d   _        | j                  dj                               }d|d   d<   d|d   d	<   |d   d
= | j                  d   |d<   || j                  k(  sJ y)zI Check that we don't accidentally modify anything that we didn't mean to r{  rL  rM  rN  r|  rt  r}  r~  	installerr[  versionN)r   r   rv  rZ  r    r   r   rc  r  s      r'   test_only_intended_changesz*ReconfigureTest.test_only_intended_changesp  s    YY[
"
4>

#$1/9

;,/9

;,ZZ B H H JK
7>
?#O43:
?#K0'5 $ 4 4Y ?
9T11111r)   z&certbot._internal.hooks.validate_hooksc                 H   | j                   d   d   dk(  sJ | j                  dj                         dgz          d| j                  d   j                  j
                  d   j                  v sJ d| j                  d	   j                  j
                  d
   j                  v sJ y)z6 Check that we use the staging server for the dry run r}  r0  z.https://acme-v02.api.letsencrypt.org/directory"--cert-name example.com --pre-hookecho prestagingrP  r   rO  rf   N)rc  r   r   rZ  	call_argsr   r0  )r#   unused_validate_hookss     r'   test_staging_usedz!ReconfigureTest.test_staging_used  s     ##O4X><= 	= = 	

7==?:,NODJJ'89CCHHKRRRRRDJJ';<FFKKANUUUUUr)   c                    | j                   d   d   }| j                   d   d   }	 | j                  dj                                t        | j                  d      5 }t        j                  |dd	      }ddd       d   d   |k(  sJ | j                  d
| j                               }|d   d   |k(  sJ 	 | j                  dj                                t        | j                  d      5 }t        j                  |dd	      }ddd       |d   d   |k(  sJ | j                  d| j                               }|d   d   |k(  sJ y# t        j                  $ r}dt        |      v sJ Y d}~/d}~ww xY w# 1 sw Y   
xY w# t        j                  $ r}dt        |      v sJ Y d}~d}~ww xY w# 1 sw Y   xY w)zx Check that we error when attempting to change the account id or server,
            but not when it's the same
        r}  r   r0  z.--cert-name example.com --account newaccountidz,Using reconfigure to change the ACME accountNrT  rU  rV  z"--cert-name example.com --account z&--cert-name example.com --server x.comz!--cert-name example.com --server )
rc  r   r   r	   r   strr_  r^  ra  rb  )r#   orig_account_idorig_servererrrg  r  s         r'   !test_new_account_or_server_errorsz1ReconfigureTest.test_new_account_or_server_errors  s    ..?	J**?;HE	NJJGNNPQ
 $##S) 	\Q",,QSZ[J	\/*95HHH ZZ"D_DU V \ \ ^_
/*95HHH	NJJ?FFHI
 $##S) 	\Q",,QSZ[J	\/*84CCC ZZ"CK= Q W W YZ
/*84CCC3 (( 	NASXMMM	N	\ 	\ (( 	NASXMMM	N	\ 	\sG   E E<9F	 .F8E9E44E9<F	F5F00F58Gc                 d   d| j                   vsJ | j                  dj                         dgz         }|d   d   dk(  sJ | j                  dj                         dgz         }|d   d   dk(  sJ d| j                   vsJ | j                  dj                         dgz         }|d   d   dk(  sJ y )	Npre_hookr  r  r}  z	echo pre2
renew_hookz%--cert-name example.com --deploy-hookzecho deploy)rc  r   r   )r#   r  r  s      r'   test_update_hooksz!ReconfigureTest.test_update_hooks  s    !5!5555ZZ D J J LPZ| [\
/*:6*DDDZZ D J J LP[} \]
/*:6+EEE 4#7#7777ZZ G M M OS`Ra ab
/*<8MIIIr)   c                 Z   t         j                  | j                  d   _        	 | j	                  dj                                t        | j                  d      5 }t        j                  |dd      }d d d        d   d   dk(  sJ y # t         j                  $ r Y Zw xY w# 1 sw Y   0xY w)	NrO  r|  rT  rU  rV  r}  r~  rt  )
r	   r   rZ  rO   r   r   r_  r^  ra  rb  )r#   rg  r  s      r'   test_dry_run_failsz"ReconfigureTest.test_dry_run_fails  s    7=||

'(4	JJ9??AB
 $##S) 	\Q",,QSZ[J	\/*?;wFFF || 			\ 	\s   B B!BB!B**certbot._internal.main.display_util.notifyc                    d}t        | j                  d      5 }|j                  |       d d d        t        | j                  d      5 }t        j                  |dd      | _        d d d        t        j                         }d|_        || j                  d   _
        || j                  d   _
        | j                  d	j                               }|d
   d   dk(  sJ |j                  d       y # 1 sw Y   xY w# 1 sw Y   xY w)Na  
            version = 2.0.0
            archive_dir = /etc/letsencrypt/archive/example.com
            cert = /etc/letsencrypt/live/example.com/cert.pem
            privkey = /etc/letsencrypt/live/example.com/privkey.pem
            chain = /etc/letsencrypt/live/example.com/chain.pem
            fullchain = /etc/letsencrypt/live/example.com/fullchain.pem

            # Options used in the renewal process
            [renewalparams]
            account = ee43634db0aa4e6804f152be39990e6a
            server = https://acme-staging-v02.api.letsencrypt.org/directory
            authenticator = webroot
            installer = nginx
            key_type = ecdsa
            webroot_path = /var/www/html,
            [[webroot_map]]
            example.com = /var/www/html
        rS  rT  rU  rV  rt  rM  rN  z--cert-name example.com --nginxr}  r~  zT
Successfully updated configuration.
Changes will apply when the certificate renews.)r_  r^  r`  ra  rb  rc  r   r   rv  rZ  r    r   r   assert_called_with)r#   mock_notifyrc  rg  rx  r  s         r'   test_report_resultsz#ReconfigureTest.test_report_results  s    & $##S) 	%QGGO$	%$##S) 	<Q#,#6#6q 7$<D 	< YY[
!
/9

;,/9

;,ZZ A G G IJ
/*?;wFFF&&@	A	% 	%	< 	<s   C0	C<0C9<D)rW   rX   rY   rZ   rn   r   r   rq  r   r[   ry  r  r  r  r  r  r  r  r   r   s   @r'   rH  rH    s    6*<ZD TZZ>?	1 @	1	H2$ TZZ89V :V#DJ TZZ89J :JG TZZ<=%A >%Ar)   rH  c                      e Zd ZdZd Zd Z ej                         d        Z ej                         d        Z	 e
j                  d       e
j                  d       e
j                  d       e
j                  d	       e
j                  d
       e
j                  d       ej                         d                                                  Z e
j                  d       e
j                  d	       e
j                  d
       e
j                  d       e
j                  d       ej                         d                                           Z e
j                  d       e
j                  d	       e
j                  d
       e
j                  d       e
j                  d       ej                         d                                           Z e
j                  d       e
j                  d	       e
j                  d
       e
j                  d       e
j                  d       ej                         d                                           Zy)DeleteIfAppropriateTestz8Tests for certbot._internal.main._delete_if_appropriate c                      ddl m}  ||       y )Nr   )_delete_if_appropriate)r   r  )r#   r9   r  s      r'   r   zDeleteIfAppropriateTest._call  s    A{+r)   c                     t        j                  d      5 }| j                  | j                         d d d        j	                          y # 1 sw Y   xY w)NrC  )r   r[   r   rS   rM   )r#   rE  s     r'   _test_delete_opt_out_commonz3DeleteIfAppropriateTest._test_delete_opt_out_common  sB    ZZ?@ 	$KJJt{{#	$%%'	$ 	$s   AAc                 F    d| j                   _        | j                          y r   )rS   delete_after_revoker  )r#   unused_mock_get_utilitys     r'   test_delete_flag_opt_outz0DeleteIfAppropriateTest.test_delete_flag_opt_out  s    */'((*r)   c                 T     |       }d|j                   _        | j                          y r   )r   r    r  )r#   r   	util_mocks      r'   test_delete_prompt_opt_outz2DeleteIfAppropriateTest.test_delete_prompt_opt_out	  s"    $&	',	$((*r)   z%certbot._internal.main.logger.warningr+  rC  z7certbot._internal.cert_manager.match_and_check_overlapsz+certbot._internal.storage.full_archive_pathz3certbot._internal.cert_manager.cert_path_to_lineagec                     | j                   }d|_        d|_        d|_        t	        j
                         |_        | j                  |       |j                          |j                  dk(  sJ y )N/some/reasonable/path r   rf   )
rS   r/  r@   r    r	   OverlappingMatchFoundrO   r   rM   rN   )	r#   r   mock_cert_path_to_lineagemock_archivemock_match_and_check_overlapsrE  mock_renewal_file_for_certnamemock_warningrS   s	            r'   test_overlapping_archive_dirsz5DeleteIfAppropriateTest.test_overlapping_archive_dirs  sc     21>!.4:4P4P4R%1

6%%'&&!+++r)   c                     | j                   }d|_        d|_        d|_        d|_        | j	                  |       |j
                  dk(  sJ y )Nr  r  r   Frf   )rS   r/  r@   r    r   rN   )r#   r   r  rE  r  mock_overlapping_archive_dirsr  rS   s           r'   test_cert_path_onlyz+DeleteIfAppropriateTest.test_cert_path_only$  sN     21>!.5:%2

6%%***r)   c                     | j                   }d|_        d|_        d|_        d|_        d|_        d|_        | j                  |       |j                  dk(  sJ y NTr  r  r   rf   )rS   noninteractive_moder/  r@   r    r   rN   r#   r   rE  r  mock_full_archive_dirr  r  rS   s           r'   test_noninteractive_deletionz4DeleteIfAppropriateTest.test_noninteractive_deletion6  s_     %)"21>!.-/*57%2

6%%***r)   c                     | j                   }d|_        d|_        d|_        d|_        d|_        d|_        | j                  |       |j                  dk(  sJ  |       j                  j                  rJ y r  )	rS   r  r/  r@   r    r   rN   r   r"   r  s           r'   test_opt_in_deletionz,DeleteIfAppropriateTest.test_opt_in_deletionJ  sz     %)"21>!.-/*57%2

6%%***#%++22222r)   N)rW   rX   rY   rZ   r   r  r   r   r  r  r   r[   r  r  r  r  rA   r)   r'   r  r    sy   B,(
 "Y!!#+ $+ "Y!!#+ $+
 TZZ78TZZEFTZZ78TZZIJTZZ=>TZZEF!Y!!#, $ G ? K 9 G 9, TZZEFTZZIJTZZ=>TZZ78TZZEF!Y!!#
+ $ G 9 ? K G
+ TZZEFTZZIJTZZ=>TZZEFTZZ78!Y!!#+ $ 9 G ? K G+ TZZEFTZZIJTZZ=>TZZEFTZZ78!Y!!#3 $ 9 G ? K G3r)   r  c                   `    e Zd ZdZ fdZd Z ej                  d       ej                  d      d               Zd Z	d Z
 ej                  d	      d
        Z ej                  d	      d        Z ej                  d       ej                  d      d               Zd Zd Zd Zd Z xZS )DetermineAccountTestz4Tests for certbot._internal.main._determine_account.c                    t         |           d | j                  _        d | j                  _        d| j                  _        t        j                  d      t        j                  d      g| _        t        j                         | _
        t        j                         | _        d| j                  j                  _        y )NFx)idyhi)rm   rn   rS   r   emailregister_unsafely_without_emailr   r/   accsAccountMemoryStorageaccount_storagemock_client	directory	new_authzr#   r}   s    r'   rn   zDetermineAccountTest.setUpb  s    " 6;3^^s+T^^s-CD	&;;=>>+/3"",r)   c                    ddl m} t        j                  d      5 }t	        j
                         5  | j                  |_         || j                        cd d d        cd d d        S # 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)Nr   )_determine_accountz1certbot._internal.main.account.AccountFileStorage)	r   r  r   r[   r   r   r  r    rS   )r#   r  mock_storages      r'   r   zDetermineAccountTest._calln  sj    =ZZKL 	3P\))+	3(,(<(<L%%dkk2	3 	3 	3 	3 	3 	3 	3s"   A<#A'	A<'A0	,A<<Bz!certbot._internal.client.registerz.certbot._internal.client.display_ops.get_emailc                     d|_         ||_        	 | j                          y # t        j                  $ r}d| t        |      k(  sJ Y d }~y d }~ww xY w)Nfoo@bar.bazz0Unable to register an account with ACME server. )r    rO   r   r	   r   r  )r#   err_msg	exceptionmock_get_emailmock_registerr  s         r'   _register_error_commonz+DetermineAccountTest._register_error_commonv  sV     '4#$-!	&JJL|| 	&EgYO X& & &	&s   ! AAAc                    | j                   j                  | j                  d   | j                         | j                  d   j                  | j
                  _        | j                  d   d f| j                         k(  sJ | j                  d   j                  | j
                  j                  k(  sJ | j
                  j                  J y )Nrf   )	r  saver  r  r  rS   r   r   r  r   s    r'   test_args_account_setz*DetermineAccountTest.test_args_account_set  s    !!$))A,0@0@A"iiloo		!d#tzz|333yy|$++"5"5555{{  (((r)   c                 F   | j                   j                  | j                  d   | j                         | j                  d   d f| j	                         k(  sJ | j                  d   j
                  | j                  j                  k(  sJ | j                  j                  J y )Nr   )	r  r  r  r  r   r  rS   r   r  r   s    r'   test_single_accountz(DetermineAccountTest.test_single_account  s    !!$))A,0@0@A		!d#tzz|333yy|$++"5"5555{{  (((r)   z3certbot._internal.client.display_ops.choose_accountc                    | j                   D ](  }| j                  j                  || j                         * | j                   d   |_        | j                   d   d f| j                         k(  sJ t        |j                  d   d         t        | j                         k(  sJ | j                   d   j                  | j                  j                  k(  sJ | j                  j                  J y )Nrf   r   )r  r  r  r  r    r   setr  r  rS   r   r  )r#   mock_choose_accountsr  s      r'   test_multiple_accountsz+DetermineAccountTest.test_multiple_accounts  s    99 	=C  %%c4+;+;<	=,0IIaL)		!d#tzz|333'11!4Q78C		NJJJyy|$++"5"5555{{  (((r)   c                     | j                   D ](  }| j                  j                  || j                         * d |_        	 | j                          y # t        j                  $ r}dt        |      v sJ Y d }~y d }~ww xY w)NzNo account has been chosen)	r  r  r  r  r    r   r	   r   r  )r#   r  r  r  s       r'   test_multiple_accounts_canceledz4DetermineAccountTest.test_multiple_accounts_canceled  sn    99 	=C  %%c4+;+;<	=,0)	<JJL|| 	</3s8;;;	<s    A A=$A88A=r  c                    d|_         t        j                  d      5 }| j                  d   t        j                  j
                  f|j                  _         | j                  d   t        j                  j
                  f| j                         k(  sJ 	 d d d        j                  j                  | j                  | j                  t        j                         | j                  d   j                  | j                  j                  k(  sJ d| j                  j                  k(  sJ |j                  d       y # 1 sw Y   xY w)Nr  certbot._internal.main.clientr   )tos_cbzAccount registered.)r    r   r[   r  sentinelr?  registerr   r   rS   r  r   r  r   r  )r#   r  r  clients       r'   test_no_accounts_no_emailz.DetermineAccountTest.test_no_accounts_no_email  s     '4#ZZ78 	FF		!dmm00,2FOO(IIaL$--"4"45EEE	F 	//KK--dhh 	0 	@ yy|$++"5"5555 1 1111++,AB	F 	Fs   A5D::Ec                    d| j                   _        t        j                  d      5 }| j                  d   t        j
                  j                  f|j                  _        | j                          d d d        | j                  d   j                  | j                   j                  k(  sJ d| j                   j                  k(  sJ y # 1 sw Y   WxY w)Nzother emailr  rf   )rS   r  r   r[   r  r  r?  r  r    r   r  r   )r#   r  s     r'   test_no_accounts_emailz+DetermineAccountTest.test_no_accounts_email  s    )ZZ78 	F,0IIaL$--:L:L+MFOO(JJL	 yy|$++"5"5555 1 1111		 	s   A	CCc                 R    d}| j                  |t        j                  |             y )Nz$Some error message raised by Certbot)r  r	   r   )r#   r  s     r'   test_register_error_certbotz0DetermineAccountTest.test_register_error_certbot  s     8##GV\\'-BCr)   c                 F    d}t        dd      }| j                  ||       y )NzAError returned by the ACME server: must agree to terms of servicez$urn:ietf:params:acme:error:malformedzmust agree to terms of service)typdetail
acme_errorr  r#   r  r  s      r'   (test_register_error_acme_type_and_detailz=DetermineAccountTest.test_register_error_acme_type_and_detail  s(    V%K(HJ	##GY7r)   c                 D    d}t        d      }| j                  ||       y )NzKError returned by the ACME server: The server experienced an internal errorz)urn:ietf:params:acme:error:serverInternal)r  r  r  s      r'   "test_register_error_acme_type_onlyz7DetermineAccountTest.test_register_error_acme_type_only  s"    `%PQ	##GY7r)   )rW   rX   rY   rZ   rn   r   r   r[   r  r  r  r  r  r  r  r  r  r  r   r   s   @r'   r  r  _  s    >	43 TZZ34TZZ@A& B 5&)) TZZEF) G) TZZEF< G< TZZ@ATZZ<=C > BC2D88r)   r  c                   ,    e Zd ZdZ fdZ fdZdpdZdqdZd Zd	 Z	d
 Z
 ej                  d      d        Z ej                  d       ej                  d       ej                  d       ej                  d       ej                  d       ej                  d      d                                           Z ej                  d       ej                  d      d               Z ej                  d       ej                  d       ej                  d      d                      Z ej                  d       ej                  d       ej                  d       ej                  d      d                             Z ej                  d       ej                  d      d               Z ej                  d       ej                  d       ej                  d       ej                  d      d                             Z ej                  d       ej                  d       ej                  d       ej                  d      d                             Z ej                  d      d        Z ej                  d      d         Z ej                  d!      d"        Z ej                  d#      d$        Z ej                  d%       ej                  d&       ej                  d      d'                      Z ej                  d%       ej                  d&      d(               Z ej                  d%       ej                  d&      d)               Z ej                  d%       ej                  d&      d*               Z ej                  d%       ej                  d&      d+               Zd, Zd- Zd. Z d/ Z!d0 Z"d1 Z#d2 Z$dqd3Z% ej                  d      d4        Z& ej                  d       ej                  d5       ej                  d       ej                  d6      d7                             Z' ej                  d      d8        Z(ddd9dde)jR                  jU                         ddfd:Z+ ej                  d       ej                  d5       ej                  d6      d;                      Z, ej                  d<       ej                  d=       ej                  d6      d>                      Z-d? Z.d@ Z/dA Z0 ej                  dB      dC        Z1 ej                  dB      dD        Z2 ej                  dE      dF        Z3 ej                  dE      dG        Z4 ej                  dH      dI        Z5 ej                  d      dJ        Z6dK Z7dL Z8dM Z9dN Z:dO Z;dP Z<	 	 drdQZ=dR Z>dS Z?dT Z@dU ZAdV ZB ej                  dW      dX        ZCdY ZDdZ ZEd[ ZFd\ ZGd] ZHd^ ZI eJj                          ej                  d_       ej                  d`       ej                  d      da                             ZLdqdbZM ej                  dc       ej                  d5       ej                  d      dd                      ZN ej                  dc      de        ZO ej                  df       ej                  dg      dh               ZPdi ZQ ej                  df       ej                  d      dj               ZR ej                  d      dk        ZS ej                  dW       ej                  dl      dm               ZT ej                  dn       ej                  dW       ej                  d`       ej                  d      do                             ZU xZVS )sMainTestzTests for different commands.c                 X   t         |           t        j                  | j                  j
                         d| j                  j                  d| j                  j                  d| j                  j
                  dg| _        t        j                  d      j                         | _        y )Nrk  
--work-dir
--logs-dir--textz
time.sleep)rm   rn   r   mkdirrS   logs_dirr[  work_dirstandard_argsr   r[   rp   
mock_sleepr  s    r'   rn   zMainTest.setUp  sy    --.,dkk.D.D*DKK,@,@*DKK,@,@(L **\288:r)   c                 @    t        t               t        |           y r   )reload_moduler   rm   r   r  s    r'   r   zMainTest.tearDown  s    cr)   NFc                   	 |rt         j                  j                  		fd}t        j                  d      5 }||_        t        j                  d      5 }| j                  ||      \  }}}||||fcddd       cddd       S t        j                  d      5 }| j                  ||      \  }}}||||fcddd       S # 1 sw Y   nxY w	 ddd       y# 1 sw Y   yxY w# 1 sw Y   yxY w)zaRun the cli with output streams, actual client and optionally
        os.path.isfile() mocked outc                 |    | j                  d      s"| j                  d      s| j                  d      ry |       S )zMock os.path.isfile()rU   chainprivkeyT)endswith)fnr   r   	orig_opens      r'   mock_isfilez#MainTest._call.<locals>.mock_isfile  s4    KK'G,I. }$r)   zcertbot.compat.os.path.isfiler  N)r   r  isfiler   r[   rO   _call_no_clientmock)
r#   r   stdout
mockisfiler  mock_ifr  r&   stderrr  s
            @r'   r   zMainTest._call  s     I% ;< 7&1#ZZ ?@ 7F*.*B*B4*P'C67 77 7 ;< 3&*&>&>tV&L#VVFFF23 3	7 7 77 7 73 3s/   CB?1	CC!?C	CC!C*c                    | j                   |z   }|r|nt        j                         }t        j                  d|      5  t        j                  d      5 }t        j                  d      5  t        j
                  |dd       }ddd       ddd       ddd       |fS # 1 sw Y   xY w# 1 sw Y   "xY w# 1 sw Y   &xY w)z-Run the client with output streams mocked out!certbot._internal.main.sys.stdoutnew!certbot._internal.main.sys.stderrcertbot.util.atexitN)r  ioStringIOr   r[   r   )r#   r   r  
toy_stdoutr  r&   s         r'   r  zMainTest._call_no_clientmock  s    !!D(%V2;;=
ZZ;L 	-?@ -FZZ 56 -))DG,C--	- J&&- -- -	- 	-s;   B9B-+B!B-B9!B*&B--B6	2B99Cc                     t        j                  d      5 }| j                  g        d|j                  k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nzcertbot._internal.main.runrf   )r   r[   r   rN   )r#   mock_runs     r'   test_no_flagszMainTest.test_no_flags  sE    ZZ45 	,JJrN+++++	, 	, 	,s   #AAc                 L   t        j                         }t        j                         }t        j                  d|      5  t        j                  d|      5  	 t	        j                  dg       |j                         xs |j                         }d|v sJ dj                  |             	 d d d        d d d        y # t
        $ r Y Yw xY w# |j                         xs |j                         }d|v sJ dj                  |             w xY w# 1 sw Y   bxY w# 1 sw Y   y xY w)Nr  r  r  z	--versioncertbotzOutput is {0})r  r  r   r[   r   
SystemExitgetvaluer   )r#   toy_outtoy_erroutputs       r'    test_version_string_program_namez)MainTest.test_version_string_program_name  s   ++-++-ZZ;I 	O?WM OOII{m, %--/E73C3C3EF$.N0F0Fv0NN.O	O 	O "  %--/E73C3C3EF$.N0F0Fv0NN.O O	O 	OsT    DDB>0<D-D>	C
C	C

C>DDD	DD#c                    d}	 t        j                  d      5  t        j                  | j                  |dd z          ddd       |J y# 1 sw Y   xY w# t        j
                  $ r}|}|t        |      v sJ Y d}~:d}~ww xY w)zQEnsure that a particular error raises a missing cli flag error containing messageNr  )r   r[   r   r  r	   MissingCommandlineFlagr  )r#   r   messageexcexc_s        r'   _cli_missing_flagzMainTest._cli_missing_flag  s    	'?@ 8		$,,tAw678
 8 8,, 	'Cc#h&&&	's-   A &AA AA B+BBz*certbot._internal.log.post_arg_parse_setupc                 z    ddg}| j                  |d       |j                  g d       | j                  |d       y )Nz-nr   zspecify a plugin)--standalone-dzeg.iszregister before running)r-  extend)r#   _r   s      r'   test_noninteractivezMainTest.test_noninteractive  s;    j!t%7834t%>?r)   rd   rb   r   zBcertbot._internal.main.client.Client.obtain_and_enroll_certificater_   c                    g d| j                   z   }t        j                         d f|_        t        j                         |_        t        j                  d      5 }|j
                  }	| j                  |       t        j                         }
|	j                  d   d   }|
|v sJ dd l
}|j                         }d|j                         v rt        j                         |v sJ d d d        t        j                  d      5 }|j
                  }	d}|d|gz  }| j                  |       |	j                  t        j                  t        j                  d	|t        j                  
       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)N)r/  r   -mznone@none.comr0  r   z--agree-tosr  rf   
user_agentr   linuxbandersnatchz--user-agentT)r   
verify_sslr6  alg)r  r   r/   r    r[   ClientNetworkr  r   get_os_info_uar  platformlowerr   r   joseRS256)r#   gsc_obtdetr2  _____r   acme_clientacme_netos_veruar=  plats                 r'   test_user_agentzMainTest.test_user_agent%  s`   46:6H6HI>>+T1>>+ZZCD 		3"00H$$T*((*F##A&|4BR<<$$&D$**,&**,222		3 ZZCD 	/"00HB^R((D$$T*,,TXXtxxTX4:: - /	/ 	/		3 		3	/ 	/s   BE0 A'E<0E9<F5certbot._internal.main.plug_sel.record_chosen_plugins.certbot._internal.main.plug_sel.pick_installerc                 P    | j                  g dd       |j                  dk(  sJ y )N)	installz	--domainsfoo.bar--cert-pathrU   
--key-pathr	  --chain-pathr  Tr  rf   )r   rN   )r#   mock_pick_installer_recs      r'   test_installer_selectionz!MainTest.test_installer_selectionF  s3     	

 FRV 	 	X"--222r)   r   c                 X   t        j                  t        j                  d      t        j                  d      t        j                  d      t        j                  d            }t        j                  d      5 }||_        | j                  g dd       |j                  d	   d	   }|j                  t        j                  d      k(  sJ |j                  t        j                  d      k(  sJ |j                  t        j                  d      k(  sJ 	 d d d        y # 1 sw Y   y xY w)
NrU   r  r	  r/  
chain_pathfullchain_pathkey_pathr   )rO  --cert-namewhateverTrT  r   )r   r/   r   	temp_joinr[   r    r   r  r/  r[  r\  )r#   _instrV  mock_installr%   mock_getlincall_configs          r'   test_installer_certnamez MainTest.test_installer_certnameM  s     ~~	0C0CF0K1:1D1DW1M5>5H5H5Q/8/B/B9/MO
 ZZMN 	JR]'3K$JJ=$JO&003A6K((I,?,?,GGGG--1D1DW1MMMM''9+>+>y+IIII	J 	J 	Js   ;BD  D)c           
      >   t        j                  t        j                  d      t        j                  d      t        j                  d      t        j                  d            }t        j                  d      5 }||_        | j                  dddd	t        j                  d
      gd       |j                  d   d   }|j                  t        j                  d      k(  sJ |j                  t        j                  d      k(  sJ |j                  t        j                  d      k(  sJ |j                  t        j                  d
      k(  sJ |j                          | j                  ddddt        j                  d      gd       |j                  d   d   }|j                  t        j                  d      k(  sJ |j                  t        j                  d      k(  sJ |j                  t        j                  d      k(  sJ 	 d d d        y # 1 sw Y   y xY w)NrU   r  r	  rY  r   rO  r]  r^  rR  overriding_privkeyTrT  r   rQ  overriding_cert)r   r/   r   r_  r[   r    r   r  r/  r[  rZ  r\  reset)r#   r`  rV  ra  r2  r%   rb  rc  s           r'   test_installer_param_overridez&MainTest.test_installer_param_override^  s   
 ~~	0C0CF0K1:1D1DW1M5>5H5H5Q/8/B/B9/MO ZZMN 	JR]'3K$JJ	=*$i&9&9:N&OQ]a  c&003A6K((I,?,?,GGGG--1D1DW1MMMM))Y-@-@-IIII''9+>+>?S+TTTT JJ	=*%y':':;L'MO[_  a&003A6K((I,?,?@Q,RRRR--1D1DW1MMMM''9+>+>y+IIII#	J 	J 	Js   ;FHHc                     t        j                  t        j                        5  | j	                  g d       d d d        y # 1 sw Y   y xY w)N)rO  r]  notfoundrR  invalidrP   rQ   r	   r   r   )r#   r`  rV  s      r'   test_installer_param_errorz#MainTest.test_installer_param_errorz  s<     ]]6445 	5JJ 4 5	5 	5 	5   AA
rr  c                    t        j                  t        j                  d      t        j                  d      t        j                  d      t        j                  d            }t        j                  d      5 }||_        | j                  dgd       d d d        |j                  sJ |j                  sJ y # 1 sw Y   &xY w)	NrU   r  r	  rY  r   rO  TrT  )r   r/   r   r_  r[   r    r   r"   )r#   	mock_instmock_getcertr`  rV  r%   rb  s          r'   test_installer_select_certz#MainTest.test_installer_select_cert  s    
 ~~	0C0CF0K1:1D1DW1M5>5H5H5Q/8/B/B9/MO ZZMN 	5R]'3K$JJ	{tJ4	5 """"		5 	5s   ;B<<Czcertbot.util.exe_existsc                 ,   d|_         t        j                  j                         }g d}dddt	        j
                  d      dt	        j
                  d      dd	d
ddg}d|v r"| j                  |      \  }}}}d|v sJ d|v sJ | j                  dgd       t        j                  d      5 }t        j                  d      5 }	t        j                         |	_         | j                  g d       |j                  d   \  }
}}t        |t        j                        sJ 	 d d d        d d d        t        j                  d      5 }| j                  ddg       d|j                  k(  sJ 	 d d d        y # 1 sw Y   UxY w# 1 sw Y   YxY w# 1 sw Y   y xY w)NT)z--apachez--authenticatorr   rO  ru  rQ  blahrR  z--nginx-server-rootz/nonexistent/thingr0  r   --debugrt  zThe nginx plugin is not workingMisconfigurationErrorr/  z(With the standalone plugin, you probablyr`   r_   )r   z--manualr0  rP  r   certbot._internal.main.certonlyauthrf   )r    r   r   r   r   r_  r   r-  r   r[   r/   r  
isinstancer   AuthenticatorrN   )r#   mock_exe_existsr2  rD  rE  real_pluginsr   r&   rt   mock_gscunused_configry  unused_installermock_certonlys                 r'   test_configurator_selectionz$MainTest.test_configurator_selection  s   
 (,$,,557< 9m##F+\9;N;Nv;V%';Ty* l"  ::d+LCAq4;;;*c111/1[\ZZ@A 	>YGH >H(,(8%

DE8A8K8KA8N5t%5!$(<(<===	>	> ZZ9: 	1mJJ/000000	1 	1> >	> 	>	1 	1s1   +E>AE2E>%F
2E;	7E>>F
Fc                 (   | j                  dg      \  }}}}d|j                  j                  k(  sJ | j                  g d      \  }}}}|j                  j                  t        j
                  dt        j
                  t        j
                         y )Nrollbackrf   )r  z--checkpoints123{   )r   r  rN   r   r   r   )r#   r2  r  s      r'   test_rollbackzMainTest.test_rollback  sp    **j\21aFOO.....**%IJ1a//HHc488TXX	/r)   z3certbot._internal.cert_manager.update_live_symlinksc                 J    | j                  dg       d|j                  k(  sJ y )Nupdate_symlinksrf   r  rN   r#   rw  s     r'   test_update_symlinkszMainTest.test_update_symlinks  s)      "3!45%00000r)   z+certbot._internal.cert_manager.certificatesc                 J    | j                  dg       d|j                  k(  sJ y )Ncertificatesrf   r  r  s     r'   test_certificateszMainTest.test_certificates  s(      .!12%00000r)   rC  c                 J    | j                  dg       d|j                  k(  sJ y )Ndeleterf   r  r  s     r'   test_deletezMainTest.test_delete  s'      (,%00000r)   z$certbot._internal.main.plugins_discozFcertbot._internal.main.cli.HelpfulArgumentParser.determine_help_topicsc                     g dt        j                  fdt        t                    D         D ]   }| j	                  dgt        |      z          " y )N)--init	--preparez--authenticatorsz--installersc              3   J   K   | ]  }t        j                  |        y wr   )	itertoolscombinations).0rT  flagss     r'   	<genexpr>z(MainTest.test_plugins.<locals>.<genexpr>  s&      . ((2 .    #r   )r  r  rangelenr   list)r#   r2  _det
mock_discor   r  s        @r'   test_pluginszMainTest.test_plugins  sR     LOO. U,./ 	1D JJ	{T$Z/0	1r)   c                    g }|j                   j                         }t        j                         }t	        j
                  |      5  | j                  dg|      \  }}}}d d d        |j                  j                          |j                         j                  j                  |       |j                         j                         }|j                         j                         t        |      k(  sJ y # 1 sw Y   xY w)Nr  r   )r   r   r  r  r   patch_display_util_with_stdoutr   visibler   ifacesr#  stripr  r#   r  r  r  r   r  r2  filtereds           r'   test_plugins_no_argszMainTest.test_plugins_no_args  s     +-,,55755VD 	>"jj)f=OAvq!	> 	//1  88@??$++- &&(CM999	> 	>s   C66C?c                 l   g }|j                   j                         }d }t        j                         }t	        j
                  d      5 }t        j                  |      5  ||_        | j                  dg|      \  }}}}d d d        d d d        |j                  j                          |j                         j                  j                  |       |j                         j                         }	|j                         j                         t        |	      k(  sJ y # 1 sw Y   xY w# 1 sw Y   xY w)Nc                 8    | ||c}}}t        j                         )zRaises error.Error.)r	   r   )r  modestrictr2  s       r'   throw_errorz?MainTest.test_plugins_no_args_unprivileged.<locals>.throw_error  s    vGAq!,,. r)   zcertbot.util.set_up_core_dirr  r   )r   r   r  r  r   r[   r   r  rO   r   r  r   r  r#  r  r  )
r#   r  r  r  r   r  r  mock_set_up_core_dirr2  r  s
             r'   !test_plugins_no_args_unprivilegedz*MainTest.test_plugins_no_args_unprivileged  s    +-,,557	!
 ZZ67 	B;O99H B3>$0"&**i[&"A61aB	B
 	//1  88@??$++- &&(CM999B B	B 	Bs$   	D*  D D*D'	#D**D3c                 <   g }|j                   j                         }t        j                         }t	        j
                  |      5  | j                  ddg|      \  }}}}d d d        |j                  j                          |j                         j                  j                  |       |j                         j                         }|j                  j                  dk(  sJ |j                         j                         t        |      k(  sJ y # 1 sw Y   xY w)Nr  r   r  rf   )r   r   r  r  r   r  r   r  r   r  initrN   r#  r  r  r  s           r'   test_plugins_initzMainTest.test_plugins_init   s     +-,,55755VD 	H"jj)X)>GOAvq!	H 	//1  88@??$++-}}''1,,, &&(CM999	H 	Hs   DDc                    g }|j                   j                         }t        j                         }t	        j
                  |      5  | j                  g d|      \  }}}}d d d        |j                  j                          |j                         j                  j                  |       |j                         j                         }|j                  j                  dk(  sJ |j                  j                          |j                  j                          |j                         }|j                         j                         t!        |      k(  sJ y # 1 sw Y   xY w)Nr  )r   r  r  rf   )r   r   r  r  r   r  r   r  r   r  r  rN   prepare	availabler#  r  r  )	r#   r  r  r  r   r  r2  r  r  s	            r'   test_plugins_preparezMainTest.test_plugins_prepare  s    +-,,55755VD 	U"jj)KVTOAvq!	U 	//1  88@??$++-}}''1,,,002224&&(	 &&(C	N:::	U 	Us   EEc                 0   d}d}d}d}t        j                  d      5 }| j                  dd|ddd	dd
dg	       d d d        j                  d   \  }}|j                  t
        j                  j                  |      k(  sJ |j                  t
        j                  j                  |      k(  sJ |j                  t
        j                  j                  |      k(  sJ |j                  t
        j                  j                  |      k(  sJ y # 1 sw Y   xY w)NrU   keyr  	fullchainrx  r   rQ  rR  rS  z--fullchain-pathr   )r   r[   r   r  r/  r   r  r	  r\  rZ  r[  )r#   rU   r  r  r  r  rS   unused_pluginss           r'   test_certonly_abspathzMainTest.test_certonly_abspath#  s    	ZZ9: 	:mJJ
M4u&*K9 :	:
 "/!8!8!;277??4#8888"''//#"6666  BGGOOE$::::$$	(BBBB	: 	:s   DDc                     	 | j                  g d       J d       # t        j                  $ r}dt        |      v sJ Y d }~y d }~ww xY w)N)-abad_authr   z!Exception should have been raisedz-The requested bad_auth plugin does not appear)r   r	   PluginSelectionErrorr  r#   es     r'   test_certonly_bad_argszMainTest.test_certonly_bad_args4  sJ    	MJJ56===5** 	MBc!fLLL	Ms    AAAc                 \   t        j                  t        j                        5  | j	                  ddg       d d d        t        j                  t        j                        5  | j	                  ddg       d d d        t        j                  t        j                        5  | j	                  ddg       d d d        t        j                  t        j                        5  | j	                  ddg       d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   axY w# 1 sw Y   y xY w)Nr0  @aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.z204.11.231.35z%2001:db8:ac69:3ff:b1cb:c8c6:5a84:a31brm  r   s    r'   test_check_config_sanity_domainz(MainTest.test_check_config_sanity_domain;  s    ]]6445 	)JJh'(	) ]]6445 	8JJ567	8 ]]6445 	0JJo./	0 ]]6445 	HJJEFG	H 	H	) 	)	8 	8	0 	0	H 	Hs/   C>#D
"D!D">D
DD"D+c                     t        j                  t        j                        5  | j	                  dj                  t              j                                d d d        y # 1 sw Y   y xY w)Nz*certonly --csr {0} --allow-subset-of-namesrP   rQ   r	   r   r   r   r   r   r   s    r'   test_csr_with_besteffortz!MainTest.test_csr_with_besteffortI  sL    ]]6<<( 	YJJCJJ3OUUWX	Y 	Y 	Y   3A  A)c                     	 | j                  dt        g       J d       # t        j                  $ r}dt	        |      v sJ Y d }~y d }~ww xY w)Nz--csrzPlease try the certonlyz2Expected supplying --csr to fail with default verb)r   r   r	   r   reprr  s     r'   test_run_with_csrzMainTest.test_run_with_csrM  sP    	JJ~& 	KJJu || 	,Q777	s     AAAc                     t        j                  t        j                        5  | j	                  dj                  t        j                  d            j                                d d d        y # 1 sw Y   y xY w)Nzcertonly --csr {0}zcsr-nonames_512.pem)	rP   rQ   r	   r   r   r   r   vector_pathr   r   s    r'   test_csr_with_no_domainsz!MainTest.test_csr_with_no_domainsV  s\    ]]6<<( 	GJJ+22%%&;<>>CegG	G 	G 	Gs   AA//A8c                     t        j                  t        j                        5  | j	                  dj                  t              j                                d d d        y # 1 sw Y   y xY w)Nz!certonly -d example.org --csr {0}r  r   s    r'   "test_csr_with_inconsistent_domainsz+MainTest.test_csr_with_inconsistent_domains[  sL    ]]6<<( 	PJJ:AA#FLLNO	P 	P 	Pr  c                    t        j                  d      5 }d|_        t        j                  d      5 }||_        |g }|dj                         z  }| j	                  |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)N=certbot._internal.main._find_lineage_for_domains_and_certname)newcertNr`   z!-d foo.bar -a standalone certonly)r   r[   r    r   r   )r#   r  r   mock_renewalrt   s        r'   _certonly_new_request_commonz%MainTest._certonly_new_request_common_  s    ZZWX 	!(9L%DE !)4	&<D;AACC

4 !	! 	!! !	! 	!s"   B 0A4#B 4A=	9B  B	c                    t        j                         }d |j                  _        | j	                  |dg       |j                  j
                  dk(  sJ |j
                  dk(  sJ |j                  d   d   j                  du sJ y N	--dry-runrf   r   T)r   r/   obtain_and_enroll_certificater    r  rN   r  dry_run)r#   mock_reportr  s      r'   )test_certonly_dry_run_new_request_successz2MainTest.test_certonly_dry_run_new_request_successj  s    nn&AE11>))+}E88CCqHHH%%***$$Q'*22d:::r)   z+certbot._internal.main.util.atexit_registerzcertbot.crypto_util.notAfterc                    t         j                  j                  t         j                  j                  | j                  j
                  d            }t         j                  j                  t         j                  j                  | j                  j
                  d            }d}| |       j                  _        t        j                  ||||      }t        j                         }	||	j                  _        | j                  |	       |	j                  j                  dk(  sJ |j                  dk(  sJ ||j                  d   d   v sJ ||j                  d   d   v sJ d	|j                  d   d   v sJ |j                  d
u sJ y )Nzlive/foo.barzlive/baz.quxz
1970-01-01)rU   r  r[  r\  rf   r   r>   rg   donateT)r   r  normpathr
  rS   r[  dater    r   r/   r  r  rN   r  r"   )
r#   mock_notAfterrx   r  r  r/  r\  r  r%   r  s
             r'   !test_certonly_new_request_successz*MainTest.test_certonly_new_request_successs  sO    GG$$RWW\\$++2H2H.%YZ	77##BGGLL1G1G$XY,0)~~9	5>Snn&AM11>))+688CCqHHH%%***K11!4Q7777;003A6666=2215a8888 ''4///r)   c                     t        j                         }d|j                  _        t	        j
                  t        j                        5  | j                  |       d d d        |j                  du sJ y # 1 sw Y   xY wr   )
r   r/   r  r    rP   rQ   r	   r   r  r"   )r#   rx   r  s      r'   !test_certonly_new_request_failurez*MainTest.test_certonly_new_request_failure  sc    nn&AF11>]]6<<( 	;--k:	; ''5000	; 	;s   	A44A=Tc                    t        j                  d      }t        j                  j	                  t        j                  j                  | j                  j                  d            }t        j                  ||||      }||j                  _        d|j                  _        dg|j                  _        d|_        d|_        |	|_        t        j                         }t        j                  d	      }t        j                         }t#        j$                         |d
|df|j&                  _        fd}	 t        j(                  d      5 }|d f|_        t        j(                  d      5 }||_        t        j(                  d      5 }|s| |       j*                  _        t        j(                  d      5 }||j.                  _        t        j(                  d      5  |sg d}|r||z  }	 | j1                  |      \  }}}|rt3        d|       t5        |      |rJ d       	 d d d        d d d        d d d        d d d        d d d        |r|	r}|
s{|j&                  j;                  t        j<                  gt        j                  j	                  t        j                  j                  | j                  j                  d                   nG|j&                  j;                  t        j<                  gd        n|j&                  j>                  dk(  sJ |r[tC        t        j                  j                  | j                  jD                  d            5 }||jG                         v sJ 	 d d d        |fS #  |s t5        dt7        j8                         z         Y yxY w# 1 sw Y   ~xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w#  | jA                           xY w# 1 sw Y   xY w# |rhtC        t        j                  j                  | j                  jD                  d            5 }||jG                         v sJ 	 d d d        w # 1 sw Y   w xY ww xY w)Nr   zlive/foo.bar/fullchain.pem)rU   r  r/  r[  F	isnot.orgr=   	secp256r1pem_key)pemr  csrc                 (    j                  |        y)zWrite message to stdout.N)r`  )r*  r   r   r  s      r'   	write_msgz0MainTest._test_renewal_common.<locals>.write_msg  s    LL!r)   z5certbot._internal.cert_manager.find_duplicative_certsr`   z)certbot._internal.display.obj.get_displayz*certbot._internal.main.renewal.crypto_utilrd   )r0  r  r  r   r   Returnedzrenewal should have erroredzUnexpected renewal error:
zlive/sample-renewal/privkey.pemr   letsencrypt.log)$r   r  r   r  r  r
  rS   r[  r   r/   should_autorenewr    has_pending_deploymentr7   rK   elliptic_curve	reuse_keyr  r  obtain_certificater[   r   rO   notAfterr   printAssertionError	traceback
format_excr   r   rN   	_dump_logr_  r   read)r#   due_for_renewal
extra_argslog_outr   should_renewerror_expected
quiet_modeexpiry_dater  new_keyr/  rZ  r%   
mock_certrmock_keyr  r  mock_fdcrt   mock_displaymock_crypto_utilr&   r2  lfr  s                            @r'   _test_renewal_commonzMainTest._test_renewal_common  s    )).9	WW%%bggll4;;3I3I3O'Q R
~~9
09*V5D%%2;@++8+6-'(/%&1#!*^^%
>>i0nn&7A77?7H&&3	"-	0ST DX`)5t(<%ZZ HI DY-8I*$OP DT`)FOLN77C!ZZ(TU D/EP,55B!%,W!X D'++^D#-$(J$6D
!D8<

48P$5CA'*(-j#(>.<S.A(A/=$\?\$\+=~DDDDD6 W  22JJDHH:(( KK224U*W XY  22JJDHH:W[\"55@@AEEE
 "'',,t{{';';=NOP 0TV"bggi///0 \6113!D+9.<,I,5,@,@,B-C/D )D ,:D DD DD DD DD DL	NN0 0 "'',,t{{';';=NOP 0TV"bggi///0 0 0 s   7O# O+O	.N<6'N/	N",9M8
%N"&N/	.N<6O	>OCO# O98$NN""N,'N/	/N94N<<OO		O	OO O# #O66P 9PA Q1Q$	Q1$Q-)Q1c                 2   | j                  dg       \  }}}|j                  j                  dk(  sJ |j                  j	                  |j                                |j                  dk(  sJ d|j                  d   d   v sJ d|j                  d   d   v sJ y )NTrf   fullchain.pemr   r>   r  )r  save_successorrN   update_all_links_tor   latest_common_versionr  )r#   r2  r  r  lineages        r'   test_certonly_renewalzMainTest.test_certonly_renewal  s     11$;A%%00A555##;;))+	-%%***+"7"7":1"=====2215a8888r)   r  zEcertbot._internal.log.logging.handlers.RotatingFileHandler.doRolloverc                    | j                  dddgd      \  }}}|j                  d       | j                  dg dd       | j                  dg d	d
      \  }}}d |       j                  j                  d   d   v sJ y )NFr  --keepzsimulating renewal)r  The dry run was successful.)z--renew-by-default-tvvrv  zAuto-renewal forced)r  rv  r  )r  znot yet duer   )r  assert_any_callr   r  )r#   r2  rD  r  mock_displayers        r'   test_certonly_renewal_triggersz'MainTest.test_certonly_renewal_triggers  s    
 ++EK3J>R , T1a##$AB!!%)R*? 	" 	A  $88@]/4  9  6>1 0 = = G G J1 MMMMr)   c                 4   t        d       t        j                  j                  | j                  j
                  d      }t        j                  j                  |      r.t        |      5 }t        |j                                d d d        y y # 1 sw Y   y xY w)NzLogs:r  )	r  r   r  r
  rS   r   r\  r_  r  )r#   log_pathr  s      r'   r  zMainTest._dump_log  sn    g77<< 4 46GH77>>(#h !2bggi ! ! $! !s   *BBc                     t        j                  | j                  j                  d       g d}| j	                  dg |d       y )Nsample-renewal.confr.   r  r  Tr   r  r   make_lineagerS   r[  r  r#   r   s     r'   test_renew_verbzMainTest.test_renew_verb   s9    t{{557LM-!!$D!Ir)   c                     t        j                  | j                  j                  dd       g d}| j	                  dg |dd       y )Nr  Fec)r.   r  --reuse-keyTr   r  r  r"  r$  s     r'   test_reuse_keyzMainTest.test_reuse_key  s?    t{{557LQVW4!!$DTX!Yr)   z6certbot._internal.storage.RenewableCert.save_successorc                     t        j                  | j                  j                  dd       ddg}| j	                  dg |dd       y )Nr  Fr'  r.   r)  Tr*  r"  r#   unused_save_successorr   s      r'   test_reuse_key_no_dry_runz"MainTest.test_reuse_key_no_dry_run
  sD    t{{557LQVW'!!$DTX!Yr)   c                     t        j                  | j                  j                  d       g d}| j	                  dg |ddd       y )Nr  )r.   r)  z	--new-keyT)r   r  r  r  r"  r-  s      r'   test_new_keyzMainTest.test_new_key  sC    t{{557LM4!!$DTX*. 	" 	0r)   z	sys.stdinc                 :   d|j                   _        t        j                  | j                  j
                  d       g d}| j                  dg |d       | j                  j                  dk(  sJ | j                  j                  d   d   }d|cxk  rdk  sJ  J y )	NFr  r   Tr!  rf   r   i  )
isattyr    r   r#  rS   r[  r  r  rN   r  )r#   stdinr   sleep_call_args       r'   !test_noninteractive_renewal_delayz*MainTest.test_noninteractive_renewal_delay  s    $)!t{{557LM-!!$D!I))Q... 2215a8N*d*****r)   c                     d|j                   _        t        j                  | j                  j
                  d       g d}| j                  dg |d       | j                  j                  dk(  sJ y )NTr  r   r!  r   )	r3  r    r   r#  rS   r[  r  r  rN   )r#   r4  r   s      r'   !test_interactive_no_renewal_delayz*MainTest.test_interactive_no_renewal_delay#  s]    $(!t{{557LM-!!$D!I))Q...r)   r*   c                 V   d|_         t        j                  | j                  j                  d       t
        j
                  j                         t        j                  d      z   }| j                  dd ddg|      \  }}}d|j                         v sJ d|j                         v sJ y )	NFr  Z   )daysr.   )r   r  r   r  zNo renewals were attempted.z7The following certificates are not due for renewal yet:)
r    r   r#  rS   r[  r  now	timedeltar  r#  )r#   r  expiryr2  r  s        r'   test_renew_skips_recent_certsz&MainTest.test_renew_skips_recent_certs+  s    $)!t{{557LM""&&(8+=+=2+FF004V[7>iV 1 U1f,0AAAAHFOOL]]]]r)   c                 (   t        j                  | j                  j                  d       ddg}| j	                  dg |d      \  }}}|j                         }d|v sJ g d}| j	                  dg |dd      \  }}}|j                         }d|k(  sJ y )	Nr  r.   r  Tr!  )r.   r  z-q)r   r  r  r  )r   r#  rS   r[  r  r#  )r#   r2  r   r  outs        r'   test_quiet_renewzMainTest.test_quiet_renew5  s    t{{557LM%00rSW0X1foo#~~+00r>Bt 1 U1fooSyyr)   c                     t        j                  | j                  j                  d       g d}| j	                  dg |dd       y )Nr  )r.   r  --post-hook=no-such-commandTFr   r  r  r"  r$  s     r'   test_renew_hook_validationz#MainTest.test_renew_hook_validationC  s@    t{{557LMD!!$E15 	" 	7r)   c                     t        j                  | j                  j                  d       g d}t	        j
                  d      5  | j                  dg |dd       d d d        y # 1 sw Y   y xY w)Nr  )r.   r  rD  z--disable-hook-validationz!certbot._internal.hooks.post_hookTFrE  )r   r#  rS   r[  r   r[   r  r$  s     r'   test_renew_no_hook_validationz&MainTest.test_renew_no_hook_validationI  sd    t{{557LM-ZZ;< 	<%%dBT5: & <	< 	< 	<s   A$$A-c                    t         j                  j                  | j                  j                  d      }t         j                  j                  |      st        j                  |       t        t         j                  j                  |d      d      5  	 d d d        g d}| j                  dg |dd       y # 1 sw Y   $xY w)NrR  z
empty.confrS  r   FTrE  )
r   r  r
  rS   r[  r\  r   r]  r_  r  )r#   rdr   s      r'   test_renew_verb_empty_configz%MainTest.test_renew_verb_empty_configQ  s    WW\\$++00)<ww~~b!#"'',,r<0#6 		-!!%$U[_!`	 	s   B88Cc                     t        j                  | j                  j                  d       | j	                  dg dg d       y )Nr  Tr.   r  r]  zsample-renewal)r  r   r"  r   s    r'   test_renew_with_certnamez!MainTest.test_renew_with_certnameZ  s:    t{{557LM!!$H 	" 	Jr)   c                 4    | j                  dg dg dd       y )NTFrM  )r  r   r  )r  r   s    r'   test_renew_with_bad_certnamez%MainTest.test_renew_with_bad_certname_  s!    !!$H 	" 	!r)   c                 6   t         j                  j                  | j                  j                  d      }t        j                  |       t        t         j                  j                  |d      d      5 }|j                  d       d d d        y # 1 sw Y   y xY w)NrR  z	test.confrS  zMy contents don't matter)	r   r  r
  rS   r[  r   r]  r_  r`  )r#   renewer_configs_dirrg  s      r'   _make_dummy_renewal_configz#MainTest._make_dummy_renewal_configd  sn     ggll4;;+A+A9M/0"'',,2K@#F 	0!GG./	0 	0 	0s   4BBc                    | j                          t        j                  d      5 }t        j                         }d|_        |	d|i|_        |||j                  _        ||_        t        j                  d      5 }|j                  ddg        | j                  d	ddi| d d d        | |rj                  sJ j                  du sJ d d d        y # 1 sw Y   4xY w# 1 sw Y   y xY w)
Nr*  zsomepath/fullchain.pemr}  !certbot._internal.main.renew_certr   r.   r  Fr   )rS  r   r[   r/   r  configurationr7   r    
setdefaultr  r"   )r#   r}  r7   assert_oc_calledr   mock_rcr%   r   s           r'   _test_renew_commonzMainTest._test_renew_commonj  s    '')ZZAB 	;g>>+L%=L"(.=}-M* 27""/#/G ?@ TO!!&7)4)))S5SFST  +#*1111*11U:::!	; 	;T T	; 	;s$   AC#<(C$*C#C 	C##C,c                 *    | j                  dd       y )NFTrX  r  rZ  r   s    r'   test_renew_no_renewalparamsz$MainTest.test_renew_no_renewalparams  s    tLr)   c                 ,    | j                  i dd       y )NFT)r}  rX  r  r]  r   s    r'   test_renew_no_authenticatorz$MainTest.test_renew_no_authenticator  s    b5 	  	!r)   c                 6    ddd}| j                  |dd       y )Nwebrootz	over 9000)r~  rsa_key_sizeTF)r}  r  rX  r]  r#   r}  s     r'   test_renew_with_bad_intz MainTest.test_renew_with_bad_int  s)    *3)46mD16 	  	8r)   c                 4    ddd}| j                  |d       y )Nrb  None)r~  http01_portTr}  rX  r]  rd  s     r'   test_renew_with_nonetype_http01z(MainTest.test_renew_with_nonetype_http01  s'    *3(.0m15 	  	7r)   c                 <    ddi}dg}| j                  |d|d       y )Nr~  rb  u   uniçodé.comTF)r}  r  r7   rX  r]  )r#   r}  r7   s      r'   test_renew_with_bad_domainz#MainTest.test_renew_with_bad_domain  s1    ()4 !mD&+e 	  	Er)   r   c                     t        j                         t        j                         f|_        ddi}| j                  |ddj	                                y )Nr~  rb  Tzrenew --configurator apacher}  rX  r   )r   r/   r    rZ  r   )r#   r   r}  s      r'   test_renew_with_configuratorz%MainTest.test_renew_with_configurator  sK    !%!14>>3C D()4'$.446 	  	8r)   c                 6    dddd}| j                  |d       y )Nrb  rg  42)r~  webroot_pathwebroot_imaginary_flagTri  r]  rd  s     r'   $test_renew_plugin_config_restorationz-MainTest.test_renew_plugin_config_restoration  s,    *3)/379 	m15 	  	7r)   c                     ddi}| j                  |dddt        j                  dt        j                         i      g       y )Nr~  rb  Tr.   z--webroot-mapr   rn  )rZ  jsondumpsr   r   rd  s     r'   test_renew_with_webroot_mapz$MainTest.test_renew_with_webroot_map  sF    ()4'$?DJJxGZGZG\7],^_ 	  	ar)   c                     t        j                  d      5 }t        |_        | j	                  dd       d d d        y # 1 sw Y   y xY w)Nz+certbot._internal.main.renewal.reconstituteFTr\  )r   r[   	ExceptionrO   rZ  )r#   mock_reconstitutes     r'   test_renew_reconstitute_errorz&MainTest.test_renew_reconstitute_error  sG    ZZEF 	QJ[,5)##U4#P	Q 	Q 	Qs	   >Ac           	      j   | j                          t        j                  d      5 }t        j                         }d|_        ||_        dddii|_        t        j                  d      5 }t        |_        | j                  dd ddgd	
       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr*  zsomewhere/fullchain.pemr}  r~  rb  rU  Tr.   F)r  r   r  )
rS  r   r[   r/   r  r    rV  rz  rO   r  )r#   rY  r%   r   s       r'   test_renew_obtain_cert_errorz%MainTest.test_renew_obtain_cert_error  s    '')ZZAB 		Ng>>+L%>L"#/G /9!=*?L&?@ NO.7+))$T07yu * NN		N 		NN N		N 		Ns$   AB))#BB)B&	"B))B2c                     | j                  dd dj                         dd       | j                  dd dj                  t              j                         dd       y )NTzrenew -d example.comFrE  zrenew --csr {0})r  r   r   r   r   s    r'   test_renew_with_bad_cli_argsz%MainTest.test_renew_with_bad_cli_args  s_    !!$3I3O3O3Q/4T 	" 	K!!$3D3K3KC3P3V3V3X/4T 	" 	Kr)   c           
          | j                  dd ddddj                  t        j                        g      \  }}}d|j	                         v sJ y )NFr.   z--post-hookz{0} -c "print('hello world');")r  r   r  r   zNo hooks were run.)r  r   sys
executabler#  )r#   r2  r  s      r'   test_no_renewal_with_hooksz#MainTest.test_no_renewal_with_hooks  sV    00!d=46#..)+ 1 ,1f
 $v'8888r)   r  r`   c                 ^   dt        j                         f|_        t        j                         x|_        }| j                  g d       |j                  j
                  du sJ |j                  j
                  du sJ  |       j                  j                  dk(  sJ |j                          y )Nr   )r0  rP  r  r   r   Fr   )
r   r/   r    r   r  r"   r  add_messagerN   rM   )r#   mock_report_new_certrt   r  r   r  s         r'   test_certonly_reinstallz MainTest.test_certonly_reinstall  s     &1$..2B$C!/3~~/??	

DE--44===88??5HHH!--88A===..0r)   c                    d}d}t        j                         }||f|j                  _        t        j
                  j                  t        j
                  j                  | j                  j                  d            }t        j
                  j                  t        j
                  j                  | j                  j                  d            }|d |f|j                  _        t        j                  d      5 }||_        t        j
                  j                  t        j
                  j                  | j                  j                  d            }dj                  t        |||      j                         }	|r|	|z  }	t        j                  d      5  | j                  |	       d d d        d d d        d		v r|j                  j                   d
u sJ y |j                  j#                  ||||       y # 1 sw Y   PxY w# 1 sw Y   TxY w)Ncertrr  zlive/example.com/cert_512.pemzlive/example.com/fullchain.pemr`   zlive/example.com/chain.pemzV-a standalone certonly --csr {0} --cert-path {1} --chain-path {2} --fullchain-path {3}z"certbot._internal.main.crypto_utilr  F)r   r/   obtain_certificate_from_csrr    r   r  r  r
  rS   r[  save_certificater[   r   r   r   r   r"   r   )
r#   r   r  r  r  r/  	full_pathrt   rZ  r   s
             r'   _test_certonly_csr_commonz"MainTest._test_certonly_csr_common  s   nn&@Eu~//<GG$$RWW\\KK""+&- .	 GG$$RWW\\KK"",&. /	 5>tY4N$$1ZZ@A 	!Y%0I"))"'',,&&,+. /J<=CVY
I>??Duw  
"@A !

4 !	! $//66%???((@@uiY@! !	! 	!s%   7BG?G3$G?3G<	8G??Hz+certbot._internal.main._csr_report_new_certc                    | j                          |j                  dk(  sJ d|j                  d   d   v sJ |j                  d   d   J d|j                  d   d   v sJ d|j                  d   d   v sJ |j                  du sJ y )	Nrf   r   r   r>   r  rg   r  T)r  rN   r  r"   )r#   rx   r  mock_csr_reports       r'   test_certonly_csrzMainTest.test_certonly_csr  s     	&&())Q...!:!:1!=a!@@@@((+A.666/";";A">q"AAAA=2215a8888 ''4///r)   c                     | j                  dg       |j                  dk(  sJ |j                  d   d   j                  du sJ y r  )r  rN   r  r  )r#   r  s     r'   test_certonly_csr_dry_runz"MainTest.test_certonly_csr_dry_run  sJ    &&}5))Q...((+A.66$>>>r)   r  r  c           	         d|_         d}| j                  dt        dt        d|dg       t	        t        d      5 }|j
                  j                  dk(  sJ |j                  j                  d	   d	   t        j                  j                  |j                               k(  sJ 	 d d d        t	        t        d      5 }t        j                  |j                               d	   }|j                         j                  }|j!                  t        j"                  |      t$        j&                         d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)
NFrP  rQ  rR  --serverr  rbrf   r   )r    r  SS_CERT_PATHRSA2048_KEY_PATHr_  r  rN   r;  r  r?  r  loadr  r   pyopenssl_load_certificater  r   ComparableX509r   r   )r#   r  r$  r0  rg  rU   r%  s          r'   test_revoke_with_keyzMainTest.test_revoke_with_key  s*    38"/  -|M]!+VX"? 	@"D) 	5Q#,,771<<<#11;;A>qA!XX]]166845 5 5	5 ,% 	99!&&(CAFD*335<<K//''-HH	 			5 	5	 	s   A(D8;A4E8EEc           
          d}t        j                  t        j                        5  | j	                  dt
        dt        d|dg       d d d        y # 1 sw Y   y xY w)NrP  rQ  rR  r  r  )rP   rQ   r	   r   r  CERTKEY)r#   r0  s     r'   test_revoke_with_key_mismatchz&MainTest.test_revoke_with_key_mismatch!  sS    ]]6<<( 	@$$mT<!+VX&? @	@ 	@ 	@s   !AAc                    d|_         t        j                         d f|_         | j                  dt        dg      \  }}}}t        t              5 }t        j                  |j                               d   }|j                         j                  }|j                  t        j                  |      t        j                         d d d        y # 1 sw Y   y xY w)NFrQ  r  r   )r    r   r/   r   r  r_  r   r  r  acme_from_config_keyr  r   r?  r  r   )r#   r  r$  r2  r  rg  rU   r%  s           r'   test_revoke_without_keyz MainTest.test_revoke_without_key'  s     38"//3~~/?.F+**mT8%DE1a$Z 	199!&&(CAFD 557>>K//''-HH	 	 	s   A4CCc                    t        j                  d      5 }t        j                         }d|_        |df|j                  _        | j                  g d       t        j                  d      5 }t        j                         }||j                  _        dg|j                  _        | j                  g d      }d|d   v sJ 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)	Nr  imaginary_accountworked)r  --emailuser@example.orgcertbot._internal.main.account
an accountzThere is an existing accountr   )	r   r[   r/   r  r  r    r  AccountFileStorager   )r#   r2  mocked_clientr  mocked_accountmocked_storager  s          r'   test_registerzMainTest.test_register5  s    ZZ78 	>M.."C(CF36/M""/$$%PQ <= >!%!1AO11>8D~''4,,-XY51===>	> 	>> >	> 	>s%   AC-ACCC	CC(z'certbot._internal.updater._run_updatersc                 P   t         j                  |_        t        j                  t         j                        5  t        j                  d d d        d d d        d| j                  _        t        j                  | j                  d d        |j                  du sJ y # 1 sw Y   LxY wr   )r	   r  rO   rP   rQ   r   
renew_certrS   r  r   run_generic_updatersr"   )r#   r  r   s      r'   test_plugin_selection_errorz$MainTest.test_plugin_selection_errorF  s     #)"="=]]6667 	.OOD$-	. $$$T[[$= %'''	. 	.s   BB%z3certbot._internal.main.updater.run_renewal_deployerc                 ^   d| j                   _        t        j                         }|t        j                         f|_        t        j                  | j                   dd       |j                  dk(  sJ |j                  dk(  sJ |j                  j                          |j                          y)z8A dry-run renewal shouldn't try to restart the installerTNrf   )
rS   r  r   r/   r    r   r  rN   r   rM   )r#   r   rt   r   mock_run_renewal_deployerr  s         r'   #test_renew_doesnt_restart_on_dryrunz,MainTest.test_renew_doesnt_restart_on_dryrunS  s     #NN$	$-t~~/?#@ T40##q(((''1,,,++-!335r)   r   r   )NNN)WrW   rX   rY   rZ   rn   r   r   r  r  r'  r-  r   r[   r3  rK  rW  rd  ri  rn  rs  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r<  r  r  r  r  r%  r+  r/  r1  r6  r8  r?  rB  rF  rH  rK  rN  rP  rS  rZ  r^  r`  re  rj  rl  ro  rt  rx  r|  r~  r  r  r   r   r  r  r  r  r  r  r  r  r  r  r   r   s   @r'   r  r    s	   ';32	',
O	 TZZ<=@ >@ TZZ;<TZZ<=TZZ9:TZZ;<TZZTUTZZ;</ = V = ; > =/6 TZZGHTZZ@A3 B I3
 TZZ67TZZGHTZZ@AJ B I 8J TZZ<=TZZ67TZZGHTZZ@AJ B I 8 >J0 TZZGHTZZ@A5 B I5
 TZZGHTZZ@ATZZ>?TZZ67	  8 @ B I	  TZZ;<TZZ<=TZZ9:TZZ)*#1 + ; > =#1J TZZ<=/ >/ TZZEF1 G1 TZZ=>1 ?1 TZZ781 91 TZZ67TZZXYTZZ<=1 > Z 81 TZZ67TZZXY: Z 8: TZZ67TZZXY: Z 8:( TZZ67TZZXY: Z 8: TZZ67TZZXY; Z 8;"C"MHYKG
P	! TZZ9:; ;; TZZ9:TZZ=>TZZ;<TZZ./0 0 = ? ;0& TZZ;<1 =1 IM"&T%(-8;L;L;P;P;R',eI2V TZZ9:TZZ=>TZZ./9 0 ? ;9 TZZ<=TZZWXTZZ./N 0 Y >N!J
Z
 TZZHIZ JZ
 TZZHI0 J0 TZZ	+ 	+ TZZ/ / TZZ89^ :^ TZZ<= >7<aJ
!
0 <@,0;*M!87E TZZQR8 S87aQNK9 "Y!!#TZZOPTZZ89TZZ9:1 ; : Q $1@> TZZ=>TZZ=>TZZ;<0 = ? ?0 TZZ=>? ??
 TZZ?@TZZ;< = A"@ TZZ?@TZZ;<
 = A
 TZZ<=> >>  TZZQRTZZ9:	( ; S	( TZZEFTZZQRTZZ89TZZ;<6 = : S G6r)   r  c                   T    e Zd Zd Zd Zd Z ej                  d      d        Zd Z	y)UnregisterTestc                 @   t        j                  d      t        j                  d      t        j                  d      t        j                         d| _        | j                  j                         D ci c]  \  }}||j                          c}}| _        y c c}}w )Nr   r  r  )r  r   r  get_utility)r   r[   r   r   rY  r  rp   rZ  )r#   rd  re  s      r'   rn   zUnregisterTest.setUpg  sp    "&**-X"Yzz"BCjj!@A$779	;
 04}}/B/B/DEtq!alE
Es   5Bc                 b    | j                   j                         D ]  }|j                           y r   )rY  ri  r{   )r#   r[   s     r'   r   zUnregisterTest.tearDowno  s'    ]]))+ 	EJJL	r)   c                 8   t        j                         | j                  d   j                  _         | j                  d          }d|j
                  _        t        j                         }t        j                         }t        j                  ||      }|dk(  sJ y )Nr   r  FzDeactivation aborted.)r   r   rZ  r  r    r   r   
unregister)r#   r  rS   r  ress        r'   test_abort_unregisterz$UnregisterTest.test_abort_unregisters  ss    @D		

900=-DJJ}-/	',	$oofn5----r)   r  c                    t        j                         }dg|j                  _        || j                  d   j
                  _        t        j                         df| j                  d   _        t        j                         }|| j                  d   j                  _        t        j                         }t        j                         }t        j                  ||      }|J |j                  d       y )Nr  r   foor  r  zAccount deactivated.)
r   r/   r   r    rZ  r  Clientr   r  r   )r#   r  r  	cb_clientrS   r  r  s          r'   test_unregisterzUnregisterTest.test_unregister  s    )0<~,@N

900=9=9I58Q

'(5NN$	3<

8##0!)oofn5{{++,BCr)   c                    t        j                         }g |j                  _        || j                  d   j
                  _        t        j                         }|| j                  d   j                  _        t        j                         }d|_        t        j                         }t        j                  ||      }d}||k(  sJ |j                  j                  j                  du sJ y )Nr   r  z"https://acme.example.com/directoryzNCould not find existing account for server https://acme.example.com/directory.F)r   r/   r   r    rZ  r  r  r0  r   r  r?  deactivate_registrationr"   )r#   r  r  rS   r  r  ms          r'   test_unregister_no_accountz)UnregisterTest.test_unregister_no_account  s    )/1,@N

900=NN$	3<

8##0!<)oofn5\axx~~55<<EEEr)   N)
rW   rX   rY   rn   r   r  r   r[   r  r  rA   r)   r'   r  r  f  s:    F
. TZZ<=D >D$Fr)   r  c                   @    e Zd ZdZ ej
                  d      d        Zy)MakeOrVerifyNeededDirsz<Tests for certbot._internal.main.make_or_verify_needed_dirs.zcertbot._internal.main.utilc                    t        j                  | j                         | j                  j                  | j                  j                  fD ]A  }|j
                  j                  |t        j                  | j                  j                         C | j                  j                  | j                  j                  | j                  j                  f}|D ]3  }|j                  j                  || j                  j                         5 y )N)r  )r   make_or_verify_needed_dirsrS   r[  r  set_up_core_dirr  r   CONFIG_DIRS_MODEstrict_permissionsrenewal_pre_hooks_dirrenewal_deploy_hooks_dirrenewal_post_hooks_dirmake_or_verify_dir)r#   	mock_utilcore_dir	hook_dirshook_dirs        r'   test_itzMakeOrVerifyNeededDirs.test_it  s    ''4//1E1EG 	H%%55)44..	 [[66[[99[[77:	 " 	AH((88!?!? 9 A	Ar)   N)rW   rX   rY   rZ   r   r[   r  rA   r)   r'   r  r    s%    FTZZ-.A /Ar)   r  c                   (    e Zd ZdZ fdZd Zd Z ej                  d       ej                  d       ej                  d       ej                  d      d	                             Z	 ej                  d       ej                  d       ej                  d       ej                  d      d
                             Z
 ej                  d       ej                  d       ej                  d      d                      Z ej                  d       ej                  d       ej                  d      d                      Z ej                  d       ej                  d      d               Zd Z ej                  d       ej                  d       ej                  d      d                      Z ej                  d       ej                  d       ej                  d       ej                  d       ej"                         d                                    Z ej                  d       ej                  d       ej                  d       ej                  d       ej"                         d                                    Zd Z xZS )EnhanceTestz)Tests for certbot._internal.main.enhance.c                     t         |           t        j                         | _        | j                  j                         | _        t        j                  t        j                        | _        y N)spec)rm   rn   r   r   r   rp   r   r   r/   r   AutoHSTSEnhancementmockinstallerr  s    r'   rn   zEnhanceTest.setUp  sK    !*!=!=!? $ 6 6 < < >!^^1Q1QRr)   c                 8    | j                   j                          y r   r   r   s    r'   r   zEnhanceTest.tearDown  r   r)   c                 &   t         j                  j                         }t        j                  ||      }t        j                  d      5 }dg|_        t        j                  d      5 }dg|_        t        j                  d      5 }t        j                         }||_	        ||_        t        j                  ||       |cd d d        cd d d        cd d d        S # 1 sw Y   nxY w	 d d d        n# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)Nrr  r   r   r`   )r   r   r   r   r   r   r[   r    r/   rS   r   enhance)r#   r   r   rS   
mock_certsmock_domrt   r  s           r'   r   zEnhanceTest._call  s    ''002++GT:ZZFG 		':'4oJ#QR 'V^)6%ZZ HI 'Y"&.."2K)/K&-8I*LL1&' '' '		' 		'' ' '' ' '		' 		' 		'sB   
D(C2:C 	C2		DC%!C2)	D2C;	7DDrL  r   z0certbot._internal.main.display_ops.choose_valuesz0certbot._internal.main._find_domains_or_certnamec                    t        j                  d      |_        dg|_        d|_        t        j                  d      5 }| j	                  ddg       |j
                  sJ d|j                  d	   d
   v sJ 	 d d d        y # 1 sw Y   y xY w)N/tmp/nonexistentrZ  r   NNrM  r  
--redirectr   r   rg   )r   r/   r    r[   r   r"   r  )r#   	mock_findr   r%   rV  	mock_picks         r'   test_selection_questionz#EnhanceTest.test_selection_question  s    
 %)NN>P$Q!$1? !-	ZZHI 	?YJJ	<01####!Y%8%8%;A%>>>>		? 	? 	?s    8BBc                    t        j                  d      |_        dg|_        d|_        t        j                  d      5  t        j                  d      5 }| j	                  g d      }|j
                  sJ d|j                  d	   d	   v sJ |j                  j
                  sJ 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)
Nr  r  r   r  rM  z.certbot._internal.main.plug_sel.logger.warning)r  r  rb  r  z
make senser   )r   r/   r    r[   r   r"   r  enhance_config)r#   r  r   r%   rV  mock_logr  s          r'   test_selection_auth_warningz'EnhanceTest.test_selection_auth_warning  s    
 %)NN>P$Q!$1? !-	ZZHI 	9LM 9QY"jj)ST&#x'9'9!'<Q'????"118888	9	9 	99 9	9 	9s%    CAB8'C8C	=CCc                    t        j                  d      |_        dg|_        t        j                  d      5  | j	                  g d      ddg}dg}j
                  j                  sJ t        fd	|D              sJ t        fd
|D              rJ dj
                  j                  d   d   v sJ 	 d d d        y # 1 sw Y   y xY w)Nr  r  r   rM  r  r  --hstsredirecthstsuirc              3   J   K   | ]  }t        j                  |        y wr   getattrrS   r  r  r  s     r'   r  z7EnhanceTest.test_enhance_config_call.<locals>.<genexpr>  s     G!w{1115Gr  c              3   J   K   | ]  }t        j                  |        y wr   r  r  s     r'   r  z7EnhanceTest.test_enhance_config_call.<locals>.<genexpr>  s     Oa7;#5#5q9Or  r   )
r   r/   r    r[   r   r  r"   allanyr  )r#   rV  r   r%   req_enhnot_req_enhr  s         @r'   test_enhance_config_callz$EnhanceTest.test_enhance_config_call  s     %)NN>P$Q!$1? ZZHI 	O**%HIK!6*G 'K--4444GwGGGGO;OOOO K$>$>$H$H$KA$NNNN	O 	O 	Os   A?CCc                    t        j                  d      |_        dg|_        t        j                  d      5  | j	                  g d      }|j
                  j                  sJ |j                  du sJ 	 d d d        y # 1 sw Y   y xY w)Nr  r  r   rM  )r  r  r  z--non-interactiveF)r   r/   r    r[   r   r  r"   )r#   rV  r   r%   r  s        r'   test_enhance_noninteractivez'EnhanceTest.test_enhance_noninteractive   s     %)NN)%+!$1? ZZHI 	/** &E FK--4444%%...		/ 	/ 	/s   <A??Bc                     g |_         t        j                  d      5  t        j                  t
        j                        5  | j                  g d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NrM  r  )r    r   r[   rP   rQ   r	   r   r   )r#   rV  r   s      r'   test_user_abort_domainsz#EnhanceTest.test_user_abort_domains  sn     $& ZZHI 	@v||, @

>?@	@ 	@@ @	@ 	@s#   $A2A&A2&A/	+A22A;c                     t        j                  t        j                        5  | j	                  g d       d d d        y # 1 sw Y   y xY w)N)r  r  r   )rP   rQ   r	   rw  r   r   s    r'   test_no_enhancements_definedz(EnhanceTest.test_no_enhancements_defined  s6    ]]6778 	2JJ01	2 	2 	2ro  r   c                     dg|_         d|_         t        j                         |_        | j	                  ddg      }|j
                  j                  du sJ y )Nr   r  r  r  F)r    r	   r  rO   r   r  r"   )r#   rV  r   r  r  s        r'   r  z'EnhanceTest.test_plugin_selection_error  sT     %2? !-	 & ; ; =	jj)X!67))00E999r)   rM  c                 2   | j                   |_        ddg|_        t        j                  d      |_        | j	                  ddg       | j                   j
                  j                  sJ | j                   j
                  j                  d   d   ddgk(  sJ y )	Nr   another.tldr  r  r  --auto-hstsr   rf   )r  r    r   r/   r   enable_autohstsr"   r  r#   r2  rV  rq  r   r%   s         r'   test_enhancement_enablez#EnhanceTest.test_enhancement_enable#  s     "&!3!3	$1=#A $(NN>P$Q!

I}-.!!118888!!11;;A>qA(-89 	9 9r)   c                 ,   t        j                  | j                  d      |_        ddg|_        t	        j
                  d      |_        t        j                  t        j                        5  | j                  ddg       d d d        y # 1 sw Y   y xY w)Nr   r   r	  r  r  r  r
  )r   r   rS   r    r   r/   rP   rQ   r	   r   r   r  s         r'   %test_enhancement_enable_not_supportedz1EnhanceTest.test_enhancement_enable_not_supported1  sr     "&V!D	$1=#A $(NN>P$Q!]]6334 	3JJ	=12	3 	3 	3s   -B

Bc                     t        j                  t        j                        5  | j	                  g d       d d d        y # 1 sw Y   y xY w)N)r  r
  r  )rP   rQ   r	   r   r   r   s    r'    test_enhancement_enable_conflictz,EnhanceTest.test_enhancement_enable_conflict=  s4    ]]6<<( 	=JJ;<	= 	= 	=ro  )rW   rX   rY   rZ   rn   r   r   r   r[   r  r  r   r  r  r  r  r   r   r  r  r  r   r   s   @r'   r  r    s   3S&' TZZGHTZZEFTZZBCTZZBC? D D G I? TZZGHTZZEFTZZBCTZZBC	9 D D G I	9 TZZEFTZZBCTZZGH
O I D G
O TZZEFTZZBCTZZGH/ I D G/ TZZBCTZZGH@ I D@2 TZZMNTZZBCTZZGH: I D O: TZZEFTZZBCTZZ@ATZZGH!Y!!#9 $ I B D G
9 TZZEFTZZBCTZZ@ATZZGH!Y!!#3 $ I B D G
3=r)   r  c                        e Zd ZdZ fdZ ej                  d       ej                  d      d               Z ej                  d       ej                  d      d               Z xZ	S )InstallTestz)Tests for certbot._internal.main.install.c                 t    t         |           t        j                  t        j
                        | _        y r  )rm   rn   r   r/   r   r  r  r  s    r'   rn   zInstallTest.setUpE  s#    !^^1Q1QRr)   rL  rM  c                 ~   t        j                  | j                  d      |_        t        j
                  j                         }d| j                  _        d| j                  _        t        j                  t        j                        5  t        j                  | j                  |       d d d        y # 1 sw Y   y xY w)Nr   Tnonexistent)r   r   rS   r    r   r   r   r   r@   rP   rQ   r	   r   r   rO  r#   rq  rV  r   s       r'   &test_install_enhancement_not_supportedz2InstallTest.test_install_enhancement_not_supportedI  s     "&V!D	''002 $,]]6334 	/LLg.	/ 	/ 	/s   	!B33B<c                    | j                   |_        t        j                  j	                         }d| j
                  _        d | j
                  _        d| j
                  _        d| j
                  _	        t        j                  t        j                        5  t        j                  | j
                  |       d d d        y # 1 sw Y   y xY w)NTr  )r  r    r   r   r   rS   r   r@   r\  r/  rP   rQ   r	   r   r   rO  r  s       r'   $test_install_enhancement_no_certnamez0InstallTest.test_install_enhancement_no_certnameS  s     "&!3!3	''002 $#1 2]]6445 	/LLg.	/ 	/ 	/s   !CC
)
rW   rX   rY   rZ   rn   r   r[   r  r  r   r   s   @r'   r  r  B  sx    3S TZZGHTZZ@A/ B I/ TZZGHTZZ@A/ B I/r)   r  c                   l    e Zd ZdZd Zd Zed        Zed        Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zy)ReportNewCertTestznTests for certbot._internal.main._report_new_cert and
       certbot._internal.main._csr_report_new_cert.
    c                 8   t        j                  d      | _        | j                  j                         | _        t        j                  d      | _        | j
                  j                         | _        t        j                  ddddd      | j                  _        y )Nr  z+certbot._internal.main.crypto_util.notAfteri  rf   r   )	r   r[   notify_patchrp   r  notafter_patchmock_notafterr  r    r   s    r'   rn   zReportNewCertTest.setUpe  su     JJ'ST,,224"jj)VW!00668*2*;*;D!Q1*M'r)   c                 l    | j                   j                          | j                  j                          y r   )r  r{   r  r   s    r'   r   zReportNewCertTest.tearDownm  s&       "r)   c                     ddl m}  ||i |S )Nr   )_report_new_cert)r   r#  )clsr   r   r#  s       r'   r   zReportNewCertTest._callq  s    ;000r)   c                     ddl m}  ||i |S )Nr   )_csr_report_new_cert)r   r&  )r$  r   r   r&  s       r'   	_call_csrzReportNewCertTest._call_csrv  s    ?#T4V44r)   c                     | j                  t        j                  d      d d d        | j                  j	                  d       y NTr  r  r   r   r   r  r  r   s    r'   test_report_dry_runz%ReportNewCertTest.test_report_dry_run{  s2    

499T*D$=++,IJr)   c                     | j                  t        j                  d      d d d        | j                  j	                  d       y r)  r'  r   r   r  r  r   s    r'   test_csr_report_dry_runz)ReportNewCertTest.test_csr_report_dry_run  s2    tyy.dDA++,IJr)   c                 \   t        j                  t              5  | j                  t	        j
                  d      d d d        d d d        t        j                  t              5  | j                  t	        j
                  d      d d d        d d d        y # 1 sw Y   TxY w# 1 sw Y   y xY w)NFr*  )rP   rQ   r  r   r   r   r'  r   s    r'   test_report_no_pathsz&ReportNewCertTest.test_report_no_paths  s    ]]>* 	CJJtyy/tTB	C ]]>* 	GNN499U3T4F	G 	G	C 	C	G 	Gs   )B$)B"B"B+c                     | j                  t        j                  d      ddd       | j                  j	                  d       y )NFr*  /path/to/cert.pem/path/to/fullchain.pem/path/to/privkey.pemaA  
Successfully received certificate.
Certificate is saved at: /path/to/fullchain.pem
Key is saved at:         /path/to/privkey.pem
This certificate expires on 1970-01-01.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.r+  r   s    r'   test_reportzReportNewCertTest.test_report  s=    

499U+%'?(	* 	++-	
r)   c                     | j                  t        j                  d      ddd        | j                  j	                  d       y )NFr*  r3  r4  a  
Successfully received certificate.
Certificate is saved at: /path/to/fullchain.pem
This certificate expires on 1970-01-01.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.r+  r   s    r'   test_report_no_keyz$ReportNewCertTest.test_report_no_key  s=    

499U+%'?	 	++-	
r)   c                     | j                  t        j                  dd      ddd       | j                  j	                  d       y )NF)r  preconfigured_renewalr3  r4  r5  
Successfully received certificate.
Certificate is saved at: /path/to/fullchain.pem
Key is saved at:         /path/to/privkey.pem
This certificate expires on 1970-01-01.
These files will be updated when the certificate renews.r+  r   s    r'   $test_report_no_preconfigured_renewalz6ReportNewCertTest.test_report_no_preconfigured_renewal  s@    

499U%H%'?(	* 	++G	
r)   c                     | j                  t        j                  d      ddd       | j                  j	                  d       y )NFr*  r3  z/path/to/chain.pemr4  z
Successfully received certificate.
Certificate is saved at:            /path/to/cert.pem
Intermediate CA chain is saved at:  /path/to/chain.pem
Full certificate chain is saved at: /path/to/fullchain.pem
This certificate expires on 1970-01-01.r.  r   s    r'   test_csr_reportz!ReportNewCertTest.test_csr_report  s>    tyy/1D*,D	F 	++6	
r)   c                     | j                  t        j                  ddd      ddd       | j                  j	                  d       y)	zBShouldn't get a message about autorenewal if no --manual-auth-hookFr   N)r  r~  manual_auth_hookr3  r4  r5  r;  r+  r   s    r'   test_manual_no_hooks_reportz-ReportNewCertTest.test_manual_no_hooks_report  sC    

499U(UYZ%'?(	* 	++G	
r)   N)rW   rX   rY   rZ   rn   r   classmethodr   r'  r,  r/  r1  r6  r8  r<  r>  rA  rA   r)   r'   r  r  `  se    N# 1 1 5 5KKG





r)   r  c                   P    e Zd ZdZd Zd Zed        ZdefdZ	d Z
d Zd	 Zd
 Zy)ReportNextStepsTestz3Tests for certbot._internal.main._report_next_stepsc                 0   t        j                  ddd dd       | _        t        j                  d      }|j	                         | _        | j                  |j                         t        j                  | _
        t        j                         t        _	        y )Nr   Trt  )	cert_namer:  r  r~  r@  r  )r   r/   rS   r[   rp   r  rz   r{   r  r  
old_stdoutr  r  )r#   r  s     r'   rn   zReportNextStepsTest.setUp  sk    nn#4GdD zz"NO'--/))***[[]
r)   c                 .    | j                   t        _        y r   )rG  r  r  r   s    r'   r   zReportNextStepsTest.tearDown  s    __
r)   c                      ddl m}  ||i | y )Nr   )_report_next_steps)r   rJ  )r$  r   r   rJ  s       r'   r   zReportNextStepsTest._call  s    =D+F+r)   returnc                     | j                   j                  dk(  sJ | j                   j                  d   d   d   dk(  sJ | j                   j                  d   d   d   S )Nr>   r   zNEXT STEPS:rf   )r  rN   r#  r   s    r'   _outputzReportNextStepsTest._output  sf    **a///..q1!4Q7=HHH..q1!4Q77r)   c                     d| j                   _        d| j                   _        | j                  | j                   dd       | j                  j                          y)zNo steps for a normal renewalr   z	/bin/trueN)rS   r~  r@  r   r  rM   r   s    r'   r6  zReportNextStepsTest.test_report  s@    $,!'2$

4;;d+**,r)   c                     d| j                   _        | j                  | j                   dd       d| j                         v sJ y)z--csr requires manual renewalzfoo.csrNz--csr will not be renewed)rS   r  r   rM  r   s    r'   r>  z#ReportNextStepsTest.test_csr_report  s5    #

4;;d+*dlln<<<r)   c                     d| j                   _        | j                  | j                   dd       d| j                         v sJ y)z/--manual without a hook requires manual renewalr   Nz--manual certificates requires)rS   r~  r   rM  r   s    r'   test_manual_no_hook_renewalz/ReportNextStepsTest.test_manual_no_hook_renewal  s6    $,!

4;;d+/4<<>AAAr)   c                     d| j                   _        | j                  | j                   dd       d| j                         v sJ y)z2No --preconfigured-renewal needs manual cron setupFNz!https://certbot.org/renewal-setup)rS   r:  r   rM  r   s    r'   test_no_preconfigured_renewalz1ReportNextStepsTest.test_no_preconfigured_renewal  s6    ,1)

4;;d+2dllnDDDr)   N)rW   rX   rY   rZ   rn   r   rB  r   r  rM  r6  r>  rQ  rS  rA   r)   r'   rD  rD    sE    =#% , ,8 8
-=BEr)   rD  c                   |     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
 ej                  d	      d
        Zd Z xZS )UpdateAccountTestz/Tests for certbot._internal.main.update_accountc                    t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                         d}|D ci c]  }|||   j	                          c}| _        |j                         D ]  }| j                  |j                          t        | )         S c c}w )Nr  r  r  r   r  z*certbot._internal.eff.prepare_subscription)r   atexitr  determine_accountnotifyprepare_subr   r   r[   r   r   rp   rZ  ri  rz   r{   rm   rn   r#   r|   rd  r[   r}   s       r'   rn   zUpdateAccountTest.setUp	  s    zz"BCjj!67jj!@A!%,W!Xjj!MN::&RS002
 7>?q'!***,,?
^^% 	(EOOEJJ'	( w}	 @s   C5c           	         t        j                  d      5  t        j                  d      5  d| j                  j                  d| j                  j                  d| j                  j
                  dg|z   }t        j                  |d d        cd d d        cd d d        S # 1 sw Y   nxY wd d d        y # 1 sw Y   y xY wNr  r  rk  r  r  r  r   r[   rS   r[  r  r   r   r$  s     r'   r   zUpdateAccountTest._call	      ZZ;< 	&ZZ;<	&"DKK$:$: $++"6"6 $++"6"6BDHID 99T!W%	& 	& 	& 	& 	& 	& 	&#   B4A B	B4B(	$B44B=c                 j   t        j                         }t        j                         }t        j                         }|g|j                  _        || j                  d   j
                  _        |j                  |j                  _        |t        j                         f| j                  d   _        |||fS )Nr   rX  )r   r/   r   r    rZ  r  bodyr  r#   r  mock_account	mock_regrs       r'   _prepare_mock_accountz'UpdateAccountTest._prepare_mock_account	  s    ~~'~~'NN$	.:^*@L

900=!*8DdnnFV7W

&'4lI66r)   c                    | j                         \  }}}| j                  |      }|J | j                  d   j                         j                  j
                  j                  dk(  sJ |j                  j                  j                  d       |j                  j                  dk(  sJ | j                  d   j                  d       | j                  d   j                          y)	z9Utility to assert that email removal is handled correctlyNr  rf   rA   contactrY  zFAny contact information associated with this account has been removed.rZ  )rg  r   rZ  r  r?  update_registrationrN   rc  updater  update_regrrM   )r#   r   r2  r  rf  results         r'   _test_update_no_contactz)UpdateAccountTest._test_update_no_contact(	  s    '+'A'A'C$L)D!~~zz(#**,11EEPPTUUUU000<''22a777

8//T	
 	

=!335r)   c                     t        j                         }g |j                  _        || j                  d   j
                  _        | j                  g d      dk(  sJ y)2Test that no existing account is handled correctlyr   )update_accountr  r  ]Could not find an existing account for server https://acme-v02.api.letsencrypt.org/directory.Nr   r/   r   r    rZ  r  r   r#   r  s     r'   test_no_existing_accountsz+UpdateAccountTest.test_no_existing_accounts:	  sX    ~~'-/*@L

900=zzKLLL 	L Lr)   c                 *    | j                  ddg       y)zBTest that --register-unsafely-without-email is handled as no emailrr  z!--register-unsafely-without-emailNro  r   s    r'    test_update_account_remove_emailz2UpdateAccountTest.test_update_account_remove_emailC	  s    $$&68[%\]r)   c                 *    | j                  g d       y)z9Test that providing an empty email is handled as no email)rr  r5  r  Nrx  r   s    r'   test_update_account_empty_emailz1UpdateAccountTest.test_update_account_empty_emailG	  s    $$%ABr)   z,certbot._internal.main.display_ops.get_emailc                    d|_         | j                         \  }}}t        j                         }|| j                  d   j
                  _         | j                  dg      }|J |j                  j                  j                  dk(  sJ |j                  j                  dk(  sJ | j                  d   j                  dk(  sJ | j                  d   j                  d       y)	z=Test that updating with a singular email is handled correctlyzuser@example.comr  rr  Nrf   rZ  rY  z4Your e-mail address was updated to user@example.com.)r    rg  r   r/   rZ  r  r   r?  rk  rN   rm  r  )r#   
mock_emailr2  r  r  rn  s         r'   test_update_account_with_emailz0UpdateAccountTest.test_update_account_with_emailK	  s     #5
#99;L!nn&3>

8##0-./~~33>>!CCC''22a777zz-(33q888

8//B	Dr)   c                    | j                         \  }}}| j                  g d      J |j                  j                  j	                  ddg       |j
                  j                  dk(  sJ | j                  d   j	                  d       y)	z8Test that multiple email addresses are handled correctly)rr  r5  z!user@example.com,user@example.orgNzmailto:user@example.comzmailto:user@example.orgri  rf   rY  zEYour e-mail address was updated to user@example.com,user@example.org.)rg  r   rc  rl  r  rm  rN   rZ  )r#   r2  r  rf  s       r'   (test_update_account_with_multiple_emailsz:UpdateAccountTest.test_update_account_with_multiple_emails`	  s    '+'A'A'C$L)zzWX```00.0IJ 	1 	
 ''22a777

8//S	Ur)   )rW   rX   rY   rZ   rn   r   rg  ro  rv  ry  r{  r   r[   r~  r  r   r   s   @r'   rU  rU  	  sU    9 &76$L^C TZZ>?D @D(	Ur)   rU  c                   R     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Z xZS )ShowAccountTestz-Tests for certbot._internal.main.show_accountc                    t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                  d      t        j                         d}|D ci c]  }|||   j	                          c}| _        |j                         D ]  }| j                  |j                          t        | )         S c c}w )Nr  r  r  r   r  )r   rW  r  rX  rY  r   r[  r\  s       r'   rn   zShowAccountTest.setUpo	  s    zz"BCjj!67jj!@A!%,W!Xjj!MN002
 7>?q'!***,,?
^^% 	(EOOEJJ'	( w}	 @s    C!c           	         t        j                  d      5  t        j                  d      5  d| j                  j                  d| j                  j                  d| j                  j
                  dg|z   }t        j                  |d d        cd d d        cd d d        S # 1 sw Y   nxY wd d d        y # 1 sw Y   y xY wr^  r_  r$  s     r'   r   zShowAccountTest._call~	  r`  ra  c                    t        j                         }t        j                         }t        j                         }|g|j                  _        || j                  d   j
                  _        |j                  |j                  _        d|j                  j                  _        |t        j                         f| j                  d   _        y )Nr   s	   foobarbazrX  )
r   r/   r   r    rZ  r  rc  r  r  
thumbprintrd  s       r'   rg  z%ShowAccountTest._prepare_mock_account	  s    ~~'~~'NN$	.:^*@L

900=!*3?##08DdnnFV7W

&'4r)   c                    | j                          t        j                         }t        j                         }||j                  _        d|_        ||j                  j                  _        || j                  d   j                  _        dg}| j                  |       |j                  j                  j                  dk(  sJ y )Nz+https://www.letsencrypt-demo.org/acme/reg/1r  show_accountrf   )rg  r   r/   rc  rj  urir?  query_registrationr    rZ  r  r   rN   )r#   rj  r  rf  r   s        r'   _test_show_accountz"ShowAccountTest._test_show_account	  s    ""$nn&NN$	!(	E	;D++83>

8##0

422==BBBr)   c                     t        j                         }g |j                  _        || j                  d   j
                  _        | j                  dg      dk(  sJ y)rq  r   r  rs  Nrt  ru  s     r'   rv  z)ShowAccountTest.test_no_existing_accounts	  sZ    ~~'-/*@L

900=zz>*+LL 	L Lr)   c                    | j                          t        j                         }d|_        || j                  d   j
                  _        	 | j                  dg       y# t        j                  $ r}dt        |      k(  sJ Y d}~yd}~ww xY w)z;Test that issues with the ACME client are handled correctlyNr  r  zACME client is not set.)rg  r   r/   r?  rZ  r  r    r   r	   r   r  )r#   r  r  s      r'   test_no_existing_clientz'ShowAccountTest.test_no_existing_client	  ss    ""$nn&3>

8##0	7JJ'(|| 	7,A666	7s   A B1BBc                     | j                  d       | j                  d   j                  dk(  sJ | j                  d   j                  t	        j
                  d      g       y )NrA   rY  rf   zAccount details for server https://acme-v02.api.letsencrypt.org/directory:
  Account URL: https://www.letsencrypt-demo.org/acme/reg/1
  Account Thumbprint: Zm9vYmFyYmF6
  Email contact: noner  rZ  rN   assert_has_callsr   r!  r   s    r'   test_no_contactsz ShowAccountTest.test_no_contacts	  sZ    #zz(#..!333

8--II . //0 	1r)   c                     d}| j                  |       | j                  d   j                  dk(  sJ | j                  d   j                  t	        j
                  d      g       y )N)mailto:foo@example.comrY  rf   zAccount details for server https://acme-v02.api.letsencrypt.org/directory:
  Account URL: https://www.letsencrypt-demo.org/acme/reg/1
  Account Thumbprint: Zm9vYmFyYmF6
  Email contact: foo@example.comr  r#   rj  s     r'   test_single_emailz!ShowAccountTest.test_single_email	  s_    -(zz(#..!333

8--II ; </= 	>r)   c                     d}| j                  |       | j                  d   j                  dk(  sJ | j                  d   j                  t	        j
                  d      g       y )N)r  zmailto:bar@example.comrY  rf   zAccount details for server https://acme-v02.api.letsencrypt.org/directory:
  Account URL: https://www.letsencrypt-demo.org/acme/reg/1
  Account Thumbprint: Zm9vYmFyYmF6
  Email contacts: foo@example.com, bar@example.comr  r  s     r'   test_double_emailz!ShowAccountTest.test_double_email	  sc    F(zz(#..!333

8--II K L/M 	Nr)   )rW   rX   rY   rZ   rn   r   rg  r  rv  r  r  r  r  r   r   s   @r'   r  r  l	  s7    7&XCL	71	>	Nr)   r  c                       e Zd ZdZej
                  ZdZe dZe	j                  d        Zej                  d        Z e	j                  dj                               d        Zd	 Zy
)TestLockOrderzFTests that Certbot's directory locks were acquired in the right order.zExpected TestLockOrder errorz|1 renew failurec              #   h   K   t        j                  d      5 }| d d d        y # 1 sw Y   y xY ww)Nzcertbot._internal.lock.lock_dir)r   r[   )r#   mock_lock_dirs     r'   r  zTestLockOrder.mock_lock_dir	  s/     ZZ9: 	 m	  	  	 s   2&	2/2c              #   L   K    fd} fd}t         j                  j                  t        j                  d|      5  t         j                  j                  t
        j                  d|      5  d ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY ww)zJPatches plugin prepare to call mock_lock_dir and raise the expected error.c                 J            j                  j                        r   EXPECTED_ERROR_TYPEEXPECTED_ERROR_STR)unused_selfauthenticator_dirr  r#   s    r'   authenticator_lockz=TestLockOrder.mock_plugin_prepare.<locals>.authenticator_lock	  s#    +,**4+B+BCCr)   c                 V            dk(  rj                  j                        y )NrO  r  )r  installer_dirr  r#   
subcommands    r'   installer_lockz9TestLockOrder.mock_plugin_prepare.<locals>.installer_lock	  s1    -(
 Y&..t/F/FGG 'r)   r  N)r   r[   objectr   r{  r   r   )r#   r  r  r  r  r  r  s   `````  r'   mock_plugin_preparez!TestLockOrder.mock_plugin_prepare	  s}     	D	H ZZz77DVW 	""4>>9nM 	 	 	 	s5   ?B$0B6B;B	B$B	BB!B$zcertonly install renew run)paramsc              #     K   t        |dz        }t        |dz        }t        |dz        }t        |dz        }t        |dz        }|j                  }	|	dddd	d
d|d|d|g}
t        j                  |d       | j	                  ||||	      5  ||||g}|	dk(  r|
|f n
|
||gz   f ddd       y# 1 sw Y   yxY ww)aR  Sets up Certbot with args and mocks to error after acquiring the last lock.

        This fixture yields the CLI arguments that should be given to Certbot
        and the expected order of directories to be locked. An error is raised
        after acquiring the last lock just as a means of stopping Certbot's
        execution.

        r~  rS   r  logsworkr  r   z-ir   z--no-random-sleep-on-renewrk  r  r  r  rO  N)r  paramr   r#  r  )r#   r  requesttmp_pathr  r[  r  r   r  r  r   
lock_orders               r'   args_and_lock_orderz!TestLockOrder.args_and_lock_order	  s       ? :;H,-
H{23x&()x&() ]]
D,f>Z
L(L 	z+@A%%&7Wab 	="J-HJY&J&& J*;)<<<<	= 	= 	=s   BB?B3*	B?3B<8B?c                 B   |\  }}t        j                  | j                  | j                        5  t	        j                  |       d d d        |j
                  t        |      k(  sJ t        |j                  |      D ]  \  }}|d   d   |k(  rJ  y # 1 sw Y   OxY w)NrF   r   )	rP   rQ   r  EXPECTED_ERROR_STR_REGEXr   rN   r  zipr#  )r#   r  r  r   r  r!  
locked_dirs          r'   test_lock_orderzTestLockOrder.test_lock_order
  s    .j]]4334;X;XY 	IIdO	''3z?::: #M$@$@* M 	,D*71:+++	,	 	s   BBN)rW   rX   rY   rZ   r	   r   r  r  r  rP   fixturer  
contextlibcontextmanagerr  r   r  r  rA   r)   r'   r  r  	  s    P ,,7 #5!55EF^^     & V^^7==?@= A=@,r)   r  __main__rf   )UrZ   r  r  	importlibr   r  r  r  rv  r  r  r   r  typingr   unittestr   ra  josepyr?  rP   r  acme.messagesr   r  r!  r   r	   r
   r   certbot._internalr   r   r   r   r   certbot._internal.pluginsr   r   r   r   certbot.compatr   r   certbot.pluginsr   certbot.tests.utiltestsr   r  r  r  r   r  JWKRSAr  load_vectorr  r  r  TestCaser   ConfigTestCaser]   r   r   TempDirTestCaser   rH  r  r  r  r  r  r  r  r  rD  rU  r  r  rW   exitargv__file__rA   r)   r'   <module>r     s   '   - 	    
          -     % ! ' " % + , * 0 %  ( & &!I!!.1	y^,iM*i,-
kk,y,,-=>?(9(():; $y$$_5O*h'' O*dV+i&& V+pQ=8$$ Q=h0 1 1 06C+** C+LcAi// cALd3i66 d3Nh8933 h8VY6y'' Y6x;FX&& ;F|AY55 A*F=)** F=R/)** /<l
)) l
^1E(++ 1EhfU	00 fUReNi.. eNPH, H,V zCHH[V[[!"
234 r)   