ó
    UsIjí0  ã                  óî   • S SK Jr  S SKrS SKrS SKrS SKrS SKJrJr  S SK	J
r
  \
" S5      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SS jrSS jrSS jrg)é    )ÚannotationsN)Úload_configÚConfig)Ú
get_loggerzactions.databasez^[a-zA-Z0-9_]+$c                óF   • U R                  SS5      R                  SS5      $ )z<Escape string literals for safe embedding in SQL statements.Ú\z\\Ú'z'')Úreplace)Úvals    Ú:D:\Programs\laragon\www\wolf\agent\src\actions\database.pyÚescape_mysql_stringr      s    € à�;‰;�t˜VÓ$×,Ñ,¨S°$Ó7Ð7ó    c           
     ó¤  • [         R                  " S5      (       d  [        S5      e[        R                  R                  5       nUR                  (       a  UR                  US'   SSUR                   3/nUR                  (       a  UR                  SUR                   35        UR                  SS/5        [        R                  " UUU SSS	S
S9$ )zARun a SQL statement on MySQL using the CLI with arguments hidden.Úmysqlzmysql CLI not found on systemÚ	MYSQL_PWDz-uz	--socket=z-Nz-BTé
   F)ÚenvÚinputÚcapture_outputÚtextÚtimeoutÚcheck)ÚshutilÚwhichÚOSErrorÚosÚenvironÚcopyÚmysql_passwordÚ
mysql_userÚmysql_socketÚappendÚextendÚ
subprocessÚrun)ÚsqlÚconfigr   Úcmds       r   Úrun_mysql_stmt_rawr)      s·   € ä�<Š<˜× Ñ ÜÐ5Ó6Ð6ä
�*‰*�/‰/Ó
€CØ××Ø!×0Ñ0ˆˆKÑà�b˜×*Ñ*Ð+Ð,Ð
-€CØ××Ø�
‰
�Y˜v×2Ñ2Ð3Ð4Ô5à‡J�J��dˆ|Ôä�>Š>ØØØØØØØñð r   c                óŠ   • [        X5      nUR                  S:w  a(  [        U SUR                  R	                  5        35      eg)z2Run a SQL statement and raise OSError if it fails.r   z: N)r)   Ú
returncoder   ÚstderrÚstrip)r&   r'   Ú	error_msgÚress       r   Úrun_mysql_stmtr0   0   sA   € ä
˜SÓ
)€CØ
‡~�~˜ÓÜ˜˜ 2 c§j¡j×&6Ñ&6Ó&8Ð%9Ð:Ó;Ð;ð r   c                ó†   • SU  S3n[        X!5      nUR                  S:X  a   UR                  R                  5       (       a  gg)z0Check if a database schema exists on the server.zSHOW DATABASES LIKE 'ú';r   TF©r)   r+   Ústdoutr-   )Údb_namer'   Úqr/   s       r   Ú	db_existsr7   7   s>   € à
 ˜y¨Ð+€AÜ
