U
    ÔZj’Y  ã                   @   sž   d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ G d
d„ dejƒZedkrše ¡  dS )zTests for certbot_nginx.parser.é    N)ÚList)Úerrors)Úos)Únginxparser)Úobj)Úparser)Úutilc                   @   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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d0S )1ÚNginxParserTestzNginx Parser Test.c                 C   s(   t  | j¡ t  | j¡ t  | j¡ d S ©N)ÚshutilÚrmtreeÚtemp_dirZ
config_dirZwork_dir©Úself© r   úb/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/certbot_nginx/tests/parser_test.pyÚtearDown   s    zNginxParserTest.tearDownc                 C   s.   t j | jd¡}t |¡}|  |j| j¡ d S )Nz*etc_nginx/////ubuntu_nginx/../../etc_nginx)	r   ÚpathÚjoinr   r   ÚNginxParserÚassertEqualÚrootÚconfig_path)r   r   Únparserr   r   r   Útest_root_normalized   s    
z$NginxParserTest.test_root_normalizedc              	   C   sN   t  ¡ }z4t  | j¡ t t j | j¡¡}|  	|j
| j¡ W 5 t  |¡ X d S r
   )r   ÚgetcwdÚchdirr   r   r   r   Úrelpathr   r   r   )r   Zcurr_dirr   r   r   r   Útest_root_absolute    s    z"NginxParserTest.test_root_absolutec                 C   s(   t  | jtjj ¡}|  |j| j¡ d S r
   )r   r   r   r   r   Úsepr   r   ©r   r   r   r   r   Útest_root_no_trailing_slash,   s    z+NginxParserTest.test_root_no_trailing_slashc                    sš   t  | j¡‰ ˆ  ¡  |  t‡ fdd„dD ƒƒtˆ j ¡ ƒ¡ |  ddddggˆ jˆ  d¡ ¡ |  d	gd
dgd
dgddgddggggˆ jˆ  d¡ ¡ dS )z+Test recursive conf file parsing.

        c                    s   g | ]}ˆ   |¡‘qS r   )Úabs_path©Ú.0Úx©r   r   r   Ú
