U
    ÝÁ]U  ã                   @   s2  d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlm  mZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ej ¡ ZG dd„ deƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZ G dd„ dejƒZ!dd„ Z"e#dkr.e $¡  dS )zTests for certbot.cli.é    N)Úreload_module)Ú
challenges)Úcli)Ú	constants)Úerrors)Úos)Ú
filesystem)Údisco)ÚTempDirTestCasec                   @   s   e Zd ZdZdd„ ZdS )ÚTestReadFilezTest cli.read_filec              	   C   s¦   t  ¡ }zŒt  | j¡ t j t j | jd¡¡}|  tj	t
j|¡ d}t|dƒ}| |¡ W 5 Q R X t
 |¡\}}|  |t j |¡¡ |  ||¡ W 5 t  |¡ X d S )NÚfoos   bar
Úwb)r   ÚgetcwdÚchdirZtempdirÚpathÚrelpathÚjoinÚassertRaisesÚargparseZArgumentTypeErrorr   Z	read_fileÚopenÚwriteÚassertEqualÚabspath)ÚselfZcurr_dirZrel_test_pathZtest_contentsÚfr   Úcontents© r   ú8/usr/lib/python3/dist-packages/certbot/tests/cli_test.pyÚtest_read_file   s       ÿzTestReadFile.test_read_fileN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdd„ ZdS )ÚFlagDefaultTestzTests cli.flag_defaultc                 C   s|   t jdkrB|  t d¡d¡ |  t d¡d¡ |  t d¡d¡ n6|  t d¡d¡ |  t d¡d	¡ |  t d¡d
¡ d S )NÚntÚ
config_dirz/etc/letsencryptÚwork_dirz/var/lib/letsencryptÚlogs_dirz/var/log/letsencryptz
C:\CertbotzC:\Certbot\libzC:\Certbot\log)r   Únamer   r   Úflag_default©r   r   r   r   Útest_default_directories4   s    
z(FlagDefaultTest.test_default_directoriesN)r   r    r!   r"   r+   r   r   r   r   r#   1   s   r#   c                   @   sJ  e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdd	„ Ze	 
d
¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Z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+dMS )NÚ	ParseTestzTest the cli args entrypointc                 C   s   t tƒ d S ©N©r   r   r*   r   r   r   ÚsetUpC   s    zParseTest.setUpc                  O   s   t jtf| ž|ŽS )z)Get result of cli.prepare_and_parse_args.)r   Zprepare_and_parse_argsÚPLUGINS©ÚargsÚkwargsr   r   r   Ú_unmocked_parseF   s    zParseTest._unmocked_parsec               
   O   s,   t  ¡  tj| |ŽW  5 Q R £ S Q R X dS )z:Mocks zope.component.getUtility and calls _unmocked_parse.N)Ú	test_utilÚpatch_get_utilityr,   r4   r1   r   r   r   ÚparseK   s    
zParseTest.parsec                    s|   t  ¡ ‰ ‡ fdd„}tjdˆ dL t ¡ 8}||ƒ j_t d¡ |  t	| j
|ˆ ¡ W 5 Q R X W 5 Q R X W 5 Q R X ˆ  ¡ S )z8Run a command, and return the output string for scrutinyc                    s   ˆ   | ¡ d S r-   )r   )Úmessager2   r3   ©Úoutputr   r   Ú	write_msgV   s    z)ParseTest._help_output.<locals>.write_msgzcertbot.main.sys.stdout)Únewzcertbot.main.sys.stderr)ÚsixÚStringIOÚmockÚpatchr5   r6   ZnotificationÚside_effectr   Ú
SystemExitr4   Úgetvalue)r   r2   r;   Zmock_get_utilityr   r9   r   Ú_help_outputQ   s    

0zParseTest._help_outputzcertbot.cli.flag_defaultc              
      s¤   t  ¡ ’‰ ˆ  ¡  ‡ fdd„}||_|  dg¡}|  |jg ¡ tˆ jdƒ}| 	d¡ W 5 Q R X |  dg¡}|  |jdg¡ |  dg¡}|  |jg ¡ W 5 Q R X d S )Nc                    s    | dkrt  tj|  ¡S ˆ jgS )NZconfig_files)ÚcopyÚdeepcopyr   ZCLI_DEFAULTSr(   )Úv©Z
