ó
    27Ej'%  ã                  ó®  • S SK Jr  S SKrS SKJs  Jr  S SKrS SK	r	S SK
Jr  S SKJrJrJr  S SKr\	R"                  R%                  S \" \" \5      R+                  5       R,                  S   S-  5      5        S SKJrJr  \R4                  S 5       r\R4                  S	 5       r\" S
5      \" S5      \" S5      \" S5      \" SSS9\" S\S9\" SSS9\" S5      \" S5      \" S5      S 5       5       5       5       5       5       5       5       5       5       r\" S
5      \" S5      \" S5      \" S5      \" SSS9\" S\S9\" SSS9S 5       5       5       5       5       5       5       r\" S
5      \" S5      \" S5      \" S5      \" SSS9\" S\S9\" SSS9S 5       5       5       5       5       5       5       r\" S
5      \" S5      \" S5      \" S5      \" SSS9\" S\S9\" SSS9S 5       5       5       5       5       5       5       r S r!\" SSS9\" SSS9\" S
5      \" S5      \" S5      \" S S!/S9\" S"5      S# 5       5       5       5       5       5       5       r"\" S"5      S$ 5       r#g)%é    )ÚannotationsN)ÚPath)Ú	MagicMockÚ	mock_openÚpatché   Úsrc)Úhandle_site_createÚhandle_site_deletec                 ó6   • [        5       n SU l        SU l        U $ )NTzhttp://localhost:8000)r   Úapi_mockÚapi_url)Úcfgs    Ú=D:\Programs\laragon\www\wolf\agent\tests\test_actions_site.pyÚmock_configr      s   € ä
‹+€CØ€C„LØ)€C„KØ€Jó    c                 ó8   • [        5       n [        5       U l        U $ )N)r   Úupdate_site_status)Úclients    r   Úmock_api_clientr      s   € ä‹[€FÜ )£€FÔØ€Mr   zsubprocess.runzos.makedirsz
os.symlinkz	os.unlinkzos.path.lexistsF)Úreturn_valuezbuiltins.open)Únew_callablezactions.site.load_agent_tokenú
test-tokenzactions.site.handle_sftp_createz#actions.site.handle_database_createz actions.site.handle_ssl_generatec           	     ó8  • [        SSSS9U	l        SSSSS	SSSS
.S.n[        XÊU5      nUS   nSoþUL nU(       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=nnUS   nSoþU:H  nU(       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=nnUR                  SSS9  U	R                  / SQSSS9  U	R                  / SQSSS9  UR                  [        R                  R                  S5      SSS9  UR                  SSSS9  UR                  SS5        UR                  S S!SS".5        UR                  S#S 05        U R                  SS$S%S&.5        UR                  R                  SS'S S(.S)5        g )*Nr   ú	syntax okÚ ©Ú
returncodeÚstdoutÚstderré*   zexample.comTz/var/www/example.com/publicÚstatic)ÚsftpÚdatabaseÚssl)Úsite_idÚdomainÚ	www_aliasÚdocrootÚruntimeÚstarter_packageÚsuccess©Úis©z%(py1)s is %(py4)s©Úpy1Úpy4úassert %(py6)sÚpy6r'   )ú==)z%(py1)s == %(py4)s)Úexist_ok)Úchownzwww-data:www-dataú/var/www/example.comF©ÚshellÚcheck)ÚchmodÚ755r8   z&/var/www/example.com/public/index.htmlÚwúutf-8©Úencodingz+/etc/nginx/sites-available/example.com.confz)/etc/nginx/sites-enabled/example.com.confÚexample_comÚWolf_example_com_2026)Úusername_suffixÚpasswordÚhome_directoryÚnamezadmin@example.comÚletsencrypt)r'   ÚemailÚproviderÚactive©ÚstatusÚerrorr   )r   r   r
   Ú
@pytest_arÚ_call_reprcompareÚ	_safereprÚAssertionErrorÚ_format_explanationÚassert_any_callÚosÚpathÚnormpathÚassert_called_once_withr   )Úmock_sslÚmock_dbÚ	mock_sftpÚ
mock_tokenÚmock_file_openÚmock_lexistsÚmock_unlinkÚmock_symlinkÚmock_makedirsÚmock_runr   r   ÚpayloadÚresÚ@py_assert0Ú@py_assert3Ú@py_assert2Ú@py_format5Ú@py_format7s                      r   Útest_site_create_static_successrj      sþ  € ô  &°¸;ÈrÑR€HÔð ØØØ0ØàØØñ
ñ€Gô ˜W°?Ó
C€Càˆy‰>Ð!˜TÐ!˜TÐ!×!×!×!Ó!ˆ>×!×!Ô!ˆ>×!×!Ó!˜T×!×!×!×!×!×!Ô!Øˆx‰=Ð)˜MÐ)˜MÑ)×)×)×)Ó)ˆ=×)×)Ô)ˆ=×)×)Ó)˜M×)×)×)×)×)×)Ô)ð ×!Ñ!Ð"?È$Ð!ÑOð ×ÑÒSÐ[`ÐhlÐÑmØ×ÑÒEÈUÐZ^ÐÑ_ð ×"Ñ"¤2§7¡7×#3Ñ#3Ð4\Ó#]Ð_bÐmtÐ"Ñuð ×"Ñ"Ð#PÐRUÐ`gÐ"ÑhØ×(Ñ(Ð)Vð  YDô  Eð ×%Ñ%Ø(Ø+Ø7ñ'ô ð
 ×#Ñ#Ø�ð%ô ð ×$Ñ$ØØ$Ø!ñ&ô ð ×&Ñ&×>Ñ>Ø
