a ‚oeÛ×ã@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$úBC:\Program Files\Certbot\pkgs\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)NZpauseF)Ú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‘rrr 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©rœr2Ú 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 e  d¡dd„ƒZ dd„Z e  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_certZ_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-staging-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ýrþrÿ) rrrjrkr rlrmrrrr r )r Z passed_argsZ full_argsror@rr Z 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)NZapacherñròróú --cert-name example.com --apacheÚ renewalparamsÚ authenticator)rrrrrrpri)r rÚ new_configr$r$r%Útest_update_configuratores   z(ReconfigureTest.test_update_configuratorz&certbot._internal.hooks.validate_hookscCs˜d|jvsJ‚| d ¡dg¡}|dddks6J‚| d ¡dg¡}|dddks^J‚d|jvslJ‚| d ¡dg¡}|dddks”J‚dS) NZpre_hookz"--cert-name example.com --pre-hookzecho prerz echo pre2Z renew_hookz%--cert-name example.com --deploy-hookz echo deploy)r rpri)r Zunused_validate_hooksrr$r$r%Útest_update_hookspsz!ReconfigureTest.test_update_hookscCsŠtj|jd_z| d ¡¡Wntjy4Yn0t|jdƒ }tj |ddd}Wdƒn1sh0Y|dddks†J‚dS) Nrôrrýrþrÿrrr) rrrr=rprirrr r )r r rr$r$r%Útest_dry_run_failss.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ýrþrÿrròróz--cert-name example.com --nginxrrzT Successfully updated configuration. Changes will apply when the certificate renews.)rrrr r r rrrrrrpriÚassert_called_with)r Ú mock_notifyr r rrr$r$r%Útest_report_resultss (ÿ&  ÿz#ReconfigureTest.test_report_results)rCrDrErFrXrrprrrGrrrrr#r…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)rmr%)r r.r%r$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_revoker&)r Zunused_mock_get_utilityr$r$r%Útest_delete_flag_opt_outÂsz0DeleteIfAppropriateTest.test_delete_flag_opt_outcCs|ƒ}d|j_| ¡dSrw)r˜rr&)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_dirsÍs   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_dirsr0r@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/r0r@r$r$r%Útest_noninteractive_deletionôs  z4DeleteIfAppropriateTest.test_noninteractive_deletioncCsT|j}d|_d|_d|_d|_d|_d|_| |¡|jdksBJ‚|ƒjjrPJ‚dSr3) r@r'râr2rrpr<r˜rr4r$r$r%Útest_opt_in_deletions  z,DeleteIfAppropriateTest.test_opt_in_deletionN)rCrDrErFrpr&rˆr‰r(r*rrGr1r2r5r6r$r$r$r%r$¶sH   r$cs´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%rX s   zDetermineAccountTest.setUpc Cs‚ddlm}t d¡X}t ¡0|j|_||jƒWdƒWdƒS1sV0YWdƒn1st0YdS)Nr)Ú_determine_accountz1certbot._internal.main.account.AccountFileStorage) rmrArrGrˆr‰r>rr@)r rAÚ mock_storager$r$r%rp,s   ÿ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=rprrÚstr)r Úerr_msgÚ exceptionÚmock_get_emailÚ mock_registerÚerrr$r$r%Ú_register_error_common4s ÿz+DetermineAccountTest._register_error_commoncCsl|j |jd|j¡|jdj|j_|jddf| ¡ks@J‚|jdj|jjksXJ‚|jjdushJ‚dS)NrP) r>Úsaver=r?r9r@r rpr<rur$r$r%Útest_args_account_set?s z*DetermineAccountTest.test_args_account_setcCs\|j |jd|j¡|jddf| ¡ks0J‚|jdj|jjksHJ‚|jjdusXJ‚dS)Nr) r>rKr=r?rpr9r@r r<rur$r$r%Útest_single_accountFsz(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) r=r>rKr?rrpÚsetÚ call_argsr9r@r r<)r Úmock_choose_accountsrÐr$r$r%Útest_multiple_accountsLs   z+DetermineAccountTest.test_multiple_accountsc Csj|jD]}|j ||j¡qd|_z | ¡Wn6tjyd}zdt|ƒvsPJ‚WYd}~n d}~00dS)NzNo account has been chosen) r=r>rKr?rrprrrD)r rPrÐrIr$r$r%Útest_multiple_accounts_canceledVs  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)NrCúcertbot._internal.main.clientr)Ztos_cbzAccount registered.)rrrGr=ÚsentinelrêÚregisterrprsr@r>rtr9r r<)r r"rGÚ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 emailrSrP) r@r<rrGr=rTrêrUrrpr9r )r rVr$r$r%Útest_no_accounts_emailps  &z+DetermineAccountTest.test_no_accounts_emailcCsd}| |t |¡¡dS)Nz$Some error message raised by Certbot)rJrr)r rEr$r$r%Útest_register_error_certbotxsz0DetermineAccountTest.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_errorrJ©r rErFr$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)rZr[r]r$r$r%Ú"test_register_error_acme_type_only‚s z7DetermineAccountTest.test_register_error_acme_type_only)rCrDrErFrXrprrGrJrLrMrQrRrWrXrYr^r_r…r$r$rfr%r7s&     r7cs²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¡d6d7„ƒZe   d8¡e   d9¡e   d¡d:d;„ƒƒƒZe   d8¡e   d9¡dd?„ƒƒZe   d8¡e   d9¡d@dA„ƒƒZe   d8¡e   d9¡dBdC„ƒƒZdDdE„ZdFdG„ZdHdI„Z dJdK„Z!dLdM„Z"dNdO„Z#dPdQ„Z$d¾dRdS„Z%e   d¡dTdU„ƒZ&e   d¡e   dV¡e   d¡e   dW¡dXdY„ƒƒƒƒZ'e   d¡dZd[„ƒZ(ddd\dde)j) *¡ddfd]d^„Z+e   d¡e   dV¡e   dW¡d_d`„ƒƒƒZ,e   da¡e   db¡e   dW¡dcdd„ƒƒƒZ-dedf„Z.dgdh„Z/didj„Z0e   dk¡dldm„ƒZ1e   dk¡dndo„ƒZ2e   dp¡dqdr„ƒZ3e   dp¡dsdt„ƒZ4e   du¡dvdw„ƒZ5e   d¡dxdy„ƒZ6dzd{„Z7d|d}„Z8d~d„Z9d€d„Z:d‚dƒ„Z;d„d…„ZdŠd‹„Z?dŒd„Z@dŽd„ZAdd‘„ZBe   d’¡d“d”„ƒZCd•d–„ZDd—d˜„ZEd™dš„ZFd›dœ„ZGddž„ZHdŸd „ZIeJ K¡e   d¡¡e   d¢¡e   d¡d£d¤„ƒƒƒƒZLdÀd¥d¦„ZMe   d§¡e   dV¡e   d¡d¨d©„ƒƒƒZNe   d§¡dªd«„ƒZOe   d¬¡e   d­¡d®d¯„ƒƒZPd°d±„ZQe   d¬¡e   d¡d²d³„ƒƒZRe   d¡d´dµ„ƒZSe   d’¡e   d¶¡d·d¸„ƒƒZTe   d¹¡e   d’¡e   d¢¡e   d¡dºd»„ƒƒƒƒZU‡ZVS)ÁÚ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.isfilerSN)rrÃÚisfilerrGr=Ú_call_no_clientmock) r rnÚstdoutÚ mockisfileroZmock_ifrVr#Ústderrr$rnr%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)rgÚioÚStringIOrrGr)r rnrrZ toy_stdoutrtr#r$r$r%rq´s   lzMainTest._call_no_clientmockcCsFt d¡(}| g¡d|jks$J‚Wdƒn1s80YdS)Nzcertbot._internal.main.runrP)rrGrpr<)r Úmock_runr$r$r%Ú test_no_flags¿s  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)Nrurvrxz --versionÚcertbotz Output is {0})rzr{rrGrÚ SystemExitÚgetvaluerh)r Ztoy_outZtoy_errÚoutputr$r$r%Ú test_version_string_program_nameÄs ÿ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 messageNrx)rrGrrgrZMissingCommandlineFlagrD)r rnÚmessageÚexcZexc_r$r$r%Ú_cli_missing_flagÑs :&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_noninteractiveÜs 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)rgrr*rrGÚ ClientNetworkrqr Zget_os_info_uarOÚ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-pathrkú --chain-pathrjT©rsrP)rpr<)r Zmock_pick_installerÚ_recr$r$r%Útest_installer_selections ÿ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) NrArjrk©râÚ chain_pathÚfullchain_pathÚkey_pathr”)r–ú --cert-nameÚwhateverTr›r) rr*rˆÚ temp_joinrGrrprOrâr r¡)r Ú_instrœÚ mock_installr"Ú mock_getlinÚ call_configr$r$r%Útest_installer_certname s ý 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)NrArjrkržr”r–r¢r£r™Zoverriding_privkeyTr›rr˜Zoverriding_cert) rr*rˆr¤rGrrprOrâr rŸr¡Úreset)r r¥rœr¦r‰r"r§r¨r$r$r%Útest_installer_param_overrides6 ý  ÿÿ  ÿÿ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_error8sz#MainTest.test_installer_param_errorrcCs‚tjt d¡t d¡t d¡t d¡d}t d¡&}||_|jdgddWdƒn1s`0Y|jstJ‚|js~J‚dS) NrArjrkržr”r–Tr›)rr*rˆr¤rGrrpr)r Ú mock_instZ mock_getcertr¥rœr"r§r$r$r%Útest_installer_select_cert?s ý . 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*rOÚ isinstancerÚ Authenticatorr<)r Zmock_exe_existsr‰r‘r’Z real_pluginsrnr#r^Zmock_gscZ unused_configr³Zunused_installerÚ mock_certonlyr$r$r%Útest_configurator_selectionNs,  ý     N z$MainTest.test_configurator_selectioncCsV| dg¡\}}}}d|jjks$J‚| gd¢¡\}}}}|j tjdtjtj¡dS)NÚrollbackrP)r¸z --checkpointsZ123é{)rpr¸r<rsrrt)r r‰rVr$r$r%Ú test_rollbackws ÿzMainTest.test_rollbackz3certbot._internal.cert_manager.update_live_symlinkscCs| dg¡d|jksJ‚dS)NZupdate_symlinksrP©rqr<©r rr$r$r%Útest_update_symlinks€s zMainTest.test_update_symlinksz+certbot._internal.cert_manager.certificatescCs| dg¡d|jksJ‚dS)NZ certificatesrPr»r¼r$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ÃrjÚrangeÚlenrpÚlist)r r‰Ú_detÚ mock_discornr$rÅr%Ú test_pluginss  ÿÿzMainTest.test_pluginscCsšg}|j ¡}t ¡}tj|d&| dg|¡\}}}}Wdƒn1sN0Y|j ¡| ¡j  |¡| ¡  ¡}|  ¡  ¡t |ƒks–J‚dS)N©rrro) rjrkrzr{rˆÚpatch_display_util_with_stdoutrpÚvisiblersÚifacesr€ÚstriprD©r rËrÌrÑrorrr‰Ú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)r@ÚmodeÚstrictr‰r$r$r%Ú throw_error®sz?MainTest.test_plugins_no_args_unprivileged..throw_errorzcertbot.util.set_up_core_dirrÎro)rjrkrzr{rrGrˆrÏr=rprÐrsrÑr€rÒrD) r rËrÌrÑrorØrrZmock_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)rjrkrzr{rˆrÏrprÐrsrÑÚinitr<r€rÒrDrÓ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)rjrkrzr{rˆrÏrprÐrsrÑrÚr<ÚprepareÚ availabler€rÒrD) r rËrÌrÑrorrr‰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ÚkeyrjÚ fullchainr²rŽr˜r™ršz--fullchain-pathr) rrGrprOrârrÃrÄr¡rŸr )r rArßrjràr¶r@Úunused_pluginsr$r$r%Útest_certonly_abspathás þ$zMainTest.test_certonly_abspathc CsZz| gd¢¡dsJdƒ‚Wn6tjyT}zdt|ƒvs@J‚WYd}~n d}~00dS)N)ú-aZbad_authrŽFz!Exception should have been raisedz-The requested bad_auth plugin does not appear)rprÚPluginSelectionErrorrD©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_domainùs,,,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_besteffortsz!MainTest.test_csr_with_besteffortc Cs\z| dtg¡Wn8tjyJ}zdt|ƒvs4J‚WYd}~dSd}~00dsXJdƒ‚dS)Nz--csrzPlease try the certonlyFz2Expected supplying --csr to fail with default verb)rpr¡rrÚreprrår$r$r%Útest_run_with_csr s 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_domainssÿ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_domainssz+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 r?rnÚ mock_renewalr^r$r$r%Ú_certonly_new_request_commons   z%MainTest._certonly_new_request_commoncCsXt ¡}d|j_| |dg¡|jjdks.J‚|jdksr?rrròr)r rar?r$r$r%Ú!test_certonly_new_request_failureHs (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)ZpemrjÚcsrcsˆ |¡dS)zWrite message to stdout.N)r)rƒrnr“rÎr$r%Ú write_msgfsz0MainTest._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ÃrúrÅr@rrr*Zshould_autorenewrZhas_pending_deploymentr-r:Zelliptic_curveÚ reuse_keyrzr{Úobtain_certificaterGrr=ZnotAfterrpÚprintÚAssertionErrorÚ tracebackÚ format_excrsrtr<Ú _dump_logrreÚread)r Údue_for_renewalÚ extra_argsÚlog_outrnÚ should_renewÚerror_expectedÚ quiet_modeÚ expiry_daterÚnew_keyrârŸr"Z mock_certrZmock_keyr?rZmock_fdcr^Z mock_displayZmock_crypto_utilr#r‰Úlfr$rÎr%Ú_test_renewal_commonPsŠ ÿÿ  ÿ       ÿÿª   ÿÿ 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_versionrO)r r‰rHr÷Zlineager$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)rr°r)r z not yet duer)rÚassert_any_callrrO)r r‰r‘r"Zmock_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@rerrr )r Zlog_pathrr$r$r%r·s   zMainTest._dump_logcCs.t |jjd¡gd¢}|jdg|dddS)Núsample-renewal.conf©r)rôrT©rnr ©rˆÚ make_lineager@rr©r rnr$r$r%Útest_renew_verb¾szMainTest.test_renew_verbcCs4tj|jjdddgd¢}|jdg|ddddS)NrF©Zec)r)rôú --reuse-keyT©rnr rrr r$r$r%Útest_reuse_keyÃszMainTest.test_reuse_keyz6certbot._internal.storage.RenewableCert.save_successorcCs4tj|jjdddddg}|jdg|ddddS)NrFr"r)r#Tr$r©r Zunused_save_successorrnr$r$r%Útest_reuse_key_no_dry_runÈsz"MainTest.test_reuse_key_no_dry_runcCs2t |jjd¡gd¢}|jdg|dddddS)Nr)r)r#z --new-keyT)rnr rrrr&r$r$r%Ú test_new_keyÎs ÿzMainTest.test_new_keyz sys.stdincCspd|j_t |jjd¡gd¢}|jdg|dd|jjdksBJ‚|jj dd}d|krfdkslnJ‚dS) NFrrTrrPrià) Úisattyrrˆrr@rrrhr<rO)r ÚstdinrnZsleep_call_argr$r$r%Ú!test_noninteractive_renewal_delayÕsz*MainTest.test_noninteractive_renewal_delaycCsFd|j_t |jjd¡gd¢}|jdg|dd|jjdksBJ‚dS)NTrrrr) r)rrˆrr@rrrhr<)r r*rnr$r$r%Ú!test_interactive_no_renewal_delayás z*MainTest.test_interactive_no_renewal_delayr'cCsld|_t |jjd¡tj ¡tjdd}|jddddg|d\}}}d|  ¡vsXJ‚d|  ¡vshJ‚dS) NFréZ)Zdaysr))r r rnrzNo renewals were attempted.z7The following certificates are not due for renewal yet:) rrˆrr@rrÌÚnowZ timedeltarr€)r r Zexpiryr‰rrr$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) Nrr)rôTr)r)rôz-q)rnr rr,)rˆrr@rrr€)r r‰rnrrÚoutr$r$r%Útest_quiet_renewós  ÿ zMainTest.test_quiet_renewcCs0t |jjd¡gd¢}|jdg|ddddS)Nr)r)rôú--post-hook=no-such-commandTF©rnr rrr r$r$r%Útest_renew_hook_validations  ÿz#MainTest.test_renew_hook_validationcCsZt |jjd¡gd¢}t d¡$|jdg|dddWdƒn1sL0YdS)Nr)r)rôr2z--disable-hook-validationz!certbot._internal.hooks.post_hookTFr3)rˆrr@rrrGrr r$r$r%Útest_renew_no_hook_validations   ÿz&MainTest.test_renew_no_hook_validationcCs|tj |jjd¡}tj |¡s(t |¡ttj |d¡dƒWdƒn1sR0Ygd¢}|j dg|ddddS)Nrûz empty.confrürFTr3) rrÃrÅr@rrrrrr)r Zrdrnr$r$r%Útest_renew_verb_empty_configs  z%MainTest.test_renew_verb_empty_configcCs*t |jjd¡|jdgdgd¢ddS)NrT©r)rôr¢zsample-renewal)r rnrrur$r$r%Útest_renew_with_certnames ÿz!MainTest.test_renew_with_certnamecCs|jdgdgd¢dddS)NTFr7)r rnr)rrur$r$r%Útest_renew_with_bad_certnames þ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@rrrrr)r Zrenewer_configs_dirr r$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)Tr F)TN) r:rrGr*ràÚ configurationr-rÚ setdefaultrr)r rr-Úassert_oc_calledr“Úmock_rcr"ršr$r$r%Ú_test_renew_common(s    2 zMainTest._test_renew_commoncCs|jddddS)NFT©r>r©r@rur$r$r%Útest_renew_no_renewalparams=sz$MainTest.test_renew_no_renewalparamscCs|jiddddS)NFT)rr>rrBrur$r$r%Útest_renew_no_authenticator@sÿz$MainTest.test_renew_no_authenticatorcCsdddœ}|j|ddddS)NÚwebrootz over 9000)rZ rsa_key_sizeTF)rrr>rB©r rr$r$r%Útest_renew_with_bad_intDs ÿÿz MainTest.test_renew_with_bad_intcCsdddœ}|j|dddS)NrEÚNone)rZ http01_portT©rr>rBrFr$r$r%Útest_renew_with_nonetype_http01Js ÿÿz(MainTest.test_renew_with_nonetype_http01cCs$ddi}dg}|j|d|dddS)NrrEu uniçodé.comTF)rrr-r>rB)r rr-r$r$r%Útest_renew_with_bad_domainPs ÿz#MainTest.test_renew_with_bad_domainr¤cCs2t ¡t ¡f|_ddi}|j|dd ¡ddS)NrrETzrenew --configurator apache©rr>rn)rr*rr@ri)r r§rr$r$r%Útest_renew_with_configuratorVs þz%MainTest.test_renew_with_configuratorcCsddddœ}|j|dddS)NrErHZ42)rZ webroot_pathZwebroot_imaginary_flagTrIrBrFr$r$r%Ú$test_renew_plugin_config_restoration^sþÿz-MainTest.test_renew_plugin_config_restorationc Cs0ddi}|j|dddt dt ¡i¡gddS)NrrETr)z --webroot-mapr–rL)r@ÚjsonÚdumpsr®r¯rFr$r$r%Útest_renew_with_webroot_mapes þz$MainTest.test_renew_with_webroot_mapcCsBt d¡$}t|_|jdddWdƒn1s40YdS)Nz+certbot._internal.main.renewal.reconstituteFTrA)rrGÚ Exceptionr=r@)r Zmock_reconstituter$r$r%Útest_renew_reconstitute_errorks 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.pemrrrEr;Tr)F)rrnr ) r:rrGr*ràrr<rRr=r)r r?r"ršr$r$r%Útest_renew_obtain_cert_errorqs ÿ  ÿz%MainTest.test_renew_obtain_cert_errorcCs:|jddd ¡ddd|jddd t¡ ¡ddddS)NTzrenew -d example.comFr3zrenew --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');")r r r rnzNo hooks were run.)rrhÚsysÚ executabler€)r r‰rrr$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*rrprrrõZ add_messager<r;)r Zmock_report_new_certr^rñr‹r?r$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Úcertrrjzlive/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_utilrôF)rr*Zobtain_certificate_from_csrrrrÃrúrÅr@rZsave_certificaterGrhr¡rirprrs) r r rZrjr?râÚ 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) NrPrrr1rrQrùT)r\r<rOr)r rarHÚmock_csr_reportr$r$r%Útest_certonly_csrºszMainTest.test_certonly_csrcCs6| dg¡|jdksJ‚|jddjdus2J‚dSró)r\r<rOrö)r r]r$r$r%Útest_certonly_csr_dry_runÆs 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)rrqÚ SS_CERT_PATHÚRSA2048_KEY_PATHrrÇr<rrOrrÏÚloadr rÚpyopenssl_load_certificaterÑrsÚComparableX509rrt)r rÈrÙrãr rArÚr$r$r%Útest_revoke_with_keyÌs" ÿ ÿ&  þzMainTest.test_revoke_with_keyc CsLd}t tj¡(| dtdtd|dg¡Wdƒn1s>0YdS)Nr—r˜r™r`rÑ)r>r?rrrqÚCERTÚKEY)r rãr$r$r%Útest_revoke_with_key_mismatchßs  ÿz&MainTest.test_revoke_with_key_mismatchcCsˆd|_t ¡df|_| dtdg¡\}}}}ttƒ@}t | ¡¡d}|  ¡j }|  t   |¡tj¡Wdƒn1sz0YdS)NFr˜rÑr)rrr*rprhrrrer Zacme_from_config_keyrÑrsrrfrt)r rÉrÙr‰rVr rArÚ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) NrSZimaginary_accountZworked)rUú--emailúuser@example.orgúcertbot._internal.main.accountú an accountzThere is an existing accountr) rrGr*r9rUrrqÚAccountFileStoragerk)r r‰Z mocked_clientrÐZmocked_accountÚmocked_storager8r$r$r%Ú test_registerós    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@rörZrun_generic_updatersr)r r|r€r$r$r%Útest_plugin_selection_errors ,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»rnrS)rAr rVÚ get_utilitycSsi|]\}}|| ¡“qSr$rõrör$r$r%rú+r6z(UnregisterTest.setUp..)rrGrˆr‰rrÔrrur$r$r%rX%s üzUnregisterTest.setUpcCs|j ¡D] }| ¡q dSr‡)rr rdrr$r$r%r-szUnregisterTest.tearDowncCsRt ¡|jdj_|jdƒ}d|j_t ¡}t ¡}t ||¡}|dksNJ‚dS)Nr rxFzDeactivation aborted.)rrrrprr˜rÚ unregister)r r)r@ráÚresr$r$r%Útest_abort_unregister1s  z$UnregisterTest.test_abort_unregisterr cCs€t ¡}dg|j_||jdj_t ¡df|jd_t ¡}||jdj_t ¡}t ¡}t ||¡}|dusrJ‚|  d¡dS)Nror ZfoorArVzAccount deactivated.) rr*rkrrrpÚClientrryrs)r r"rqÚ cb_clientr@rárzr$r$r%Útest_unregister=s   zUnregisterTest.test_unregistercCs|t ¡}g|j_||jdj_t ¡}||jdj_t ¡}d|_t ¡}t  ||¡}d}||ksfJ‚|j j j dusxJ‚dS)Nr rVz"https://acme.example.com/directoryzNCould not find existing account for server https://acme.example.com/directory.F) rr*rkrrrpr|rãrryrêZdeactivate_registrationr)r rqr}r@rárzÚmr$r$r%Útest_unregister_no_accountPs  z)UnregisterTest.test_unregister_no_accountN) rCrDrErXrr{rrGr~r€r$r$r$r%rw$s   rwc@s"eZdZdZe d¡dd„ƒZdS)ÚMakeOrVerifyNeededDirsz}| ddg¡|js@J‚d|jd d vsVJ‚Wdƒn1sj0YdS) Nú/tmp/nonexistent©rŸr–©NNr•rˆú --redirectrrrQ)rr*rrGrprrO)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ãrErŒz make senser)rr*rrGrprrOÚenhance_config)r rr€r"rœZmock_logr?r$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æ©r?r$r%rǺr6z7EnhanceTest.test_enhance_config_call..c3s|]}tˆj|ƒVqdSr‡r”r–r—r$r%rÇ»r6r) rr*rrGrprrÚallÚanyrO)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_domainsËs z#EnhanceTest.test_user_abort_domainscCs>t tj¡| gd¢¡Wdƒn1s00YdS)N)rˆrãr)r>r?rr±rprur$r$r%Útest_no_enhancements_definedÓsz(EnhanceTest.test_no_enhancements_definedrzcCs:dg|_d|_t ¡|_| ddg¡}|jjdus6J‚dS)Nr–r‹rˆr“F)rrrär=rprr)r rœr€rŽr?r$r$r%rt×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_conflictûsz,EnhanceTest.test_enhancement_enable_conflict)rCrDrErFrXrrprrGrr‘ršr›rœrrtrˆr‰r¡r¢r£r…r$r$rfr%rƒwsV       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%rXs 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_supporteds  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_certnames 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_patchrZr"Únotafter_patchZ mock_notafterrÌrrur$r$r%rX#s     zReportNewCertTest.setUpcCs|j ¡|j ¡dSr‡)r©rdrªrur$r$r%r+s zReportNewCertTest.tearDowncOsddlm}||i|¤ŽS)Nr)Ú_report_new_cert)rmr«)Úclsrnr“r«r$r$r%rp/s zReportNewCertTest._callcOsddlm}||i|¤ŽS)Nr)Ú_csr_report_new_cert)rmr­)r¬rnr“r­r$r$r%Ú _call_csr4s zReportNewCertTest._call_csrcCs(| tjddddd¡|j d¡dS©NT©rör©rprrr"r!rur$r$r%Útest_report_dry_run9sz%ReportNewCertTest.test_report_dry_runcCs(| tjddddd¡|j d¡dSr¯©r®rrr"r!rur$r$r%Útest_csr_report_dry_run=sz)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_pathsAs 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_reportHsþÿ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_keyWsþÿ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_renewalesþÿ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_reportrs ÿÿz!ReportNewCertTest.test_csr_reportcCs,| tjddddddd¡|j d¡dS) zBShouldn't get a message about autorenewal if no --manual-auth-hookFrN)rörÚ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@rGrZr"rcrdrVrrÚ old_stdoutrzr{)r r©r$r$r%rXsþ   zReportNextStepsTest.setUpcCs |jt_dSr‡)rÃrVrrrur$r$r%ršszReportNextStepsTest.tearDowncOsddlm}||i|¤ŽdS)Nr)Ú_report_next_steps)rmrÄ)r¬rnr“rÄr$r$r%rps zReportNextStepsTest._call)ÚreturncCs@|jjdksJ‚|jjddddks,J‚|jjdddS)Nr1rz NEXT STEPS:rP)r"r<rØrur$r$r%Ú_output¢szReportNextStepsTest._outputcCs.d|j_d|j_| |jdd¡|j ¡dS)zNo steps for a normal renewalrz /bin/trueN)r@rr¿rpr"r;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ÁrprDrÆ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) NrnryrSr»r z*certbot._internal.eff.prepare_subscription)r ÚatexitrVÚdetermine_accountÚnotifyÚ prepare_subr csi|]}|ˆ| ¡“qSr$rõ©r÷rø©rer$r%rúÎr6z+UpdateAccountTest.setUp..© rrGrˆr‰rr rcrdrWrXrrfrÏr%rXÄsù  zUpdateAccountTest.setUpc Csšt d¡|t d¡Rd|jjd|jjd|jjdg|}t |dd…¡WdƒWdƒS1sn0YWdƒn1sŒ0YdS©Nrurxrrarbrc©rrGr@rrfrerr r$r$r%rpÔs ÿ þþzUpdateAccountTest._callcCsXt ¡}t ¡}t ¡}|g|j_||jdj_|j|j_|t ¡f|jd_|||fS)Nr rË)rr*rkrrrpÚbodyrË©r rBZ 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 correctlyNrVrPr$©ÚcontactrÌzFAny contact information associated with this account has been removed.rÍ) rÖrprr|rêÚupdate_registrationr<rÓÚupdater!Ú update_regrr;)r rnr‰rBrÕÚ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_accountrlrmú]Could not find an existing account for server https://acme-v02.api.letsencrypt.org/directory.N©rr*rkrrrprp©r rBr$r$r%Útest_no_existing_accountsø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_email 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.comrVrßNrPrÍrÌz4Your e-mail address was updated to user@example.com.) rrÖrr*rr|rprêrÙr<rÛr!)r Z mock_emailr‰rBr?rÜr$r$r%Útest_update_account_with_email 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Úr!rÛr<r)r r‰rBrÕ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) NrnryrSr»r )r rÊrVrËrÌr csi|]}|ˆ| ¡“qSr$rõrÎrÏr$r%rú6 r6z)ShowAccountTest.setUp..rÐrrfrÏr%rX- sú zShowAccountTest.setUpc Csšt d¡|t d¡Rd|jjd|jjd|jjdg|}t |dd…¡WdƒWdƒS1sn0YWdƒn1sŒ0YdSrÑrÒr r$r$r%rp< s ÿ þþzShowAccountTest._callcCs\t ¡}t ¡}t ¡}|g|j_||jdj_|j|j_d|jj _|t ¡f|jd_dS)Nr s foobarbazrË) rr*rkrrrprÓrËrßZ thumbprintrÔr$r$r%rÖD 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/1rVÚ show_accountrP) rÖrr*rÓrØZurirêZquery_registrationrrr|rpr<)r rØr?rÕrnr$r$r%Ú_test_show_accountN 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 correctlyNrVrêzACME client is not set.) rÖrr*rêrr|rrprrrD)r r?rær$r$r%Útest_no_existing_clientf 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_contactsq 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é* 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–rõrø)Ú installer_dirrôr Ú subcommandr$r%Úinstaller_lock¦ sz9TestLockOrder.mock_plugin_prepare..installer_lockrÜN)rrGÚobjectrrµrr|)r rùrûrôrürúrýr$)rùrûrôr rür%Ú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@ruZlogsZworkrãrz-irz--no-random-sleep-on-renewrrbrarr–N)rDZparamrˆrrÿ) r rôZrequestZtmp_pathrùrrûrerfrürnÚ 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 rrôrnrrÖZ locked_dirr$r$r%Útest_lock_orderÔ s (zTestLockOrder.test_lock_orderN)rCrDrErFrrrör÷rr>ZfixturerôÚ contextlibÚcontextmanagerrÿrirrr$r$r$r%ró’ s    róÚ__main__rP)UrFrrÌÚ importlibrrirzrÃrOr¿rVr®rÚtypingrZunittestrr Zjosepyrr>rÍZ acme.messagesrr\r~rrr r Zcertbot._internalr r r rrZcertbot._internal.pluginsrrrrZcertbot.compatrrZcertbot.pluginsrZcertbot.tests.utilZtestsrˆrírÁrhr¡riZJWKRSArdZ load_vectorrÏrcrbZTestCaserZConfigTestCaserHr†r±ZTempDirTestCaserºrïr$r7r`rwrrƒr¤r¨rÂrÉrérórCÚexitÚargvÚ__file__r$r$r$r%Ús’                          RX%gk#> o4ihK