U
    ÔZjAA  ã                   @   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m	Z	m
Z
mZmZmZ ddlmZ e d¡ZG dd„ dejƒZG dd	„ d	ejƒZed
krše ¡  dS )z#Test for certbot_nginx.nginxparser.é    N)ÚParseException)ÚRawNginxParserÚloadsÚloadÚdumpsÚdumpÚUnspacedList)Ú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&S )'ÚTestRawNginxParserz+Test the raw low-level Nginx config parser.c                 C   sP   t j d¡ ¡ }|  |dddg¡ t j d¡ ¡ }|  |dddgdddg¡ d S )Nzroot /test;Úrootú z/testzroot /test;foo bar;ÚfooÚbar)r   Z
assignmentÚparseStringÚasListÚassertEqual©ÚselfÚparsed© r   úg/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/certbot_nginx/tests/nginxparser_test.pyÚtest_assignments   s    z#TestRawNginxParser.test_assignmentsc              	   C   s€   t j d¡ ¡ }|  |ddgg g¡ t j d¡ ¡ }|  |dddgg g¡ t j d¡ ¡ }|  |ddgdddddgdgg¡ d S )	Nzfoo {}r   r   zlocation /foo{}Úlocationz/foozfoo { bar foo ; }r   )r   Úblockr   r   r   r   r   r   r   Útest_blocks   s    zTestRawNginxParser.test_blocksc                 C   sF   t j d¡ ¡ }|\}}|  t|ƒdddgg g¡ |  t|ƒd¡ d S )Nzfoo { bar {} }r   r   r   )r   r   r   r   r   ÚFIRST)r   r   r   Úcontentr   r   r   Útest_nested_blocks"   s    z%TestRawNginxParser.test_nested_blocksc                 C   sˆ   t tdddgdddgddddgdd	dd
gddddgdddddgdddgdddgddddggggggggƒƒ}|  | d¡d d¡¡ d S )NÚuserr   úwww-dataÚ
Úserverú
    ÚlistenÚ80Úserver_namezfoo.comr   ú/home/ubuntu/sites/foo/z

    r   ú/statusz	
        Úcheck_statusÚ z


        Útypesz
            ú
image/jpegÚjpgz¿user www-data;
server {
    listen 80;
    server_name foo.com;
    root /home/ubuntu/sites/foo/;

    location /status {
        check_status;

        types {
            image/jpeg jpg;}}})r   r   r   Úsplit)r   Zdumpedr   r   r   Útest_dump_as_string(   s&    


ÿþüþ
öÿz&TestRawNginxParser.test_dump_as_stringc                 C   sº   t t d¡ƒ�}t t|ƒ¡}W 5 Q R X |  |ddgdgdgdddd	gd
ddgddgddgdgddgggggdddgddgddgggdddgg gdddgg gdddgg gggggg¡ d S )Núfoo.confr   r   Úhttpr!   r#   z*:80Zdefault_serverÚsslr%   z*.www.foo.comz*.www.example.comr   r&   r   r'   r*   r+   r,   ú~zcase_sensitive\.php$Úindexz	index.phpz	/var/rootú~*zcase_insensitive\.php$ú=zexact_match\.php$z^~zignore_regex\.php$©Úopenr	   Úget_data_filenameZfilter_commentsr   r   ©r   Úhandler   r   r   r   Útest_parse_from_fileC   s0    
ÿþóÿÿþz'TestRawNginxParser.test_parse_from_filec                 C   s²   t t d¡ƒ�}t t|ƒ¡}W 5 Q R X |  |dgddgggdgddgdddgd	d
ddgdddgggggggdgddgdddgdddgdddddgddgdddgggggg¡ d S )Nzedge_cases.confr!   r%   Úsimplezwith.ifr   r2   z^/services/.+$Úifz($request_filenamer4   z\.(ttf|woff)$)Ú
add_headerzAccess-Control-Allow-Originz"*"zwith.complicated.headersz\.(?:gif|jpe?g|png)$ZPragmaÚpublicúCache-Controlz+'public, must-revalidate, proxy-revalidate'z
"test,;{}"r   Zblahz"hello;world"Ú	try_filesz$uriz	@rewritesr6   r9   r   r   r   Útest_parse_from_file2[   s@    

ÿÿÿÿ  þûÿÿÿúþz(TestRawNginxParser.test_parse_from_file2c              	   C   s^   t t d¡ƒ�}t t|ƒ¡}W 5 Q R X |  |dgdgddgddgdd	gggggggg¡ d S )
Nzmultiline_quotes.confr0   r!   r#   z*:443r   ú/Zbody_filter_by_luazâ'ngx.ctx.buffered = (ngx.ctx.buffered or "") .. string.sub(ngx.arg[1], 1, 1000)
                            if ngx.arg[2] then
                              ngx.var.resp_body = ngx.ctx.buffered
                            end'r6   r9   r   r   r   Útest_parse_from_file3p   s     ÿÿÿÿÿþz(TestRawNginxParser.test_parse_from_file3c              	   C   s,   t t d¡ƒ�}|  tt|¡ W 5 Q R X d S )Nzbroken.conf)r7   r	   r8   ÚassertRaisesr   r   )r   r:   r   r   r   Útest_abort_on_parse_failure‚   s    z.TestRawNginxParser.test_abort_on_parse_failurec                 C   sÞ   t t d¡ƒ�}t|ƒ}W 5 Q R X |d d  tdgdddddgddd	gd