tmp_configr   r   Ú<lambda>g   s    ÿz0ParseTest.test_cli_ini_domains.<locals>.<lambda>ÚcertonlyÚwzdomains = example.comúexample.comÚrenew)
ÚtempfileZNamedTemporaryFileÚcloserA   r7   r   Údomainsr   r(   r   )r   Zmock_flag_defaultZshimÚ	namespaceZfile_hr   rH   r   Útest_cli_ini_domainsa   s    

ÿzParseTest.test_cli_ini_domainsc                 C   s0   |   g ¡}dD ]}|  t||ƒt |¡¡ qd S )N)r%   r'   r&   )r7   r   Úgetattrr   r)   )r   rQ   Údr   r   r   Útest_no_argsv   s    
zParseTest.test_no_argsc                 C   sž   d}d}d}d}t  d¡" |  dd|ddd	dd
dg	¡}W 5 Q R X |  |jtj |¡¡ |  |jtj |¡¡ |  |j	tj |¡¡ |  |j
tj |¡¡ d S )NÚcertÚkeyÚchainÚ	fullchainzcertbot.main.installÚinstallú--cert-pathú
--key-pathz--chain-pathz--fullchain-path)r?   r@   r7   r   Z	cert_pathr   r   r   Zkey_pathZ
chain_pathZfullchain_path)r   rV   rW   rX   rY   rQ   r   r   r   Útest_install_abspath{   s"    
    þzParseTest.test_install_abspathc                 C   s’  |   dg¡ |   ddg¡}|  d|k¡ |  d|k¡ |  d|k¡ |  d|k¡ |  d|k¡ |  d|k¡ |  d	|k¡ |  d
