
    DjY                       S SK Jr  S SKrS SKJs  Jr  S SKrS SK	J
r
Jr  S SKrS SKrS SKJrJrJr  \R$                  " SS9S 5       rS rS	 rS
 r\" S5      S 5       r\" S5      S 5       r\" S5      S 5       r\" S5      S 5       rg)    )annotationsN)	MagicMockpatch)handle_nginx_config_readhandle_nginx_config_writehandle_nginx_service_reloadT)autousec              #    #    [         R                  R                  n[        U 5      [         R                  l        [        R
                  " [        R                  R                  [        U 5      S5      SS9  [        R
                  " [        R                  R                  [        U 5      S5      SS9  U v   U[         R                  l        g7f)zPOverride NGINX_BASE_DIR with a temporary folder and create standard directories.zsites-availableT)exist_okconf.dN)actionsnginxNGINX_BASE_DIRstrosmakedirspathjoin)tmp_pathoriginal_bases     >D:\Programs\laragon\www\wolf\agent\tests\test_actions_nginx.pysetup_temp_nginx_baser      s      MM00M $'x=GMM  KKS],=>NKKS]H5E
N $1GMM s   CCc                   [         R                  R                  [        U 5      SS5      n[	        SU05      nUS   nSoCUL oU(       do  [
        R                  " SU4SX445      [
        R                  " U5      [
        R                  " U5      S.-  nS	S
U0-  n[        [
        R                  " U5      5      eS =n=pTSo2S   oCU;   oU(       do  [
        R                  " SU4SX445      [
        R                  " U5      [
        R                  " U5      S.-  nS	S
U0-  n[        [
        R                  " U5      5      eS =n=pT[        USS.5      nUS   nSoCUL oU(       do  [
        R                  " SU4SX445      [
        R                  " U5      [
        R                  " U5      S.-  nS	S
U0-  n[        [
        R                  " U5      5      eS =n=pTSo8S   oCU;   oU(       do  [
        R                  " SU4SX445      [
        R                  " U5      [
        R                  " U5      S.-  nS	S
U0-  n[        [
        R                  " U5      5      eS =n=pTg )Nz..zoutside.confconfig_pathsuccessFisz%(py1)s is %(py4)spy1py4assert %(py6)spy6z!outside of Nginx config directoryerrorinz%(py1)s in %(py4)stestr   content)r   r   r   r   r   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationr   )	r   traversal_pathres@py_assert0@py_assert3@py_assert2@py_format5@py_format7	res_writes	            r   +test_verify_safe_path_blocks_path_traversalr8   !   su   WW\\#h-~FN
"M>#B
CCy>"U"U""""">""">"""U""""""".>g,>,>>>>>.>>>.>>>,>>>>>>>).U[*\]IY(5(5(((((((((((5(((((((.DG2DD2DDDDDD.DDD.DDD2DDDDDDDD    c                   [         R                  R                  [        U 5      S5      n[	        USS.5      nUS   nSoCUL oU(       do  [
        R                  " SU4SX445      [
        R                  " U5      [
        R                  " U5      S.-  nS	S
U0-  n[        [
        R                  " U5      5      eS =n=pTSo2S   oCU;   oU(       do  [
        R                  " SU4SX445      [
        R                  " U5      [
        R                  " U5      S.-  nS	S
U0-  n[        [
        R                  " U5      5      eS =n=pTg )Nzforbidden.confr(   r)   r   Fr   r   r   r"   r#   zDirectory is not allowedr$   r%   r'   )
r   r   r   r   r   r+   r,   r-   r.   r/   )r   invalid_dir_pathr1   r2   r3   r4   r5   r6   s           r   %test_write_blocks_invalid_directoriesr<   .   s    ww||CM3CD
#4DQW$X
YCy>"U"U""""">""">"""U"""""""%5W555555%555%5555555555r9   c                l   [         R                  R                  [        U 5      SS5      nSS-  n[	        XS.5      nUS   nSoTUL of(       do  [
        R                  " SU4S	XE45      [
        R                  " U5      [
        R                  " U5      S
.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=peSoCS   oTU;   of(       do  [
        R                  " SU4SXE45      [
        R                  " U5      [
        R                  " U5      S
.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=pe[        USSS9 n	U	R                  S5        S S S 5        [        SSS9   [        SU05      n
U
S   nSoTUL of(       do  [
        R                  " SU4S	XE45      [
        R                  " U5      [
        R                  " U5      S
.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=peSoJS   oTU;   of(       do  [
        R                  " SU4SXE45      [
        R                  " U5      [
        R                  " U5      S
.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=peS S S 5        g ! , (       d  f       GN8= f! , (       d  f       g = f)Nr   z	test.confai  r)   r   Fr   r   r   r"   r#   zexceeds maximum size of 512KBr$   r%   r'   wutf-8encodingr(   zos.path.getsizei
  )return_valuer   )r   r   r   r   r   r+   r,   r-   r.   r/   openwriter   r   )r   
valid_pathhuge_contentr7   r2   r3   r4   r5   r6   fres_reads              r   'test_read_and_write_respect_512kb_limitrJ   7   s   c(mX{CJ.)L ***^_IY(5(5(((((((((((5(((((((*@.@@.@@@@@@*@@@*@@@.@@@@@@@@ 
j#	0A	 
1 
 	?+]J,GH	"+e+e+++++"+++"+++e+++++++.C72CC2CCCCCC.CCC.CCC2CCCCCCCC 
@	?	 
1	0 
@	?s   J4DJ%
J"%
J3zsubprocess.runc                   [        SSSS9U l        [        R                  R	                  [        U5      SS5      nSn[        X#S.5      nUS	   nS
oeUL ow(       do  [        R                  " SU4SXV45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =n=pv[        R                  oR                  of" U5      o(       Gd  SS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U
5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  n[        [        R                  " U5      5      eS =n
=pk[!        US5       nUR"                  o" 5       ofU:H  o(       Gd  [        R                  " SU4SXc45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U
5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  n	SSU	0-  n[        [        R                  " U5      5      eS =n
=pnS S S 5        U R%                  / SQS
S
SSS9  g ! , (       d  f       N$= f)Nr   z	syntax ok 
returncodestdoutstderrr   	site.confzserver { listen 80; }r)   r   Tr   r   r   r"   r#   zbassert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py5)s)
}r   rF   )py0py2r!   py5py7r==zC%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.read
}()
} == %(py6)srH   r*   rR   rS   r!   r#   assert %(py8)spy8)r   z-tz-cz/etc/nginx/nginx.confF)capture_outputtextshellcheck)r   rC   r   r   r   r   r   r+   r,   r-   r.   r/   exists@py_builtinslocals_should_repr_global_namerD   readassert_called_once_with)mock_runr   rF   r*   r1   r2   r3   r4   r5   r6   @py_assert1@py_assert6@py_format8rH   @py_assert5@py_format9s                   r   test_write_config_successrm   K   s    &;rRHc(mX{CJ%G
#J$S
TCy>!T!T!!!!!>!!!>!!!T!!!!!!!77%>>%>*%%%%%%%%%2%%%%2%%%7%%%>%%%%%%*%%%%*%%%%%%%%%%	j#	!vv"vx"7"""""x""""""q""""q"""v"""x""""""7""""7""""""" 
 $$6 % 	 
	s   
D(M
Mc           	     (   [        SSSS9U l        [        R                  R	                  [        U5      SS5      nSn[        USS	S
9 nUR                  U5        S S S 5        Sn[        X%S.5      nUS   nSoUL o(       do  [        R                  " SU	4SXx45      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n=pUS   nSoU:H  o(       do  [        R                  " SU	4SXx45      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n=pSovS   oU;   o(       do  [        R                  " SU	4SXx45      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n=p[        US5       nUR                  o" 5       oU:H  o(       Gd  [        R                  " SU4SX45      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R                  " U5      OSS .-  nS!S"U0-  n[        [        R                  " U5      5      eS =n=pS S S 5        [        R$                  " [        R                  R'                  U5      5      nU Vs/ sH  nS#U;   d  M  UPM     nn[)        U5      n	SoU:H  nU(       Gd  [        R                  " SU4S$X45      S%[        R                   " 5       ;   d  [        R"                  " [(        5      (       a  [        R                  " [(        5      OS%S&[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R                  " U5      OS&[        R                  " U	5      [        R                  " U5      S'.-  nS!S"U0-  n[        [        R                  " U5      5      eS =n	=nn[        R                  oR*                  nS(nUU-   nU" U5      nU(       + nU(       Gd  S)S*[        R                   " 5       ;   d  [        R"                  " [        5      (       a  [        R                  " [        5      OS*[        R                  " U5      [        R                  " U5      S+[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R                  " U5      OS+[        R                  " U5      [        R                  " U5      S,.-  n[        [        R                  " U5      5      eS =n=n=n=n=nn[        R                  oR*                  nS-nUU-   nU" U5      nU(       + nU(       Gd  S)S*[        R                   " 5       ;   d  [        R"                  " [        5      (       a  [        R                  " [        5      OS*[        R                  " U5      [        R                  " U5      S+[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R                  " U5      OS+[        R                  " U5      [        R                  " U5      S,.-  n[        [        R                  " U5      5      eS =n=n=n=n=nng ! , (       d  f       GN= f! , (       d  f       GNR= fs  snf ).N   rL   z nginx: [emerg] invalid directiverM   r   rQ   z server { listen 80; # original }r?   r@   rA   zserver { invalid_directive }r)   r   Fr   r   r   r"   r#   r$   nginx_test_failedrW   )z%(py1)s == %(py4)szinvalid directivenginx_outputr%   r'   rV   rY   rH   original_contentrZ   r[   r\   z.wolfpanel.bak.)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenbackup_files)rR   r    py3r#   z.tmpztassert not %(py10)s
{%(py10)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}((%(py5)s + %(py7)s))
}r   rF   )rR   rS   r!   rT   rU   py10z
.orig_temp)r   rC   r   r   r   r   rD   rE   r   r+   r,   r-   r.   r/   re   rb   rc   rd   listdirdirnamers   ra   )rg   r   rF   rr   rH   new_invalid_contentr1   r2   r3   r4   r5   r6   rh   rk   rl   files_in_dirrt   @py_assert4ri   @py_assert8@py_assert9@py_assert11@py_format12s                          r   )test_write_config_test_fails_and_restoresr   d   sc    &2FhiHc(mX{CJ :	j#	0A	 ! 
1 9
#J$_
`Cy>"U"U""""">""">"""U"""""""w<.........<...<...........5n"55"555555555555"55555555 
j#	!vv+vx+++++++x++++++q++++q+++v+++x+++++++++++++++++++ 
 ::bggooj9:L+F|!/@A/EA|LF|!!!!!!!!!!!!!3!!!!3!!!!!!|!!!!|!!!!!!!!!!!!! ww2~~262j612~1222222222222r2222r222w222~222222j2222j222622222222222ww8~~8<8j<78~7888888888888r8888r888w888~888888j8888j888<88888888888+ 
1	0 
	
 Gs%   ]+
D(]=1	^>^+
]:=
^c                R   [        SSSS9U l        [        0 5      nUS   nSo2UL oD(       do  [        R                  " SU4SX#45      [        R
                  " U5      [        R
                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS =n=pCUS   nSo2UL oD(       do  [        R                  " SU4SX#45      [        R
                  " U5      [        R
                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS =n=pCSo!S   o2U;   oD(       do  [        R                  " SU4SX#45      [        R
                  " U5      [        R
                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS =n=pCg )Nr   reloadedrL   rM   r   Tr   r   r   r"   r#   outputr%   r'   )r   rC   r   r+   r,   r-   r.   r/   )rg   r1   r2   r3   r4   r5   r6   s          r   test_service_reload_successr      s   %:bQH
%b
)Cy>!T!T!!!!!>!!!>!!!T!!!!!!!z?"d"d"""""?"""?"""d"""""""&X&&&&&&:&&&:&&&&&&&&&&r9   c                v   [        SSSS9n[        SSSS9nX/U l        [        0 5      nUS   nSoTUL of(       do  [        R                  " S	U4S
XE45      [        R
                  " U5      [        R
                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=peUS   nSoTUL of(       do  [        R                  " S	U4S
XE45      [        R
                  " U5      [        R
                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=peSoCS   oTU;   of(       do  [        R                  " SU4SXE45      [        R
                  " U5      [        R
                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=peSoCS   oTU;   of(       do  [        R                  " SU4SXE45      [        R
                  " U5      [        R
                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=peg )Nro   rL   zreload errorrM   r   inactiver   Fr   r   r   r"   r#   r   r   r%   r'   )r   side_effectr   r+   r,   r-   r.   r/   )	rg   mock_reloadmock_statusr1   r2   r3   r4   r5   r6   s	            r   test_service_reload_failurer      se    qNKKqBGK'5H
%b
)Cy>"U"U""""">""">"""U"""""""z?#e#e#####?###?###e#######*]*]*****>***>***]*******&X&&&&&&:&&&:&&&&&&&&&&r9   )
__future__r   builtinsrb   _pytest.assertion.rewrite	assertionrewriter+   r   unittest.mockr   r   pytestactions.nginxr   r   r   r   fixturer   r8   r<   rJ   rm   r   r   r    r9   r   <module>r      s    "   	 *    1 1"
E6D(  0 9 9@ ' ' ' 'r9   