ddgdddgdddgdddgdddgdddgdddgdddddgggggƒ¡ tjdd��"}t||ƒ | 	d¡ t|ƒ}W 5 Q R X |  
||¡ d S )Nz
nginx.conféÿÿÿÿr!   r#   r   Ú443r1   r%   Ú	localhostZssl_certificatezcert.pemZssl_certificate_keyzcert.keyZssl_session_cachezshared:SSL:1mZssl_session_timeoutZ5mZssl_cipherszHIGH:!aNULL:!MD5r   rC   r   Úhtmlr3   z
index.htmlz	index.htmúw+t©Úmoder   )r7   r	   r8   r   Úappendr   ÚtempfileÚTemporaryFiler   Úseekr   ©r   r:   r   ÚfZ
parsed_newr   r   r   Útest_dump_as_file†   s,    ÿÿùÿ

z$TestRawNginxParser.test_dump_as_filec                 C   s®   t t d¡ƒ�}t|ƒ}W 5 Q R X tjdd��"}t||ƒ | d¡ t|ƒ}W 5 Q R X |  ||¡ |  |ddgddgdd	gd
gdgddgddgddgddgddgggg¡ d S )Nzminimalistic_comments.confrK   rL   r   ú#z$ Use bar.conf when it's a full moon!Úincluder/   z Kilroy was herer(   r!   r)   z' Don't forget to open up your firewall!r#   Ú1234z listen 80;)	r7   r	   r8   r   rO   rP   r   rQ   r   rR   r   r   r   Útest_comments›   s*    

üÿûz TestRawNginxParser.test_commentsc                 C   s.   t dƒ}|  |ddddgdddgggg¡ d S )	Nz1if ($http_accept ~* "webp") { set $webp "true"; }r=   z($http_acceptr4   z"webp")Úsetz$webpz"true"©r   r   r   r   r   r   Útest_issue_518²   s    

ÿÿz!TestRawNginxParser.test_issue_518c                 C   s&   t dƒ}|  |dgddgggg¡ d S )Nz&http {
          # server{
          }r0   rU   z server{rZ   r   r   r   r   Útest_comment_in_blockº   s    ÿÿz(TestRawNginxParser.test_comment_in_blockc                 C   s    t dƒ}|  |dddgg¡ d S )NzYaccess_log syslog:server=unix:/dev/log,facility=auth,tag=nginx_post,severity=info custom;Z
access_logzFsyslog:server=unix:/dev/log,facility=auth,tag=nginx_post,severity=infoZcustomrZ   r   r   r   r   Útest_access_logÄ   s    þÿz"TestRawNginxParser.test_access_logc                 C   s    t dƒ}|  |dddgg¡ d S )NzEadd_header Cache-Control no-cache,no-store,must-revalidate,max-age=0;r>   r@   z+no-cache,no-store,must-revalidate,max-age=0rZ   r   r   r   r   Útest_add_headerÏ   s    ÿz"TestRawNginxParser.test_add_headerc              
   C   sL   d}t |ƒ}|  |dgdddgddgdd	gd