�x¨$Ñ/°õr   c	                ó   • [        SSSS9Ul        SSSSS	S
0 S.n	[        X—U5      n
U
S   nSoËUL oÝ(       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=pÜUR                  SSSS9  UR                  / SQSSS9  g )Nr   r   r   r   é+   zmy-php-site.orgFz/var/www/my-php-site.orgÚphpú8.2)r&   r'   r(   r)   r*   Úphp_versionr+   r,   Tr-   r/   r0   r3   r4   z,/etc/php/8.2/fpm/pool.d/my-php-site.org.confr>   r?   r@   )Ú	systemctlÚreloadú
php8.2-fpmr9   )	r   r   r
   rO   rP   rQ   rR   rS   rT   ©r\   r]   r^   r_   r`   ra   rb   r   r   rc   rd   re   rf   rg   rh   ri   s                   r   Útest_site_create_php_runtimert   e   s¿   € ô &°¸;ÈrÑR€HÔð Ø#ØØ-ØØØñ€Gô ˜W°?Ó
C€Càˆy‰>Ð!˜TÐ!˜TÐ!×!×!×!Ò!ˆ>×!×!Ô!ˆ>×!×!Ó!˜T×!×!×!×!×!×!Ó!ð ×"Ñ"Ð#QÐSVÐahÐ"Ñià×ÑÒBÈ%ÐW[ÐÒ\r   c	                óˆ  • S n	X–l         SSSSSSS.n
[        X§U5      nUS	   nS
oÜUL oî(       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=píUR                  R                  SSS S.S5        g )Nc                óN   • SU ;   a  [         R                  SU SS9e[        SSSS9$ )Nrr   r   zreload failed)r    r   r   r   )Ú
subprocessÚCalledProcessErrorr   )ÚcmdÚargsÚkwargss      r   Úrun_side_effectÚKtest_site_create_php_fpm_reload_failure_soft_fails.<locals>.run_side_effect“   s1   € Ø˜3ÓÜ×/Ñ/°°3¸Ð/ÐOÐOÜ A¨b¸Ñ<Ð<r   é,   zphp-fail.comFz/var/www/php-fail.comrm   rn   )r&   r'   r(   r)   r*   ro   r,   Tr-   r/   r0   r3   r4   rK   rL   r   )	Úside_effectr
   rO   rP   rQ   rR   rS   r   Úassert_called_with)r\   r]   r^   r_   r`   ra   rb   r   r   r|   rc   rd   re   rf   rg   rh   ri   s                    r   Ú2test_site_create_php_fpm_reload_failure_soft_failsr�   ‡   s§   € ò=ð
 +Ôð Ø ØØ*ØØñ€Gô ˜W°?Ó