˜QÓ
'€CØ
‡~�~˜Ó˜sŸz™z×/Ñ/×1Ñ1ØØr   c                óŒ   • SU  SU S3n[        X25      nUR                  S:X  a   UR                  R                  5       (       a  gg)z.Check if a database user exists on the server.z%SELECT 1 FROM mysql.user WHERE User='z' AND Host='r2   r   TFr3   )ÚusernameÚhostr'   r6   r/   s        r   Úuser_existsr;   @   sD   € à
/°¨z¸ÀdÀVÈ2ÐN€AÜ
˜QÓ
'€CØ
‡~�~˜Ó˜sŸz™z×/Ñ/×1Ñ1ØØr   c                óú  •  U R                  S5      nU(       d  [        S5      e[        R                  U5      (       d  [        S5      eSU 3n[        R                  SU5        [        5       n[        X#5      (       a  [        SU S35      eSU S	3n[        XCS
5        [        R                  SU5        SSU S3US.$ ! [         a0  n[        U5      n[        R                  SU5        SUS.s SnA$ SnAff = f)z6Create a new logical MySQL database with prefix wolf_.ÚnameúDatabase name is requiredúAInvalid database name: must contain only alphanumeric/underscoresÚwolf_z!Attempting to create database: %sú	Database z already existszCREATE DATABASE z2 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;zFailed to create databasez Database %s created successfullyTz created successfully©ÚsuccessÚmessageÚdatabasezDatabase creation failed: %sF©rC   ÚerrorN)ÚgetÚ
ValueErrorÚVALID_NAME_PATTERNÚmatchÚlogÚinfor   r7   r0   Ú	ExceptionÚstrrG   )Úpayloadr=   r5   r'   r&   ÚexcÚerr_msgs          r   Úhandle_database_createrS   I   s  € ð
Ø�{‰{˜6Ó"ˆÞÜÐ8Ó9Ð9ä!×'Ñ'¨×-Ñ-ÜÐ`ÓaÐaà˜$˜�.ˆÜ�‰Ð4°gÔ>ä“ˆÜ�W×%Ñ%Ü˜y¨¨	°ÐAÓBÐBà   	Ð)[Ð\ˆÜ�sÐ$?Ô@ä�‰Ð3°WÔ=àØ" 7 )Ð+@ÐAØñ
ð 	
øô ó 
Ü�c“(ˆÜ�	‰	Ð0°'Ô:àØñ
õ 	
ûð
ús   ‚B=C  Ã 
C:Ã
%C5Ã/C:Ã5C:c                ó2  •  U R                  S5      nU(       d  [        S5      eUR                  S5      (       d  [        S5      e[        R	                  U5      (       d  [        S5      e[
        R                  SU5        [        5       n[        X5      (       d  [        SU S35      eS	U S
3n[        X2S5        [
        R                  SU5        SSU S3US.$ ! [         a0  n[        U5      n[
        R                  SU5        SUS.s SnA$ SnAff = f)z0Drop a logical MySQL database with prefix wolf_.r=   r>   r@   ú3Database name must start with 'wolf_' for isolationr?   zAttempting to drop database: %srA   ú does not existzDROP DATABASE Ú;zFailed to drop databasez Database %s dropped successfullyTz dropped successfullyrB   zDatabase dropping failed: %sFrF   N)rH   rI   Ú
startswithrJ   rK   rL   rM   r   r7   r0   rN   rO   rG   )rP   r=   r'   r&   rQ   rR   s         r   Úhandle_database_droprY   m   s  € ð!
Ø�{‰{˜6Ó"ˆÞÜÐ8Ó9Ð9à�‰˜w×'Ñ'ÜÐRÓSÐSä!×'Ñ'¨×-Ñ-ÜÐ`ÓaÐaä�‰Ð2°DÔ9ä“ˆÜ˜×&Ñ&Ü˜y¨¨¨oÐ>Ó?Ð?à˜t˜f AÐ&ˆÜ�sÐ$=Ô>ä�‰Ð3°TÔ:àØ" 4 &Ð(=Ð>Øñ
ð 	
øô ó 
Ü�c“(ˆÜ�	‰	Ð0°'Ô:àØñ
õ 	
ûð
ús   ‚CC Ã
DÃ&%DÄDÄDc                óÆ  •  U R                  S5      nU R                  S5      nU R                  S5      nU(       a  U(       a  U(       d  [        S5      eUR                  S5      (       d  [        S5      e[        R	                  U5      (       d  [        S5      eUR                  S5      (       d  [        S5      e[        R	                  U5      (       d  [        S	5      e[
        R                  S
X5        [        5       n[        USU5      (       a  [        SU S35      e[        U5      nSU SU S3nUSU SU S3-  n[        XdS5        [
        R                  SU5        SSU SU S3US.$ ! [         ae  n[        U5      nS H/  n	U R                  U	5      n
U
(       d  M  UR                  U
S5      nM1     [
        R                  SU5        SUS.s S nA$ S nAff = f)!zKCreate a database user and assign all privileges on the specified database.r9   ÚpasswordrE   z-username, password, and database are requiredr@   ú.Username must start with 'wolf_' for isolationú<Invalid username: must contain only alphanumeric/underscoresrU   r?   z,Attempting to create database user: %s on %sÚ	localhostúUser 'z'@'localhost' already existszCREATE USER 'ú'@'localhost' IDENTIFIED BY 'z';
zGRANT ALL PRIVILEGES ON ú.* TO 'ú'@'localhost';z2Failed to create database user or grant privilegesz%Database user %s created successfullyTúDatabase user z# created and granted privileges on z successfully©rC   rD   r9   )r[   Ú____z4Database user creation failed (passwords hidden): %sFrF   N©rH   rI   rX   rJ   rK   rL   rM   r   r;   r   r0   rN   rO   r
   rG   )rP   r9   r[   rE   r'   Úescaped_passwordr&   rQ   rR   Úkeyr   s              r   Úhandle_database_user_createri   “   sÚ  € ð2
Ø—;‘;˜zÓ*ˆØ—;‘;˜zÓ*ˆØ—;‘;˜zÓ*ˆæžx®xÜÐLÓMÐMà×"Ñ" 7×+Ñ+ÜÐMÓNÐNä!×'Ñ'¨×1Ñ1ÜÐ[Ó\Ð\à×"Ñ" 7×+Ñ+ÜÐRÓSÐSä!×'Ñ'¨×1Ñ1ÜÐ`ÓaÐaä�‰Ð?ÀÔTä“ˆÜ�x ¨f×5Ñ5Ü˜v h ZÐ/KÐLÓMÐMô /¨xÓ8ÐØ˜h˜ZÐ'DÐEUÐDVÐVZÐ[ˆØÐ)¨(¨°7¸8¸*ÀNÐSÑSˆä�sÐ$XÔYä�‰Ð8¸(ÔCàØ'¨ zÐ1TÐU]ÐT^Ð^kÐlØ ñ
ð 	
øô ó 

Ü�c“(ˆÛ ˆCØ—+‘+˜cÓ"ˆCßˆsØ!Ÿ/™/¨#¨vÓ6’ñ !ô 	�	‰	ÐHÈ'ÔRàØñ
õ 	
ûð

ús$   ‚E.E1 Å1
G Å;&GÆ%0GÇG ÇG c                ó6  •  U R                  S5      nU(       d  [        S5      eUR                  S5      (       d  [        S5      e[        R	                  U5      (       d  [        S5      e[
        R                  SU5        [        5       n[        USU5      (       d  [        SU S	35      eS
U S3n[        X2S5        [
        R                  SU5        SSU S3US.$ ! [         a0  n[        U5      n[
        R                  SU5        SUS.s SnA$ SnAff = f)z+Delete a database user prefixed with wolf_.r9   zusername is requiredr@   r\   r]   z&Attempting to delete database user: %sr^   r_   ú'@'localhost' does not existzDROP USER 'rb   zFailed to drop database userz%Database user %s deleted successfullyTrc   z deleted successfullyrd   z!Database user deletion failed: %sFrF   N)rH   rI   rX   rJ   rK   rL   rM   r   r;   r0   rN   rO   rG   )rP   r9   r'   r&   rQ   rR   s         r   Úhandle_database_user_deleterl   Ê   s  € ð!
Ø—;‘;˜zÓ*ˆÞÜÐ3Ó4Ð4à×"Ñ" 7×+Ñ+ÜÐMÓNÐNä!×'Ñ'¨×1Ñ1ÜÐ[Ó\Ð\ä�‰Ð9¸8ÔDä“ˆÜ˜8 [°&×9Ñ9Ü˜v h ZÐ/KÐLÓMÐMà˜H˜: ^Ð4ˆÜ�sÐ$BÔCä�‰Ð8¸(ÔCàØ'¨ zÐ1FÐGØ ñ
ð 	
øô ó 
Ü�c“(ˆÜ�	‰	Ð5°wÔ?àØñ
õ 	
ûð
ús   ‚CC Ã
DÃ(%DÄDÄDc                óì  •  U R                  S5      nU R                  S5      nU(       a  U(       d  [        S5      eUR                  S5      (       d  [        S5      e[        R	                  U5      (       d  [        S5      e[
        R                  SU5        [        5       n[        USU5      (       d  [        S	U S
35      e[        U5      nSU SU S3n[        XSS5        [
        R                  SU5        SSU S3US.$ ! [         ae  n[        U5      nS H/  nU R                  U5      n	U	(       d  M  UR                  U	S5      nM1     [
        R                  SU5        SUS.s SnA$ SnAff = f)z:Reset the password of a database user prefixed with wolf_.r9   Únew_passwordz&username and new_password are requiredr@   r\   r]   z2Attempting to reset password for database user: %sr^   r_   rk   zALTER USER 'r`   r2   zFailed to reset passwordz0Password for database user %s reset successfullyTzPassword for database user z reset successfullyrd   )rn   re   z:Database user password reset failed (passwords hidden): %sFrF   Nrf   )
rP   r9   rn   r'   rg   r&   rQ   rR   rh   r   s
             r   Ú#handle_database_user_reset_passwordro   ð   sl  € ð(
Ø—;‘;˜zÓ*ˆØ—{‘{ >Ó2ˆæž|ÜÐEÓFÐFà×"Ñ" 7×+Ñ+ÜÐMÓNÐNä!×'Ñ'¨×1Ñ1ÜÐ[Ó\Ð\ä�‰ÐEÀxÔPä“ˆÜ˜8 [°&×9Ñ9Ü˜v h ZÐ/KÐLÓMÐMä.¨|Ó<ÐØ˜X˜JÐ&CÐDTÐCUÐUWÐXˆÜ�sÐ$>Ô?ä�‰ÐCÀXÔNàØ4°X°JÐ>QÐRØ ñ
ð 	
øô ó 

Ü�c“(ˆÛ$ˆCØ—+‘+˜cÓ"ˆCßˆsØ!Ÿ/™/¨#¨vÓ6’ñ %ô 	�	‰	ÐNÐPWÔXàØñ
õ 	
ûð

ús$   ‚DD Ä
E3Ä&E.Ä80E.Å(E3Å.E3c                ó˜  ^•  U R                  S5      nU R                  S5      nU R                  S5      nU(       a  U(       a  U(       d  [        S5      eUR                  S5      (       d  [        S5      e[        R	                  U5      (       d  [        S5      eUR                  S5      (       d  [        S5      e[        R	                  U5      (       d  [        S	5      eUR                  S
5       Vs/ sH   oDR                  5       R                  5       PM"     nn1 Skm[        U4S jU 5       5      (       d  [        S5      eSR                  U5      n[        R                  SXU5        [        5       n[        USU5      (       d  [        SU S35      e[        X'5      (       d  [        SU S35      eSU SU S3n[        X‡5        SU SU SU S3n	[!        X—S5        [        R                  SXU5        SSU SU S U 3US!.$ s  snf ! ["         a0  n
[%        U
5      n[        R'                  S"U5        S#US$.s S%n
A
$ S%n
A
ff = f)&z8Update database user privileges on a specified database.r9   rE   Ú
privilegesz/username, database, and privileges are requiredr@   r\   r]   z.Database must start with 'wolf_' for isolationr?   Ú,>   ÚALLÚDROPÚALTERÚINDEXÚCREATEÚDELETEÚINSERTÚSELECTÚUPDATEÚEXECUTEúLOCK TABLESúALL PRIVILEGESúCREATE TEMPORARY TABLESc              3  ó*   >#   • U H	  oT;   v •  M     g 7f)N© )Ú.0ÚpÚvalid_privss     €r   Ú	<genexpr>Ú5handle_database_user_update_grants.<locals>.<genexpr>:  s   øé € Ð7©Y¨˜Ö#ªYùs   ƒzInvalid privilege(s) specifiedz, z>Attempting to update grants for database user: %s on %s to: %sr^   r_   rk   rA   rV   zREVOKE ALL PRIVILEGES ON z	.* FROM 'rb   zGRANT z ON ra   zFailed to update privilegesz3Privileges for %s on %s updated successfully to: %sTzPrivileges for z on database z updated successfully to: rd   z*Database user privileges update failed: %sFrF   N)rH   rI   rX   rJ   rK   Úsplitr-   ÚupperÚallÚjoinrL   rM   r   r;   r7   r)   r0   rN   rO   rG   )rP   r9   rE   rq   rƒ   Ú	priv_listÚpriv_strr'   Ú
revoke_sqlÚ	grant_sqlrQ   rR   r„   s               @r   Ú"handle_database_user_update_grantsr�     s9  ø€ ð<
Ø—;‘;˜zÓ*ˆØ—;‘;˜zÓ*ˆØ—[‘[ Ó.ˆ
æžx®zÜÐNÓOÐOà×"Ñ" 7×+Ñ+ÜÐMÓNÐNä!×'Ñ'¨×1Ñ1ÜÐ[Ó\Ð\à×"Ñ" 7×+Ñ+ÜÐMÓNÐNä!×'Ñ'¨×1Ñ1ÜÐ`ÓaÐað 1;×0@Ñ0@ÀÔ0EÓFÑ0E¨1—W‘W“Y—_‘_Ö&Ñ0Eˆ	ÐFò
ˆô
 Ô7©YÓ7×7Ñ7ÜÐ=Ó>Ð>Ø—9‘9˜YÓ'ˆä�‰ÐQÐS[ÐgoÔpä“ˆÜ˜8 [°&×9Ñ9Ü˜v h ZÐ/KÐLÓMÐMÜ˜×*Ñ*Ü˜y¨¨
°/ÐBÓCÐCð 1°°
¸)ÀHÀ:È^Ð\ˆ
Ü˜:Ô.ð ˜X˜J d¨8¨*°G¸H¸:À^ÐTˆ	Ü�yÐ*GÔHä�‰ÐFÈÐ\dÔeàØ(¨¨
°-À¸zÐIcÐdlÐcmÐnØ ñ
ð 	
ùò7 GøôB ó 
Ü�c“(ˆÜ�	‰	Ð>ÀÔHàØñ
õ 	
ûð
ús1   ƒC2H Ã5&H
ÄC.H È
H È
I	È%IÈ>I	ÉI	)r   rO   ÚreturnrO   )r&   rO   r'   r   r�   zsubprocess.CompletedProcess)r&   rO   r'   r   r.   rO   r�   ÚNone)r5   rO   r'   r   r�   Úbool)r9   rO   r:   rO   r'   r   r�   r’   )rP   Údictr�   r“   )Ú
__future__r   r   Úrer   r$   r'   r   r   Úloggerr   rL   ÚcompilerJ   r   r)   r0   r7   r;   rS   rY   ri   rl   ro   r�   r�   r   r   Ú<module>r˜      ss   ðÝ "ã 	Û 	Û Û ß &Ý áÐ#Ó$€ð —Z’ZÐ 2Ó3Ð ô8ôô4<ôôô!
ôH#
ôL4
ôn#
ôL*
õZ>
r   