
    M/eB                        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m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  ej&                  d      Z G d dej*                        Z G d dej*                        Zedk(  r4 ej2                   ej4                  ej6                  dd egz                yy)z-Test for certbot_nginx._internal.nginxparser.    N)ParseException)dump)dumps)loadloads)RawNginxParser)UnspacedList)	test_utilc                   |    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)TestRawNginxParserz+Test the raw low-level Nginx config parser.c                     t         j                  j                  d      j                         }|g dk(  sJ t         j                  j                  d      j                         }|g dk(  s	J g d       y )Nzroot /test;)root z/testzroot /test;foo bar;)foor   bar)r	   
assignmentparseStringasListselfparseds     P/usr/lib/python3/dist-packages/certbot_nginx/_internal/tests/nginxparser_test.pytest_assignmentsz#TestRawNginxParser.test_assignments   se    **66}ELLN////**667LMTTV//D1DD/    c                 \   t         j                  j                  d      j                         }|ddgg gk(  sJ t         j                  j                  d      j                         }|g dg gk(  sJ t         j                  j                  d      j                         }|ddgg ddggk(  sJ y )Nzfoo {}r   r   zlocation /foo{})locationr   z/foozfoo { bar foo ; })r   r   r   r   r   )r	   blockr   r   r   s     r   test_blockszTestRawNginxParser.test_blocks   s    %%11(;BBD5#,++++%%112CDKKM3R8888%%112EFMMO5#,)F(LMMMMr   c                     t         j                  j                  d      j                         }|\  }}t	        |      g dg gk(  sJ t	        |      dk(  sJ y )Nzfoo { bar {} })r   r   r   r   )r	   r   r   r   FIRST)r   r   r   contents       r   test_nested_blocksz%TestRawNginxParser.test_nested_blocks'   sU    %%112BCJJLwW~"3R!8888U|u$$$r   c                     t        t        g dg dg dg dg dg dg dg dg d	ggggggg            }|j                  d
      dj                  d
      k(  sJ y )N)userr   www-data)
serverr   )
    listenr   80)r)   server_namer   zfoo.com)r)   r   r   /home/ubuntu/sites/foo/)z

    r   r   /statusr   )z	
        check_status )z


        typesr   )z
            
image/jpegr   jpgr'   zuser www-data;
server {
    listen 80;
    server_name foo.com;
    root /home/ubuntu/sites/foo/;

    location /status {
        check_status;

        types {
            image/jpeg jpg;}}})r   r
   split)r   dumpeds     r   test_dump_as_stringz&TestRawNginxParser.test_dump_as_string-   s    |%"/9B>63ABDA 		% 	%   ||D!
: ;@%+F 	F Fr   c                 V   t        j                  d      5 }t        |      5 }t        j                  t	        |            }d d d        d d d        ddgdgdgg dg ddd	gd
dgdgddgggggg dddgddgggg dg gg dg gg dg ggggggk(  sJ y # 1 sw Y   SxY w# 1 sw Y   WxY w)Nfoo.confr%   r&   httpr(   )r*   z*:80default_serverssl)r,   z*.www.foo.comz*.www.example.comr   r-   r   r.   r1   r2   r3   )r   ~zcase_sensitive\.php$indexz	index.phpz	/var/root)r   ~*zcase_insensitive\.php$)r   =zexact_match\.php$)r   z^~zignore_regex\.php$utilget_data_filenameopenfilter_commentsr   r   pathhandler   s       r   test_parse_from_filez'TestRawNginxParser.test_parse_from_fileH   s   ##J/ 	<4d <v--d6l;<	< j!Xj;E23i(Y,!6 78+  <k*[)>  ?C8"=:B?   	 < <	< 	<s"   BBBB	BB(c                 H   t        j                  d      5 }t        |      5 }t        j                  t	        |            }d d d        d d d        dgddgggdgddgg dg dg dggggggdgdd	gg d
g dg dddgg dgggggk(  sJ y # 1 sw Y   LxY w# 1 sw Y   PxY w)Nzedge_cases.confr(   r,   simplezwith.if)r   r<   z^/services/.+$)ifz($request_filenamer>   z\.(ttf|woff)$))
add_headerzAccess-Control-Allow-Originz"*"zwith.complicated.headers)r   r>   z\.(?:gif|jpe?g|png)$)rL   Pragmapublic)rL   Cache-Controlz+'public, must-revalidate, proxy-revalidate'z
"test,;{}"r   blahz"hello;world")	try_filesz$uriz	@rewritesr@   rE   s       r   test_parse_from_file2z(TestRawNginxParser.test_parse_from_file2_   s    ##$56 	<$d <v--d6l;<	< jM8456ZY'0GEFH IJKL
 Z7883% )2456788 	8 8< <	< 	<s"   BBBB	BB!c                    t        j                  d      5 }t        |      5 }t        j                  t	        |            }d d d        d d d        dgdgddgddgdd	ggggggggk(  sJ y # 1 sw Y   ,xY w# 1 sw Y   0xY w)