|k¡ |   ddg¡}dtkr®|  d|k¡ |  d|k¡ |  d|k¡ |   dg¡}|  d|k¡ dtkrü|  d|k¡ n|  d|k¡ |   ddg¡}|  d|k¡ |  d|k¡ |  d|k¡ |   ddg¡}|  d|k¡ |   ddg¡}|  d|k¡ |   ddg¡}|  d|k¡ |   ddg¡}|  d|k¡ |  d|k¡ |   ddg¡}|  d|k¡ |  d|k¡ |  d|k¡ |  d|k¡ |  d|k¡ |   ddg¡}|  d|k¡ |  d|k¡ |   dg¡}|  tj|k¡ |  tjd d … |k¡ |  d|k¡ |  d	|k¡ d S )!Nú--helpÚallú--configuratorúhow a certificate is deployedú--webroot-pathú--textú--dialogú%sú{0}ú--renew-hookú-hZnginxz--nginx-ctlz--checkpointszletsencrypt-autozUse the Nginx pluginz (the certbot nginx plugin is notÚpluginsz	--preparez"plugins" subcommandrM   z--keepZ
automationÚrevokerZ   r[   r\   ú--reasonú--delete-after-revokeú--no-delete-after-revokeZconfig_changeséd   )rD   Ú
assertTruer0   r   ZSHORT_USAGEZCOMMAND_OVERVIEW©r   Úoutr   r   r   Ú	test_help‹   s^    zParseTest.test_helpc                 C   sÔ   |   dg¡ |   ddg¡}|  d|k¡ |  d|k¡ |  d|k¡ |  d|k¡ |  d|k¡ |  d|k¡ |  d	|k¡ |   dd
g¡}|  d|k¡ |  d|k¡ |   ddg¡}|  d|k¡ |  d|k¡ d S )NÚhelpr_   r`   ra   rb   rc   rd   re   rf   rZ   r[   r\   rj   )rD   ro   rp   r   r   r   Útest_help_no_dashesÇ   s    zParseTest.test_help_no_dashesc                 C   sÖ   ddg}|   |¡}|  |jdg¡ ddg}|   |¡}|  |jdg¡ ddg}|   |¡}|  |jdddg¡ ddg}|   |¡}|  |jdg¡ ddg}|   |¡}|  |jdg¡ dd	g}|   |¡}|  |jddg¡ d S )
Nz-drL   ztrailing.period.com.ztrailing.period.comz-example.com,another.net,third.org,example.comzanother.netz	third.orgz	--domainsz#example.com,another.net,example.com)r7   r   rP   )r   Ú
short_argsrQ   Z	long_argsr   r   r   Útest_parse_domainsÛ   s(    


ÿ


zParseTest.test_parse_domainsc              	   C   sb   ddg}|   |¡}tjjtjjg}|  |j|¡ ddg}t d¡ |  	t
| j |¡ W 5 Q R X d S )Nz--preferred-challengesz	http, dnszjumping-over-the-moonz
sys.stderr)r7   r   ÚHTTP01ÚtypZDNS01r   Úpref_challsr?   r@   r   rB   )r   ru   rQ   Zexpectedr   r   r   Útest_preferred_challengesõ   s    
z#ParseTest.test_preferred_challengesc                 C   s    |   d ¡ ¡}|  |jd¡ d S )Nú--server example.comrL   )r7   Úsplitr   Úserver©r   rQ   r   r   r   Útest_server_flag  s    zParseTest.test_server_flagc                 C   s,   dg}|   |¡}|  |j¡ |  |j¡ d S )Nz--must-staple)r7   ro   Zmust_stapleZstaple©r   ru   rQ   r   r   r   Útest_must_staple_flag  s    
zParseTest.test_must_staple_flagc              
   C   s|   z$|   |¡ |  d d |¡¡¡ W nR tjk
rv } z2|  dt|ƒk¡ |D ]}|  |t|ƒk¡ qNW 5 d }~X Y nX d S )Nz6The following flags didn't conflict with --server: {0}z, ú--server)r7   ZfailÚformatr   r   ÚErrorro   Ústr)r   Zparser_argsZconflicting_argsÚerrorÚargr   r   r   Ú_check_server_conflict_message  s    
ÿÿz(ParseTest._check_server_conflict_messagec                 C   sH   dg}|   |¡}|  |j¡ |  |jtj¡ |d ¡ 7 }|  |d¡ d S )Nú	--stagingr{   )	r7   ro   Ústagingr   r}   r   ÚSTAGING_URIr|   rˆ   r€   r   r   r   Útest_staging_flag  s    
zParseTest.test_staging_flagc                 C   sn   |   |j¡ |   |j¡ |   |j¡ |  |jtj¡ |rR|   |j¡ |   |j	¡ n|  
|j¡ |  
|j	¡ d S r-   )ro   Zdry_runZbreak_my_certsrŠ   r   r}   r   r‹   ZtosZregister_unsafely_without_emailÚassertFalse)r   rQ   Zexisting_accountr   r   r   Ú_assert_dry_run_flag_worked   s    z%ParseTest._assert_dry_run_flag_workedc              	   C   sp  t  ¡ }d |¡ ¡ }|  tj| j|¡ |  |  |dg ¡d¡ |  |  |dg ¡d¡ |  |  |dg ¡d¡ t	j
 |tj¡}t |¡ t t	j
 |d¡¡ |  |  |dg ¡d¡ |  |  |dg ¡d¡ |  |  |dg ¡d¡ |dg7 }|  |  |dd	g ¡jd	¡ |  |  |dtjg ¡jtj¡ |  |  |dt d
¡g ¡jtj¡ dg}|  |dd	dg |¡ d S )Nz--dry-run --config-dir {0}ZauthFrJ   rM   Zfake_account_dirTr‚   rL   r}   r‰   )rN   Zmkdtemprƒ   r|   r   r   r„   r7   rŽ   r   r   r   r   ZACCOUNTS_DIRr   Úmkdirr   r}   r‹   r   r)   rˆ   )r   r%   ru   Zaccount_dirZ	conflictsr   r   r   Útest_dry_run_flag-  sF     ÿ ÿ ÿ

ÿÿÿÿzParseTest.test_dry_run_flagc                 C   s~   d}t  |¡}|  d |¡ ¡ ¡ |  t  ||¡¡ |  t  dd¡¡ d}|  t  |t  |¡¡¡ |  t  dt  d¡¡¡ d S )NZrsa_key_sizez--rsa-key-size {0}Zno_verify_sslTr%   Zauthenticator)r   r)   r7   rƒ   r|   ro   Zoption_was_setr   )r   Zkey_size_optionZkey_size_valueZconfig_dir_optionr   r   r   Útest_option_was_setT  s    
 ÿ ÿzParseTest.test_option_was_setc                 C   sh   t j ¡ D ]$\}}|  d|g¡}|  |j|¡ q
t j ¡ D ](\}}|  d| ¡ g¡}|  |j|¡ q:d S )Nrk   )r   ZREVOCATION_REASONSÚitemsr7   r   ÚreasonÚupper)r   r“   ÚcoderQ   r   r   r   Útest_encode_revocation_reasonb  s    z'ParseTest.test_encode_revocation_reasonc                 C   s0   |   tj| jd ¡ ¡ |   tj| jd ¡ ¡ d S )Nzrenew --force-interactivez-n --force-interactive©r   r   r„   r7   r|   r*   r   r   r   Útest_force_interactivej  s      ÿ  ÿz ParseTest.test_force_interactivec              	   C   s.   t  d¡ |  t| jd ¡ ¡ W 5 Q R X d S )Núcertbot.cli.sys.stderrz"--renew-hook foo --deploy-hook bar©r?   r@   r   rB   r7   r|   r*   r   r   r   Útest_deploy_hook_conflictp  s    
ÿz#ParseTest.test_deploy_hook_conflictc                 C   s8   d}|   d|d|dg¡}|  |j|¡ |  |j|¡ d S )Nr   rg   ú--deploy-hookú--disable-hook-validation©r7   r   Zdeploy_hookÚ
renew_hook©r   ÚvaluerQ   r   r   r   Ú#test_deploy_hook_matches_renew_hooku  s     þz-ParseTest.test_deploy_hook_matches_renew_hookc                 C   s4   d}|   d|dg¡}|  |j|¡ |  |j|¡ d S )Nr   rœ   r   rž   r    r   r   r   Ú test_deploy_hook_sets_renew_hook}  s    ÿz*ParseTest.test_deploy_hook_sets_renew_hookc              	   C   s.   t  d¡ |  t| jd ¡ ¡ W 5 Q R X d S )Nr™   z"--deploy-hook foo --renew-hook barrš   r*   r   r   r   Útest_renew_hook_conflict„  s    
ÿz"ParseTest.test_renew_hook_conflictc                 C   s8   d}|   d|d|dg¡}|  |j|¡ |  |j|¡ d S )Nr   rœ   rg   r   rž   r    r   r   r   Ú#test_renew_hook_matches_deploy_hook‰  s     þz-ParseTest.test_renew_hook_matches_deploy_hookc                 C   s4   d}|   d|dg¡}|  |jd ¡ |  |j|¡ d S )Nr   rg   r   rž   r    r   r   r   Ú'test_renew_hook_does_not_set_renew_hook‘  s    ÿz1ParseTest.test_renew_hook_does_not_set_renew_hookc              	   C   sB   t  d¡. |  t| jd ¡ ¡ |  t| jd ¡ ¡ W 5 Q R X d S )Nr™   z--max-log-backups fooz--max-log-backups -42rš   r*   r   r   r   Útest_max_log_backups_error˜  s      ÿ  ÿz$ParseTest.test_max_log_backups_errorc                 C   s(   d}|   d|g¡}|  |jt|ƒ¡ d S )NZ42z--max-log-backups)r7   r   Zmax_log_backupsÚintr    r   r   r   Útest_max_log_backups_successŸ  s    z&ParseTest.test_max_log_backups_successc                 C   sd   |   g ¡}|  |jg ¡ |  |jg ¡ tjjg|_dg|_|   g ¡}|  |jg ¡ |  |jg ¡ d S )NrL   )r7   r   rP   ry   r   rw   rx   r~   r   r   r   Útest_unchanging_defaults¤  s    

z"ParseTest.test_unchanging_defaultsc                 C   s   |   |  dg¡j¡ d S )Nz--no-directory-hooks)r   r7   Údirectory_hooksr*   r   r   r   Útest_no_directory_hooks_set°  s    z%ParseTest.test_no_directory_hooks_setc                 C   s   |   |  g ¡j¡ d S r-   )ro   r7   r«   r*   r   r   r   Útest_no_directory_hooks_unset³  s    z'ParseTest.test_no_directory_hooks_unsetc                 C   s   |   dg¡}|  |j¡ d S )Nrl   )r7   ro   Údelete_after_revoker~   r   r   r   Útest_delete_after_revoke¶  s    z"ParseTest.test_delete_after_revokec                 C   s   |   g ¡}|  |jd ¡ d S r-   )r7   r   r®   r~   r   r   r   Ú test_delete_after_revoke_defaultº  s    
z*ParseTest.test_delete_after_revoke_defaultc                 C   s   |   dg¡}|  |j¡ d S )Nrm   )r7   r   r®   r~   r   r   r   Útest_no_delete_after_revoke¾  s    z%ParseTest.test_no_delete_after_revokec                 C   s   |   tj| jd ¡ ¡ d S )Nz(--allow-subset-of-names -d *.example.orgr—   r*   r   r   r   Útest_allow_subset_with_wildcardÂ  s    ÿz)ParseTest.test_allow_subset_with_wildcardc              	   C   s0   dD ]&}dD ]}|   d|  ||g¡k¡ qqd S )N)rh   r^   )r_   ri   zdns-route53zcertbot-route53:auth)r   rD   )r   Z	help_flagZtopicr   r   r   Útest_route53_no_revertÆ  s    z ParseTest.test_route53_no_revertc                 C   s   |   dg¡}|  |j¡ d S )Nz--no-permissions-check)r7   ro   Zno_permissions_checkr~   r   r   r   Ú"test_no_permissions_check_acceptedË  s    z,ParseTest.test_no_permissions_check_acceptedN),r   r    r!   r"   r/   Ústaticmethodr4   r7   rD   r?   r@   rR   rU   r]   rr   rt   rv   rz   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,   ?   sR   


<	'r,   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚDefaultTestzTests for certbot.cli._Default.c                 C   s   t  ¡ | _t  ¡ | _d S r-   )r   Z_DefaultÚdefault1Údefault2r*   r   r   r   r/   Ô  s    
zDefaultTest.setUpc                 C   s   |   | j¡ |   | j¡ d S r-   )r   r·   r¸   r*   r   r   r   Útest_booleanÙ  s    zDefaultTest.test_booleanc                 C   s   |   | j| j¡ d S r-   )r   r·   r¸   r*   r   r   r   Útest_equalityÝ  s    zDefaultTest.test_equalityc                 C   s   |   t| jƒt| jƒ¡ d S r-   )r   Úhashr·   r¸   r*   r   r   r   Ú	test_hashà  s    zDefaultTest.test_hashN)r   r    r!   r"   r/   r¹   rº   r¼   r   r   r   r   r¶   Ð  s
   r¶   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚSetByCliTestz3Tests for certbot.set_by_cli and related functions.c                 C   s   t tƒ d S r-   r.   r*   r   r   r   r/   è  s    zSetByCliTest.setUpc                 C   s   |   tdd ¡ dƒ¡ d S )NrŸ   z--deploy-hook foorM   )ro   Ú_call_set_by_clir|   r*   r   r   r   Útest_deploy_hookë  s
      ÿzSetByCliTest.test_deploy_hookc                 C   s"   d  ¡ }d}|  td||ƒ¡ d S )Nz-w /var/www/html -d example.comrM   Zwebroot_map)r|   ro   r¾   )r   r2   Úverbr   r   r   Útest_webroot_mapï  s    zSetByCliTest.test_webroot_mapc                 C   s$   t  dd¡ t  dd¡ |  ¡  d S )NÚmanual_public_ip_logging_okÚmanual_auth_hookÚmanual©r   Zreport_config_interactionÚ&_test_report_config_interaction_commonr*   r   r   r   Ú"test_report_config_interaction_strô  s
    ÿz/SetByCliTest.test_report_config_interaction_strc                 C   s$   t  dd¡ t  dd¡ |  ¡  d S )N)rÂ   )rÃ   )rÄ   rÅ   r*   r   r   r   Ú'test_report_config_interaction_iterableû  s
    ÿz4SetByCliTest.test_report_config_interaction_iterablec                 C   sh   dg}d}dD ]}|   t|||ƒ¡ qdtj_ddg}dD ]}|   t|||ƒ¡ q:|  td||ƒ¡ dS )	a  Tests implied interaction between manual flags.

        --manual implies --manual-auth-hook which implies
        --manual-public-ip-logging-ok. These interactions don't actually
        exist in the client, but are used here for testing purposes.

        z--manualrM   )rÄ   rÃ   rÂ   Nz--manual-auth-hookZcommand)rÃ   rÂ   rÄ   )ro   r¾   r   Ú
set_by_cliZdetectorr   )r   r2   rÀ   rG   r   r   r   rÆ     s    	z3SetByCliTest._test_report_config_interaction_commonN)
r   r    r!   r"   r/   r¿   rÁ   rÇ   rÈ   rÆ   r   r   r   r   r½   ä  s   r½   c                 C   sX   t  d¡D}t ¡ 0 ||_||_t | ¡W  5 Q R £ W  5 Q R £ S Q R X W 5 Q R X d S )Nzcertbot.cli.helpful_parser)r?   r@   r5   r6   r2   rÀ   r   rÉ   )Úvarr2   rÀ   Zmock_parserr   r   r   r¾     s
    
r¾   Ú__main__)%r"   r   rE   rN   Zunittestr?   r=   Z	six.movesr   Zacmer   Zcertbot.tests.utilZtestsÚutilr5   Zcertbotr   r   r   Zcertbot.compatr   r   Zcertbot.pluginsr	   r
   ZPluginsRegistryZfind_allr0   r   ZTestCaser#   r,   r¶   r½   r¾   r   Úmainr   r   r   r   Ú<module>   s8   
   6