<listcomp>6   s     z-NginxParserTest.test_load.<locals>.<listcomp>)úfoo.confú
nginx.confúserver.confúsites-enabled/defaultúsites-enabled/example.comzsites-enabled/headers.comzsites-enabled/migration.comzsites-enabled/sslon.comúsites-enabled/globalssl.comzsites-enabled/ipv6.comzsites-enabled/ipv6ssl.comÚserver_nameÚsomenameÚaliasúanother.aliasr*   ÚserverÚlistenú69.50.225.155:9000ú	127.0.0.1ú.example.comú	example.*r,   N)	r   r   r   Úloadr   ÚsetÚparsedÚkeysr"   r   r   r&   r   Ú	test_load0   s&    ÿ
öÿýÿüzNginxParserTest.test_loadc                 C   s|   t  | j¡}tjdkrH|  d| d¡¡ |  tj | jd¡| d¡¡ n0|  d| d¡¡ |  tj | jd¡| d¡¡ d S )NÚntz/etc/nginx/*zfoo/barzC:\etc\nginx\*zfoo\bar)	r   r   r   r   Únamer   r"   r   r   r    r   r   r   Útest_abs_pathJ   s    
ÿÿzNginxParserTest.test_abs_pathc              	   C   s–   t  | j¡}|jddd� | | d¡¡}|  dtt | d¡¡ƒ¡ |  dtt | d¡¡ƒ¡ |  d	gd
dgd
dgddgddgggg|d ¡ d S )NÚtestF)Zlazyzsites-enabled/example.com.testé   z*.testé   zsites-enabled/*.testr2   r3   r4   r5   r.   r6   r7   r   )	r   r   r   ÚfiledumpZ_parse_filesr"   r   ÚlenÚglob)r   r   r:   r   r   r   Útest_filedumpV   s     ÿÿýüzNginxParserTest.test_filedumpc                 C   sz  dgdgdggdgdggfdgdgdggdggfdgdgdggdggfg g fdg fdgdgdggdgdgdgggddgddgddgddggfdgdgdggdgdgdgggddgddgddggfdgdgdggdgdgdgggddgddggfdgdgdggdgdgdgggddggfdgdgdggdgdgdgggg fg
}|D ]4\}}g }t  |dd„ |fd	d„¡ |  ||¡ �q@d S )
Né   rA   r   é   é   é   c                 S   s"   t | tƒo t| ƒdko | d dkS )NrI   r   rG   )Ú
isinstanceÚlistrD   )r%   r   r   r   Ú<lambda>v   s   

ÿz7NginxParserTest.test__do_for_subarray.<locals>.<lambda>c                 S   s
   |  |¡S r
   )Úappend)r%   ÚyZptsr   r   r   rM   y   ó    )r   Z_do_for_subarrayr   )r   ZmylistsZmylistÚresultÚpathsr   r   r   Útest__do_for_subarraye   s(    ÿ4.("ö
üz%NginxParserTest.test__do_for_subarrayc                 C   sl   t  | j¡}| ¡ }t | d¡t dddddd¡gddtdgƒg dg¡}dd	„ |D ƒd }|  	||¡ d S )
Nr-   z4.8.2.6Z57TFúglobalssl.comr   c                 S   s   g | ]}d |j kr|‘qS )rT   ©Úfilepr#   r   r   r   r'   …   s     
 z>NginxParserTest.test_get_vhosts_global_ssl.<locals>.<listcomp>)
r   r   r   Ú
get_vhostsr   ÚVirtualHostr"   ÚAddrr9   r   )r   r   ÚvhostsZvhostZglobalssl_comr   r   r   Útest_get_vhosts_global_ssl|   s     ÿ    ýz*NginxParserTest.test_get_vhosts_global_sslc                 C   s  t  | j¡}| ¡ }t | d¡t dddddd¡gddtddgƒg dd	d
g¡}t | d¡t dddddd¡t dddddd¡gddtdddgƒg dd	dg¡}t | d¡t dddddd¡t dddddd¡gddtddgƒg dg¡}t | d¡t dddddd¡t dddddd¡gddtdgƒg dg¡}t | d¡t dddddd¡gddtddgƒg d d	dg¡}|  	d!t
|ƒ¡ d"d#„ |D ƒd }|  	||¡ d$d#„ |D ƒd }	|  	||	¡ d%d#„ |D ƒd }
|  	||
¡ d&d#„ |D ƒd }|  	||¡ d'd#„ |D ƒd }|  	||¡ d S )(Nr)   Ú Z8080FTÚ	localhostú~^(www\.)?(example|bar)\.é
   rI   é	   r/   Z8000r1   r0   é   r,   z69.50.225.155Z9000r5   r6   r7   r   r+   ZmyhostZ	otherhostúwww.example.orgr(   Ú*Ú80ú*.www.foo.comú*.www.example.comrG   é   c                 S   s   g | ]}d |j kr|‘qS )úexample.comrU   r#   r   r   r   r'   ±   s     
 z3NginxParserTest.test_get_vhosts.<locals>.<listcomp>c                 S   s   g | ]}d |j kr|‘qS ©ÚdefaultrU   r#   r   r   r   r'   ³   s     
 c                 S   s   g | ]}d |j kr|‘qS )r(   rU   r#   r   r   r   r'   µ   s     
 c                 S   s   g | ]}d |j kr|‘qS )r]   ©Únamesr#   r   r   r   r'   ·   s     
 c                 S   s   g | ]}d |j kr|‘qS )r/   rk   r#   r   r   r   r'   ¹   s     
 )r   r   r   rW   r   rX   r"   rY   r9   r   rD   )r   r   rZ   Zvhost1Zvhost2Zvhost3Zvhost4Zvhost5Úexample_comrj   Zfooconfr]   r/   r   r   r   Útest_get_vhostsˆ   s²     ÿ ÿ ú ÿ ÿþ  ù   ÿ ÿþ 
  ú ÿ ÿþ   ú ÿ  ÿ ûzNginxParserTest.test_get_vhostsc                 C   sÔ   t  | j¡}t d d d d d ddgddgddgddgd	d
ggggd ¡}|  | |¡¡ ddddgdddgddgg|_|  | |¡¡ ddgdddgg|_|  | |¡¡ ddgddgdddgg|_|  | |¡¡ d S )Nr3   zmyhost default_serverr.   rb   Úlocationú/r   ÚhtmlÚindexzindex.html index.htmz*:80Zdefault_serverÚsslre   rf   z/home/ubuntu/sites/foo/z80 sslrd   Úon)	r   r   r   r   rX   ÚassertFalseZhas_ssl_on_directiveÚrawÚ
assertTrue)r   r   Ú
mock_vhostr   r   r   Útest_has_ssl_on_directive¼   s.    þü
þÿþz)NginxParserTest.test_has_ssl_on_directivec                 C   sÈ   t  | j¡}t | d¡d d d tddgƒd dddg¡}| d¡}tdd	gƒ}||_||_d
g|_	| 
|ddgddgg¡ | |d¡ | |d¡ |  |j| dgddgddgddgdd	gg ggg¡ d S )Nr)   r]   r^   r_   rI   r`   r,   r6   r7   r   ÚfooÚbarÚssl_certificateú/etc/ssl/cert2.pemr2   r3   r4   r5   r.   )r   r   r   r   rX   r"   r9   rV   rl   r   Úadd_server_directivesZremove_server_directivesr   r:   )r   r   rx   rm   rl   r   r   r   Útest_remove_server_directivesÑ   s>      ÿ ü
ÿÿ
üÿz-NginxParserTest.test_remove_server_directivesc           	      C   s†  t  | j¡}t | d¡d d d tddgƒd dddg¡}| |ddgd	d
ddgg¡ t 	d¡}t
 |j| d¡ ¡}|  dtt ||¡ƒ¡ | d¡}tddgƒ}||_||_dg|_| |ddgd
dgg¡ | |ddgg¡ ddlm} |  |j| dgddgddgddgddgddgd|gd
dgd|gg g g
gg¡ | d¡}tdddgƒ}||_||_g |_|  tj|j|ddgd
dgg¡ d S )Nr)   r]   r^   r_   rI   r`   rz   r{   z
 r|   ú z/etc/ssl/cert.pemz&\n\s+ssl_certificate /etc/ssl/cert.pemr,   r6   r7   r   r}   ©ÚCOMMENTr2   r3   r4   r5   r.   ú#r*   r0   r1   r/   )r   r   r   r   rX   r"   r9   r~   ÚreÚcompiler   Údumpsr:   r   rD   ÚfindallrV   rl   r   Úcertbot_nginx.parserr‚   ZassertRaisesr   ZMisconfigurationError)	r   r   rx   Zssl_reÚdumprm   rl   r‚   Zserver_confr   r   r   Útest_add_server_directivesé   sp      ÿ üÿÿ

ÿÿ
  ùÿ
ÿýz*NginxParserTest.test_add_server_directivesc                 C   sÈ   t  | j¡}| d¡}t |d d d tddgƒd dg¡}| |ddddgg¡ | |dd	d| d
¡gg¡ ddlm	} |  
|j| dgddgddgddgddgdddgg d	| d
¡gd|gg g	gg¡ d S )Nr,   r6   r7   r   z
  rƒ   r€   zwhat a nice commentÚincludezcomment_in_file.confr�   r2   r3   r4   r5   r.   )r   r   r   r"   r   rX   r9   r~   rˆ   r‚   r   r:   )r   r   rm   rx   r‚   r   r   r   Útest_comment_is_repeatable  s>    
  
 ýÿÿÿ
øÿz*NginxParserTest.test_comment_is_repeatablec                 C   sþ   t  | j¡}tddgƒ}| d¡}t |d d d |d dg¡}| |ddgg¡ ddlm	} |  
|j| dgd	d
gd	dgddgd|gddgg ggg¡ tddgƒ|_| |ddgg¡ |  
|j| dgd	d
gd	dgddgd|gddgg ddgd|gg g	gg¡ d S )Nr6   r7   r,   r   r.   z
foobar.comr�   r2   r3   r4   r5   rƒ   r|   zcert.pem)r   r   r   r9   r"   r   rX   Zupdate_or_add_server_directivesrˆ   r‚   r   r:   rl   )r   r   ÚtargetrV   rx   r‚   r   r   r   Útest_replace_server_directives0  sJ    
 ÿ
  ýþ ÿ
    üþz.NginxParserTest.test_replace_server_directivesc                 C   sÚ   d}t dddgƒt dddgƒt ddgƒt d	dgƒt d
ddgƒt dddgƒt ddgƒt dddgƒt dddgƒt ddgƒt dgƒt g ƒt dgƒg}dddddddddddddg}t|ƒD ] \}}|  |t ||| ¡¡ q´d S )Núwww.eff.orgzirrelevant.long.name.eff.orgú*.orgzeff.orgzww2.eff.orgztest.www.eff.orgú	*.eff.orgú.www.eff.orgú.eff.orgzwww.eff.ú	www.eff.*z*.www.eff.orgrh   ú~^(www\.)?(eff.+)z*.eff.*rc   úwww.*z.test.eff.org)Úexactr�   )NN)r—   r’   )Úwildcard_startr“   )Úwildcard_endr”   )Úregexr•   )r˜   rc   )r™   r–   )r˜   r‘   )r˜   r�   )r9   Ú	enumerater   r   Zget_best_match)r   Ztarget_namerl   ZwinnersÚiÚwinnerr   r   r   Útest_get_best_matchK  sB    



ôôÿz#NginxParserTest.test_get_best_matchc                 C   s‚   t  dddddgdddgddddgg¡}d	d
lm}m} ||dƒ ||d	ƒ |  |jdddddg|ddddg|ddddgg¡ d S )NÚ
Úar€   ÚbÚcÚdÚeÚfr   )Úcomment_directiveÚCOMMENT_BLOCKrI   )r   ZUnspacedListrˆ   r¦   r§   r   Úspaced)r   Úblockr¦   r§   r   r   r   Útest_comment_directivel  s     
ý


úz&NginxParserTest.test_comment_directivec                 C   sš   t  d¡}|d d }ddlm} ||ddƒ ||ddƒ ||d	d
ƒ |  |jddddgddddgddddgddddgdddgdddgdddgdg¡ d S )Na4  
            server {
                listen 80;
                root /var/www/html;
                index star.html;

                server_name *.functorkitten.xyz;
                ssl_session_timeout 1440m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

                ssl_prefer_server_ciphers on;
            }r   rI   )Ú_comment_out_directiverH   Zblah1rJ   Zblah2é   Zblah3z
                r3   r€   rd   r   z/var/www/htmlrr   z	star.htmlz

                r.   z*.functorkitten.xyzrƒ   z1 ssl_session_timeout 1440m; # duplicated in blah1z; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # duplicated in blah2z4 ssl_prefer_server_ciphers on; # duplicated in blah3z
            )r   Úloadsrˆ   r«   r   r¨   )r   Zserver_blockr©   r«   r   r   r   Útest_comment_out_directive}  s     




øz*NginxParserTest.test_comment_out_directivec                 C   sŠ   t  ddgg¡}|  |d ¡ t  dddgg¡}|  |d ¡ t  ddgddgg¡}|  |d ¡ t  ddgddgg¡}|  |d ¡ d S )Nr3   Ú443rs   Úoffrt   )r   Ú_parse_server_rawru   rw   ©r   r2   r   r   r   Útest_parse_server_raw_ssl˜  s$    ÿÿ ÿ ÿz)NginxParserTest.test_parse_server_raw_sslc                 C   s(   t  ddgg¡}|  t|d ƒd¡ d S )Nr3   zunix:/var/run/nginx.sockÚaddrsr   )r   r±   r   rD   r²   r   r   r   Útest_parse_server_raw_unix­  s    ÿz*NginxParserTest.test_parse_server_raw_unixc                 C   s.   t  | j¡}| ddgg¡}|  |d ¡ d S )Nr3   r¯   rs   )r   r   r   Zparse_serverrw   )r   r   r2   r   r   r   Ú$test_parse_server_global_ssl_applied³  s
    ÿz4NginxParserTest.test_parse_server_global_ssl_appliedc           	      C   s  t  | j¡}| ¡ }dd„ |D ƒd }|j|dd�}|jdd� |  tt|j	ƒƒj
¡ |  |j|j¡ t  | j¡}| ¡ }dd„ |D ƒ}|  t|ƒd	¡ |d
 }|  tt|j	ƒƒj
¡ |  tt|jƒƒtt|jƒƒ¡ |  t|jƒt|jƒ¡ |  tt|j	ƒƒ tt|j	ƒƒ¡¡ d S )Nc                 S   s   g | ]}d |j kr|‘qS ri   rU   r#   r   r   r   r'   ¾  s     
 z8NginxParserTest.test_duplicate_vhost.<locals>.<listcomp>r   T©Zremove_singleton_listen_paramsr\   ©Úextc                 S   s   g | ]}d |j kr|‘qS ri   rU   r#   r   r   r   r'   É  s     
 rG   rI   )r   r   r   rW   Úduplicate_vhostrC   ru   ÚnextÚiterr´   rj   ZassertNotEqualr   r   rD   rl   rv   rw   Zsuper_eq)	r   r   rZ   rj   Ú	new_vhostZnew_nparserZ
new_vhostsZnew_defaultsZnew_vhost_parsedr   r   r   Útest_duplicate_vhostº  s      z$NginxParserTest.test_duplicate_vhostc                 C   s¦   t  | j¡}| ¡ }dd„ |D ƒd }|j|dd�}|jdd� |jD ]}|  |j¡ qF|j|dd�}|jdd� d}|jD ]}|j	r||  
|j¡ d}q||  
|¡ d S )	Nc                 S   s   g | ]}d |j kr|‘qS )Úipv6sslrU   r#   r   r   r   r'   Õ  s     
 zHNginxParserTest.test_duplicate_vhost_remove_ipv6only.<locals>.<listcomp>r   Tr·   r\   r¸   F)r   r   r   rW   rº   rC   r´   ru   Zipv6onlyZipv6rw   )r   r   rZ   r¿   r½   ÚaddrZidentical_vhostZcalledr   r   r   Ú$test_duplicate_vhost_remove_ipv6onlyÑ  s    

z4NginxParserTest.test_duplicate_vhost_remove_ipv6onlyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r!   r<   r?   rF   rS   r[   rn   ry   r   rŠ   rŒ   rŽ   rž   rª   r®   r³   rµ   r¶   r¾   rÁ   r   r   r   r   r	      s0   4.!r	   Ú__main__)rÅ   rE   r„   r   ZunittestZacme.magic_typingr   Zcertbotr   Zcertbot.compatr   Zcertbot_nginxr   r   r   Zcertbot_nginx.testsr   Z	NginxTestr	   rÂ   Úmainr   r   r   r   Ú<module>   s"      Y