Nzmultiline_quotes.confr9   r(   r*   z*:443r   /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'r@   rE   s       r   test_parse_from_file3z(TestRawNginxParser.test_parse_from_file3t   s    ##$;< 	<d <v--d6l;<	< h*( #&.>? @A	B
C 
DE FF 	F F< <	< 	<s"   A8A,A8,A5	1A88Bc                 
   t        j                  d      5 }t        |      5 }t        j                  t
              5  t        |       d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nzbroken.conf)rA   rB   rC   pytestraisesr   r   )r   rF   rG   s      r   test_abort_on_parse_failurez.TestRawNginxParser.test_abort_on_parse_failure   sr    ##M2 	!dd !v]]>2 !L!!	! 	!! !! !	! 	!s9   A9A-A!A-A9!A*&A--A6	2A99Bc                    t        j                  d      5 }t        |      5 }t        |      }d d d        d d d        d   d   j	                  t        dgg dg dg dg dg dg d	g d
g dg dg dgggg             t        j                  d      5 }t        ||       |j                  d       t        |      }d d d        |k(  sJ y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   )xY w)Nz
nginx.confr(   )r*   r   443r   r;   )r,   r   	localhost)ssl_certificater   zcert.pem)ssl_certificate_keyr   zcert.key)ssl_session_cacher   zshared:SSL:1m)ssl_session_timeoutr   5m)ssl_ciphersr   zHIGH:!aNULL:!MD5)r   r   rT   )r   r   html)r=   r   z
index.htmlr   z	index.htmw+tmoder   )
rA   rB   rC   r   appendr
   tempfileTemporaryFiler   seekr   rF   rG   r   f
parsed_news         r   test_dump_as_filez$TestRawNginxParser.test_dump_as_file   s    ##L1 	&Td &vf&	& 	r
2lXJ B A D H K B H!7"7"P"R!S	 T
,U 
V 
	W ##/ 	!1OFF1IaJ	! ###%& &	& 	&	! 	!s-   CCC)C(C	CC%(C1c                    t        j                  d      5 }t        |      5 }t        |      }d d d        d d d        t	        j
                  d      5 }t        |       |j                  d       t        |      }d d d        k(  sJ |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k(  sJ y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   NxY w)Nzminimalistic_comments.confrf   rg   r   #z$ Use bar.conf when it's a full moon!includer8   z Kilroy was herer/   r(   r0   z' Don't forget to open up your firewall!r*   1234z listen 80;)rA   rB   rC   r   rj   rk   r   rl   rm   s         r   test_commentsz TestRawNginxParser.test_comments   s   ##$@A 	&Td &vf&	& ##/ 	!1OFF1IaJ	!
 ###89
#$%ZBi=>Bi M"	$%
 
 	
 
& &	& 	&	! 	!s-   B>B2B>)C
2B;	7B>>C
Cc                 8    t        d      }|g dg dgggk(  sJ y )Nz1if ($http_accept ~* "webp") { set $webp "true"; })rK   z($http_acceptr>   z"webp"))setz$webpz"true"r   r   s     r   test_issue_518z!TestRawNginxParser.test_issue_518   s2    JK5()+
 
 	
 
r   c                 6    t        d      }|dgddggggk(  sJ y )Nz&http {
          # server{
          }r9   rr   z server{r   r   s     r   test_comment_in_blockz(TestRawNginxParser.test_comment_in_block   s?       XJ "
 
 	
 
r   c                 .    t        d      }|g dgk(  sJ y )NzYaccess_log syslog:server=unix:/dev/log,facility=auth,tag=nginx_post,severity=info custom;)
access_logzFsyslog:server=unix:/dev/log,facility=auth,tag=nginx_post,severity=infocustomr   r   s     r   test_access_logz"TestRawNginxParser.test_access_log   s/     3 4 
 
 	
 