dgddgggdgggg¡ d S )NzÝhttp {
            map $http_upgrade $connection_upgrade {
              default upgrade;
              ''      close;
              "~Opera Mini" 1;
              *.example.com 1;
            }
            one;
        }r0   Úmapz$http_upgradez$connection_upgradeÚdefaultÚupgradez''Úclosez"~Opera Mini"Ú1z*.example.comÚonerZ   )r   Ztest_strr   r   r   r   Ú!test_map_then_assignment_in_block×   s    	üùÿz4TestRawNginxParser.test_map_then_assignment_in_blockc                 C   s    t dƒ}|  |dddgg¡ d S )NzQtry_files /typo3temp/tx_ncstaticfilecache/$host${request_uri}index.html @nocache;rA   z=/typo3temp/tx_ncstaticfilecache/$host${request_uri}index.htmlz@nocacherZ   r   r   r   r   Útest_variable_nameï   s    þÿz%TestRawNginxParser.test_variable_namec                 C   sž   d}t |ƒ}|  |ddddgdddd	gggdd
ddgdddgggddddgddgggddgddgggddddgdddgggdddgddgggdd d!gg¡ d S )"Na•  
            if ($http_user_agent ~ MSIE) {
                rewrite ^(.*)$ /msie/$1 break;
            }

            if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
               set $id $1;
            }

            if ($request_method = POST) {
               return 405;
            }

            if ($request_method) {
               return 403;
            }

            if ($args ~ post=140){
              rewrite ^ http://example.com/;
            }

            location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ {
              alias /data/w3/images/$1;
            }

            proxy_set_header X-Origin-URI ${scheme}://${http_host}/$request_uri;
        r=   z($http_user_agentr2   zMSIE)Zrewritez^(.*)$z/msie/$1Úbreakú($http_cookier4   ú"id=([^;]+)(?:;|$)")rY   z$idz$1z($request_methodr5   zPOST)ÚreturnZ405z($request_method)Z403z($argsz	post=140)ú^zhttp://example.com/r   z ^/users/(.+\.(?:gif|jpe?g|png))$Úaliasz/data/w3/images/$1Zproxy_set_headerzX-Origin-URIz%${scheme}://${http_host}/$request_urirZ   )r   Útestr   r   r   r   Útest_weird_blocksù   s$    ÿÿ

ÿÿ÷z$TestRawNginxParser.test_weird_blocksc                 C   s"  t dƒ}|  |dgddgg¡ t dƒ}|  |dddd	gdd
gggg¡ d}t |ƒ}|  |dgdgdgdgdgdgdgdgdgg	¡ |  tt d¡ |  tt d¡ d}t |ƒ}|  |dddddgdddddgg¡ t dƒ}|  |ddd d!d"gg¡ |  tt d#¡ |  t d$ƒd%gg¡ |  tt d&¡ d S )'Nz"hello\""; # blah "heh heh"z	"hello\""rU   z blah "heh heh"zAif ($http_cookie ~* "id=([^;]+)(?:;|$)") { # blah )
            }r=   rh   r4   ri   z blah )zá
            one"test";
            ("two");
            "test")red;
            "test")"blue";
            "test")"three;
            (one"test")one;
            one";
            one"test;
            one"test"one;
        z	one"test"z("two")z
"test")redz"test")"blue"z"test")"threez(one"test")onezone"zone"testzone"test"onez
"test"one;z"test;zë
            server_name foo.example.com bar.example.com                         baz.example.com qux.example.com;
            server_name foo.example.com bar.example.com
                        baz.example.com qux.example.com;
        r%   zfoo.example.comzbar.example.comzbaz.example.comzqux.example.comzdirective $var ${var} $ ${};Ú	directivez$varz${var}ú$z${}zserver {server_name test.com};zblag${dfgdfg};zblag${dfgdfg}zblag${dfgdf{g};)r   r   rE   r   )r   r   rm   r   r   r   Útest_edge_cases"  sL    ÿ÷ ÿ ÿýz"TestRawNginxParser.test_edge_casesN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r.   r;   rB   rD   rF   rT   rX   r[   r\   r]   r^   re   rf   rn   rq   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d„ Z
