a }|ägäâã@s2dZddlZddlZddlmZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddlZddlmZddlZddlZddlZddlZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lm Z dd lm!Z!ddlm"Z"ddlm#Z#ddl$m%Z%ddl$m&Z&ddl$m'Z'ddl$m(Z(ddl)m*Z*ddl)m+Z+ddl,m-Z-ddl.m/mZ0e0 1d¡Z2e0 1d¡Z3e0 1d¡Z4e0 1d¡Z5ej6 7e0 8d¡¡Z9e0 1d¡Z:e0 1d¡Z;Gdd„dej<ƒZ=Gdd „d e0j>ƒZ?Gd!d"„d"ej<ƒZ@Gd#d$„d$ej<ƒZAGd%d&„d&e0jBƒZCGd'd(„d(e0jBƒZDGd)d*„d*e0j>ƒZEGd+d,„d,e0j>ƒZFGd-d.„d.e0j>ƒZGGd/d0„d0ej<ƒZHGd1d2„d2e0j>ƒZIGd3d4„d4e0j>ƒZJGd5d6„d6e0j>ƒZKGd7d8„d8ej<ƒZLGd9d:„d:ej<ƒZMGd;d<„dƒZNGd=d>„d>e0j>ƒZOGd?d@„d@ƒZPeQdAkr.e  Re "e jSdBd…eTg¡¡dS)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.derzrsa256_key.pemzrsa512_key.pemzrsa2048_key.pemz cert_2048.pemc@sleZdZdZe d¡dd„ƒZe d¡e d¡e d¡dd„ƒƒƒZe d¡d d „ƒZe d ¡d d „ƒZ dS)ÚTestHandleCertsz1Test for certbot._internal.main._handle_* methodsút ¡}d|j_t t ¡|¡}|d|fks0J‚|js:J‚dS)NFÚ reinstall)rÚMockÚensure_deployedÚ return_valuerÚ_handle_identical_cert_requestÚcalled)ÚselfÚmock_handle_migrationÚ mock_lineageÚret©r$úE/usr/lib/python3.9/site-packages/certbot/_internal/tests/main_test.pyÚ*test_handle_identical_cert_request_pending5s z:TestHandleCerts.test_handle_identical_cert_request_pendingú&certbot._internal.renewal.should_renewzcertbot.display.util.menucCsZd|_t ¡}d|j_d|_t tjddd|¡}|jssÿ  z:TestHandleCerts.test_handle_identical_cert_key_type_changecCsPt ¡}d|_t ¡}ddg|j_t |dg|¡}|d|fksBJ‚|jsLJ‚dS)NTZdummy1Zdummy2r))rrÚexpandÚnamesrrZ_handle_subset_cert_requestr)r r!Ú mock_configr"r#r$r$r%Útest_handle_subset_cert_requestMs z/TestHandleCerts.test_handle_subset_cert_requestz)certbot._internal.main.display_util.yesnocCs@t ¡}t ¡}||_t ¡}d|_d|_t ||¡| ¡|j|jksNJ‚d|_d|_t ||¡|j dkstJ‚|jdks‚J‚d|_d|_t ||¡|jdks¨J‚d|_t ||¡|jdksÈJ‚d|_dd„|_ t j t jdd t ||¡Wdƒn1s 0Yd d„|_ t ||¡|jdks{ózKTestHandleCerts.test_handle_unexpected_key_type_migration..z.Please provide both --cert-name and --key-type©ÚmatchcSs|dkS)NÚkey_typer$r3r$r$r%r5€r6)rrZ set_by_userr9Úprivate_key_typerZ%_handle_unexpected_key_type_migrationÚassert_not_calledrÚ call_countÚ side_effectÚpytestÚraisesrr)r Z mock_yesnoÚconfigZmock_setÚcertr$r$r%Ú)test_handle_unexpected_key_type_migrationWs8     ,  z9TestHandleCerts.test_handle_unexpected_key_type_migrationN) Ú__name__Ú __module__Ú __qualname__Ú__doc__rÚpatchr&r+r/rBr$r$r$r%r3s   rcsveZdZdZ‡fdd„Zdd„Zdd„Zdd „Zd d „Ze   d ¡d d„ƒZ e   d¡dd„ƒZ e   d ¡dd„ƒZ ‡ZS)ÚRunTestz%Tests for certbot._internal.main.run.c sôtƒ ¡d|_t d¡t d¡t d¡t d¡t d¡t d¡t d¡t d ¡t d ¡g }|d  ¡|_|d  ¡|_|d  ¡|_|d ¡|_ |d ¡|_ |d ¡|_ |d ¡|_ |d ¡|_ |d ¡|_|D]}| |j¡qÞdS)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_clientú7certbot._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ér1éééééé)ÚsuperÚsetUpÚdomainrrGÚstartÚ mock_authÚmock_success_installationÚmock_success_renewalÚ mock_initZmock_suggest_donationÚmock_report_certÚmock_find_certÚmock_subscriptionÚmock_report_next_stepsÚ addCleanupÚstop)r ÚpatchesrG©Ú __class__r$r%rXˆs. ÷ z RunTest.setUpcCs@d |j¡ ¡}tj ¡}t ||¡}ddlm }|||ƒdS)Nz-a webroot -i null -d {0}r)r() ÚformatrYÚsplitrÚPluginsRegistryÚfind_allr Úprepare_and_parse_argsÚcertbot._internal.mainr()r ÚargsÚpluginsr@r(r$r$r%Ú_call£s    z RunTest._callcCsHt ¡|j_d|j_| ¡|j |jg¡|j jtj dtj dddS)N©TNT©Znew_or_renewed_cert) rrr[rr`rpr\Úassert_called_once_withrYrbÚANY©r r$r$r%Útest_newcert_success«s ÿzRunTest.test_newcert_successcCs8t ¡|j_dt ¡f|j_| ¡|j |jg¡dS©NF) rrr[rr`rpr\rsrYrur$r$r%Útest_reinstall_success³s zRunTest.test_reinstall_successcCs8t ¡|j_dt ¡f|j_| ¡|j |jg¡dS)NT) rrr[rr`rpr]rsrYrur$r$r%Útest_renewal_success¹s zRunTest.test_renewal_successú;certbot._internal.main.plug_sel.choose_configurator_pluginscCsdt |jd¡df|_tj ¡}d|j_t  t j ¡t   |j|¡Wdƒn1sV0YdS©NrT)rÚ Installerr@rrrjrkÚ auto_hstsr>r?rÚNotSupportedErrorrr(©r Ú mock_chooseror$r$r%Ú"test_run_enhancement_not_supported¿s  z*RunTest.test_run_enhancement_not_supportedú$certbot._internal.main._install_certcCs|t d¡|_t ¡|j_d|j_t  tj¡|  ¡Wdƒn1sJ0Y|j j tj |jtj dd|j ¡dS)NzFake installation errorrqTrr)rZ PluginErrorr=rrr[rr`r>r?rprbrsrtr\r;)r Zmock_install_certr$r$r%Útest_cert_success_install_errorÇs  &ÿz'RunTest.test_cert_success_install_errorcCsdt |jd¡df|_tj ¡}d|j_t  t j ¡t   |j|¡Wdƒn1sV0YdSr{)rr|r@rrrjrkZ must_stapler>r?rr~rr(rr$r$r%Ú"test_run_must_staple_not_supportedÕs  z*RunTest.test_run_must_staple_not_supported)rCrDrErFrXrprvrxryrrGrrƒr„Ú __classcell__r$r$rfr%rH…s   rHc@s¨eZdZdZdd„Zdd„Zdd„Ze d¡e d ¡e d ¡d d „ƒƒƒZ d d„Z e d¡e d¡e d¡e d¡e d¡e d ¡dd„ƒƒƒƒƒƒZ e d¡e d¡e d¡e d¡e d ¡dd„ƒƒƒƒƒZ e d¡e d ¡e d¡e d¡dd„ƒƒƒƒZ e d¡e d ¡e d¡e d ¡e d¡dd„ƒƒƒƒƒZe d¡e d ¡e d¡e d ¡e d¡dd „ƒƒƒƒƒZe d¡e d ¡e d¡e d ¡d!d"„ƒƒƒƒZd#S)$Ú CertonlyTestz*Tests for certbot._internal.main.certonly.cCst ¡|_|j ¡|_dS©N)Ú test_utilÚpatch_display_utilÚget_utility_patchrZÚmock_get_utilityrur$r$r%rXàs zCertonlyTest.setUpcCs|j ¡dSr‡©rŠrdrur$r$r%ÚtearDownäszCertonlyTest.tearDownc Cs¦tj ¡}t ||¡}t d¡p}t d¡Ft d¡t ||¡Wdƒn1sZ0YWdƒn1sx0YWdƒn1s–0Y|ƒS)NrJrKrN) rrjrkr rlrrGrÚcertonly)r rnror@r^r$r$r%rpçs     fzCertonlyTest._callrMrIrLcCs4| ¡j}|j|_t ¡|_d|_| d ¡¡dS)N)FNz!certonly --webroot -d example.com) r‹Ú notificationÚ_assert_no_pauser=rrrrpri)r Z unused_reportr[r`Zmock_notificationr$r$r%Útest_no_reinstall_text_pauseòs   z)CertonlyTest.test_no_reinstall_text_pausecOs| d¡dusJ‚dS)NÚpauseF)Úget)r rnÚkwargsr$r$r%rüszCertonlyTest._assert_no_pauserOú3certbot._internal.cert_manager.lineage_for_certnameú3certbot._internal.cert_manager.domains_for_certnamez$certbot._internal.renewal.renew_certrcCs ddg}||_||j_| d ¡¡|jdks2J‚|jdks@J‚|jdksNJ‚|jdks\J‚|jdksjJ‚|jtjdtjdd| d ¡¡|jdksœJ‚|jdksªJ‚|jdks¸J‚|jdksÆJ‚|jdksÔJ‚d | ¡j _t   t j ¡| d ¡¡Wdƒn1s0YdS) Nú example.comztest.orgzEcertonly --webroot -d example.com -d test.org --cert-name example.comrPTrrúEcertonly --webroot -d example.com -d test.com --cert-name example.comr1F)rr-rprir<rsrrtr‹Úyesnor>r?rÚConfigurationError)r r_Zmock_handle_typeÚmock_renew_certÚ mock_domainsr"rbÚdomainsr$r$r%Ú*test_find_lineage_for_domains_and_certnameÿs* ÿ z7CertonlyTest.test_find_lineage_for_domains_and_certnameú certbot.display.ops.choose_namescCs^d|_| d ¡¡|jdks"J‚|jdks0J‚dg|_d|_| d ¡¡|jdusZJ‚dS)Nr˜rPZsomenamez*certonly --webroot --cert-name example.comT)rrprir<r)r r_r"Úmock_choose_namesZmock_domains_for_certnameZunused_mock_report_next_stepsr$r$r%Ú*test_find_lineage_for_domains_new_certname#sz7CertonlyTest.test_find_lineage_for_domains_new_certnamez-certbot._internal.main._csr_get_and_save_certcCsZd|_d|_dt›dfD]:}| d|›d ¡¡|jtjtjtjdd| ¡qdS) 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-runFrr)rÚCSRrprirsrrtZ reset_mock)r r"Zmock_csr_get_certZunused_mock_get_certrbÚflagr$r$r%Ú$test_dryrun_next_steps_no_cert_saved8sÿz1CertonlyTest.test_dryrun_next_steps_no_cert_savedú?certbot._internal.plugins.selection.choose_configurator_pluginscCs>t ¡}|df|_t ¡|_d|_| d ¡¡|j ¡dS)Nrqzcertonly --nginx -d example.com)rr*rrpriÚrestartZassert_called_once©r Úmock_selÚ mock_get_certr`Úunused_report_newÚunused_report_nextZmock_installerr$r$r%Útest_installer_runs_restartGs   z(CertonlyTest.test_installer_runs_restartcCs>t ¡}|df|_t ¡|_d|_| d ¡¡|j ¡dS)Nrqz)certonly --nginx -d example.com --dry-run)rr*rrprir¦r;r§r$r$r%Ú$test_dryrun_installer_doesnt_restartVs   z1CertonlyTest.test_dryrun_installer_doesnt_restartcCs2t ¡|_d|_| dt ¡›dd ¡¡dS)Nrqzcertonly --webroot -w ú z-i standalone -d example.com)rr*rrpÚtempfileÚ gettempdirri)r r©r`rªr«r$r$r%Útest_invalid_installeres  ÿz#CertonlyTest.test_invalid_installerN)rCrDrErFrXrrprrGr‘rržr¡r¤r¬r­r±r$r$r$r%r†ÝsX    r†c@sFeZdZdZe d¡dd„ƒZe d¡dd„ƒZe d¡dd „ƒZd S) ÚFindDomainsOrCertnameTestz;Tests for certbot._internal.main._find_domains_or_certname.rŸcCs,tjddd}d|_t |d¡dks(J‚dS)N©rr2Ú domainname)r´N©rrrrÚ_find_domains_or_certname©r r r.r$r$r%Útest_display_opstsz*FindDomainsOrCertnameTest.test_display_opscCsPtjddd}g|_t tj¡t |d¡Wdƒn1sB0YdS)Nr³) rrrr>r?rrrr¶r·r$r$r%Útest_no_results{sz)FindDomainsOrCertnameTest.test_no_resultsr–cCs8tjddd}ddg|_t |d¡ddgdfks4J‚dS)Nzone.comr³ztwo.comrµ)r rœr.r$r$r%Útest_grab_domainsƒs    ÿz+FindDomainsOrCertnameTest.test_grab_domainsN) rCrDrErFrrGr¸r¹rºr$r$r$r%r²qs  r²cseZdZdZ‡fdd„Zddd„Ze d¡e d¡d d „ƒƒZe d¡e d ¡e d ¡e d ¡dd„ƒƒƒƒZ e d¡e d ¡e d ¡e d ¡dd„ƒƒƒƒZ e d¡e d ¡e d ¡e d ¡dd„ƒƒƒƒZ e d¡dd„ƒZ dd„Z e d¡e d¡e ¡dd„ƒƒƒZ‡ZS)Ú RevokeTestz(Tests for certbot._internal.main.revoke.c stƒ ¡t t|j¡tj tj  |jd¡¡|_ t   d¡t   d¡t   d¡t   d¡g}|d  ¡j|_|d  ¡|d  ¡|_|d   ¡|_|D]}| |j¡q’dd lm}t  ¡|_|jd tjd d ddddtjdd|_||jt|jƒ|_|jdf|j_dS)Nrz$certbot._internal.client.acme_clientzcertbot._internal.client.Clientú)certbot._internal.main._determine_accountz5certbot._internal.main.display_ops.success_revocationrrPr1rQ)ÚAccountztest.certbot.orgißrUrRéé )Ztzinfo)Z creation_hostZ creation_dt) rWrXÚshutilÚcopyÚ CERT_PATHÚtempdirrÚpathÚabspathÚjoinÚ tmp_cert_pathrrGrZÚClientV2Úmock_acme_clientÚmock_determine_accountÚmock_success_revokercrdZcertbot._internal.accountr½r*ÚregrZMetaÚdatetimeÚpytzZUTCÚmetaÚJWKÚaccr)r rerGr½rfr$r%rXs0 ü   ÿþzRevokeTest.setUpNcCsH|sd}| |j¡ ¡}tj ¡}t ||¡}ddlm }|||ƒdS)Nzrevoke --cert-path={0} r)Úrevoke) rhrÇrirrjrkr rlrmrÒ)r rnror@rÒr$r$r%rp­s   zRevokeTest._callú-certbot._internal.main._delete_if_appropriateú)certbot._internal.main.client.acme_clientcCsžd|_| ¡j}g}tj ¡D]l\}}d |j|¡ ¡}|  |¡|  t   t j |¡¡d |j| ¡¡ ¡}|  |¡|  t   t j |¡¡q||jksšJ‚dS)NFz#revoke --cert-path={0} --reason {1})rrÈrÒr ZREVOCATION_REASONSÚitemsrhrÇrirpÚappendrÚcallrtÚupperÚcall_args_list)r rÉÚmock_delete_if_appropriateÚ mock_revokeZexpectedÚreasonÚcodernr$r$r%Útest_revoke_with_reason·s  ÿ z"RevokeTest.test_revoke_with_reasonú'certbot._internal.storage.RenewableCertú3certbot._internal.storage.renewal_file_for_certnamez-certbot._internal.client.acme_from_config_keycCs`|j|_tj|jdd|_d ¡}d|_| |¡|jdddjdksNJ‚|j   |j¡dS)Núhttps://acme.example©Ú cert_pathÚserverúrevoke --cert-name=example.comFr) rÉrrr*rÇrirprÙrärËrs©r Zmock_acme_from_configZ%unused_mock_renewal_file_for_certnameZ mock_certrÚrnr$r$r%Útest_revoke_by_certnameÈsÿ ÿz"RevokeTest.test_revoke_by_certnamecCsXtj|jdd|_d ¡}d|_| |¡|jdddjdksFJ‚|j  |j¡dS)z9Revoking with --server should use the server from the CLIrárâz=revoke --cert-name=example.com --server https://other.exampleFrzhttps://other.exampleN) rr*rÇrrirprÙrärËrsrær$r$r%Ú"test_revoke_by_certname_and_serverÙsÿ ÿz-RevokeTest.test_revoke_by_certname_and_servercCs^tj|jdd|_d ¡}d|_| |¡|jdddjtj dksLJ‚|j   |j¡dS)zLRevoking with --cert-name where the lineage server is empty shouldn't crash NrâråFrrä) rr*rÇrrirprÙrär Z CLI_DEFAULTSrËrsrær$r$r%Ú$test_revoke_by_certname_empty_serverês ÿz/RevokeTest.test_revoke_by_certname_empty_servercCs | ¡d|_|j |j¡dSrw)rprrËrsrÇ)r rÚr$r$r%Útest_revocation_successúsz"RevokeTest.test_revocation_successcCsZddlm}| ¡|j_t |j¡| ¡Wdƒn1sB0Y|j  ¡dS)Nrr) ÚacmerZ ClientErrorrÉr=r>r?rprËr;)r Z acme_errorsr$r$r%Útest_revocation_errors   &z RevokeTest.test_revocation_errorú%certbot._internal.cert_manager.deletecCs*d|ƒj_d|_| ¡|jdus&J‚dSrw)r™rrpr)r r‹Ú mock_deleterÚr$r$r%Útest_revocation_with_prompts z&RevokeTest.test_revocation_with_prompt)N)rCrDrErFrXrprrGrÞrçrèrérêrìrˆr‰rïr…r$r$rfr%r»Œs8       r»cs¤eZdZdZ‡fdd„Z‡fdd„Zdd„Zdd „Ze  d ¡d d „ƒZ d d„Z dd„Z e  d¡dd„ƒZ dd„Ze  d¡dd„ƒZdd„Ze  d¡dd„ƒZ‡ZS)ÚReconfigureTestz,Tests for certbot._internal.main.reconfigurec sTtƒ ¡t ¡|_|j ¡|_t d¡t d¡t d¡t d¡t d¡t d¡t d¡t d¡d œ|_ d d „|j   ¡Dƒ|_ d g|j d _ t j |jd¡|_t j |jd¡}t j |¡sÄt |¡t j |d¡|_d}t|jdƒ}| |¡Wdƒn1s0Yt|jdƒ"}tj|ddd|_Wdƒn1sF0YdS)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_initrIrJz"certbot._internal.hooks.list_hooks)Zcheck_symlinksÚ cert_namesÚpick_installerÚ pick_authÚ find_initÚ_get_and_save_certÚ_init_le_clientZ list_hookscSsi|]\}}|| ¡“qSr$©rZ©Ú.0ÚkÚvr$r$r%Ú #r6z)ReconfigureTest.setUp..r—rñr@Úrenewalzexample.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©ÚencodingZdefault_encoding)rWrXrˆr‰rŠrZr‹rrGÚpatchersrÕÚmocksrrrÄrÆrÃÚ config_dirÚexistsrÚmakedirsÚ renewal_fileÚopenÚwriteÚ configobjÚ ConfigObjÚoriginal_config)r Zrenewal_configs_dirr Úfrfr$r%rXs4   ø   *ÿzReconfigureTest.setUpcs0tƒ ¡|j ¡|j ¡D] }| ¡qdSr‡)rWrrŠrdrÚvalues©r rGrfr$r%rBs  zReconfigureTest.tearDowncCsz|d|jg}tj ¡}t ||¡}ddlm}|||ƒt|j dƒ }t j |ddd}Wdƒn1sl0Y|S)Nú --config-dirr)Ú reconfigurerÿrr) rrrjrkr rlrmrr rr r )r Z passed_argsZ full_argsror@rrZ updated_confr$r$r%rpHs    .zReconfigureTest._callcCs>t tj¡| d ¡¡Wdƒn1s00YdS)Nz!--cert-name cert1 -d one.cert.com)r>r?rršrprirur$r$r%Útest_domains_setUsz ReconfigureTest.test_domains_setú,certbot._internal.cert_manager.get_certnamescCsZt ¡}d|_||jd_||jd_||jd_dg|_| d ¡¡|jdksVJ‚dS)NÚnginxròrórôr—ú--nginxrP)rrÚnamerrrprir<)r Úmock_cert_managerÚ named_mockr$r$r%Útest_asks_for_certnameYs   z&ReconfigureTest.test_asks_for_certnamecCsXt ¡}d|_||jd_||jd_||jd_| d ¡¡}|dddksTJ‚dS)NÚapacheròrórôú --cert-name example.com --apacheÚ renewalparamsÚ authenticator)rrrrrrpri©r rÚ new_configr$r$r%Útest_update_configuratores   z(ReconfigureTest.test_update_configuratorcCs‚t ¡}d|_||jd_||jd_||jd_| d ¡¡}d|dd<d|dd <|dd =|jd |d <||jks~J‚d S) zI Check that we don't accidentally modify anything that we didn't mean to rròrórôrrrrÚ installerrÚversionN)rrrrrrprir rr$r$r%Útest_only_intended_changesps      z*ReconfigureTest.test_only_intended_changesz&certbot._internal.hooks.validate_hookscCsf|jdddksJ‚| d ¡dg¡d|jdjjdjvsFJ‚d|jd jjd jvsbJ‚d S) z6 Check that we use the staging server for the dry run rräz.https://acme-v02.api.letsencrypt.org/directoryú"--cert-name example.com --pre-hookúecho preZstagingrörrõrPN)r rprirÚ call_argsrnrä)r Úunused_validate_hooksr$r$r%Útest_staging_used‚s  ÿz!ReconfigureTest.test_staging_usedc Cs®|jdd}|jdd}z| d ¡¡Wn6tjyd}zdt|ƒvsPJ‚WYd}~n d}~00t|jdƒ }tj |ddd }Wdƒn1s˜0Y|dd|ks¶J‚| d |› ¡¡}|dd|ksÞJ‚z| d  ¡¡Wn:tjy*}zdt|ƒvsJ‚WYd}~n d}~00t|jdƒ }tj |ddd }Wdƒn1s`0Y|dd|ks€J‚| d |› ¡¡}|dd|ksªJ‚dS) zx Check that we error when attempting to change the account id or server, but not when it's the same rr räz.--cert-name example.com --account newaccountidz,Using reconfigure to change the ACME accountNrÿrrz"--cert-name example.com --account z&--cert-name example.com --server x.comz!--cert-name example.com --server ) r rprirršÚstrr rr r )r Zorig_account_idZ orig_serverÚerrrr r$r$r%Ú!test_new_account_or_server_errorss(&.(0z1ReconfigureTest.test_new_account_or_server_errorscCs˜d|jvsJ‚| d ¡dg¡}|dddks6J‚| d ¡dg¡}|dddks^J‚d|jvslJ‚| d ¡dg¡}|dddks”J‚dS) NZpre_hookr%r&rz echo pre2Z renew_hookz%--cert-name example.com --deploy-hookz echo deploy)r rpri)r r(r r$r$r%Útest_update_hooks²sz!ReconfigureTest.test_update_hookscCsŠtj|jd_z| d ¡¡Wntjy4Yn0t|jdƒ }tj |ddd}Wdƒn1sh0Y|dddks†J‚dS) Nrõrrÿrrrrr) rrrr=rprir rr r )r rr r$r$r%Útest_dry_run_failsÁs.z"ReconfigureTest.test_dry_run_failsú*certbot._internal.main.display_util.notifycCsÎd}t|jdƒ}| |¡Wdƒn1s00Yt|jdƒ"}tj|ddd|_Wdƒn1sn0Yt ¡}d|_||j d_ ||j d_ |  d   ¡¡}|d d dksÀJ‚|  d ¡dS) 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 rþrÿrrrrórôz--cert-name example.com --nginxrrzT Successfully updated configuration. Changes will apply when the certificate renews.)r rr r r r rrrrrrpriÚassert_called_with)r Ú mock_notifyr rrr r$r$r%Útest_report_resultsÏs (ÿ&  ÿz#ReconfigureTest.test_report_results)rCrDrErFrXrrprrrGrr!r$r)r,r-r.r2r…r$r$rfr%rðs" -     % rðc @sReZdZdZdd„Zdd„Ze ¡dd„ƒZe ¡dd „ƒZ e   d ¡e   d ¡e   d ¡e   d ¡e   d¡e   d¡e ¡dd„ƒƒƒƒƒƒƒZ e   d ¡e   d ¡e   d¡e   d ¡e   d¡e ¡dd„ƒƒƒƒƒƒZ e   d ¡e   d ¡e   d¡e   d¡e   d ¡e ¡dd„ƒƒƒƒƒƒZe   d ¡e   d ¡e   d¡e   d¡e   d ¡e ¡dd„ƒƒƒƒƒƒZdS)ÚDeleteIfAppropriateTestz8Tests for certbot._internal.main._delete_if_appropriate cCsddlm}||ƒdS)Nr)Ú_delete_if_appropriate)rmr4)r r.r4r$r$r%rpûs zDeleteIfAppropriateTest._callcCsBt d¡}| |j¡Wdƒn1s,0Y| ¡dS)Nrí)rrGrpr@r;)r rîr$r$r%Ú_test_delete_opt_out_commonÿs *z3DeleteIfAppropriateTest._test_delete_opt_out_commoncCsd|j_| ¡dSrw)r@Údelete_after_revoker5)r Zunused_mock_get_utilityr$r$r%Útest_delete_flag_opt_outsz0DeleteIfAppropriateTest.test_delete_flag_opt_outcCs|ƒ}d|j_| ¡dSrw)r™rr5)r r‹Ú util_mockr$r$r%Útest_delete_prompt_opt_out sz2DeleteIfAppropriateTest.test_delete_prompt_opt_outz%certbot._internal.main.logger.warningràríz7certbot._internal.cert_manager.match_and_check_overlapsz+certbot._internal.storage.full_archive_pathz3certbot._internal.cert_manager.cert_path_to_lineagec CsF|j}d|_d|_d|_t ¡|_| |¡| ¡|j dksBJ‚dS)Nú/some/reasonable/pathÚr—rP) r@rãr2rrZOverlappingMatchFoundr=rpr;r<) r r‹Úmock_cert_path_to_lineageÚ mock_archiveÚmock_match_and_check_overlapsrîÚmock_renewal_file_for_certnameZ mock_warningr@r$r$r%Útest_overlapping_archive_dirss   z5DeleteIfAppropriateTest.test_overlapping_archive_dirscCs:|j}d|_d|_d|_d|_| |¡|jdks6J‚dS)Nr:r;r—FrP)r@rãr2rrpr<)r r‹r<rîr=Zmock_overlapping_archive_dirsr?r@r$r$r%Útest_cert_path_only$s  z+DeleteIfAppropriateTest.test_cert_path_onlycCsF|j}d|_d|_d|_d|_d|_d|_| |¡|jdksBJ‚dS©NTr:r;r—rP)r@Znoninteractive_moderãr2rrpr<©r r‹rîr<Zmock_full_archive_dirr>r?r@r$r$r%Útest_noninteractive_deletion6s  z4DeleteIfAppropriateTest.test_noninteractive_deletioncCsT|j}d|_d|_d|_d|_d|_d|_| |¡|jdksBJ‚|ƒjjrPJ‚dSrB) r@r6rãr2rrpr<r™rrCr$r$r%Útest_opt_in_deletionJs  z,DeleteIfAppropriateTest.test_opt_in_deletionN)rCrDrErFrpr5rˆr‰r7r9rrGr@rArDrEr$r$r$r%r3øsH   r3cs´eZdZdZ‡fdd„Zdd„Ze d¡e d¡dd „ƒƒZd d „Z d d „Z e d¡dd„ƒZ e d¡dd„ƒZ e d¡e d¡dd„ƒƒZ dd„Zdd„Zdd„Zdd„Z‡ZS)ÚDetermineAccountTestz4Tests for certbot._internal.main._determine_account.cs^tƒ ¡d|j_d|j_d|j_tjddtjddg|_t  ¡|_ t ¡|_ d|j j _ dS)NFÚx)ÚidÚyÚhi)rWrXr@r ÚemailZregister_unsafely_without_emailrr*ÚaccsZAccountMemoryStorageÚaccount_storageÚ mock_clientÚ directoryZ new_authzrurfr$r%rXbs   zDetermineAccountTest.setUpc Cs‚ddlm}t d¡X}t ¡0|j|_||jƒWdƒWdƒS1sV0YWdƒn1st0YdS)Nr)Ú_determine_accountz1certbot._internal.main.account.AccountFileStorage) rmrPrrGrˆr‰rMrr@)r rPÚ mock_storager$r$r%rpns   ÿzDetermineAccountTest._callz!certbot._internal.client.registerz.certbot._internal.client.display_ops.get_emailc CsZd|_||_z | ¡Wn<tjyT}z"d|›t|ƒks@J‚WYd}~n d}~00dS)Nú foo@bar.bazz0Unable to register an account with ACME server. )rr=rprrr*)r Úerr_msgÚ exceptionÚmock_get_emailÚ mock_registerr+r$r$r%Ú_register_error_commonvs ÿz+DetermineAccountTest._register_error_commoncCsl|j |jd|j¡|jdj|j_|jddf| ¡ks@J‚|jdj|jjksXJ‚|jjdushJ‚dS)NrP) rMÚsaverLrNrHr@r rprKrur$r$r%Útest_args_account_sets z*DetermineAccountTest.test_args_account_setcCs\|j |jd|j¡|jddf| ¡ks0J‚|jdj|jjksHJ‚|jjdusXJ‚dS)Nr) rMrXrLrNrprHr@r rKrur$r$r%Útest_single_accountˆsz(DetermineAccountTest.test_single_accountz3certbot._internal.client.display_ops.choose_accountcCsŽ|jD]}|j ||j¡q|jd|_|jddf| ¡ksBJ‚t|jddƒt|jƒksbJ‚|jdj|j j kszJ‚|j j dusŠJ‚dS)NrPr) rLrMrXrNrrpÚsetr'rHr@r rK)r Úmock_choose_accountsrÑr$r$r%Útest_multiple_accountsŽs   z+DetermineAccountTest.test_multiple_accountsc Csj|jD]}|j ||j¡qd|_z | ¡Wn6tjyd}zdt|ƒvsPJ‚WYd}~n d}~00dS)NzNo account has been chosen) rLrMrXrNrrprrr*)r r\rÑr+r$r$r%Útest_multiple_accounts_canceled˜s  z4DetermineAccountTest.test_multiple_accounts_canceledr/cCs²d|_t d¡D}|jdtjjf|j_|jdtjjf| ¡ksFJ‚Wdƒn1sZ0Y|jj|j |j tj d|jdj |j j ks”J‚d|j jks¤J‚| d¡dS)NrRúcertbot._internal.main.clientr)Ztos_cbzAccount registered.)rrrGrLÚsentinelrëÚregisterrprsr@rMrtrHr rK)r r1rUÚclientr$r$r%Útest_no_accounts_no_email¢s ÿ< ÿz.DetermineAccountTest.test_no_accounts_no_emailcCs|d|j_t d¡.}|jdtjjf|j_|  ¡Wdƒn1sF0Y|jdj |jj kshJ‚d|jjksxJ‚dS)Nz other emailr_rP) r@rKrrGrLr`rërarrprHr )r rbr$r$r%Útest_no_accounts_email²s  &z+DetermineAccountTest.test_no_accounts_emailcCsd}| |t |¡¡dS)Nz$Some error message raised by Certbot)rWrr)r rSr$r$r%Útest_register_error_certbotºsz0DetermineAccountTest.test_register_error_certbotcCs d}tddd}| ||¡dS)NzAError returned by the ACME server: must agree to terms of servicez$urn:ietf:params:acme:error:malformedzmust agree to terms of service)ÚtypZdetail©Ú acme_errorrW©r rSrTr$r$r%Ú(test_register_error_acme_type_and_detail¾s ÿz=DetermineAccountTest.test_register_error_acme_type_and_detailcCsd}tdd}| ||¡dS)NzKError returned by the ACME server: The server experienced an internal errorz)urn:ietf:params:acme:error:serverInternal)rfrgrir$r$r%Ú"test_register_error_acme_type_onlyÄs z7DetermineAccountTest.test_register_error_acme_type_only)rCrDrErFrXrprrGrWrYrZr]r^rcrdrerjrkr…r$r$rfr%rF_s&     rFcs eZdZdZ‡fdd„Z‡fdd„Zd¹dd „Zdºd d „Zd d „Zdd„Z dd„Z e   d¡dd„ƒZ e   d¡e   d¡e   d¡e   d¡e   d¡e   d¡dd„ƒƒƒƒƒƒZe   d¡e   d¡dd„ƒƒZe   d ¡e   d¡e   d¡d!d"„ƒƒƒZe   d¡e   d ¡e   d¡e   d¡d#d$„ƒƒƒƒZe   d¡e   d¡d%d&„ƒƒZe   d¡e   d¡e   d'¡e   d ¡d(d)„ƒƒƒƒZe   d¡e   d¡e   d¡e   d*¡d+d,„ƒƒƒƒZe   d¡d-d.„ƒZe   d/¡d0d1„ƒZe   d2¡d3d4„ƒZe   d5¡e   d6¡e   d¡d7d8„ƒƒƒZe   d5¡e   d6¡d9d:„ƒƒZe   d5¡e   d6¡d;d<„ƒƒZe   d5¡e   d6¡d=d>„ƒƒZe   d5¡e   d6¡d?d@„ƒƒZdAdB„ZdCdD„ZdEdF„ZdGdH„Z dIdJ„Z!dKdL„Z"dMdN„Z#d»dOdP„Z$e   d¡dQdR„ƒZ%e   d¡e   dS¡e   d¡e   dT¡dUdV„ƒƒƒƒZ&e   d¡dWdX„ƒZ'dddYdde(j( )¡ddfdZd[„Z*e   d¡e   dS¡e   dT¡d\d]„ƒƒƒZ+e   d^¡e   d_¡e   dT¡d`da„ƒƒƒZ,dbdc„Z-ddde„Z.dfdg„Z/e   dh¡didj„ƒZ0e   dh¡dkdl„ƒZ1e   dm¡dndo„ƒZ2e   dm¡dpdq„ƒZ3e   dr¡dsdt„ƒZ4e   d¡dudv„ƒZ5dwdx„Z6dydz„Z7d{d|„Z8d}d~„Z9dd€„Z:dd‚„Z;d¼dƒd„„Zd‰dŠ„Z?d‹dŒ„Z@ddŽ„ZAe   d¡dd‘„ƒZBd’d“„ZCd”d•„ZDd–d—„ZEd˜d™„ZFdšd›„ZGdœd„ZHeI J¡e   dž¡e   dŸ¡e   d¡d d¡„ƒƒƒƒZKd½d¢d£„ZLe   d¤¡e   dS¡e   d¡d¥d¦„ƒƒƒZMe   d¤¡d§d¨„ƒZNe   d©¡e   dª¡d«d¬„ƒƒZOd­d®„ZPe   d©¡e   d¡d¯d°„ƒƒZQe   d¡d±d²„ƒZRe   d¡e   d³¡d´dµ„ƒƒZSe   d¶¡e   d¡e   dŸ¡e   d¡d·d¸„ƒƒƒƒZT‡ZUS)¾ÚMainTestzTests for different commands.csLtƒ ¡t |jj¡d|jjd|jjd|jjdg|_t   d¡  ¡|_ dS)Nrú --work-dirú --logs-dirú--textz time.sleep) rWrXrÚmkdirr@Úlogs_dirrÚwork_dirÚ standard_argsrrGrZÚ mock_sleeprurfr$r%rXÍs  þzMainTest.setUpcsttƒtƒ ¡dSr‡)Ú reload_moduler rWrrurfr$r%r×szMainTest.tearDownNFc sì|r tjj‰‡fdd„}t d¡l}||_t d¡<}| ||¡\}}}||||fWdƒWdƒS1sv0YWdƒn1s”0YnHt d¡.}| ||¡\}}}||||fWdƒS1sÞ0YdS)zaRun the cli with output streams, actual client and optionally os.path.isfile() mocked outcs*| d¡s| d¡s| d¡r"dSˆ|ƒS)zMock os.path.isfile()rAÚchainÚprivkeyT)Úendswith)Úfnrnr”©Z orig_openr$r%Ú mock_isfileäs ÿþz#MainTest._call..mock_isfilezcertbot.compat.os.path.isfiler_N)rrÄÚisfilerrGr=Ú_call_no_clientmock) r rnÚstdoutÚ mockisfiler{Zmock_ifrbr#Ústderrr$rzr%rpÝs   X zMainTest._callc Cs¸|j|}|r|nt ¡}tjd|dvt d¡L}t d¡"t |dd…¡}Wdƒn1sh0YWdƒn1s†0YWdƒn1s¤0Y|||fS)z-Run the client with output streams mocked outú!certbot._internal.main.sys.stdout©Únewú!certbot._internal.main.sys.stderrúcertbot.util.atexitN)rsÚioÚStringIOrrGr)r rnr~Z toy_stdoutr€r#r$r$r%r}ös   lzMainTest._call_no_clientmockcCsFt d¡(}| g¡d|jks$J‚Wdƒn1s80YdS)Nzcertbot._internal.main.runrP)rrGrpr<)r Úmock_runr$r$r%Ú test_no_flagss  zMainTest.test_no_flagsc Csèt ¡}t ¡}tjd|d¶tjd|dˆzNzt dg¡WntyTYn0W| ¡pf| ¡}d|vs¨Jd |¡ƒ‚n(| ¡pŽ| ¡}d|vs¦Jd |¡ƒ‚0Wdƒn1s¼0YWdƒn1sÚ0YdS)Nrr‚r„z --versionÚcertbotz Output is {0})r†r‡rrGrÚ SystemExitÚgetvaluerh)r Ztoy_outZtoy_errÚoutputr$r$r%Ú test_version_string_program_names ÿz)MainTest.test_version_string_program_namec Cs–d}zFt d¡(t |j|dd…¡Wdƒn1s>0YWn:tjy„}z |}|t|ƒvspJ‚WYd}~n d}~00|dus’J‚dS)zQEnsure that a particular error raises a missing cli flag error containing messageNr„)rrGrrsrZMissingCommandlineFlagr*)r rnÚmessageÚexcZexc_r$r$r%Ú_cli_missing_flags :&zMainTest._cli_missing_flagz*certbot._internal.log.post_arg_parse_setupcCs2ddg}| |d¡| gd¢¡| |d¡dS)Nz-nrŽzspecify a plugin)ú --standaloneú-dzeg.iszregister before running)r‘Úextend)r Ú_rnr$r$r%Útest_noninteractives zMainTest.test_noninteractiverNrLr¼zBcertbot._internal.main.client.Client.obtain_and_enroll_certificaterIcCsgd¢|j}t ¡df|_t ¡|_t d¡n}|j} | |¡t ¡} | j dd} | | vsdJ‚ddl } |   ¡} d|   ¡vrt ¡| vsJ‚Wdƒn1s¤0Yt d¡J}|j} d} |d| g7}| |¡| j tj tj d | tjd Wdƒn1s 0YdS) N)r’rŽú-mz none@none.comr“r—z --agree-tosrÔrPÚ user_agentrZlinuxZ bandersnatchz --user-agentT)r Z verify_sslr˜Zalg)rsrr*rrGÚ ClientNetworkr}r Zget_os_info_uar'ÚplatformÚlowerrsrtÚjoseZRS256)r ZgscZ_obtZdetr•Ú__Ú___rnZ acme_clientZacme_netZos_verZuaršZplatr$r$r%Útest_user_agent%s. ÿ     .   ÿzMainTest.test_user_agentú5certbot._internal.main.plug_sel.record_chosen_pluginsú.certbot._internal.main.plug_sel.pick_installercCs$|jgd¢dd|jdks J‚dS)N) Úinstallz --domainsúfoo.barú --cert-pathrAú --key-pathrwú --chain-pathrvT©rrP)rpr<)r Zmock_pick_installerÚ_recr$r$r%Útest_installer_selectionFs ÿz!MainTest.test_installer_selectionr‚cCsºtjt d¡t d¡t d¡t d¡d}t d¡r}||_|jgd¢dd|jd d }|jt d¡kspJ‚|j t d¡ks„J‚|j t d¡ks˜J‚Wdƒn1s¬0YdS) NrArvrw©rãÚ chain_pathÚfullchain_pathÚkey_pathr•)r¢ú --cert-nameÚwhateverTr§r) rr*rˆÚ temp_joinrGrrpr'rãr¬r­)r Ú_instr¨Ú mock_installr"Ú mock_getlinÚ call_configr$r$r%Útest_installer_certnameMs ý z MainTest.test_installer_certnamec CsTtjt d¡t d¡t d¡t d¡d}t d¡}||_|jdddd t d ¡gd d |jd d }|jt d¡ks~J‚|j t d¡ks’J‚|j t d¡ks¦J‚|j t d ¡ksºJ‚|  ¡|jddddt d¡gd d |jd d }|jt d¡ksJ‚|j t d¡ksJ‚|j t d¡ks0J‚Wdƒn1sF0YdS)NrArvrwrªr•r¢r®r¯r¥Zoverriding_privkeyTr§rr¤Zoverriding_cert) rr*rˆr°rGrrpr'rãr¬r«r­Úreset)r r±r¨r²r•r"r³r´r$r$r%Útest_installer_param_override^s6 ý  ÿÿ  ÿÿz&MainTest.test_installer_param_overridecCs>t tj¡| gd¢¡Wdƒn1s00YdS)N)r¢r®Znotfoundr¥Zinvalid©r>r?rršrp)r r±r¨r$r$r%Útest_installer_param_errorzsz#MainTest.test_installer_param_errorrcCs‚tjt d¡t d¡t d¡t d¡d}t d¡&}||_|jdgddWdƒn1s`0Y|jstJ‚|js~J‚dS) NrArvrwrªr•r¢Tr§)rr*rˆr°rGrrpr)r Ú mock_instZ mock_getcertr±r¨r"r³r$r$r%Útest_installer_select_certs ý . z#MainTest.test_installer_select_certzcertbot.util.exe_existsc CsZd|_tj ¡}gd¢}dddt d¡dt d¡dd d d d g }d |vrp| |¡\}}}}d|vsdJ‚d|vspJ‚| dgd¡t  d¡r}t  d¡H} t  ¡| _| gd¢¡|j d\} } } t | t jƒsÎJ‚Wdƒn1sâ0YWdƒn1s0Yt  d¡.} | ddg¡d| jks6J‚Wdƒn1sL0YdS)NT)z--apachez--authenticatorrr¢rr¤Zblahr¥z--nginx-server-rootz/nonexistent/thingr“r—ú--debugrzThe nginx plugin is not workingÚMisconfigurationErrorr’z(With the standalone plugin, you probablyrJrI)rŽz--manualr“r£rúcertbot._internal.main.certonlyÚauthrP)rrrjrkrˆr°rpr‘rrGr*r'Ú isinstancerÚ Authenticatorr<)r Zmock_exe_existsr•rržZ real_pluginsrnr#r^Zmock_gscZ unused_configr¿Zunused_installerÚ mock_certonlyr$r$r%Útest_configurator_selections,  ý     N z$MainTest.test_configurator_selectioncCsV| dg¡\}}}}d|jjks$J‚| gd¢¡\}}}}|j tjdtjtj¡dS)NÚrollbackrP)rÄz --checkpointsZ123é{)rprÄr<rsrrt)r r•rbr$r$r%Ú test_rollback¹s ÿzMainTest.test_rollbackz+certbot._internal.cert_manager.certificatescCs| dg¡d|jksJ‚dS)NZ certificatesrP©r}r<©r rr$r$r%Útest_certificatesÂs zMainTest.test_certificatesrícCs| dg¡d|jksJ‚dS)NÚdeleterPrÇrÈr$r$r%Ú test_deleteÇs zMainTest.test_deletez$certbot._internal.main.plugins_discozFcertbot._internal.main.cli.HelpfulArgumentParser.determine_help_topicscsFgd¢‰tj‡fdd„ttˆƒƒDƒŽD]}| dgt|ƒ¡q(dS)N)ú--initú --preparez--authenticatorsz --installersc3s|]}t ˆ|¡VqdSr‡)Ú itertoolsÚ combinations)rùrÿ©Úflagsr$r%Ú Òsÿz(MainTest.test_plugins..ro)rÎrvÚrangeÚlenrpÚlist)r r•Ú_detÚ mock_discornr$rÐr%Ú test_pluginsÌs  ÿÿzMainTest.test_pluginscCsšg}|j ¡}t ¡}tj|d&| dg|¡\}}}}Wdƒn1sN0Y|j ¡| ¡j  |¡| ¡  ¡}|  ¡  ¡t |ƒks–J‚dS)N©r~ro) rjrkr†r‡rˆÚpatch_display_util_with_stdoutrpÚvisiblersÚifacesrŒÚstripr*©r rÖr×rÜror~r•Úfilteredr$r$r%Útest_plugins_no_argsÖs 4  zMainTest.test_plugins_no_argsc CsÒg}|j ¡}dd„}t ¡}t d¡X}tj|d,||_|  dg|¡\}}}}Wdƒn1sh0YWdƒn1s†0Y|j   ¡|  ¡j   |¡|  ¡  ¡} |  ¡ ¡t| ƒksÎJ‚dS)NcSs|||}}}t ¡‚dS)zRaises error.Error.N)rr)rOÚmodeÚstrictr•r$r$r%Ú throw_errorësz?MainTest.test_plugins_no_args_unprivileged..throw_errorzcertbot.util.set_up_core_dirrÙro)rjrkr†r‡rrGrˆrÚr=rprÛrsrÜrŒrÝr*) r rÖr×rÜrorãr~Zmock_set_up_core_dirr•rßr$r$r%Ú!test_plugins_no_args_unprivilegedås  R  z*MainTest.test_plugins_no_args_unprivilegedcCs¬g}|j ¡}t ¡}tj|d(| ddg|¡\}}}}Wdƒn1sP0Y|j ¡| ¡j  |¡| ¡  ¡}|j j dksJ‚|  ¡  ¡t|ƒks¨J‚dS)NrÙrorÌrP)rjrkr†r‡rˆrÚrprÛrsrÜÚinitr<rŒrÝr*rÞr$r$r%Útest_plugins_initûs 6  zMainTest.test_plugins_initc CsÈg}|j ¡}t ¡}tj|d(| gd¢|¡\}}}}Wdƒn1sP0Y|j ¡| ¡j  |¡| ¡  ¡}|j j dksJ‚|j  ¡|j  ¡|  ¡}| ¡ ¡t|ƒksÄJ‚dS)NrÙ)rorÌrÍrP)rjrkr†r‡rˆrÚrprÛrsrÜrår<ÚprepareÚ availablerŒrÝr*) r rÖr×rÜror~r•rßrèr$r$r%Útest_plugins_prepare s 6    zMainTest.test_plugins_preparec CsÀd}d}d}d}t d¡,}| dd|ddd dd dg ¡Wdƒn1sL0Y|jd \}}|jtj |¡kszJ‚|jtj |¡ksJ‚|j tj |¡ks¦J‚|j tj |¡ks¼J‚dS) NrAÚkeyrvÚ fullchainr¾rŽr¤r¥r¦z--fullchain-pathr) rrGrpr'rãrrÄrÅr­r«r¬)r rArêrvrërÂr@Úunused_pluginsr$r$r%Útest_certonly_abspaths þ$zMainTest.test_certonly_abspathc CsXz| gd¢¡t d¡Wn6tjyR}zdt|ƒvs>J‚WYd}~n d}~00dS)N)ú-aZbad_authrŽz!Exception should have been raisedz-The requested bad_auth plugin does not appear)rpr>ÚfailrÚPluginSelectionErrorr*©r Úer$r$r%Útest_certonly_bad_args/s zMainTest.test_certonly_bad_argscCsìt tj¡| ddg¡Wdƒn1s00Yt tj¡| ddg¡Wdƒn1sj0Yt tj¡| ddg¡Wdƒn1s¤0Yt tj¡| ddg¡Wdƒn1sÞ0YdS)Nr“Z@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaþaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.z 204.11.231.35z%2001:db8:ac69:3ff:b1cb:c8c6:5a84:a31br¸rur$r$r%Útest_check_config_sanity_domain6s,,,z(MainTest.test_check_config_sanity_domaincCsDt tj¡$| d t¡ ¡¡Wdƒn1s60YdS)Nz*certonly --csr {0} --allow-subset-of-names©r>r?rrrprhr¢rirur$r$r%Útest_csr_with_besteffortDsz!MainTest.test_csr_with_besteffortc CsZz| dtg¡Wn8tjyJ}zdt|ƒvs4J‚WYd}~dSd}~00t d¡dS)Nz--csrzPlease try the certonlyz2Expected supplying --csr to fail with default verb)rpr¢rrÚreprr>rïrñr$r$r%Útest_run_with_csrHs zMainTest.test_run_with_csrcCsJt tj¡*| d t d¡¡ ¡¡Wdƒn1s<0YdS)Nzcertonly --csr {0}zcsr-nonames_512.pem) r>r?rrrprhrˆÚ vector_pathrirur$r$r%Útest_csr_with_no_domainsQsÿz!MainTest.test_csr_with_no_domainscCsDt tj¡$| d t¡ ¡¡Wdƒn1s60YdS)Nz!certonly -d example.org --csr {0}rõrur$r$r%Ú"test_csr_with_inconsistent_domainsVsz+MainTest.test_csr_with_inconsistent_domainsc Cs†t d¡h}d|_t d¡8}||_|dur0g}|d ¡7}| |¡Wdƒn1sZ0YWdƒn1sx0YdS)Nú=certbot._internal.main._find_lineage_for_domains_and_certname)ZnewcertNrJz!-d foo.bar -a standalone certonly)rrGrrirp)r rNrnÚ mock_renewalr^r$r$r%Ú_certonly_new_request_commonZs   z%MainTest._certonly_new_request_commoncCsXt ¡}d|j_| |dg¡|jjdks.J‚|jdksr?rrrþr)r rarNr$r$r%Ú!test_certonly_new_request_failure…s (z*MainTest.test_certonly_new_request_failureTc sZt d¡} tj tj |jjd¡¡} tj | | | | d} || j _ d| j _ dg| j _ d| _d| _| | _t  ¡}tj dd }t  ¡}t ¡‰|d |d f|j_ ‡fd d „}zXzêt d¡f}| df|_ t d¡.}||_ t d¡ü}|sð||ƒj_t d¡Â}||j_ t d¡Ž|sgd¢}|r,||7}z>| |ˆ¡\}‰}}|rZtd|ƒt|ƒ‚|rhJdƒ‚Wn"|sˆtdt ¡ƒ‚Yn0Wdƒn1s¤0YWdƒn1sÄ0YWdƒn1sä0YWdƒn1s0YWdƒn1s$0Y|r~| rj| sj|j tjgtj tj |jjd¡¡¡n|j tjgd¡n|jjdksJ‚Wn|  ¡‚Yn0W|rPt!tj |jj"d¡ƒ"}|| #¡vsÜJ‚Wdƒn1sò0YnR|rNt!tj |jj"d¡ƒ"}|| #¡vs.J‚Wdƒn1sD0Y0| |ˆfS)Nrzlive/foo.bar/fullchain.pem)rArërãr¬Fú isnot.orgr0Z secp256r1Zpem_key)ZpemrvÚcsrcsˆ |¡dS)zWrite message to stdout.N)r )rrnr”rÙr$r%Ú write_msg£sz0MainTest._test_renewal_common..write_msgz5certbot._internal.cert_manager.find_duplicative_certsrJz)certbot._internal.display.obj.get_displayz*certbot._internal.main.renewal.crypto_utilrN)r“r rîrrŽZReturnedzrenewal should have erroredzUnexpected renewal error: zlive/sample-renewal/privkey.pemrúletsencrypt.log)$rˆrùrrÄrrÆr@rrr*Zshould_autorenewrZhas_pending_deploymentr-r:Zelliptic_curveÚ reuse_keyr†r‡Úobtain_certificaterGrr=ZnotAfterrpÚprintÚAssertionErrorÚ tracebackÚ format_excrsrtr<Ú _dump_logr rqÚread)r Údue_for_renewalÚ extra_argsÚlog_outrnÚ should_renewÚerror_expectedÚ quiet_modeÚ expiry_daterÚnew_keyrãr«r"Z mock_certrZmock_keyrNr Zmock_fdcr^Z mock_displayZmock_crypto_utilr#r•Úlfr$rÙr%Ú_test_renewal_commonsŠ ÿÿ  ÿ       ÿÿª   ÿÿ 4þ4zMainTest._test_renewal_commoncCsp| dg¡\}}}|jjdks"J‚|j | ¡¡|jdks@J‚d|jddvsVJ‚d|jddvslJ‚dS)NTrPú fullchain.pemrr1r)rZsave_successorr<Zupdate_all_links_torsZlatest_common_versionr')r r•rVrZlineager$r$r%Útest_certonly_renewalØsÿzMainTest.test_certonly_renewalr/zEcertbot._internal.log.logging.handlers.RotatingFileHandler.doRollovercCsp|jdddgdd\}}}| d¡|jdgd¢dd|jdgd ¢dd \}}}d |ƒjjd d vslJ‚dS) NFrú--keepzsimulating renewal)rúThe dry run was successful.)z--renew-by-defaultú-tvvr¼zAuto-renewal forced)r$r¼r")rz not yet duer)rÚassert_any_callrr')r r•rr1Zmock_displayerr$r$r%Útest_certonly_renewal_triggersäs ÿ   ÿ ÿ z'MainTest.test_certonly_renewal_triggerscCs^tdƒtj |jjd¡}tj |¡rZt|ƒ}t| ¡ƒWdƒn1sP0YdS)NzLogs:r ) rrrÄrÆr@rqrr r)r Zlog_pathrr$r$r%rôs   zMainTest._dump_logcCs.t |jjd¡gd¢}|jdg|dddS)Núsample-renewal.conf©r)rr$T©rnr©rˆÚ make_lineager@rr©r rnr$r$r%Útest_renew_verbûszMainTest.test_renew_verbcCs4tj|jjdddgd¢}|jdg|ddddS)Nr'F©Zec)r)rú --reuse-keyT©rnrrr*r,r$r$r%Útest_reuse_keyszMainTest.test_reuse_keyz6certbot._internal.storage.RenewableCert.save_successorcCs4tj|jjdddddg}|jdg|ddddS)Nr'Fr.r)r/Tr0r*©r Zunused_save_successorrnr$r$r%Útest_reuse_key_no_dry_runsz"MainTest.test_reuse_key_no_dry_runcCs2t |jjd¡gd¢}|jdg|dddddS)Nr')r)r/z --new-keyT)rnrrrr*r2r$r$r%Ú test_new_key s ÿzMainTest.test_new_keyz sys.stdincCspd|j_t |jjd¡gd¢}|jdg|dd|jjdksBJ‚|jj dd}d|krfdkslnJ‚dS) NFr'r(Tr)rPrià) Úisattyrrˆr+r@rrrtr<r')r ÚstdinrnZsleep_call_argr$r$r%Ú!test_noninteractive_renewal_delaysz*MainTest.test_noninteractive_renewal_delaycCsFd|j_t |jjd¡gd¢}|jdg|dd|jjdksBJ‚dS)NTr'r(r)r) r5rrˆr+r@rrrtr<)r r6rnr$r$r%Ú!test_interactive_no_renewal_delays z*MainTest.test_interactive_no_renewal_delayr'cCsld|_t |jjd¡tj ¡tjdd}|jddddg|d\}}}d|  ¡vsXJ‚d|  ¡vshJ‚dS) NFr'éZ)Zdaysr))rrrnrzNo renewals were attempted.z7The following certificates are not due for renewal yet:) rrˆr+r@rrÍÚnowZ timedeltarrŒ)r rZexpiryr•r~r$r$r%Útest_renew_skips_recent_certs&s ÿ z&MainTest.test_renew_skips_recent_certscCs~t |jjd¡ddg}|jdg|dd\}}}| ¡}d|vsDJ‚gd¢}|jdg|ddd\}}}| ¡}d|kszJ‚dS) Nr'r)rTr))r)rz-q)rnrrr;)rˆr+r@rrrŒ)r r•rnr~Úoutr$r$r%Útest_quiet_renew0s  ÿ zMainTest.test_quiet_renewcCs0t |jjd¡gd¢}|jdg|ddddS)Nr')r)rú--post-hook=no-such-commandTF©rnrrr*r,r$r$r%Útest_renew_hook_validation>s  ÿz#MainTest.test_renew_hook_validationcCsZt |jjd¡gd¢}t d¡$|jdg|dddWdƒn1sL0YdS)Nr')r)rr>z--disable-hook-validationz!certbot._internal.hooks.post_hookTFr?)rˆr+r@rrrGrr,r$r$r%Útest_renew_no_hook_validationDs   ÿz&MainTest.test_renew_no_hook_validationcCs|tj |jjd¡}tj |¡s(t |¡ttj |d¡dƒWdƒn1sR0Ygd¢}|j dg|ddddS)Nrýz empty.confrþr(FTr?) rrÄrÆr@rrrrr r)r Zrdrnr$r$r%Útest_renew_verb_empty_configLs  z%MainTest.test_renew_verb_empty_configcCs*t |jjd¡|jdgdgd¢ddS)Nr'T©r)rr®zsample-renewal)rrnr*rur$r$r%Útest_renew_with_certnameUs ÿz!MainTest.test_renew_with_certnamecCs|jdgdgd¢dddS)NTFrC)rrnr)rrur$r$r%Útest_renew_with_bad_certnameZs þz%MainTest.test_renew_with_bad_certnamecCs^tj |jjd¡}t |¡ttj |d¡dƒ}| d¡Wdƒn1sP0YdS)Nrýz test.confrþzMy contents don't matter) rrÄrÆr@rrrr r )r Zrenewer_configs_dirrr$r$r%Ú_make_dummy_renewal_config_s z#MainTest._make_dummy_renewal_configc KsÞ| ¡t d¡¸}t ¡}d|_|dur4d|i|_|durD||j_||_t d¡2}| ddg¡|j d dd i|¤ŽWdƒn1sŒ0Y|dur¼|r®|j s¼J‚n|j d us¼J‚Wdƒn1sÐ0YdS) Nrßzsomepath/fullchain.pemrú!certbot._internal.main.renew_certrnr)TrF)TN) rFrrGr*rëÚ configurationr-rÚ setdefaultrr)r rr-Úassert_oc_calledr”Úmock_rcr"r›r$r$r%Ú_test_renew_commones    2 zMainTest._test_renew_commoncCs|jddddS)NFT©rJr©rLrur$r$r%Útest_renew_no_renewalparamszsz$MainTest.test_renew_no_renewalparamscCs|jiddddS)NFT)rrJrrNrur$r$r%Útest_renew_no_authenticator}sÿz$MainTest.test_renew_no_authenticatorcCsdddœ}|j|ddddS)NÚwebrootz over 9000)rZ rsa_key_sizeTF)rrrJrN©r rr$r$r%Útest_renew_with_bad_ints ÿÿz MainTest.test_renew_with_bad_intcCsdddœ}|j|dddS)NrQÚNone)rZ http01_portT©rrJrNrRr$r$r%Útest_renew_with_nonetype_http01‡s ÿÿz(MainTest.test_renew_with_nonetype_http01cCs$ddi}dg}|j|d|dddS)NrrQu uniçodé.comTF)rrr-rJrN)r rr-r$r$r%Útest_renew_with_bad_domains ÿz#MainTest.test_renew_with_bad_domainr¥cCs2t ¡t ¡f|_ddi}|j|dd ¡ddS)NrrQTzrenew --configurator apache©rrJrn)rr*rrLri)r r¨rr$r$r%Útest_renew_with_configurator“s þz%MainTest.test_renew_with_configuratorcCsddddœ}|j|dddS)NrQrTZ42)rZ webroot_pathZwebroot_imaginary_flagTrUrNrRr$r$r%Ú$test_renew_plugin_config_restoration›sþÿz-MainTest.test_renew_plugin_config_restorationc Cs0ddi}|j|dddt dt ¡i¡gddS)NrrQTr)z --webroot-mapr—rX)rLÚjsonÚdumpsr¯r°rRr$r$r%Útest_renew_with_webroot_map¢s þz$MainTest.test_renew_with_webroot_mapcCsBt d¡$}t|_|jdddWdƒn1s40YdS)Nz+certbot._internal.main.renewal.reconstituteFTrM)rrGÚ Exceptionr=rL)r Zmock_reconstituter$r$r%Útest_renew_reconstitute_error¨s z&MainTest.test_renew_reconstitute_errorc Csž| ¡t d¡x}t ¡}d|_||_dddii|_t d¡,}t|_|j ddddgd d Wdƒn1sr0YWdƒn1s0YdS) Nrßzsomewhere/fullchain.pemrrrQrGTr)F)rrnr) rFrrGr*rërrHr^r=r)r rKr"r›r$r$r%Útest_renew_obtain_cert_error®s ÿ  ÿz%MainTest.test_renew_obtain_cert_errorcCs:|jddd ¡ddd|jddd t¡ ¡ddddS)NTzrenew -d example.comFr?zrenew --csr {0})rrirhr¢rur$r$r%Útest_renew_with_bad_cli_args»s ÿÿz%MainTest.test_renew_with_bad_cli_argsc Cs:|jdddddd tj¡gd\}}}d| ¡vs6J‚dS)NFr)z --post-hookz{0} -c "print('hello world');")rrrrnzNo hooks were run.)rrhÚsysÚ executablerŒ)r r•r~r$r$r%Útest_no_renewal_with_hooksÁsÿÿþ z#MainTest.test_no_renewal_with_hooksrürJcCshdt ¡f|_t ¡|_}| gd¢¡|jjdus:J‚|jjdusJJ‚|ƒjjdks\J‚|  ¡dS)Nr)r“r£rîrrŽFr) rr*rrprrrZ add_messager<r;)r Zmock_report_new_certr^rýr‹rNr$r$r%Útest_certonly_reinstallÉsz MainTest.test_certonly_reinstallc Cs2d}d}t ¡}||f|j_tj tj |jj d¡¡}tj tj |jj d¡¡}|d|f|j _t  d¡„}||_tj tj |jj d¡¡}d  t |||¡ ¡} |rª| |7} t  d¡| | ¡Wdƒn1sÔ0YWdƒn1sò0Yd | vr|j jd us.J‚n|j  |||||¡dS) NÚcertrrvzlive/example.com/cert_512.pemzlive/example.com/fullchain.pemrJzlive/example.com/chain.pemzV-a standalone certonly --csr {0} --cert-path {1} --chain-path {2} --fullchain-path {3}z"certbot._internal.main.crypto_utilrF)rr*Zobtain_certificate_from_csrrrrÄrrÆr@rZsave_certificaterGrhr¢rirprrs) r rrfrvrNrãÚ full_pathr^r«rnr$r$r%Ú_test_certonly_csr_commonØs>  þ þ  þþ F  ÿz"MainTest._test_certonly_csr_commonz+certbot._internal.main._csr_report_new_certcCs€| ¡|jdksJ‚d|jddvs,J‚|jdddusBJ‚d|jddvsXJ‚d|jddvsnJ‚|jdus|J‚dS) NrPrrr1r rQrT)rhr<r'r)r rarVÚmock_csr_reportr$r$r%Útest_certonly_csr÷szMainTest.test_certonly_csrcCs6| dg¡|jdksJ‚|jddjdus2J‚dSrÿ)rhr<r'r)r rir$r$r%Útest_certonly_csr_dry_runs z"MainTest.test_certonly_csr_dry_runrÓrÔc CsÞd|_d}| dtdtd|dg¡ttdƒD}|jjdks>J‚|jjd d t j   |  ¡¡ksbJ‚Wdƒn1sv0Yttdƒ@}t  |  ¡¡d }| ¡j}| t  |¡tj¡Wdƒn1sÐ0YdS) NFr£r¤r¥ú--serverrÒÚrbrPr)rr}Ú SS_CERT_PATHÚRSA2048_KEY_PATHr rÈr<r™r'rœrÐÚloadrrÚpyopenssl_load_certificaterÒrsÚComparableX509rrt)r rÉrÚrärrArÛr$r$r%Útest_revoke_with_key s" ÿ ÿ&  þzMainTest.test_revoke_with_keyc CsLd}t tj¡(| dtdtd|dg¡Wdƒn1s>0YdS)Nr£r¤r¥rlrÒ)r>r?rrr}ÚCERTÚKEY)r rär$r$r%Útest_revoke_with_key_mismatchs  ÿz&MainTest.test_revoke_with_key_mismatchcCsˆd|_t ¡df|_| dtdg¡\}}}}ttƒ@}t | ¡¡d}|  ¡j }|  t   |¡tj¡Wdƒn1sz0YdS)NFr¤rÒr)rrr*rprtr rrqrZacme_from_config_keyrÒrsrœrrrt)r rÊrÚr•rbrrArÛr$r$r%Útest_revoke_without_key"s  þz MainTest.test_revoke_without_keyc Cs¸t d¡š}t ¡}d|_|df|j_| gd¢¡t d¡H}t ¡}||j_dg|j_| gd¢¡}d|dvsxJ‚Wdƒn1sŒ0YWdƒn1sª0YdS) Nr_Zimaginary_accountZworked)raú--emailúuser@example.orgúcertbot._internal.main.accountú an accountzThere is an existing accountr) rrGr*rHrarr}ÚAccountFileStoragerk)r r•Z mocked_clientrÑZmocked_accountÚmocked_storagerGr$r$r%Ú test_register0s    zMainTest.test_registerz'certbot._internal.updater._run_updaterscCsltj|_t tj¡t ddd¡Wdƒn1s80Yd|j_t   |jdd¡|j dushJ‚dSrw) rrðr=r>r?rÚ renew_certr@rrZrun_generic_updatersr)r rˆr€r$r$r%Útest_plugin_selection_errorAs ,z$MainTest.test_plugin_selection_errorz3certbot._internal.main.updater.run_renewal_deployercCs`d|j_t ¡}|t ¡f|_t |jdd¡|jdkseZdZdd„Zdd„Zdd„Ze d¡dd „ƒZd d „Z d S) ÚUnregisterTestcCs@t d¡t d¡t d¡t ¡dœ|_dd„|j ¡Dƒ|_dS)Nr¼rzr_)rPr rbÚ get_utilitycSsi|]\}}|| ¡“qSr$r÷rør$r$r%rühr6z(UnregisterTest.setUp..)rrGrˆr‰rrÕrrur$r$r%rXbs üzUnregisterTest.setUpcCs|j ¡D] }| ¡q dSr‡)rrrdrr$r$r%rjszUnregisterTest.tearDowncCsRt ¡|jdj_|jdƒ}d|j_t ¡}t ¡}t ||¡}|dksNJ‚dS)Nr rƒFzDeactivation aborted.)rrrr|rr™rÚ unregister)r r8r@rìÚresr$r$r%Útest_abort_unregisterns  z$UnregisterTest.test_abort_unregisterr/cCs€t ¡}dg|j_||jdj_t ¡df|jd_t ¡}||jdj_t ¡}t ¡}t ||¡}|dusrJ‚|  d¡dS)Nr{r ZfoorPrbzAccount deactivated.) rr*rkrrr|ÚClientrr„rs)r r1r}Ú cb_clientr@rìr…r$r$r%Útest_unregisterzs   zUnregisterTest.test_unregistercCs|t ¡}g|j_||jdj_t ¡}||jdj_t ¡}d|_t ¡}t  ||¡}d}||ksfJ‚|j j j dusxJ‚dS)Nr rbz"https://acme.example.com/directoryzNCould not find existing account for server https://acme.example.com/directory.F) rr*rkrrr|r‡rärr„rëZdeactivate_registrationr)r r}rˆr@rìr…Úmr$r$r%Útest_unregister_no_accounts  z)UnregisterTest.test_unregister_no_accountN) rCrDrErXrr†rrGr‰r‹r$r$r$r%r‚as   r‚c@s"eZdZdZe d¡dd„ƒZdS)ÚMakeOrVerifyNeededDirsz}| ddg¡|js@J‚d|jd d vsVJ‚Wdƒn1sj0YdS) Nú/tmp/nonexistent©r«r—©NNr¡r“ú --redirectrrrQ)rr*rrGrprr')r Ú mock_findr€r"r¨Ú mock_pickr$r$r%Útest_selection_questionÏs  z#EnhanceTest.test_selection_questionc Cs®tjdd|_dg|_d|_t d¡tt d¡J}| gd¢¡}|jsLJ‚d|jd d vsbJ‚|jjsnJ‚Wdƒn1s‚0YWdƒn1s 0YdS) Nr”r•r—r–r¡z.certbot._internal.main.plug_sel.logger.warning)r“rîrQr—z make senser)rr*rrGrprr'Úenhance_config)r r˜r€r"r¨Zmock_logrNr$r$r%Útest_selection_auth_warningÝs   z'EnhanceTest.test_selection_auth_warningcs¸tjdd|_dg|_t d¡„| gd¢¡‰ddg}dg}ˆjjsJJ‚t‡fd d „|DƒƒsdJ‚t‡fd d „|Dƒƒr~J‚dˆjj d d vs–J‚Wdƒn1sª0YdS) Nr”r•r—r¡©r“r—ú--hstsZredirectZhstsZuirc3s|]}tˆj|ƒVqdSr‡©Úgetattrr@©rùrò©rNr$r%rÒ÷r6z7EnhanceTest.test_enhance_config_call..c3s|]}tˆj|ƒVqdSr‡rŸr¡r¢r$r%rÒør6r) rr*rrGrpr›rÚallÚanyr')r r¨r€r"Zreq_enhZ not_req_enhr$r¢r%Útest_enhance_config_callìs  z$EnhanceTest.test_enhance_config_callcCsltjdd|_dg|_t d¡8| gd¢¡}|jjsr?rrrp)r r¨r€r$r$r%Útest_user_abort_domainss z#EnhanceTest.test_user_abort_domainscCs>t tj¡| gd¢¡Wdƒn1s00YdS)N)r“rîr)r>r?rr½rprur$r$r%Útest_no_enhancements_definedsz(EnhanceTest.test_no_enhancements_definedrzcCs:dg|_d|_t ¡|_| ddg¡}|jjdus6J‚dS)Nr—r–r“ržF)rrrðr=rpr›r)r r¨r€r™rNr$r$r%r€s  z'EnhanceTest.test_plugin_selection_errorr¡cCs^|j|_ddg|_tjdd|_| ddg¡|jjjsr?rr~rpr«r$r$r%Ú%test_enhancement_enable_not_supported,s  z1EnhanceTest.test_enhancement_enable_not_supportedcCs>t tj¡| gd¢¡Wdƒn1s00YdS)N)r“rªrž)r>r?rrrprur$r$r%Ú test_enhancement_enable_conflict8sz,EnhanceTest.test_enhancement_enable_conflict)rCrDrErFrXrrprrGršrœr¥r¦r§r¨r€rˆr‰r¬r­r®r…r$r$rfr%rŽ´sV       rŽcsXeZdZdZ‡fdd„Ze d¡e d¡dd„ƒƒZe d¡e d¡dd „ƒƒZ‡Z S) Ú InstallTestz)Tests for certbot._internal.main.install.cstƒ ¡tjtjd|_dSr)rWrXrr*rr‘r’rurfr$r%rX@s zInstallTest.setUpr r¡cCsht |jd¡|_tj ¡}d|j_d|j_t   t j ¡t  |j|¡Wdƒn1sZ0YdS)NrTZ nonexistent)rr|r@rrrjrkr}r2r>r?rr~rr¢©r rºr¨ror$r$r%Ú&test_install_enhancement_not_supportedDs  z2InstallTest.test_install_enhancement_not_supportedcCsp|j|_tj ¡}d|j_d|j_d|j_d|j_ t   t j ¡t |j|¡Wdƒn1sb0YdS)NTr”)r’rrrjrkr@r}r2r­rãr>r?rršrr¢r°r$r$r%Ú$test_install_enhancement_no_certnameNs z0InstallTest.test_install_enhancement_no_certname) rCrDrErFrXrrGr±r²r…r$r$rfr%r¯=s  r¯c@sxeZdZdZdd„Zdd„Zedd„ƒZedd „ƒZd d „Z d d „Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„ZdS)ÚReportNewCertTestznTests for certbot._internal.main._report_new_cert and certbot._internal.main._csr_report_new_cert. cCsJt d¡|_|j ¡|_t d¡|_|j ¡|_t ddddd¡|j_dS)Nr/z+certbot._internal.main.crypto_util.notAfteri²rPr) rrGÚ notify_patchrZr1Únotafter_patchZ mock_notafterrÍrrur$r$r%rX`s     zReportNewCertTest.setUpcCs|j ¡|j ¡dSr‡)r´rdrµrur$r$r%rhs zReportNewCertTest.tearDowncOsddlm}||i|¤ŽS)Nr)Ú_report_new_cert)rmr¶)Úclsrnr”r¶r$r$r%rpls zReportNewCertTest._callcOsddlm}||i|¤ŽS)Nr)Ú_csr_report_new_cert)rmr¸)r·rnr”r¸r$r$r%Ú _call_csrqs zReportNewCertTest._call_csrcCs(| tjddddd¡|j d¡dS©NT©rr#©rprrr1r0rur$r$r%Útest_report_dry_runvsz%ReportNewCertTest.test_report_dry_runcCs(| tjddddd¡|j d¡dSrº©r¹rrr1r0rur$r$r%Útest_csr_report_dry_runzsz)ReportNewCertTest.test_csr_report_dry_runcCsˆt t¡(| tjddddd¡Wdƒn1s80Yt t¡(| tjddddd¡Wdƒn1sz0YdS)NFr»)r>r?rrprrr¹rur$r$r%Útest_report_no_paths~s 6 z&ReportNewCertTest.test_report_no_pathscCs(| tjddddd¡|j d¡dS)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¼rur$r$r%Ú test_report…sþÿzReportNewCertTest.test_reportcCs(| tjddddd¡|j d¡dS)NFr»rÁrÂ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¼rur$r$r%Útest_report_no_key”sþÿz$ReportNewCertTest.test_report_no_keycCs*| tjdddddd¡|j d¡dS)NF)rÚpreconfigured_renewalrÁrÂrÃúâ 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¼rur$r$r%Ú$test_report_no_preconfigured_renewal¢sþÿz6ReportNewCertTest.test_report_no_preconfigured_renewalcCs(| tjddddd¡|j d¡dS)NFr»rÁz/path/to/chain.pemrÂ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¾rur$r$r%Útest_csr_report¯s ÿÿz!ReportNewCertTest.test_csr_reportcCs,| tjddddddd¡|j d¡dS) zBShouldn't get a message about autorenewal if no --manual-auth-hookFrN)rrÚmanual_auth_hookrÁrÂrÃrÇr¼rur$r$r%Útest_manual_no_hooks_report»sþÿz-ReportNewCertTest.test_manual_no_hooks_reportN)rCrDrErFrXrÚ classmethodrpr¹r½r¿rÀrÄrÅrÈrÉrËr$r$r$r%r³[s    r³c@sZeZdZdZdd„Zdd„Zedd„ƒZedœd d „Z d d „Z d d„Z dd„Z dd„Z dS)ÚReportNextStepsTestz3Tests for certbot._internal.main._report_next_stepscCsLtjdddddd|_t d¡}| ¡|_| |j¡tj |_ t   ¡t_ dS)Nr—Tr)Z cert_namerÆr rrÊr/) rr*r@rGrZr1rcrdrbr~Ú old_stdoutr†r‡)r r´r$r$r%rXÍsþ   zReportNextStepsTest.setUpcCs |jt_dSr‡)rÎrbr~rur$r$r%r×szReportNextStepsTest.tearDowncOsddlm}||i|¤ŽdS)Nr)Ú_report_next_steps)rmrÏ)r·rnr”rÏr$r$r%rpÚs zReportNextStepsTest._call)ÚreturncCs@|jjdksJ‚|jjddddks,J‚|jjdddS)Nr1rz NEXT STEPS:rP)r1r<rÙrur$r$r%Ú_outputßszReportNextStepsTest._outputcCs.d|j_d|j_| |jdd¡|j ¡dS)zNo steps for a normal renewalrz /bin/trueN)r@rrÊrpr1r;rur$r$r%rÄäszReportNextStepsTest.test_reportcCs,d|j_| |jdd¡d| ¡vs(J‚dS)z--csr requires manual renewalzfoo.csrNz--csr will not be renewed)r@r rprÑrur$r$r%rÉësz#ReportNextStepsTest.test_csr_reportcCs,d|j_| |jdd¡d| ¡vs(J‚dS)z/--manual without a hook requires manual renewalrNz--manual certificates requires)r@rrprÑrur$r$r%Útest_manual_no_hook_renewalñsz/ReportNextStepsTest.test_manual_no_hook_renewalcCs,d|j_| |jdd¡d| ¡vs(J‚dS)z2No --preconfigured-renewal needs manual cron setupFNz!https://certbot.org/renewal-setup)r@rÆrprÑrur$r$r%Útest_no_preconfigured_renewal÷sz1ReportNextStepsTest.test_no_preconfigured_renewalN)rCrDrErFrXrrÌrpr*rÑrÄrÉrÒrÓr$r$r$r%rÍÊs  rÍcsjeZdZdZ‡fdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z e   d¡dd„ƒZ dd„Z‡ZS)ÚUpdateAccountTestz/Tests for certbot._internal.main.update_accountcstt d¡t d¡t d¡t d¡t d¡t d¡t ¡dœ‰‡fdd „ˆDƒ|_ˆ ¡D]}| |j¡qXtƒ  ¡S) Nrzr…r_r¼r/z*certbot._internal.eff.prepare_subscription)r ÚatexitrbÚdetermine_accountÚnotifyÚ prepare_subr csi|]}|ˆ| ¡“qSr$r÷©rùrú©rer$r%rü r6z+UpdateAccountTest.setUp..© rrGrˆr‰rrrcrdrWrXrrfrÚr%rX sù  zUpdateAccountTest.setUpc Csšt d¡|t d¡Rd|jjd|jjd|jjdg|}t |dd…¡WdƒWdƒS1sn0YWdƒn1sŒ0YdS©Nrr„rrmrnro©rrGr@rrrrqrr,r$r$r%rp s ÿ þþzUpdateAccountTest._callcCsXt ¡}t ¡}t ¡}|g|j_||jdj_|j|j_|t ¡f|jd_|||fS)Nr rÖ)rr*rkrrr|ÚbodyrÌ©r rQZ mock_accountÚ mock_regrr$r$r%Ú_prepare_mock_account s  z'UpdateAccountTest._prepare_mock_accountcCs‚| ¡\}}}| |¡}|dus$J‚|jd ¡jjjdks@J‚|jjj dd|j jdks`J‚|jd  d¡|jd  ¡dS) z9Utility to assert that email removal is handled correctlyNrbrPr$©Úcontactr×zFAny contact information associated with this account has been removed.rØ) rárprr‡rëÚupdate_registrationr<rÞÚupdater0Ú update_regrr;)r rnr•rQràÚresultr$r$r%Ú_test_update_no_contact# s   ÿz)UpdateAccountTest._test_update_no_contactcCs8t ¡}g|j_||jdj_| gd¢¡dks4J‚dS)ú2Test that no existing account is handled correctlyr )Úupdate_accountrxryú]Could not find an existing account for server https://acme-v02.api.letsencrypt.org/directory.N©rr*rkrrr|rp©r rQr$r$r%Útest_no_existing_accounts5 s  ÿz+UpdateAccountTest.test_no_existing_accountscCs| ddg¡dS)zBTest that --register-unsafely-without-email is handled as no emailrêz!--register-unsafely-without-emailN©rèrur$r$r%Ú test_update_account_remove_email> sz2UpdateAccountTest.test_update_account_remove_emailcCs| gd¢¡dS)z9Test that providing an empty email is handled as no email)rêr—r;Nrïrur$r$r%Útest_update_account_empty_emailB sz1UpdateAccountTest.test_update_account_empty_emailz,certbot._internal.main.display_ops.get_emailcCsŒd|_| ¡\}}}t ¡}||jdj_| dg¡}|dusBJ‚|jjj dksTJ‚|j j dksdJ‚|jdj dksxJ‚|jd  d¡dS) z=Test that updating with a singular email is handled correctlyzuser@example.comrbrêNrPrØr×z4Your e-mail address was updated to user@example.com.) rrárr*rr‡rprërär<rær0)r Z mock_emailr•rQrNrçr$r$r%Útest_update_account_with_emailF s   ÿz0UpdateAccountTest.test_update_account_with_emailcCs\| ¡\}}}| gd¢¡dus$J‚|jjjddgd|jjdksHJ‚|jd d¡dS) z8Test that multiple email addresses are handled correctly)rêr—z!user@example.com,user@example.orgNzmailto:user@example.comzmailto:user@example.orgrârPr×zEYour e-mail address was updated to user@example.com,user@example.org.)rárprÞrår0rær<r)r r•rQràr$r$r%Ú(test_update_account_with_multiple_emails[ sÿ ÿz:UpdateAccountTest.test_update_account_with_multiple_emails)rCrDrErFrXrprárèrîrðrñrrGròrór…r$r$rfr%rÔþs    rÔcs`eZdZdZ‡fdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z ‡Z S)ÚShowAccountTestz-Tests for certbot._internal.main.show_accountcslt d¡t d¡t d¡t d¡t d¡t ¡dœ‰‡fdd„ˆDƒ|_ˆ ¡D]}| |j¡qPtƒ  ¡S) Nrzr…r_r¼r/)r rÕrbrÖr×r csi|]}|ˆ| ¡“qSr$r÷rÙrÚr$r%rüs r6z)ShowAccountTest.setUp..rÛrrfrÚr%rXj sú zShowAccountTest.setUpc Csšt d¡|t d¡Rd|jjd|jjd|jjdg|}t |dd…¡WdƒWdƒS1sn0YWdƒn1sŒ0YdSrÜrÝr,r$r$r%rpy s ÿ þþzShowAccountTest._callcCs\t ¡}t ¡}t ¡}|g|j_||jdj_|j|j_d|jj _|t ¡f|jd_dS)Nr s foobarbazrÖ) rr*rkrrr|rÞrÌrêZ thumbprintrßr$r$r%rá s   z%ShowAccountTest._prepare_mock_accountcCsd| ¡t ¡}t ¡}||j_d|_||jj_||j dj _dg}|  |¡|jjj dks`J‚dS)Nz+https://www.letsencrypt-demo.org/acme/reg/1rbÚ show_accountrP) rárr*rÞrãZurirëZquery_registrationrrr‡rpr<)r rãrNràrnr$r$r%Ú_test_show_account‹ s  z"ShowAccountTest._test_show_accountcCs6t ¡}g|j_||jdj_| dg¡dks2J‚dS)rér rõrëNrìrír$r$r%rîš s  ÿz)ShowAccountTest.test_no_existing_accountsc Csp| ¡t ¡}d|_||jdj_z| dg¡Wn6tj yj}zdt |ƒksVJ‚WYd}~n d}~00dS)z;Test that issues with the ACME client are handled correctlyNrbrõzACME client is not set.) rárr*rërr‡rrprrr*)r rNròr$r$r%Útest_no_existing_client£ sz'ShowAccountTest.test_no_existing_clientcCs:| d¡|jdjdksJ‚|jd t d¡g¡dS)Nr$r×rPz¾Account 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örr<Zassert_has_callsrr×rur$r$r%Útest_no_contacts® s   ÿz ShowAccountTest.test_no_contactscCs>d}| |¡|jdjdks"J‚|jd t d¡g¡dS)N)úmailto:foo@example.comr×rPzÉAccount 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 rãr$r$r%Útest_single_email¸ s   ÿz!ShowAccountTest.test_single_emailcCs>d}| |¡|jdjdks"J‚|jd t d¡g¡dS)N)rúzmailto:bar@example.comr×rPzÛAccount 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ûr$r$r%Útest_double_emailà s   ÿz!ShowAccountTest.test_double_email)rCrDrErFrXrprárörîr÷rùrürýr…r$r$rfr%rôg s      rôc@s`eZdZdZejZdZe›dZe j dd„ƒZ e j dd„ƒZe j d ¡d d d „ƒZd d „ZdS)Ú TestLockOrderzFTests that Certbot's directory locks were acquired in the right order.zExpected TestLockOrder errorz|1 renew failureccs4t d¡}|VWdƒn1s&0YdS)Nzcertbot._internal.lock.lock_dir)rrG)r Ú mock_lock_dirr$r$r%rÿ× s zTestLockOrder.mock_lock_dirc #s‡‡‡fdd„}‡‡‡‡fdd„}tj tjd|¡Htj tjd|¡dVWdƒn1sd0YWdƒn1s‚0YdS)zJPatches plugin prepare to call mock_lock_dir and raise the expected error.csˆˆƒˆ ˆj¡‚dSr‡©ÚEXPECTED_ERROR_TYPEÚEXPECTED_ERROR_STR©Z unused_self)Úauthenticator_dirrÿr r$r%Úauthenticator_lockß sz=TestLockOrder.mock_plugin_prepare..authenticator_lockcs ˆˆƒˆdkrˆ ˆj¡‚dS)Nr¢rr)Ú installer_dirrÿr Ú subcommandr$r%Úinstaller_lockã sz9TestLockOrder.mock_plugin_prepare..installer_lockrçN)rrGÚobjectrrÁrr|)r rrrÿrrrr$)rrrÿr rr%Úmock_plugin_prepareÜ s  z!TestLockOrder.mock_plugin_preparezcertonly install renew run)Úparamsc csÎt|dƒ}t|dƒ}t|dƒ}t|dƒ}t|dƒ}|j} | dddd d d |d |d |g } t |d¡| |||| ¡@||||g} | dkrœ| | fVn| | |gfVWdƒn1sÀ0YdS)aRSets 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. rr@r"ZlogsZworkrîrz-irz--no-random-sleep-on-renewrrnrmr'r¢N)r*Zparamrˆr+r ) r rÿZrequestZtmp_pathrrrrqrrrrnÚ lock_orderr$r$r%Úargs_and_lock_orderð s       þ   z!TestLockOrder.args_and_lock_ordercCs„|\}}tj|j|jdt |¡Wdƒn1s:0Y|jt|ƒksVJ‚t|j|ƒD]\}}|dd|ksbJ‚qbdS)Nr7r) r>r?rÚEXPECTED_ERROR_STR_REGEXrr<rÔÚziprÙ)r r rÿrnr r×Z locked_dirr$r$r%Útest_lock_order s (zTestLockOrder.test_lock_orderN)rCrDrErFrrrrrr>ZfixturerÿÚ contextlibÚcontextmanagerr rir rr$r$r$r%rþÏ s    rþÚ__main__rP)UrFrrÍÚ importlibrrur†rÎr[rÀrbr¯rÚtypingrZunittestrr Zjosepyrœr>rÎZ acme.messagesrrhrŠrrr r Zcertbot._internalr r r rrZcertbot._internal.pluginsrrrrZcertbot.compatrrZcertbot.pluginsrZcertbot.tests.utilZtestsrˆrùrÂrtr¢ruZJWKRSArpZ load_vectorrÐrornZTestCaserZConfigTestCaserHr†r²ZTempDirTestCaser»rðr3rFrlr‚rŒrŽr¯r³rÍrÔrôrþrCÚexitÚargvÚ__file__r$r$r$r%Ús’                          RXggk> o4ihK