r   c                 .    t        d      }|g dgk(  sJ y )NzEadd_header Cache-Control no-cache,no-store,must-revalidate,max-age=0;)rL   rO   z+no-cache,no-store,must-revalidate,max-age=0r   r   s     r   test_add_headerz"TestRawNginxParser.test_add_header   s'    ^_Z
 
 	
 
r   c                 Z    d}t        |      }|dgg dddgddgdd	gd
d	gggdggggk(  sJ y )Nzhttp {
            map $http_upgrade $connection_upgrade {
              default upgrade;
              ''      close;
              "~Opera Mini" 1;
              *.example.com 1;
            }
            one;
        }r9   )mapz$http_upgradez$connection_upgradedefaultupgradez''closez"~Opera Mini"1z*.example.comoner   )r   test_strr   s      r   !test_map_then_assignment_in_blockz4TestRawNginxParser.test_map_then_assignment_in_block   sn     xX@	*7O$c*$c*	C   

 

 
	
 

r   c                 .    t        d      }|g dgk(  sJ y )NzQtry_files /typo3temp/tx_ncstaticfilecache/$host${request_uri}index.html @nocache;)rQ   z=/typo3temp/tx_ncstaticfilecache/$host${request_uri}index.htmlz@nocacher   r   s     r   test_variable_namez%TestRawNginxParser.test_variable_name   s/     6 7 
 
 	
 
r   c           	          d}t        |      }|g dg dggg dg dggg dddgggd	d
gddgggg dg dggg dddgggg dgk(  sJ y )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;
        )rK   z($http_user_agentr<   zMSIE))rewritez^(.*)$z/msie/$1breakrK   z($http_cookier>   z"id=([^;]+)(?:;|$)"))rw   z$idz$1)rK   z($request_methodr?   zPOST)return405rK   z($request_method)403)rK   z($argsr<   z	post=140))r   ^zhttp://example.com/)r   r<   z ^/users/(.+\.(?:gif|jpe?g|png))$aliasz/data/w3/images/$1)proxy_set_headerzX-Origin-URIz%${scheme}://${http_host}/$request_urir   )r   testr   s      r   test_weird_blocksz$TestRawNginxParser.test_weird_blocks  s    6 tD78:BEYDZ[558I7JK'(!#E45#7C+,-/Y	[ 	[ 		[ 	[r   c           
          t        d      }|dgddggk(  sJ t        d      }|g dddggggk(  sJ d}t        |      }|d	gd
gdgdgdgdgdgdgdgg	k(  sJ t        j                  t              5  t        d       d d d        t        j                  t              5  t        d       d d d        d}t        |      }|g dg dgk(  sJ t        d      }|g dgk(  sJ t        j                  t              5  t        d       d d d        t        d      dggk(  sJ t        j                  t              5  t        d       d d d        t        d      }|g k(  sJ y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   sxY w# 1 sw Y   @xY w)Nz"hello\""; # blah "heh heh"z	"hello\""rr   z blah "heh heh"zAif ($http_cookie ~* "id=([^;]+)(?:;|$)") { # blah )
            }r   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};r0   )r   rX   rY   r   )r   r   r   s      r   test_edge_casesz"TestRawNginxParser.test_edge_cases)  s   56<.30A*BCCCC   P9  ! ! 	! !
 tMKNHL

 

 
	
 

 ]]>* 	!- 	!]]>* 	)	 t66
 
 	
 
 56EFFFF]]>* 	423	4%&O+<*====]]>* 	%#$	% r||?	! 	!	 	*	4 	4	% 	%s0   1E E,:E89F E),E58FFN)__name__
__module____qualname____doc__r   r   r#   r6   rH   rR   rV   rZ   rp   ru   rx   rz   r~   r   r   r   r   r    r   r   r   r      sf    5EN%F6.8*F$!$,
0

	


