
    UsIj0                        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     ;;tV$,,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

Yv22345JJ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
~~2cjj&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
~~szz//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dV2NA
Q
'C
~~szz//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 requiredAInvalid 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$.4g>W%%y	ABB 	)[\s$?@3W="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2D9&&yo>??tfA&s$=>3T:"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*xxLMM""7++MNN!''11[\\""7++RSS!''11`aa?Txf55vhZ/KLMM /x8hZ'DEUDVVZ[)(78*NSSs$XY8(C'z1TU]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[\\98D8[&99vhZ/KLMMH:^4s$BC8(C'z1FG 
 	
  
c(		5w?
 	

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[\\ExP8[&99vhZ/KLMM.|<XJ&CDTCUUWXs$>?CXN4XJ>QR 
 	
  

c($C++c"Cs!//#v6 % 			NPW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[        X5        SU SU SU S3n	[!        XS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     7Y#Ys   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*[[.
xzNOO""7++MNN!''11[\\""7++MNN!''11`aa 1;0@0@0EF0E1WWY__&0E	F

 7Y777=>>99Y'QS[gop8[&99vhZ/KLMM**y
/BCC 1
)H:^\
:. XJd8*GH:^T	y*GHF\de(
-zIcdlcm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    " 	 	   & #$ ZZ 23 84<!
H#
L4
n#
L*
Z>
r   