a }|äg`fã@s€dZddlZddlZddlmZddlZddlZddlZddl m Z m Z ddl Z ddl m Z ddlZddlmZddlmZddlmZmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddl m!m"Z#ddl m$Z$ej% &¡Z'Gdd„de$ƒZ(Gdd„de j)ƒZ*e+e dœdd„Z,e+e edœdd„Z-Gdd„de j)ƒZ.e/dkr|e 0e 1ej2dd…e3g¡¡dS)z Tests for certbot._internal.cli.éN)Úreload)ÚAnyÚList)Úmock)Ú challenges)Úerrors)ÚArgumentSourceÚNamespaceConfig)Úcli)Ú constants)Ú flag_default)Údisco)Ú filesystem)Úos)ÚTempDirTestCasec@seZdZdZdd„ZdS)Ú TestReadFilezTest cli.read_filec Csòt ¡}zØt |j¡t tj |jd¡¡}tj |¡}t   t j ¡t  |¡Wdƒn1sd0Yd}t|dƒ}| |¡Wdƒn1sœ0Yt  |¡\}}|tj |¡ksÈJ‚||ksÔJ‚Wt |¡n t |¡0dS)NÚfoosbar Úwb)rÚgetcwdÚchdirZtempdirrÚrealpathÚpathÚjoinÚrelpathÚpytestÚraisesÚargparseÚArgumentTypeErrorr Z read_fileÚopenÚwriteÚabspath)ÚselfZcurr_dirZ real_pathÚ relative_pathZ test_contentsÚfrÚcontents©r%úD/usr/lib/python3.9/site-packages/certbot/_internal/tests/cli_test.pyÚtest_read_files  ( (zTestReadFile.test_read_fileN)Ú__name__Ú __module__Ú __qualname__Ú__doc__r'r%r%r%r&rsrc@seZdZdZdd„ZdS)ÚFlagDefaultTestzTests cli.flag_defaultcCs|tjdkrBt d¡dksJ‚t d¡dks.J‚t d¡dksxJ‚n6t d¡dksTJ‚t d¡d ksfJ‚t d¡d ksxJ‚dS) NÚntÚ config_dirz/etc/letsencryptÚwork_dirz/var/lib/letsencryptÚlogs_dirz/var/log/letsencryptz C:\CertbotzC:\Certbot\libzC:\Certbot\log)rÚnamer r ©r!r%r%r&Útest_default_directories@s z(FlagDefaultTest.test_default_directoriesN)r(r)r*r+r3r%r%r%r&r,=sr,)ÚattrÚvaluecCs$t||ƒ|ksJ‚| |¡s J‚dS©N)ÚgetattrÚ set_by_user)Ú namespacer4r5r%r%r&Úassert_set_by_user_with_valueKsr:)r4r5ÚsourcecCs(t||ƒ|ksJ‚|j||ks$J‚dSr6)r7Zargument_sources)r9r4r5r;r%r%r&Úassert_value_and_sourcePsr<c@sÚeZdZdZeeeedœdd„ƒZeeeedœdd„ƒZ eedœdd „Z e   d ¡d d „ƒZ d d„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Ze   d/¡d0d1„ƒZe   d2¡d3d4„ƒZ d5d6„Z!d7d8„Z"d9d:„Z#d;d<„Z$d=d>„Z%d?d@„Z&dAdB„Z'dCdD„Z(dEdF„Z)dGdH„Z*dIdJ„Z+dKdL„Z,dMdN„Z-dOdP„Z.dQdR„Z/dSdT„Z0dUdV„Z1dWdX„Z2dYdZ„Z3d[d\„Z4d]d^„Z5e   d/¡d_d`„ƒZ6dadb„Z7dcdd„Z8deS)fÚ ParseTestzTest the cli args entrypoint)ÚargsÚreturncCs t t|¡S)z)Get result of cli.prepare_and_parse_args.)r Úprepare_and_parse_argsÚPLUGINS©r>r%r%r&Ú_unmocked_parseXszParseTest._unmocked_parsecCs6t ¡t |¡WdƒS1s(0YdS)zJMocks certbot._internal.display.obj.get_display and calls _unmocked_parse.N)Ú test_utilÚpatch_display_utilr=rCrBr%r%r&Úparse]s zParseTest.parserBc sÚt ¡‰‡fdd„}tjdˆd t ¡x}||ƒj_t d¡Dt  t ¡|  |¡Wdƒn1sn0YWdƒn1sŒ0YWdƒn1sª0YWdƒn1sÈ0Yˆ  ¡S)z8Run a command, and return the output string for scrutinycsˆ |¡dSr6)r)Úmessager>Úkwargs©Úoutputr%r&Ú write_msghsz)ParseTest._help_output..write_msgz!certbot._internal.main.sys.stdout)Únewz!certbot._internal.main.sys.stderrN) ÚioÚStringIOrÚpatchrDrEZ notificationÚ side_effectrrÚ SystemExitrCÚgetvalue)r!r>rKZmock_get_utilityr%rIr&Ú _help_outputcs     ‚zParseTest._help_outputz*certbot._internal.cli.helpful.flag_defaultc sÒt ¡¶‰ˆ ¡‡fdd„}||_| dg¡}t|dgtjƒtˆj dƒ}|  d¡Wdƒn1sl0Y| dg¡}t|ddgtj ƒ| dg¡}t|dgtj ƒWdƒn1sÄ0YdS) Ncs |dkrt tj|¡SˆjgS)NZ config_files)ÚcopyÚdeepcopyr Z CLI_DEFAULTSr1)Úv©Ú tmp_configr%r&Úzsÿz0ParseTest.test_cli_ini_domains..ÚcertonlyÚdomainsÚwzdomains = example.comú example.comÚrenew) ÚtempfileÚNamedTemporaryFileÚcloserPrFr<rÚDEFAULTrr1rÚ CONFIG_FILEÚRUNTIME)r!Zmock_flag_defaultZshimr9Úfile_hr%rWr&Útest_cli_ini_domainsts  ÿ (  zParseTest.test_cli_ini_domainscCs>| g¡}dD]*}t||ƒt |¡ks*J‚| |¡rJ‚qdS)N)r.r0r/)rFr7r r r8)r!r9Údr%r%r&Ú test_no_args‰s zParseTest.test_no_argsc Cs²d}d}d}d}t d¡,| dd|ddd dd dg ¡}Wdƒn1sL0Y|jtj |¡kslJ‚|jtj |¡ks‚J‚|jtj |¡ks˜J‚|j tj |¡ks®J‚dS) NÚcertÚkeyÚchainÚ fullchainzcertbot._internal.main.installÚinstallú --cert-pathú --key-pathz --chain-pathz--fullchain-path) rrOrFZ cert_pathrrr Zkey_pathZ chain_pathZfullchain_path)r!rirjrkrlr9r%r%r&Útest_install_abspaths  þ$zParseTest.test_install_abspathcCsZ| dg¡| ddg¡}d|vs&J‚d|vs2J‚d|vs>J‚d|vsJJ‚d|vsVJ‚d|vsbJ‚d |vsnJ‚| d d g¡}d tvrd |vsJ‚d|vsœJ‚d |vs¨J‚| d g¡}d tvrÊd|vsÖJ‚n d|vsÖJ‚| ddg¡}d|vsðJ‚d|vsüJ‚d|vs J‚| d dg¡}d|vs&J‚| d dg¡}d|vsBJ‚| d dg¡}d|vs^J‚| ddg¡}d|vszJ‚d|vsˆJ‚| ddg¡}d|vs¤J‚d|vs²J‚d|vsÀJ‚d|vsÎJ‚d|vsÜJ‚| d dg¡}d|vsøJ‚d|vsJ‚| d g¡}tj|vs"J‚tjdd…|vs:J‚d|vsHJ‚d|vsVJ‚dS)Nú--helpÚallú--configuratorúhow a certificate is deployedú--webroot-pathú--textú%sú{0}ú --renew-hookú-hZnginxz --nginx-ctlz --checkpointszUse the Nginx pluginz (the certbot nginx plugin is notÚpluginsz --preparez"plugins" subcommandr^z--keepZ automationÚrevokermrnroú--reasonú--delete-after-revokeú--no-delete-after-revokeÚregisteréd)rSrAr Z SHORT_USAGEZCOMMAND_OVERVIEW©r!Úoutr%r%r&Ú test_helpŸsZ                zParseTest.test_helpcCs²| dg¡| ddg¡}d|vs&J‚d|vs2J‚d|vs>J‚d|vsJJ‚d|vsVJ‚d|vsbJ‚| dd g¡}d |vs|J‚d |vsˆJ‚| dd g¡}d |vs¢J‚d |vs®J‚dS) NÚhelprrrsrtrurvrwrxrmrnror|©rSr‚r%r%r&Útest_help_no_dashesÙs          zParseTest.test_help_no_dashescCsÈddg}| |¡}t|ddgƒddg}| |¡}t|ddgƒddg}| |¡}t|dgd¢ƒddg}| |¡}t|ddgƒddg}| |¡}t|ddgƒdd g}| |¡}t|ddd gƒdS) Nz-dr]r[ztrailing.period.com.ztrailing.period.comz-example.com,another.net,third.org,example.com)r]ú another.netz third.orgz --domainsz#example.com,another.net,example.comrˆ©rFr:)r!Ú short_argsr9Z long_argsr%r%r&Útest_parse_domainsìs(   ÿ   zParseTest.test_parse_domainsc Cs˜ddg}| |¡}tjjtjjg}t|d|ƒddg}t d¡Dt  t ¡| |¡Wdƒn1sl0YWdƒn1sŠ0YdS)Nz--preferred-challengesz http, dnsÚ pref_challszjumping-over-the-moonz sys.stderr) rFrÚHTTP01ÚtypZDNS01r:rrOrrrQ)r!rŠr9Zexpectedr%r%r&Útest_preferred_challengess    z#ParseTest.test_preferred_challengescCs| d ¡¡}t|ddƒdS)Nú--server example.comÚserverr])rFÚsplitr:©r!r9r%r%r&Útest_server_flagszParseTest.test_server_flagcCs,| dg¡}t|ddƒt|ddtjƒdS)Nú --must-stapleÚ must_stapleTÚstaple)rFr:r<rrdr“r%r%r&Útest_must_staple_flags  zParseTest.test_must_staple_flagcCs*| ddg¡}t|ddƒt|ddƒdS)Nr•z --staple-ocspr–Tr—r‰r“r%r%r&Ú&test_must_staple_and_staple_ocsp_flagss z0ParseTest.test_must_staple_and_staple_ocsp_flagsc Cszz$| |¡| d d |¡¡¡WnPtjyt}z6dt|ƒvsFJ‚|D]}|t|ƒvsJJ‚qJWYd}~n d}~00dS)Nz6The following flags didn't conflict with --server: {0}z, ú--server)rFZfailÚformatrrÚErrorÚstr)r!Z parser_argsZconflicting_argsÚerrorÚargr%r%r&Ú_check_server_conflict_message"s ÿÿz(ParseTest._check_server_conflict_messagecCsFdg}| |¡}t|ddƒt|dtjƒ|d ¡7}| |d¡dS)Nú --stagingÚstagingTr‘r)rFr:r Ú STAGING_URIr’r )r!rŠr9r%r%r&Útest_staging_flag-s    zParseTest.test_staging_flagcCsˆt|ddƒt|ddtjƒt|ddtjƒt|dtjtjƒ|rdt|ddtjƒt|ddtjƒn t|ddtjƒt|ddtjƒdS) NÚdry_runTZbreak_my_certsr¢r‘ZtosZregister_unsafely_without_emailF)r:r<rrdr r£rb)r!r9Zexisting_accountr%r%r&Ú_assert_dry_run_flag_worked6s z%ParseTest._assert_dry_run_flag_workedcCsœt ¡}d |¡ ¡}t tj¡| |¡Wdƒn1sB0Y|  | |dg¡d¡|  | |dg¡d¡|  | |dg¡d¡t j   |t j¡}t |¡t t j   |d¡¡|  | |dg¡d¡|  | |dg¡d¡|  | |dg¡d¡|dg7}| |dd g¡}t|d d ƒ| |dt jg¡}t|d t jƒ| |dt d ¡g¡}t|d t jtjƒd g}| |gd ¢|¡dS) Nz--dry-run --config-dir {0}ZauthFrZr^Zfake_account_dirTršr]r‘r¡)ršr]r¡)r_Zmkdtempr›r’rrrrœrFr¦rrrr Z ACCOUNTS_DIRrÚmkdirr:r£r r r<rrdr )r!r.rŠZ account_dirÚconfigÚ conflictsr%r%r&Útest_dry_run_flagCs<(ÿÿÿ   ÿzParseTest.test_dry_run_flagcCsTd}t |¡}| d |¡ ¡¡}| |¡s0J‚d}| |¡rBJ‚| d¡rPJ‚dS)NZ rsa_key_sizez--rsa-key-size {0}r.Ú authenticator©r r rFr›r’r8)r!Zkey_size_optionZkey_size_valuer¨Zconfig_dir_optionr%r%r&Útest_user_set_rsa_key_sizeks ÿz$ParseTest.test_user_set_rsa_key_sizecCsP| d¡}| d¡sJ‚| d¡s&J‚| d¡}| d¡s>J‚| d¡rLJ‚dS)Nz--apacheZ installerr«z--installer webroot)rFr8)r!r¨r%r%r&Ú)test_user_set_installer_and_authenticatorws   z3ParseTest.test_user_set_installer_and_authenticatorcCs4d}t |¡}| d |¡ ¡¡}| |¡s0J‚dS)NZelliptic_curvez--elliptic-curve {0}r¬)r!Zelliptic_curve_optionZelliptic_curve_option_valuer¨r%r%r&Útest_user_set_ecdsa_key_option€s z(ParseTest.test_user_set_ecdsa_key_optioncCshd}t |¡}| d |¡ ¡¡}| |¡s0J‚t t¡| d¡Wdƒn1sZ0YdS)NZkey_typez--key-type {0}z--key-type foo) r r rFr›r’r8rrrQ)r!Zkey_type_optionZkey_type_valuer¨r%r%r&Útest_user_set_invalid_key_type†s   z(ParseTest.test_user_set_invalid_key_typez&certbot._internal.hooks.validate_hookscCs0d ¡}tj ¡}t ||¡}| d¡s,J‚dS)Nzrenew --deploy-hook fooÚ renew_hook)r’r ÚPluginsRegistryÚfind_allr r@r8)r!Zunused_mock_validate_hooksr>r{r¨r%r%r&Útest_user_set_deploy_hooks  z#ParseTest.test_user_set_deploy_hookz3certbot._internal.plugins.webroot._validate_webrootcCs6d ¡}d|_tj ¡}t ||¡}| d¡s2J‚dS)Nz%renew -w /var/www/html -d example.comz /var/www/htmlZ webroot_map)r’Z return_valuer r²r³r r@r8)r!Zmock_validate_webrootr>r{r¨r%r%r&Útest_user_set_webroot_map–s   z#ParseTest.test_user_set_webroot_mapcCshtj ¡D]$\}}| d|g¡}|j|ks J‚q tj ¡D](\}}| d| ¡g¡}|j|ks:J‚q:dS)Nr})r ZREVOCATION_REASONSÚitemsrFÚreasonÚupper)r!r·Úcoder9r%r%r&Útest_encode_revocation_reasonžs z'ParseTest.test_encode_revocation_reasoncCsxt tj¡| d ¡¡Wdƒn1s00Yt tj¡| d ¡¡Wdƒn1sj0YdS)Nzrenew --force-interactivez-n --force-interactive©rrrrœrFr’r2r%r%r&Útest_force_interactive¦s,z ParseTest.test_force_interactivec Csft d¡Ht t¡| d ¡¡Wdƒn1s:0YWdƒn1sX0YdS)Nú certbot._internal.cli.sys.stderrz"--renew-hook foo --deploy-hook bar©rrOrrrQrFr’r2r%r%r&Útest_deploy_hook_conflict¬s  z#ParseTest.test_deploy_hook_conflictcCs4d}| d|d|dg¡}t|d|ƒt|d|ƒdS)Nrryú --deploy-hookú--disable-hook-validationÚ deploy_hookr±r‰©r!r5r9r%r%r&Ú#test_deploy_hook_matches_renew_hook±sþ z-ParseTest.test_deploy_hook_matches_renew_hookcCs0d}| d|dg¡}t|d|ƒt|d|ƒdS)NrrÀrÁrÂr±r‰rÃr%r%r&Ú test_deploy_hook_sets_renew_hook¹s ÿ z*ParseTest.test_deploy_hook_sets_renew_hookc Csft d¡Ht t¡| d ¡¡Wdƒn1s:0YWdƒn1sX0YdS)Nr½z"--deploy-hook foo --renew-hook barr¾r2r%r%r&Útest_renew_hook_conflictÀs  z"ParseTest.test_renew_hook_conflictcCs4d}| d|d|dg¡}t|d|ƒt|d|ƒdS)NrrÀryrÁrÂr±r‰rÃr%r%r&Ú#test_renew_hook_matches_deploy_hookÅsþ z-ParseTest.test_renew_hook_matches_deploy_hookcCs2d}| d|dg¡}|jdus"J‚t|d|ƒdS)NrryrÁr±)rFrÂr:rÃr%r%r&Ú'test_renew_hook_does_not_set_renew_hookÍs ÿz1ParseTest.test_renew_hook_does_not_set_renew_hookc Csžt d¡€t t¡| d ¡¡Wdƒn1s:0Yt t¡| d ¡¡Wdƒn1sr0YWdƒn1s0YdS)Nr½z--max-log-backups fooz--max-log-backups -42r¾r2r%r%r&Útest_max_log_backups_errorÔs   , z$ParseTest.test_max_log_backups_errorcCs&d}| d|g¡}t|dt|ƒƒdS)NZ42z--max-log-backupsZmax_log_backups)rFr:ÚintrÃr%r%r&Útest_max_log_backups_successÛsz&ParseTest.test_max_log_backups_successcCsl| g¡}t|dgtjƒt|dgtjƒtjjg|_dg|_| g¡}t|dgtjƒt|dgtjƒdS)Nr[rŒr]) rFr<rrbrrrŽrŒr[r“r%r%r&Útest_unchanging_defaultsàs   z"ParseTest.test_unchanging_defaultscCs| dg¡}t|ddƒdS)Nz--no-directory-hooksÚdirectory_hooksFr‰r“r%r%r&Útest_no_directory_hooks_setìs z%ParseTest.test_no_directory_hooks_setcCs| g¡}t|ddtjƒdS)NrÍT)rFr<rrbr“r%r%r&Útest_no_directory_hooks_unsetðs z'ParseTest.test_no_directory_hooks_unsetcCs| dg¡}t|ddƒdS)Nr~Údelete_after_revokeTr‰r“r%r%r&Útest_delete_after_revokeôs z"ParseTest.test_delete_after_revokecCs*| g¡}|jdusJ‚| d¡r&J‚dS)NrÐ)rFrÐr8r“r%r%r&Ú test_delete_after_revoke_defaultøs z*ParseTest.test_delete_after_revoke_defaultcCs| dg¡}t|ddƒdS)NrrÐFr‰r“r%r%r&Útest_no_delete_after_revokeýs z%ParseTest.test_no_delete_after_revokecCs>t tj¡| d ¡¡Wdƒn1s00YdS)Nz(--allow-subset-of-names -d *.example.orgr»r2r%r%r&Útest_allow_subset_with_wildcardsz)ParseTest.test_allow_subset_with_wildcardcCs.dD]$}dD]}d| ||g¡vs J‚q qdS)N)rzrq)rrr{z dns-route53zcertbot-route53:authr†)r!Z help_flagZtopicr%r%r&Útest_route53_no_revertsz ParseTest.test_route53_no_revertcCs>t tj¡| ddg¡Wdƒn1s00YdS)Nz--hstsz --auto-hsts)rrrrœrFr2r%r%r&Ú$test_parse_args_hosts_and_auto_hosts sz.ParseTest.test_parse_args_hosts_and_auto_hostsc Csätdƒ}d}d}| dg¡}t|d|tjƒt ¡œ}| ¡t|j dƒ }|  d|›¡Wdƒn1sp0Y| dd|j g¡}t|d|tj ƒ| dd|j d|g¡}t|d|tj ƒWdƒn1sÖ0YdS) Nr‘zconfigfile.bizzcommandline.edurZr\z server = z-crš) r rFr<rrbr_r`rarr1rrcZ COMMAND_LINE)r!Z DEFAULT_VALUEZCONFIG_FILE_VALUEZCOMMAND_LINE_VALUEr9rXrer%r%r&Ú)test_parse_with_multiple_argument_sourcess(  .þýz3ParseTest.test_parse_with_multiple_argument_sourcesc Cs®| d¡}t|ddgƒt|ddƒt ¡n}| ¡t|jdƒ}| d¡Wdƒn1sb0Y| dd |jg¡}t|ddgƒWdƒn1s 0YdS) Nz--preferred-chal dns --no-dirrŒzdns-01rÍFr\zpreferred-chal = dnsrZz--config)rFr:r_r`rarr1r)r!r9rXrer%r%r&Útest_abbreviated_arguments+s   (þz$ParseTest.test_abbreviated_argumentscCsB| d¡}t|ddgƒtj ¡}t |ddg¡}t|ddƒdS)Nz-d=example.comr[r]Úrunz--pre-hook="foo=bar"Zpre_hookz "foo=bar")rFr:r r²r³r r@)r!Zunsused_mock_validate_hooksr9r{r%r%r&Útest_argument_with_equals>s   z#ParseTest.test_argument_with_equalscCsv| d¡}t|ddƒt|ddƒ| d¡}t|ddƒt|ddƒ| d¡}t|ddƒt|ddƒt|d d ƒdS) Nz-tvZ text_modeTZ verbose_countéz-tvvvéz-tvm foo@example.comZemailzfoo@example.comr‰r“r%r%r&Útest_adjacent_short_argsHs         z"ParseTest.test_adjacent_short_argscCs | ddg¡}t|ddgƒdS)NrZz -d foo.comr[zfoo.comr‰r“r%r%r&Útest_arg_with_contained_spacesVsz(ParseTest.test_arg_with_contained_spacesN)9r(r)r*r+Ú staticmethodrrr rCrFrSrrOrfrhrpr„r‡r‹rr”r˜r™r r¤r¦rªr­r®r¯r°r´rµrºr¼r¿rÄrÅrÆrÇrÈrÉrËrÌrÎrÏrÑrÒrÓrÔrÕrÖr×rØrÚrÝrÞr%r%r%r&r=Usl :   (       r=Ú__main__rÛ)4r+rrTÚ importlibrZ reload_modulerMÚsysr_ÚtypingrrZunittestrrZacmerZcertbotrZcertbot.configurationrr Zcertbot._internalr r Zcertbot._internal.cli.cli_utilsr Zcertbot._internal.pluginsr Zcertbot.compatrrZcertbot.tests.utilZtestsÚutilrDrr²r³rArZTestCaser,rr:r<r=r(ÚexitÚmainÚargvÚ__file__r%r%r%r&ÚsB