0
&[PBr   r   c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)TestUnspacedListz$Test the UnspacedList data structurec                     g d| _         ddg| _        | j                   d d  | _        | j                  d d  | _        t	        | j                        | _        t	        | j                        | _        y )N)r)   thingsr   quirkyr   )abll2r
   ulul2r   s    r   setUpzTestUnspacedList.setUpp  sR    3s&&)tvv&(r   c                 N    | j                   ddgk(  sJ | j                  dgk(  sJ y )Nr   r   r   )r   r   r   s    r   test_constructionz"TestUnspacedList.test_constructionx  s-    ww8W----xxC5   r   c                     t        j                  | j                        }|j                  d       |g dk(  sJ |j                  | j
                  dgz   k(  sJ y )Nwise)r   r   r   )copydeepcopyr   ri   spacedr   r   ul3s     r   test_appendzTestUnspacedList.test_append|  sL    mmDGG$

61111zzTVVvh....r   c                 v   | j                   | j                  z   }|g dk(  sJ |j                  | j                  | j                  z   k(  sJ | j                   j                  | j                  k(  sJ | j                   | j
                  z   }|g dk(  sJ |j                  | j                  | j                  z   k(  sJ y N)r   r   r   )r   r   r   r   r   r   r   s     r   test_addzTestUnspacedList.test_add  s    gg ....zzTVVdff_,,,ww~~'''gg....zzTVVdff_,,,r   c                 $   t        j                  | j                        }|j                  | j                         |g dk(  sJ |j
                  | j                  | j                  z   k(  sJ | j                  j
                  | j                  k(  sJ y r   )r   r   r   extendr   r   r   r   r   s     r   test_extendzTestUnspacedList.test_extend  sk    mmDGG$

488....zzTVVdff_,,,ww~~'''r   c                     t        j                  | j                        }d|d<   g d}t        |      |d<   |dddggk(  sJ |j                  | j
                  d   dd|gk(  sJ y )Nzitherr   )z
 zatherzest   r   r   r   )r   r   r   r
   r   r   )r   r   r   s      r   test_setzTestUnspacedList.test_set  sj    mmDGG$A%aAx(F!34444zzdffQi3::::r   c                 (   t        j                  t              5  | j                  j	                  d       d d d        t        j                  t              5  | j                  j	                  d       d d d        y # 1 sw Y   GxY w# 1 sw Y   y xY w)N   )rX   rY   
IndexErrorr   __getitem__r   s    r   test_getzTestUnspacedList.test_get  sm    ]]:& 	$HH  #	$]]:& 	%HH  $	% 	%	$ 	$	% 	%s   A<B<BBc           	          t        g dg dg dg ddg dg      }|j                  dd       |d	d
gd	dgddgddgg ddgk(  sJ |j                  g dg dg dg ddg ddgk(  sJ y )N)r)   r*          69.50.225.155:9000)r)   r*   r   	127.0.0.1)r)   r,   r   .example.com)r)   r,   r   	example.*r'   )r*   r   5001r   r;      FROGZr*   r   r   r,   r   r   )r*   r   r;   )r
   insertr   )r   xs     r   test_insertzTestUnspacedList.test_insert  s    F<>;T3	56 	
G,-+/FN+m[-I%w00 	0 0 xxB8:7/ 	 r   c                     t        j                  | j                        }|j                  dd       |j	                  d       |j                  ddg       |d= |g dk(  sJ y )Nr   somewhydidwhetherr   )r   r   r   r   r   )r   r   r   r   ri   r   r   s     r   test_rawlistszTestUnspacedList.test_rawlists  sU    mmDGG$

1f

5

E9%&FAAAAr   c                 p   | j                   j                         du sJ t        g       }|j                  | j                         | j                  j                         du sJ |j                         du sJ t        dgg dg      }|j                         du sJ d|d   d<   |j                         du sJ y )NFTr   )r         r   r   )r   is_dirtyr
   ri   r   )r   r   ul4s      r   test_is_dirtyzTestUnspacedList.test_is_dirty  s    xx  "e+++2

477ww!U***||~%%%QC+,||~&&&Aq	||~%%%r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   n  s8    .)!/-(;%(B	&r   r   __main__r   )r   r   operatorsysrj   unittest	pyparsingr   rX   #certbot_nginx._internal.nginxparserr   r   r   r   r	   r
   certbot_nginx._internal.testsr   rA   
itemgetterr!   TestCaser   r   r   exitmainargv__file__r   r   r   <module>r      s    3   
   $  4 5 4 5 > < ;AU** Up
W&x(( W&t zCHH[V[[!"
234 r   