
    sIjp                    v    S SK Jr  S SKrS SKrS SKrS SKJr  \" S5      rS
S jrSS jr	SS jr
SS jrSS	 jrg)    )annotationsN)
get_loggerzactions.sftpc                    SSK nUR                  U 5        g! [         a     g[         a    [        R
                  R                  S5      (       a|   [        SSSS9 nU H?  nUR                  5       R                  S	5      nU(       d  M+  US   U :X  d  M6    SSS5         g   SSS5        O!! , (       d  f       O= f! [         a     Of = f gf = f)
z@Check if a system user exists using pwd or /etc/passwd fallback.r   NTFz/etc/passwdrzutf-8)encoding:)pwdgetpwnamKeyErrorImportErrorospathexistsopenstripsplit	Exception)usernamer	   flinepartss        6D:\Programs\laragon\www\wolf\agent\src\actions\sftp.pyuser_existsr      s    X  77>>-((-w?1 ! $

 2 23 7 5U1X%9#'	 @? ! @??
  st    
C-CB=*B,B,B,B=!B,#B=+C,
B:	6B=9C:B==
C
C	C

CCc                   U (       d  [        S5      e[        R                  R                  S5      nU(       a?  [        R                  R                  [        R                  R                  USS5      5      nO[        R                  R                  S5      n[        R                  R                  U 5      nX2:w  a  UR                  U[        R                  -   5      (       d  UR                  SS5      nUR                  SS5      n[        U5      S:  a  US   S	:X  a  US
S n[        U5      S:  a  US   S	:X  a  US
S nXE:w  a(  UR                  US-   5      (       d  [        SU S35      e[        R                  S:X  aG  U R                  S5      (       a1  Un[        U5      S:  a  US   S	:X  a  US
S nUR                  SS5      $ U$ )zXResolve and verify that the path is strictly within the allowed web root base directory.zhome_directory is requiredWOLFPANEL_DEV_HOMEvarwwwz/var/www\/   r      Nz:Access denied: Path is outside of allowed base directory ()nt)
ValueErrorr   environgetr   realpathjoin
startswithsepreplacelenPermissionErrorname)	user_pathdev_home	base_pathresolved_pathnormalized_resolvednormalized_baseres_strs          r   _verify_safe_pathr6   !   s   566zz~~23HGG$$RWW\\(E5%IJ	GG$$Z0	GG$$Y/M !-*B*B9rvvCU*V*V+33D#>#++D#6"#a',?,Bc,I"5ab"9!#(:c(A-ab1O1:M:X:XYhknYn:o:o!$^_l^mmn"opp	ww$9//44w<!
c 1abkGtS))    c           
     F    U R                  S5      nU R                  S5      nU R                  S5      nU(       a  U(       a  U(       d  [        S5      e[        R                  " SS[	        U5      5      SS nU(       d  [        S	5      e[        U5      nS
U 3n[        R                  SXe5        [        U5      (       a  [        SU S35      eSSSUSSSSU/	n[        R                  " USSSS9nUR                  S:w  a&  [        SUR                  R                  5        35      e[        R                  " S/U SU 3SSSS9nUR                  S:w  a&  [        SUR                  R                  5        35      e[        R                  " SSU/SSSS9nUR                  S:w  a&  [        S UR                  R                  5        35      e[        R                  " S!U S"3U/SSSS9nUR                  S:w  a&  [        S#UR                  R                  5        35      e[        R                  S$U5        SS%U S&3US'.$ ! [         aW  n	[        R!                  S([	        U	5      R#                  U R                  SS)5      S)5      5        S[	        U	5      S*.s Sn	A	$ Sn	A	ff = f)+zUCreate a new SFTP user with a home directory and group www-data, and assign password.username_suffixpasswordhome_directoryz:username_suffix, password, and home_directory are requiredz[^a-zA-Z0-9_] N    z Invalid or empty username_suffix
wolf_sftp_z-Attempting to create SFTP user: %s (home: %s)User z already existsuseraddz-mz-dz-sz/usr/sbin/nologinz-gzwww-dataTFcapture_outputtextcheckr   zuseradd failed: chpasswdr   inputrB   rC   rD   chpasswd failed: chmod750zchmod failed: chownz	:www-datazchown failed: z!SFTP user %s created successfully
SFTP user z created successfullysuccessmessager   z*SFTP creation failed (password hidden): %s____rN   error)r&   r$   resubstrr6   loginfor   
subprocessrun
returncodeOSErrorstderrr   r   rR   r+   )
payloadr9   r:   r;   suffix_sanitizedsafe_home_directoryr   cmd_useraddresexcs
             r   handle_sftp_createrc   D   s   B
!++&78;;z* %56hnYZZ 66"2BO8LMcrR?@@/? 012@(`x  uXJo>?? %%*
 nn[DPUV>>Q,SZZ-=-=-?,@ABB nnLJaz*
 >>Q-cjj.>.>.@-ABCC nngu.ABSW^bjop>>QN3::+;+;+=*>?@@nng(9'=?RSdhos  |A  B>>QN3::+;+;+=*>?@@4h?#H:-BC 
 	
  
		>C@P@PQXQ\Q\]gioQprx@yzX
 	

s   H<H? ?
J 	AJJ J c                *    U R                  SS5      nUR                  S5      (       d  [        S5      e[        R	                  SU5        [        U5      (       d  [        SU S35      e[        R                  " SS	U/S
S
SS9nUR                  S:w  a&  [        SUR                  R                  5        35      e[        R	                  SU5        S
SU S3US.$ ! [         a.  n[        R                  SU5        S[        U5      S.s SnA$ SnAff = f)z-Delete an SFTP user and their home directory.r   r<   r>   %Username must start with 'wolf_sftp_'z"Attempting to delete SFTP user: %sr?    does not existuserdelz-rTFrA   r   zuserdel failed: z!SFTP user %s deleted successfullyrL   z deleted successfullyrM   zSFTP deletion failed: %srQ   N)r&   r)   r$   rV   rW   r   rX   rY   rZ   r[   r\   r   r   rR   rU   )r]   r   ra   rb   s       r   handle_sftp_deleterh      s   
;;z2.""<00DEE5x@8$$uXJo>?? nnix8TX`ef>>Q,SZZ-=-=-?,@ABB4h?#H:-BC 
 	
  
		,c2X
 	

s   CC 
D$#DDDc           
         U R                  SS5      nU R                  S5      nU(       a  U(       d  [        S5      eUR                  S5      (       d  [        S5      e[        R	                  SU5        [        U5      (       d  [        SU S	35      e[        R                  " S
/U SU 3SSSS9nUR                  S:w  a&  [        SUR                  R                  5        35      e[        R	                  SU5        SSU S3US.$ ! [         aW  n[        R                  S[        U5      R                  U R                  SS5      S5      5        S[        U5      S.s SnA$ SnAff = f)z$Reset the password for an SFTP user.r   r<   new_passwordz&username and new_password are requiredr>   re   z.Attempting to reset password for SFTP user: %sr?   rf   rE   r   TFrF   r   rH   z,Password for SFTP user %s reset successfullyzPassword for SFTP user z reset successfullyrM   z0SFTP password reset failed (password hidden): %srP   rQ   N)r&   r$   r)   rV   rW   r   rX   rY   rZ   r[   r\   r   r   rR   rU   r+   )r]   r   rj   ra   rb   s        r   handle_sftp_reset_passwordrk      sj   &
;;z2.{{>2|EFF""<00DEEA8L8$$uXJo>?? nnLJa~.
 >>Q-cjj.>.>.@-ABCC?J0
:MN 
 	
  
		Dc#hFVFVW^WbWbcqsyWz  }C  GD  	EX
 	

s   DD 
E)AE$E)$E))r   rU   returnbool)r/   rU   rl   rU   )r]   dictrl   rn   )
__future__r   r   rS   rX   loggerr   rV   r   r6   rc   rh   rk    r7   r   <module>rr      s;    " 	 	   , FD
N
@(
r7   