ó
    Õ�Ejy%  ã                  óˆ  • S SK Jr  S SKrS SKrS SKrS SKJr  S SKJr  \" S5      r\R                  R                  S5      r\(       a7  \R                  R                  \R                  R                  \SS5      5      rO\R                  R                  S	5      rSS
 jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrg)é    )ÚannotationsN)Údatetime)Ú
get_loggerzactions.file_managerÚWOLFPANEL_DEV_HOMEÚvarÚwwwz/var/wwwc                óÚ  • U (       d  [        S5      e[        R                  R                  U 5      (       dQ  [        R                  R	                  [        R                  R                  [        U R                  S5      5      5      nO[        R                  R	                  U 5      nU[        :w  a:  UR                  [        [        R                  -   5      (       d  [        SU S35      eU$ )zLNormalize and verify that the path is strictly within the allowed BASE_PATH.zpath is requiredÚ/z2Access denied: Path is outside of base directory (Ú))Ú
ValueErrorÚosÚpathÚisabsÚrealpathÚjoinÚ	BASE_PATHÚlstripÚ
startswithÚsepÚPermissionError)Ú	user_pathÚresolved_paths     Ú>D:\Programs\laragon\www\wolf\agent\src\actions\file_manager.pyÚ_verify_safe_pathr      sª   € æÜÐ+Ó,Ð,ô �7‰7�=‰=˜×#Ñ#ÜŸ™×(Ñ(¬¯©¯©´iÀ×AQÑAQÐRUÓAVÓ)WÓX‰äŸ™×(Ñ(¨Ó3ˆð œ	Ó!¨-×*BÑ*BÄ9ÌrÏvÉvÑCU×*VÑ*VÜÐ RÐS`ÐRaÐabÐcÓdÐdàÐó    c                óH   • U S:  a  U  S3$ U S:  a	  U S-  S S3$ U S-  S S3$ )z.Format file sizes into human-readable strings.é   z Bi   z.1fz KBz MB© )Ú
size_bytess    r   Ú_format_sizer    $   sI   € à�DÓØ�˜RÐ Ð Ø	�kÓ	!Ø˜tÑ# CÐ(¨Ð,Ð,à Ñ,¨SÐ1°Ð5Ð5r   c                óx  •  U R                  SS5      n[        U5      n[        R                  R	                  U5      (       d  SSU 3S.$ [        R                  R                  U5      (       d  SSU 3S.$ / n[        R                  " U5       HÌ  nUS;   a  M  [        R                  R                  X$5      n[        R                  R                  U5      n [        R                  " U5      nU(       d  [        UR                  5      OSn[        R                  " UR                  5      R                  S	5      n	UR!                  UU(       a  SOSUU	S.5        MÎ     SUS.$ ! [         a    U(       d  S
OSnSn	 NAf = f! [         a.  n
["        R%                  SU
5        S['        U
5      S.s Sn
A
$ Sn
A
ff = f)z0List directory contents under the verified path.r   Ú FzDirectory not found: ©ÚsuccessÚerrorzPath is not a directory: )Ú.z..Nz%d.%m.%Y %H:%Mz0 BÚUnknownÚfolderÚfile)ÚnameÚtypeÚsizeÚmodified_atT)r$   ÚitemszFile list failed: %s)Úgetr   r   r   ÚexistsÚisdirÚlistdirr   Ústatr    Úst_sizer   ÚfromtimestampÚst_mtimeÚstrftimeÚ	ExceptionÚappendÚlogr%   Ústr)Úpayloadr   r   r.   r*   Ú	full_pathÚis_dirr3   Úsize_strÚ	mtime_strÚexcs              r   Úhandle_file_listrB   .   s�  € ð0
Ø—K‘K ¨Ó+ˆ	Ü)¨)Ó4ˆä�w‰w�~‰~˜m×,Ñ,à Ø0°°Ð<ñð ô �w‰w�}‰}˜]×+Ñ+à Ø4°Y°KÐ@ñð ð
 ˆÜ—J’J˜}Ö-ˆDà�{Ó"ÙäŸ™Ÿ™ ]Ó9ˆIÜ—W‘W—]‘] 9Ó-ˆFð&Ü—w’w˜yÓ)�Þ=Cœ<¨¯©Ô5È�Ü$×2Ò2°4·=±=ÓA×JÑJÐK[Ó\�	ð
 �L‰LØÞ$*™°Ø Ø(ñ	ö ñ! .ð0 Øñ
ð 	
øô ó &Þ(.™5°D�Ø%’	ð&ûô ó 
Ü�	‰	Ð(¨#Ô.àÜ˜“Xñ
õ 	
ûð
úsP   ‚AF Á+F Á7A!F ÃA#E$Ä<'F Å$E>Å;F Å=E>Å>F Æ
F9Æ#F4Æ.F9Æ4F9c                óH  •  U R                  SS5      n[        U5      n[        R                  R	                  U5      (       a$  [        R                  R                  U5      (       d  SSU 3S.$ [        R                  R                  U5      nUS:”  a  SSS.$ [        US5       nUR                  S	5      nS
U;   a  SSS.sSSS5        $  SSS5        [        R                  " U5      u  pgU(       a)  UR                  S5      =(       d    US;   nU(       d  SSS.$ [        USSSS9 nUR                  5       n	SSS5        SW	SS.$ ! , (       d  f       N�= f! , (       d  f       N%= f! [         a.  n
[        R                  SU
5        S[        U
5      S.s Sn
A
$ Sn
A
ff = f)z4Read textual files safely (max 2MB, rejects binary).r   r"   FzFile not found: r#   é    z(File exceeds maximum allowed size of 2MBÚrbr   ó    zBinary files are not allowedNztext/)zapplication/jsonzapplication/javascriptzapplication/xmlzapplication/x-javascriptzapplication/x-shzapplication/x-bashzapplication/x-phpzapplication/xhtml+xmlÚrúutf-8Úignore)ÚencodingÚerrorsT)r$   ÚcontentrJ   zFile read failed: %s)r/   r   r   r   r0   ÚisfileÚgetsizeÚopenÚreadÚ	mimetypesÚ
guess_typer   r8   r:   r%   r;   )r<   r   r   Ú	file_sizeÚfÚchunkÚ	mime_typeÚ_Úis_textrL   rA   s              r   Úhandle_file_readrY   c   s”  € ð;
Ø—K‘K ¨Ó+ˆ	Ü)¨)Ó4ˆä�w‰w�~‰~˜m×,Ñ,´B·G±G·N±NÀ=×4QÑ4Qà Ø+¨I¨;Ð7ñð ô —G‘G—O‘O MÓ2ˆ	Ø�Ó&à ØCñð ô �- Ô&¨!Ø—F‘F˜4“LˆEØ˜%Óà$Ø;ñ÷ 'Ñ&à÷ 'ô !×+Ò+¨MÓ:‰ˆ	ÞØ×*Ñ*¨7Ó3÷ 	°yð 	Eñ 	8ˆGö à$Ø;ñð ô
 �- ¨w¸xÒHÈAØ—f‘f“hˆG÷ Ið ØØñ
ð 	
÷= 'Õ&ú÷6 IÕHûô ó 
Ü�	‰	Ð(¨#Ô.àÜ˜“Xñ
õ 	
ûð
úsg   ‚A,E) Á/)E) ÂE) Â%EÃ	E) ÃAE) ÄE) Ä(EÄ9E) Å
EÅE) Å
E&Å"E) Å)
F!Å3#FÆF!ÆF!c                óÞ  • Sn U R                  SS5      nU R                  SS5      n[        U5      n[        R                  " [        R                  R                  U5      SS9  UR                  S5      n[        U5      S:”  a  S	S
S.$ US-   n[        US5       nUR                  U5        SSS5        [        R                  " X5        SSS.$ ! , (       d  f       N)= f! [         a�  n[        R                  SU5        U(       aL  [        R                  R                  U5      (       a(   [        R                  " U5        O! [         a     Of = fS	[!        U5      S.s SnA$ SnAff = f)z&Write text files atomically (max 2MB).Nr   r"   rL   T©Úexist_okrH   rD   Fz+Content exceeds maximum allowed size of 2MBr#   z.tmpÚwb)r$   ÚwrittenzFile write failed: %s)r/   r   r   Úmakedirsr   ÚdirnameÚencodeÚlenrO   ÚwriteÚreplacer8   r:   r%   r0   Úremover;   )r<   Útmp_pathr   rL   r   Úcontent_bytesrT   rA   s           r   Úhandle_file_writerh   £   s>  € à€Hð%
Ø—K‘K ¨Ó+ˆ	Ø—+‘+˜i¨Ó,ˆä)¨)Ó4ˆô 	�Š”B—G‘G—O‘O MÓ2¸TÒBð  Ÿ™ wÓ/ˆÜˆ}Ó Ó/à ØFñð ð ! 6Ñ)ˆÜ�(˜DÔ! QØ�G‰G�MÔ"÷ "ô 	�
Š
�8Ô+àØñ
ð 	
÷	 "Õ!ûô ó 

Ü�	‰	Ð)¨3Ô/ÞœŸ™Ÿ™ x×0Ñ0ðÜ—	’	˜(Õ#øÜó Ùðúð Ü˜“Xñ
õ 	
ûð

úsa   „BC! Â
C! ÂCÂ-"C! Ã
CÃC! Ã!
E,Ã+AE'Ä-EÅE'Å
EÅE'ÅEÅE'Å!E,Å'E,c                ó¸  •  U R                  SS5      n[        U5      n[        R                  R	                  U5      (       d  SSU 3S.$ [        R                  R                  U5      (       a  [        R                  " U5        O[        R                  " U5        SSS.$ ! [         a.  n[        R                  SU5        S[        U5      S.s S	nA$ S	nAff = f)
zDelete a file or directory.r   r"   FúPath not found: r#   T)r$   ÚdeletedzFile delete failed: %sN)r/   r   r   r   r0   r1   ÚshutilÚrmtreere   r8   r:   r%   r;   )r<   r   r   rA   s       r   Úhandle_file_deletern   Î   s¿   € ð
Ø—K‘K ¨Ó+ˆ	Ü)¨)Ó4ˆä�w‰w�~‰~˜m×,Ñ,à Ø+¨I¨;Ð7ñð ô
 �7‰7�=‰=˜×'Ñ'Ü�MŠM˜-Õ(ä�IŠI�mÔ$ð Øñ
ð 	
øô ó 
Ü�	‰	Ð*¨CÔ0àÜ˜“Xñ
õ 	
ûð
ús%   ‚AB! ÁAB! Â!
CÂ+#CÃCÃCc                óŽ  •  U R                  SS5      nU R                  SS5      nU(       a  U(       d  SSS.$ SU;   d  SU;   a  SS	S.$ [        U5      n[        R                  R	                  U5      n[        [        R                  R                  XB5      5      n[        R                  R                  U5      (       d  SS
U 3S.$ [        R                  R                  U5      (       a  SSS.$ [        R                  " X55        SSS.$ ! [         a.  n[        R                  SU5        S[        U5      S.s SnA$ SnAff = f)z-Rename a file or directory inside its folder.Úold_pathr"   Únew_nameFz'Both old_path and new_name are requiredr#   r
   Ú\zInvalid file name formatrj   z1A file or folder with the new name already existsT)r$   ÚrenamedzFile rename failed: %sN)r/   r   r   r   r`   r   r0   Úrenamer8   r:   r%   r;   )r<   rp   rq   Úold_resolvedÚ
parent_dirÚnew_resolvedrA   s          r   Úhandle_file_renamerx   ë   s3  € ð,
Ø—;‘;˜z¨2Ó.ˆØ—;‘;˜z¨2Ó.ˆæžxà ØBñð ð �(‹?˜d hÓ.à Ø3ñð ô
 )¨Ó2ˆÜ—W‘W—_‘_ \Ó2ˆ
Ü(¬¯©¯©°jÓ)KÓLˆä�w‰w�~‰~˜l×+Ñ+à Ø+¨H¨:Ð6ñð ô �7‰7�>‰>˜,×'Ñ'à ØLñð ô
 	�	Š	�,Ô-àØñ
ð 	
øô ó 
Ü�	‰	Ð*¨CÔ0àÜ˜“Xñ
õ 	
ûð
ús5   ‚6D ¹D Á
A=D Ã(D Ã1D Ä
EÄ#D?Ä9EÄ?Ec                ó  •  U R                  SS5      nU R                  SS5      n[        U5      n[        R                  " [        R                  R                  U5      SS9  [        R                  R                  U5      (       a  SSS	.$ US
:X  a  [        R                  " USS9  O[        USSS9 n SSS5        SSS.$ ! , (       d  f       N= f! [         a.  n[        R                  SU5        S[        U5      S	.s SnA$ SnAff = f)z!Create a blank file or directory.r   r"   r+   r)   Tr[   FzPath already existsr#   r(   ÚwrH   )rJ   N)r$   ÚcreatedzFile create failed: %s)r/   r   r   r_   r   r`   r0   rO   r8   r:   r%   r;   )r<   r   Ú	item_typer   rT   rA   s         r   Úhandle_file_creater}     sî   € ð
Ø—K‘K ¨Ó+ˆ	Ø—K‘K ¨Ó/ˆ	ä)¨)Ó4ˆô 	�Š”B—G‘G—O‘O MÓ2¸TÒBä�7‰7�>‰>˜-×(Ñ(à Ø.ñð ð
 ˜Ó Ü�KŠK˜°Ó5ä�m S°7Ò;¸qØ÷ <ð Øñ
ð 	
÷ <Õ;ûô ó 
Ü�	‰	Ð*¨CÔ0àÜ˜“Xñ
õ 	
ûð
ús<   ‚B	C Â'C Â3CÂ5C Ã
CÃC Ã
DÃ#DÄ DÄD)r   r;   Úreturnr;   )r   Úintr~   r;   )r<   Údictr~   r€   )Ú
__future__r   rQ   r   rl   r   Úloggerr   r:   Úenvironr/   ÚDEV_HOMEr   r   r   r   r   r    rB   rY   rh   rn   rx   r}   r   r   r   Ú<module>r…      s�   ðÝ "ã Û 	Û Ý Ý áÐ'Ó(€à�:‰:�>‰>Ð.Ó/€ÞØ—‘× Ñ  §¡§¡¨h¸¸uÓ!EÓF�Ià—‘× Ñ  Ó,€Iôô$6ô2
ôj=
ô@(
ôV
ô:.
õb 
r   