ó
    ë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€   é € ô —M‘M×0Ñ0€Mô $' x£=„G‡M�MÔ ô ‡K‚K”—‘—‘œS ›]Ð,=Ó>ÈÒNÜ‡K‚K”—‘—‘œS ›]¨HÓ5ÀÒEà
‚Nð $1„G‡M�MÕ ù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  € ä—W‘W—\‘\¤# h£-°°~ÓF€Nä
" M°>Ð#BÓ
C€CØˆy‰>Ð"˜UÐ"˜UÐ"×"×"×"Ò"ˆ>×"×"Ô"ˆ>×"×"Ó"˜U×"×"×"×"×"×"Ó"Ø.Ð>°g±,Ð>°,Ñ>×>×>×>Ò>Ð.×>×>Ô>Ð.×>×>Ó>°,×>×>×>×>×>×>Ó>ä)¸.ÐU[Ñ*\Ó]€IØ�YÑÐ( 5Ð( 5Ð(×(×(×(Ò(Ð×(×(Ô(Ð×(×(Ó( 5×(×(×(×(×(×(Ó(Ø.ÐD¸GÑ2DÐDÐ2DÑD×D×D×DÒDÐ.×D×DÔDÐ.×D×DÓDÐ2D×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Ç   € ä—w‘w—|‘|¤C¨£MÐ3CÓDÐä
#Ð4DÐQWÑ$XÓ
Y€CØˆy‰>Ð"˜UÐ"˜UÐ"×"×"×"Ò"ˆ>×"×"Ô"ˆ>×"×"Ó"˜U×"×"×"×"×"×"Ó"Ø%Ð5¨W©Ð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 (›m¨X°{ÓC€JØ˜.Ñ)€Lô *¸*Ñ*^Ó_€IØ�YÑÐ( 5Ð( 5Ð(×(×(×(Ò(Ð×(×(Ô(Ð×(×(Ó( 5×(×(×(×(×(×(Ó(Ø*Ð@¸Ñ.@Ð@Ð.@Ñ@×@×@×@Ò@Ð*×@×@Ô@Ð*×@×@Ó@Ð.@×@×@×@×@×@×@Ó@ô 
ˆj˜#¨Ò	0°AØ	�‰�Œ÷ 
1ô 
Ð ¨Ó	?Ü+¨]¸JÐ,GÓHˆØ˜	Ñ"Ð+ eÐ+ eÐ+×+×+×+Ò+Ð"×+×+Ô+Ð"×+×+Ó+ e×+×+×+×+×+×+Ó+Ø.ÐC¸7Ñ2CÐCÐ2CÑC×C×C×CÒCÐ.×C×CÔCÐ.×C×CÓCÐ2C×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                  oªR                  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ÑR€HÔä—‘—‘œc (›m¨X°{ÓC€JØ%€Gä
#°JÑ$SÓ
T€Càˆy‰>Ð!˜TÐ!˜TÐ!×!×!×!Ò!ˆ>×!×!Ô!ˆ>×!×!Ó!˜T×!×!×!×!×!×!Ó!Ü�7‰7Ð%�>‰>Ð%ˆ>˜*Ó%Ð%Ö%×%×%×%×%×%Ñ%Œ2×%×%×%Ñ%Œ2×%×%Õ%ˆ7×%×%Ó%ˆ>×%×%×%×%×%Ô%˜*×%×%×%Ñ%˜*×%×%Õ%Ð%×%×%×%×%×%Ô%Ü	ˆj˜#Ô	 !Ø�v‰vÐ"ˆv‹xÐ"˜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o‡U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=p˜US   nSo‡U: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=p˜SovS   o‡U;   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       oˆU:H  oÝ(       Gd  [        R                  " SU4SXƒ4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=p�S 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oÙU:H  nU(       Gd  [        R                  " SU4S$X�4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                  oÌR*                  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                  oÌR*                  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  € ô &°¸2ÐFhÑi€HÔä—‘—‘œc (›m¨X°{ÓC€Jð :ÐÜ	ˆj˜#¨Ò	0°AØ	�‰Ð Ô!÷ 
1ð 9ÐÜ
#°JÑ$_Ó
`€Càˆy‰>Ð"˜UÐ"˜UÐ"×"×"×"Ò"ˆ>×"×"Ô"ˆ>×"×"Ó"˜U×"×"×"×"×"×"Ó"Øˆw‰<Ð.Ð.Ð.Ð.Ñ.×.×.×.Ò.ˆ<×.×.Ô.ˆ<×.×.Ó.Ð.×.×.×.×.×.×.Ó.ØÐ5 nÑ"5Ð5Ð"5Ñ5×5×5×5Ò5Ð×5×5Ô5Ð×5×5Ó5Ð"5×5×5×5×5×5×5Ó5ô 
ˆj˜#Ô	 !Ø�v‰vÐ+ˆv‹xÐ+Ð+Ñ+×+×+×+Ó+ˆx×+×+×+×+×+Õ+ˆq×+×+×+Ñ+ˆq×+×+Õ+ˆv×+×+Ó+ˆx×+×+×+×+×+Ô+Ð+×+×+×+Ñ+Ð+×+×+×+×+×+×+Õ+÷ 
ô —:’:œbŸg™gŸo™o¨jÓ9Ó:€LÙ+ÓF™|˜!Ð/@ÀAÑ/E—A™|€LÐFÜˆ|ÓÐ! Ð! Ñ!×!×!×!Ô!Ð×!×!×!×!×!Õ!Œ3×!×!×!Ñ!Œ3×!×!×!×!×!Ö!ˆ|×!×!×!Ñ!ˆ|×!×!Õ!Ð×!×!Ó! ×!×!×!×!×!×!Ô!ô �w‰wÐ2�~‰~Ð2¨6Ð2˜j¨6Ñ1Ð2‰~Ð1Ó2Ð2Ð2Ô2Ð2×2×2×2×2×2×2Ñ2Œr×2×2×2Ñ2Œr×2×2Õ2ˆw×2×2Ó2ˆ~×2×2×2×2×2Ô2˜j×2×2×2Ñ2˜j×2×2Õ2¨6×2×2Ó2Ð2×2×2×2×2×2×2Ó2Ü�w‰wÐ8�~‰~Ð8¨<Ð8˜j¨<Ñ7Ð8‰~Ð7Ó8Ð8Ð8Ô8Ð8×8×8×8×8×8×8Ñ8Œr×8×8×8Ñ8Œr×8×8Õ8ˆw×8×8Ó8ˆ~×8×8×8×8×8Ô8˜j×8×8×8Ñ8˜j×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ÑQ€HÔä
% 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ÑK€KÜ q°ÀBÑG€Kà'Ð5€HÔä
% 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   