dd„ Zdd„ Zdd„ ZdS )ÚTestUnspacedListz$Test the UnspacedList data structurec                 C   sT   ddddg| _ ddg| _| j d d … | _| jd d … | _t| jƒ| _t| jƒ| _d S )Nr"   Úthingsr   ÚquirkÚy)ÚaÚbÚlÚl2r   ÚulÚul2©r   r   r   r   ÚsetUpa  s    
zTestUnspacedList.setUpc                 C   s&   |   | jddg¡ |   | jdg¡ d S ©Nrw   rx   ry   )r   r~   r   r€   r   r   r   Útest_constructioni  s    z"TestUnspacedList.test_constructionc                 C   sB   t  | j¡}| d¡ |  |dddg¡ |  |j| jdg ¡ d S )NZwiserw   rx   )ÚcopyÚdeepcopyr~   rN   r   Úspacedrz   ©r   Úul3r   r   r   Útest_appendm  s    
zTestUnspacedList.test_appendc                 C   s~   | j | j }|  |dddg¡ |  |j| j| j ¡ |  | j j| j¡ | j | j }|  |dddg¡ |  |j| j| j ¡ d S r‚   )r~   r   r   r†   rz   r{   r}   r‡   r   r   r   Útest_adds  s    zTestUnspacedList.test_addc                 C   sV   t  | j¡}| | j¡ |  |dddg¡ |  |j| j| j ¡ |  | jj| j¡ d S r‚   )	r„   r…   r~   Úextendr   r   r†   rz   r{   r‡   r   r   r   Útest_extend|  s
    zTestUnspacedList.test_extendc                 C   s^   t  | j¡}d|d< dddg}t|ƒ|d< |  |dddgg¡ |  |j| jd dd|g¡ d S )NZzitherr   z
 ZzatherZzesté   r   )r„   r…   r~   r   r   r†   rz   )r   rˆ   r|   r   r   r   Útest_setƒ  s    
zTestUnspacedList.test_setc                 C   s(   |   t| jjd¡ |   t| jjd¡ d S )Né   éýÿÿÿ)rE   Ú
IndexErrorr   Ú__getitem__r€   r   r   r   Útest_get‹  s    zTestUnspacedList.test_getc                 C   sÂ   t ddddgddddgddddgdddd	gd
dddddggƒ}| dd¡ |  |ddgddgddgdd	gdddgdg¡ |  |jddddgddddgddddgdddd	gd
dddddgdg¡ d S )Nr"   r#   z       z69.50.225.155:9000z	127.0.0.1r%   r   z.example.comz	example.*r    Z5001r1   é   ZFROGZ)r   Úinsertr   r†   )r   Úxr   r   r   Útest_insert�  s8    



 üÿ  þÿ



 ûÿzTestUnspacedList.test_insertc                 C   sP   t  | j¡}| dd¡ | d¡ | ddg¡ |d= |  |dddddg¡ d S )Nr   ZsomeÚwhyZdidZwhetherr�   rw   )r„   r…   r~   r•   rN   r‹   r   r‡   r   r   r   Útest_rawlists£  s    
zTestUnspacedList.test_rawlistsc                 C   sŒ   |   d| j ¡ ¡ tg ƒ}| | j¡ |   d| j ¡ ¡ |   d| ¡ ¡ tdgdddggƒ}|   d| ¡ ¡ d|d d< |   d| ¡ ¡ d S )NFTr�   r�   é   é   r”   )r   r   Zis_dirtyr   rN   r~   )r   rˆ   Úul4r   r   r   Útest_is_dirty«  s    zTestUnspacedList.test_is_dirtyN)rr   rs   rt   ru   r�   rƒ   r‰   rŠ   rŒ   rŽ   r“   r—   r™   r�   r   r   r   r   rv   _  s   	rv   Ú__main__)ru   r„   ÚoperatorrO   ZunittestZ	pyparsingr   Zcertbot_nginx.nginxparserr   r   r   r   r   r   Zcertbot_nginx.testsr	   Ú
itemgetterr   ZTestCaser
   rv   rr   Úmainr   r   r   r   Ú<module>   s    
  PX