C€Cð ˆy‰>Ð!˜TÐ!˜TÐ!×!×!×!Ò!ˆ>×!×!Ô!ˆ>×!×!Ó!˜T×!×!×!×!×!×!Ó!à×&Ñ&×9Ñ9Ø
�x¨$Ñ/°õr   Tc	                óÄ  • [        SSSS9Ul        SSSSS	S
.n	[        X—U5      n
U
S   nSoËUL oÝ(       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=pÜSoºS   oËU;   oÝ(       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=pÜUR                  S5        UR                  R                  SSU
S   S.S5        g )Nr   r   znginx emerg syntax errorr   é-   zbad-nginx.comTz/var/www/bad-nginx.comr"   )r&   r'   r(   r)   r*   r,   Fr-   r/   r0   r3   r4   zNginx configuration test failedrN   ©Úin)z%(py1)s in %(py4)sz+/etc/nginx/sites-enabled/bad-nginx.com.confÚfailedrL   r   )r   r   r
   rO   rP   rQ   rR   rS   rT   r   rX   rs   s                   r   Ú0test_site_create_nginx_test_failure_raises_errorr‡   ­   s  € ô &°¸2ÐF`Ña€HÔð Ø!ØØ+Øñ€Gô ˜W°?Ó
C€Cð ˆy‰>Ð"˜UÐ"˜UÐ"×"×"×"Ò"ˆ>×"×"Ô"ˆ>×"×"Ó"˜U×"×"×"×"×"×"Ó"Ø,Ð<°G±Ð<°Ñ<×<×<×<Ò<Ð,×<×<Ô<Ð,×<×<Ó<°×<×<×<×<×<×<Ó<ð ×ÑÐ MÔNð ×&Ñ&×>Ñ>Ø
�x¨#¨g©,Ñ7¸õr   c                óä  • SSSS.SSSS.SSSS.SSSS./nU GHÓ  n[        X0U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/ n
SotS   o·U;   oÌo\(       d  SoÔS   oíU;   oÿnU(       Gd
  [        R                  " SU4SX{45      [        R                  " U5      [        R                  " U5      S.-  n	SSU	0-  nU
R                  U5        U(       db  [        R                  " SW4SWW45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  nU
R                  U5        [        R                  " U
S5      0 -  nSSU0-  n[	        [        R
                  " U5      5      eS =n=n
=n=n=n=n=pþGMÖ     g )Nz
../outsidez/var/www/outsider   )r'   r)   r&   zsite.comú
/etc/nginxz/var/www/../../etc/nginxzd:/programs/var/www/siter,   Fr-   r/   r0   r3   r4   úInvalid domainrN   zmust be under /var/wwwr„   ©z%(py3)s in %(py6)s©Úpy3r4   ú%(py8)sÚpy8©z%(py11)s in %(py14)s©Úpy11Úpy14ú%(py16)sÚpy16úassert %(py19)sÚpy19)r
   rO   rP   rQ   rR   rS   ÚappendÚ_format_boolop)r   r   ÚpayloadsÚprd   re   rf   rg   rh   ri   Ú@py_assert1Ú@py_assert5Ú@py_assert4Ú@py_assert10Ú@py_assert13Ú@py_assert12Ú@py_format9Ú@py_format15Ú@py_format17Ú@py_format18Ú@py_format20s                        r   Ú1test_site_create_validation_blocks_path_traversalr§   Ò   sQ  € àÐ,>È1ÑMØ¨,À1ÑEØÐ*DÐQRÑSØÐ*DÐQRÑSð	€Hô ˆÜ  °ÓAˆØ�9‰~Ð& Ð& Ð&×&×&×&Ò&ˆ~×&×&Ô&ˆ~×&×&Ó& ×&×&×&×&×&×&Ó&Ù]Ð Ð]¨¡LÐ] LÑ0×]Ð4LÐ]ÐT[ÑP\Ð]ÐP\Ñ4\×]×]×]Õ]Ð ×]×]Ô]Ð ×]×]Ó] L×]×]×]×]×]×]×]Ó]Ð4LÐP\×]×]Ô]Ð4L×]×]Ó]ÐP\×]×]×]×]×]×]×]×]×]×]×]×]×]×]Ò]ò r   zos.path.existsz	os.removez	glob.globú$/etc/php/8.2/fpm/pool.d/del.com.confzshutil.rmtreec	                óö  • [        SS9Ul        SSS.n	[        X—U5      n
U
S   nSoËUL oÝ(       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=pÜUR                  S5        UR                  S5        UR                  S5        U R                  SSS9  UR                  / SQSSS9  g )Nr   )r   údel.comú/var/www/del.com©r'   r)   r,   Tr-   r/   r0   r3   r4   z%/etc/nginx/sites-enabled/del.com.confz'/etc/nginx/sites-available/del.com.confr¨   )Úignore_errors)rp   rq   ÚnginxFr9   )
r   r   r   rO   rP   rQ   rR   rS   rX   rT   )Úmock_rmtreeÚ	mock_globÚmock_remover_   rb   r^   Úmock_existsr   r   rc   rd   re   rf   rg   rh   ri   s                   r   Útest_site_delete_successr³   à   sÛ   € ô &°Ñ3€HÔð Ø%ñ€Gô
 ˜W°?Ó
C€Càˆy‰>Ð!˜TÐ!˜TÐ!×!×!×!Ò!ˆ>×!×!Ô!ˆ>×!×!Ó!˜T×!×!×!×!×!×!Ó!ð ×'Ñ'Ð(OÔPØ×ÑÐ IÔJð ×ÑÐ FÔGð ×'Ñ'Ð(:È$Ð'ÑOð ×$Ñ$Ò%EÈUÐZ^Ð$Ò_r   c                ó   • SSS.SSS.SSS.SSS./nU GHÕ  n[        XAU5      nUS   nS	ovUL oˆ(       do  [        R                  " S
U4SXg45      [        R                  " U5      [        R                  " U5      S.-  n	SSU	0-  n
[	        [        R
                  " U
5      5      eS =n=p‡/ nSo…S   oÈU;   oÝom(       d  SoåS   oþU;   nUnU(       Gd
  [        R                  " SU4SXŒ45      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  nUR                  U5        U(       db  [        R                  " SW4SWW45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        [        R                  " US5      0 -  nSSU0-  n[	        [        R
                  " U5      5      eS =n=n=n=n=n=n=nnGMØ     U R                  5         g )Nz../etcr«   r¬   rª   z/var/wwwz	/var/www/r‰   r,   Fr-   r/   r0   r3   r4   rŠ   rN   zmust be strictly under /var/wwwr„   r‹   rŒ   rŽ   r�   r�   r‘   r”   r•   r   r–   r—   )	r   rO   rP   rQ   rR   rS   r˜   r™   Úassert_not_called)r¯   r   r   Úinvalid_payloadsr›   rd   re   rf   rg   rh   ri   rœ   r�   rž   rŸ   r    r¡   r¢   r£   r¤   r¥   r¦   s                         r   Ú&test_site_delete_security_restrictionsr·     sV  € ð Ð(:Ñ;Ø¨Ñ4Ø¨Ñ5Ø¨Ñ6ð	Ðô ˆÜ  °ÓAˆØ�9‰~Ð& Ð& Ð&×&×&×&Ò&ˆ~×&×&Ô&ˆ~×&×&Ó& ×&×&×&×&×&×&Ó&ÙfÐ Ðf¨¡LÐf LÑ0×fÐ4UÐfÐ]dÑYeÐfÐYeÑ4e×f×f×fÖfÐ ×f×fÔfÐ ×f×fÓf L×f×f×f×f×f×f×fÓfÐ4UÐYe×f×fÔfÐ4U×f×fÓfÐYe×f×f×f×f×f×f×f×f×f×f×f×f×f×fÓfñ ð
 ×!Ñ!Õ#r   )$Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriterO   rU   ÚsysÚpathlibr   Úunittest.mockr   r   r   ÚpytestrV   ÚinsertÚstrÚ__file__ÚresolveÚparentsÚactions.siter
   r   Úfixturer   r   rj   rt   r�   r‡   r§   r³   r·   © r   r   Ú<module>rÊ      s  ðÝ "ç  „ ƒ	Û 
Ý ß 5Ñ 5Û ð ‡�‡��‘3‘t˜H“~×-Ñ-Ó/×7Ñ7¸Ñ:¸UÑBÓCÔ Dç ?ð ‡�ñó ðð ‡�ñó ðñ ÐÓÙ€}ÓÙ€|ÓÙ€{ÓÙÐ uÑ-Ù€ YÑ/ÙÐ&°\ÑBÙÐ(Ó)ÙÐ,Ó-ÙÐ)Ó*ñ:ó +ó .ó *ó Có 0ó .ó ó ó ó ð:ñz ÐÓÙ€}ÓÙ€|ÓÙ€{ÓÙÐ uÑ-Ù€ YÑ/ÙÐ&°\ÑBñ]ó Có 0ó .ó ó ó ó ð]ñ6 ÐÓÙ€}ÓÙ€|ÓÙ€{ÓÙÐ uÑ-Ù€ YÑ/ÙÐ&°\ÑBñó Có 0ó .ó ó ó ó ðñ> ÐÓÙ€}ÓÙ€|ÓÙ€{ÓÙÐ tÑ,Ù€ YÑ/ÙÐ&°\ÑBñó Có 0ó -ó ó ó ó ðò<^ñ Ð dÑ+ÙÐ tÑ,ÙÐÓÙ€{ÓÙ€{ÓÙ€{Ð"HÐ!IÑJÙ€Óñ`ó ó Kó ó ó ó -ó ,ð`ñ: €Óñ$ó ñ$r   