
    ip                        d dl mZmZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlZd dlZd dlZd dlmZmZ d dlmZmZmZmZmZ ddlmZmZ ddlmZmZmZ dd	lmZ dd
lm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- erddl.m/Z/ ej`                  jb                  Z2 G d dejf                        Z4 G d dejj                        Z6 G d dejn                        Z8 G d de9      Z:y)    )print_functionunicode_literalsN)ExceptHookArgs)AUTH_FAILEDAUTH_SUCCESSFUL)SFTP_FAILURESFTP_NO_SUCH_FILESFTP_OKSFTP_OP_UNSUPPORTEDSFTP_PERMISSION_DENIED   )ANYWINTYPE_CHECKING)LEELOO_DALLASVFSAuthSrv)bos)
VF_CAREFULDaemonODictPebkacipnormmin_ex	read_utf8relchkrunhooksanitize_fnub64encundotvjoinwunlink)SvcHubc                   P    e Zd Zd ZddZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)SSH_Srvc                    || _         |j                  x| _        }|j                  | _        d| _        || _        |d   | _        | j                  j                  d      r| j                  dd  | _        g }|j                  r|j                  d       |j                  r|j                  d       |j                  s|j                  r|j                  d       dj                  |      | _        y )	N*r   z::ffff:   none	publickeypassword,)hubargsloglog_funcunameaddrip
startswith	sftp_anonappend
sftp_key2usftp_pwjoin_auths)selfr,   r1   r-   zsls        B/home/ubuntu/myenv/lib/python3.12/site-packages/copyparty/sftpd.py__init__zSSH_Srv.__init__4   s    88#	D
	q'77i(ggabkDG>>JJv??JJ{#<<4>>JJz"hhsm    c                 X    | j                   j                  d| j                  ||       y Nzsftp:r,   r.   r2   r:   msgcs      r<   r.   zSSH_Srv.logH       $''+S!4r>   c                     | j                   S N)r9   r:   usernames     r<   get_allowed_authszSSH_Srv.get_allowed_authsK   s    {{r>   c                    | j                   j                  r| j                  d       | j                   j                  }|sy|j	                  d      rt        | j                  |dd  d      }|r|j                  d      s|dz  }|dfS )N
get_banner)NN@r   F
zen-US)r-   sftpvr.   sftp_bannerr3   r   endswith)r:   ts     r<   rL   zSSH_Srv.get_bannerN   ss    99??HH\"II!!<<$((AabE51AQZZ%IA7|r>   c                     | j                   j                  r| j                  d|d|       |dk(  rt        j                  j
                  S t        j                  j                  S )Nzchannel-request: , session)r-   rO   r.   paramikocommonOPEN_SUCCEEDED'OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED)r:   kindchanids      r<   check_channel_requestzSSH_Srv.check_channel_requestZ   sF    99??HH$?@9??111FFFr>   c                 z    	 | j                  |      S #  | j                  dt               d       t        cY S xY wNunhandled exception: r   )_check_auth_noner.   r   r   rH   s     r<   check_auth_nonezSSH_Srv.check_auth_nonea   s8    	((22	HH&(<a@    %:c                 x   | j                   }||j                  k7  s|st        S t        | j                        }| j
                  j                  }||v rK||   t        j                         z
  }|dk  r| j                  d       ||= n| j                  d       t        S d| _	        | j                  d       t        S )Nr   client unbannedclient is bannedr&   zauth-none OK: *)r-   r4   r   r   r2   r,   banstimer.   r0   r   )r:   r0   r-   ipnrf   rts         r<   r`   zSSH_Srv._check_auth_noneh   s    yyDNN"%TWWoxx}}$;cTYY[(BAv*+I+,""
"#r>   c                 |    	 | j                  ||      S #  | j                  dt               d       t        cY S xY wr^   )_check_auth_passwordr.   r   r   )r:   rI   r*   s      r<   check_auth_passwordzSSH_Srv.check_auth_password|   s:    	,,Xx@@	HH&(<a@    %;c                    | j                   }|j                  r|}|j                  dk(  rd}nb|j                  dk(  rSt        j                  |j                  dd            j                         }dt        |d d       j                  d      z   }| j                  d	|d
|       t        | j                        }| j                  j                  }||v rK||   t        j                         z
  }|dk  r| j                  d       ||= n| j                  d       t        S |j                   }	|	r#||	k(  rd| _        | j                  d       t$        S |j&                  st        S |j(                  r	|d|g}
n||g}
|d|}d}| j                  j*                  }|
D ]=  }|j,                  j/                  |j0                  j3                  |      d      }|s;|} n |j4                  r7|dk(  r2|j6                  |j8                  j;                  | j                           }|j<                  rR||j>                  v rD|j>                  |   j;                  | j                        stA        jB                  d|       t        S |rJ|jD                  jF                  j/                  |      s|jD                  jH                  j/                  |      s| j                  jJ                  }|jL                  r|jO                  | j                  |      \  }}|rtA        jB                  d       ||| j                  <   	 || j                  jP                  jR                  j                  |<   | j                  jP                  jR                  xjT                  dz  c_*        t        S t        S || _        | j                  d|       t$        S #  Y t        S xY w)Nr       zutf-8replace%   asciiz	auth-pw: rT   rd   re   r&   zauth-pw OK: *:username [%s] rejected by --iprz client banned: invalid passwordsr   zauth-pw OK: )+r-   rO   
log_badpwdhashlibsha512encodedigestr   decoder.   r   r2   r,   rf   rg   r   r4   r0   r   r7   	usernamesasrviacctgetahhashipuipu_iuipu_nmmapipripr_uloggingwarningvfsareadawritegpwdlimbonkbrokerhttpsrvnban)r:   r0   pwr-   logpwzbrh   rf   ri   anonaltsattemptr~   zsgr   r2   s                    r<   rk   zSSH_Srv._check_auth_password   s   yy::E!#A%^^BIIgy$ABIIKgb"g.55g>>HH%78TWWoxx}}$;cTYY[(BAv*+I+,""~~ETMDJHH_%""||>>$b)*D;D"B'xx}} 	BR 0"5B		 88KK 89E88+::e$((1 A5I""TXX^^//6$((//:M:Me:TAuu66$''73bOO$FG$(DM;?//44R8//4494 ;
U,-s   2A N? ?Oc                 |    	 | j                  ||      S #  | j                  dt               d       t        cY S xY wr^   )_check_auth_publickeyr.   r   r   )r:   rI   keys      r<   check_auth_publickeyzSSH_Srv.check_auth_publickey   s:    	--h<<	HH&(<a@rm   c                    | j                   }|j                  r>|j                         dz   |j                         d d z   }| j	                  d|d|       t        | j                        }| j                  j                  }||v rK||   t        j                         z
  }|dk  r| j	                  d       ||= n| j	                  d       t        S |j                  }|r#||k(  rd| _        | j	                  d	       t        S |j                         d
|j                         }	|j                  j                  |	      |k(  }
|
r^|j                   rR||j"                  v rD|j"                  |   j%                  | j                        st'        j(                  d|       t        S | j                  j*                  }|
rJ|j,                  j.                  j                  |      s?|j,                  j0                  j                  |      s| j	                  d|       t        S || _        | j	                  d|       t        S )Nr+       z
auth-key: rT   r   rd   re   r&   zauth-key OK: * rv   zauth-key REJECTED: zauth-key OK: )r-   rO   get_name
get_base64r.   r   r2   r,   rf   rg   r   r4   r0   r   r6   r   r   r   r   r   r   r~   r   r   r   )r:   r0   r   r-   r   rh   rf   ri   r   r   okr~   s               r<   r   zSSH_Srv._check_auth_publickey   s   yy::#%(8"(==BHH5"56TWWoxx}}$;cTYY[(BAv*+I+,""~~ETMDJHH%&"" \\^S^^-=>__  )U2$((u

2::e$((1 A5I""xx}}$((..,,U3txx7J7J57QHH78
e-.r>   Nr   )__name__
__module____qualname__r=   r.   rJ   rL   r\   ra   r`   rl   rk   r   r    r>   r<   r$   r$   3   s<    $(5
G(EN&r>   r$   c                   ,     e Zd Zd fd	Zd Zd Z xZS )SFTP_FHc                 V    d| _         d | _        d | _        t        t        |   |       y )Nro   )filenamereadfile	writefilesuperr   r=   )r:   flags	__class__s     r<   r=   zSFTP_FH.__init__   s'    gt%e,r>   c                 "   	 | j                   xs | j                  }t        j                  t	        j
                  |j                                     S # t        $ r3}t        j                  j                  |j                        cY d }~S d }~ww xY wrG   )r   r   SATTR	from_statosfstatfilenoOSErrorrV   
SFTPServerconvert_errnoerrno)r:   fexs      r<   statzSFTP_FH.stat  sb    	?/A??288AHHJ#788 	?&&44RXX>>	?s   AA 	B(B	B	Bc                    | j                   st        S 	 t        j                  j	                  | j
                  |       t        S # t        $ r3}t        j                  j                  |j                        cY d }~S d }~ww xY wrG   )
r   r   rV   r   set_file_attrr   r
   r   r   r   )r:   attrr   s      r<   chattrzSFTP_FH.chattr  s`     ~~))	?--dmmTBN 	?&&44RXX>>	?s   /A 	B (A;5B ;B r   )r   r   r   r=   r   r   __classcell__r   s   @r<   r   r      s    -?	?r>   r   c                        e Zd Z fdZddZ	 	 	 	 ddZd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )SFTP_Srvc                    t        t        | 
  |g|i | || _        |j                  | _        |j
                  | _        |j                  | _        | j
                  j                  | _        | j
                  j                  | _        | j                  j                  | _
        | j                  j                  | _        | j                  t        k(  rt        d      | j                  j                  j                   j#                         D cg c]m  \  }}| j                  |j$                  j&                  v sD| j                  |j$                  j(                  v s"| j                  |j$                  j*                  v r|o c}}| _        t/               | _        | j,                  D ]Y  }| j0                  j3                  |       |s!d|v r|j5                  dd      d   nd}| j0                  j3                  |       |r9[ y c c}}w )Nzsend her back/r   r   ro   )r   r   r=   sshr2   r,   r0   r-   r~   rO   vsftpvvvvr   	Exceptionr   all_volsitemsaxsureaduwriteugetvolssetvisaddrsplit)r:   r   akavpvnr   r   s          r<   r=   zSFTP_Srv.__init__  st   h&s5Q5"566GGii
HHMM	XX]]	))""::&O,, ))--00668
BzzRVV\\)zzRVV]]*zzRVV[[(	 
	 5)) 	!BHHLL-0BYRYYsA&q)BR  	!
s   A2Hc                 X    | j                   j                  d| j                  ||       y r@   rA   rB   s      r<   r.   zSFTP_Srv.log1  rE   r>   c           	      ~   |j                  t        j                  d      j                  d      }t        j                  j                  |      \  }}t        |      r!| j                  d|       t        d|d      t        |xs d      }t        ||      }| j                  j                  j                  j                  || j                  ||||      \  }}	|r|j!                         |j"                  d   v r| j                  |j$                  j&                  vr`d|j"                  vrRd|z   }t        ||      }| j                  j                  j                  j                  || j                  ||||      \  }}	|j(                  st+        t,        j.                  d	|d      d
|j"                  v sd|j"                  v r|j1                  |	      }
|j3                  |
      }d}|st+        t,        j4                  d|d      |j6                  | j                     \	  }}}}}}}}}|r|r|r|r|r|r|r |st+        t,        j4                  d|d      d|j"                  v r,|j9                  |	d      st+        t,        j.                  d      t        j                  j;                  |j(                  |	      ||	fS )Nr   zmalicious vpath: %szUnsupported characters in []ro   emb_allwo_up_readme_wo_zno filesystem mounted at [/xdevxvolzPermission denied in [{}]zpermission denied in [/bcasechkTz$file does not exist case-sensitively)rq   r   sepstrippathsplitr   r.   r   r   r    r,   r~   r   r   r0   lowerr   r   r   realpathr   r   ENOENT	canonicalchk_apEPERMuaxscasechkr8   )r:   vpathrwmdrdfnr   remapavnrR   crcwcmcd_s                     r<   v2azSFTP_Srv.v2a4  s"    bffc*005u%B":HH*E2GHHr"b"((--##''tzz1aAFC
bhhy11

"&&,,.bhh."B"bMEhhmm''++E4::q!QJGB{{%,,E(STTRXX288!3c"B))B-C+Aekk5+RSS,/HHTZZ,@)BBAq!Qqqqekk5+RSS!"**S$*?%,,(NOOww||BKK-r366r>   c                    	 | j                  |      S # t        $ r>}|j                  dk(  r| j                  d|       t        cY d }~S t
        cY d }~S d }~w | j                  dt               d       t        cY S xY w)Ni  zfolder 404: r_   r   )_list_folderr   coder.   r	   r   r   r   )r:   r   r   s      r<   list_folderzSFTP_Srv.list_folderc  sg    		 $$T** 	*ww#~T34(())	 HH&(<a@s&    	A?(AA?
AA?(A?c                    | j                   r| j                  d|d       |j                  d      }	 | j                  |d      \  }}}|j-                  || j.                  | j0                  j2                   ddgddggd      \  }
}}|D cg c]  }t&        j)                  |d   |d         ! }}|j5                         D ]W  \  }}|j6                  st9        j:                  |j6                        }|j%                  t&        j)                  ||             Y | j.                  |j<                  j>                  vr=|D cg c]2  }|j@                  jC                  d      d
   j!                  d      r1|4 }}|j+                  d        | j                  d|t#        |      fz         |S # t        $ ry 	 | j                  |d       | j                  d|d       g cY S #  Y nxY w|| j
                  vr| j                  d|d       t        cY S g }t        t        j                               }t        j                  d	d
d
dddd|||f
      }|dz   }| j                  j                  j                  j                         D ]o  }|r|j                  j!                  |      s!|j                  t#        |      d  }	d|	v s|	s@|j%                  t&        j)                  ||j                               q |j+                  d        | j                  d|t#        |      fz         |cY S w xY wc c}w c c}w )Nzls(z):r   T)r   )r   z): [] (write-only)): EPERMA  r        r   c                     | j                   S rG   r  xs    r<   <lambda>z'SFTP_Srv._list_folder.<locals>.<lambda>  s
    1:: r>   )r   zls(%s): vfs-vols; |%d|F)throwr   .c                     | j                   S rG   r  r  s    r<   r  z'SFTP_Srv._list_folder.<locals>.<lambda>  s
    qzz r>   zls(%s): |%d|)"r   r.   r   r  r   r   r   intrg   r   stat_resultr~   r   	all_nodesvaluesr   r3   lenr5   r   r   sortlsr0   r-   
no_scandirr   r   r   r   r   udotr   r   )r:   r   r   r   r   retzivstprefixvnamer  vfs_lsvfs_virtr  r   vn2sts                    r<   r  zSFTP_Srv._list_foldero  s   66HH$()zz#	((44(0KBC6 !eeJJ		$$$E]UDM* $ 
68 >DDuqtad3DD~~' 	9GB<<#,,'BJJurB78		9
 ::RVV[[(!S)9)9#)>r)B)M)Mc)R1SCS)*4S"223
W  	&d<=	488#D23--CTYY[!B..%RD$2r2!NOCCZFiimm--446 D 3 3F ;V/%<u

5??3?BCD HH-H.HH-s3x0@@AJ1	B E TsB   F1 $L72L<7L<1
L4<)G(%L4(G,*.L4DL43L4c                 z    	 | j                  |      S #  | j                  dt               d       t        cY S xY wr^   _statr.   r   r   r:   r   s     r<   r   zSFTP_Srv.stat  6    	 ::d##	 HH&(<a@rb   c                 z    	 | j                  |      S #  | j                  dt               d       t        cY S xY wr^   r)  r+  s     r<   lstatzSFTP_Srv.lstat  r,  rb   c                    |j                  d      }	 | j                  |      \  }}}| j                  |j                  j                  vr_| j                  |j                  j
                  vr=| j                  |j                  j                  vr| j                  d|d       t        S t        j                  |      }| j                  d|d|       t"        j%                  |      S #  || j                  vr| j                  d|d       t        cY S t        t        j                               }t        j                   ddddd	d	d
|||f
      }| j                  d       Y xY w)Nr   zstat(r	  ): z	): ENOENTr
  r  r   r  r  zstat(%s): vfs-vols)r   r  r0   r   r   r   r   r.   r   r   r   r   r	   r  rg   r   r  r   r   )r:   r   r   r   r  r'  r   s          r<   r*  zSFTP_Srv._stat  s   XXc]	+IBA

"&&,,.JJbffmm3JJbffkk1b23--"BHHr2./ r""	+!r34((TYY[!BB4q"b" MNBHH)*s   BC* ),C* *+E&AE&c                 ~    	 | j                  |||      S #  | j                  dt               d       t        cY S xY wr^   )_openr.   r   r   )r:   r   r   r   s       r<   openzSFTP_Srv.open  s:    	 ::dE400	 HH&(<a@s    %<c                 "	   t         r|t        j                  z  }|t        j                  z  rd}d}|t        j                  z  rd}n9d}n6|t        j
                  z  rdx}}|t        j                  z  rd}n	d}nd}d}d}	 | j                  j                  j                  || j                  ||      \  }}t        j                  j                  |j                  |      }	|j                  }
| j                  d	|||fz         |r	 t#        j$                  |	      }t'        j&                         |j(                  z
  }d}|j                  j                  d      }|rt+        | j                  d | j,                  j.                  d||	|dddd
d
dt'        j&                         d       }|j                  d      xs d}|s|j                  d      d
k7  r|sd|}| j                  |d       t         S | j                  d|d|	d       |dk\  r|| j0                  j2                  k  rd}nQ| j0                  j4                  s| j0                  j6                  rd}n"| j                  |j8                  j:                  v }|sd}| j                  ||fz         t         S d|vrt=        | j                  |	t>               tA        |dd       }|)|
j                  dd      }| j                  d||fz         n| j                  d|||fz         	 t        jB                  |	||      }|t        jN                  z  r tF        jH                  jQ                  |	|       	 t        jR                  ||      }tU        |      }|	|_+        |r|nd |_,        |r	||_-        |S d |_-        |S # t        $ r+}d}| j                  ||||||fz         t         cY d }~S d }~ww xY w#  d}d
}Y xY w# tD        $ rO}d}| j                  |||	|||fz  d       tF        jH                  jK                  |jL                        cY d }~S d }~ww xY w# tD        $ rN}d}| j                  |||	||fz  d       tF        jH                  jK                  |jL                        cY d }~S d }~ww xY w) NFTabwbza+bzr+brbz6denied open file [%s], iflag=%s, read=%s, write=%s: %szopen(%s, %x, %s)r   xbuzxbu.sftpro   z7.3.8.7	rejectmsgrcz%upload blocked by xbu server config:    zwriting to [z] => [r   r  z6file already exists and no permission to overwrite: %sr   st_modechmod_fi  z"open(%s, %x): client did not chmodz"open(%s, %x): client set chmod 0%ozAfailed to os.open [%s] -> [%s] with iflag [%s] and chmod [%s]: %rz3failed to os.fdpen [%s] -> [%s] with smode [%s]: %r).r   r   O_BINARYO_WRONLYO_APPENDO_RDWRr~   r   r   r0   r   r8   r   r   r   r.   r   r   r   rg   st_mtimer   r,   up2kr-   ftp_wtno_del	ftp_no_owr   udelr!   r   getattrr3  r   rV   r   r   r   O_CREATr   fdopenr   r   r   r   )r:   r   iflagr   r   wrsmoder   r   r   vfr   rR   r'  tdneed_unlinkr8  hrdo_itchmodfdr   r  s                          r<   r2  zSFTP_Srv._open  s   R[[ E2;;BBr{{"RYYNBr{{"BBE	*iimm''DJJB?GBbkk3/BB 	#r5%&889XXb\YY[2;;."
 ((,,u%CHHHHMMIIK" FF;'-2t)IKMHHQN11HH"b9:RxB$))"2"22!!TYY%8%8 

bffkk1LbU#-- E!"j1i.=FF9e,EHH9RKGHHH9R<NNO	?UE*B 2::--b$7	?		"e$A enqD
 &*
w  	*HAHHQ"eRR001))	*#t  	?SAHHQ"b%33Q7&&44RXX>>	?  	?EAHHQ"b%,,a0&&44RXX>>	?si   A+N 8O O P7 	O" OOOO	P4%AP/)P4/P47	R AR	R	Rc                 z    	 | j                  |      S #  | j                  dt               d       t        cY S xY wr^   )_remover.   r   r   r+  s     r<   removezSFTP_Srv.removeC  s6    	 <<%%	 HH&(<a@rb   c                 P   | j                  d|d       | j                  j                  r| j                  d       t        S 	 | j                  j
                  j                  | j                  | j                  |gg dd       | j                  d|d       t        S # t        $ r,}d}| j                  |||fz         t        |      j                  d      rt        cY d }~S 	 | j                  |      \  }}}| j                  |j                  j                   vrd| j                  |j                  j"                  vrB| j                  |j                  j$                  vr | j                  d|d       t        cY d }~S t&        j(                  j+                  |      s| j                  d	       t        cY d }~S n#  Y nxY wt        cY d }~S d }~wt,        $ rJ}| j                  d
|d|       t.        j0                  j3                  |j4                        cY d }~S d }~ww xY w)Nzrm()z/The delete feature is disabled in server configFz): okzdenied delete [%s]: %szfile not foundr	  z' `- file didn't exist; returning ENOENTzfailed: rm(r0  )r.   r-   rE  r   r,   rC  	handle_rmr0   r2   r
   r   strr3   r	   r  r   r   r   r   r   r   existsr   rV   r   r   r   )r:   r   r   rR   r   r   r  s          r<   rV  zSFTP_Srv._removeJ  s   R!"99HHFG))	?HHMM##DJJ"r5%PHHR)*N 	*(AHHQ"b\"2w!!"23(( HHRL	BJJbffll2

"&&--7

"&&++5HH4511xxr*HHFG,, +)) 	?HHR45&&44RXX>>	?sb   AB 
H%(7GH%&BF=;H%5F=6H%<G=G?
G	H%H%?H H% H%c                 |    	 | j                  ||      S #  | j                  dt               d       t        cY S xY wr^   )_renamer.   r   r   )r:   oldpathnewpaths      r<   renamezSFTP_Srv.renamel  s8    	 <<11	 HH&(<a@rm   c           	      ^   | j                  d|d|d       | j                  j                  r| j                  d       |j                  d      }|j                  d      }	 | j                  j
                  j                  d| j                  | j                  ||       t        S # t        $ r)}d}| j                  ||||fz         t        cY d }~S d }~wt        $ rM}| j                  d|d|d|       t        j                  j                  |j                         cY d }~S d }~ww xY w)	Nzmv(rT   rY  z4The rename/move feature is disabled in server configr   ro   zdenied rename [%s] to [%s]: %sr0  )r.   r-   no_mvr   r,   rC  	handle_mvr0   r2   r
   r   r   r   rV   r   r   r   )r:   svpdvpr   rR   s        r<   r^  zSFTP_Srv._renames  s    c*+99??HHKLiiniin		?HHMM##B

DGGS#FN 	*0AHHQ#sB'()) 	?HHc267&&44RXX>>	?s2   #AB& &	D,/CD,D,AD'!D,'D,c                 |    	 | j                  ||      S #  | j                  dt               d       t        cY S xY wr^   )_mkdirr.   r   r   r:   r   r   s      r<   mkdirzSFTP_Srv.mkdir  s8    	 ;;tT**	 HH&(<a@rm   c                    | j                  d|d       	 | j                  j                  j                  || j                  dd      \  }}t
        j                  j                  |j                  |      }t        j                  ||j                         | t        j                  j                  ||       t        S # t         $ r(}d}| j                  |||fz         t"        cY d }~S d }~wt$        $ rJ}| j                  d|d|       t        j                  j'                  |j(                        cY d }~S d }~ww xY w)Nzmkdir(rY  FT)rN  zdenied mkdir [%s]: %sr0  )r.   r~   r   r   r0   r   r   r8   r   r   makedirsr   rV   r   r   r
   r   r   r   r   r   r:   r   r   r   r   r   r   rR   s           r<   rh  zSFTP_Srv._mkdir  s    $%	?iimm''DJJtDGBbkk3/BLL)##11"d;N 	*'AHHQ"b\")) 	?HHB/0&&44RXX>>	?s0   B'B? ?	EC+%E+E7?D<6E<Ec                 z    	 | j                  |      S #  | j                  dt               d       t        cY S xY wr^   )_rmdirr.   r   r   r+  s     r<   rmdirzSFTP_Srv.rmdir  s6    	 ;;t$$	 HH&(<a@rb   c                 0   | j                  d|d       	 | j                  j                  j                  || j                  ddd      \  }}t
        j                  j                  |j                  |      }t        j                  |       t        S # t        $ r(}d}| j                  |||fz         t        cY d }~S d }~wt        $ rJ}| j                  d|d|       t        j                   j#                  |j$                        cY d }~S d }~ww xY w)Nzrmdir(rY  FTwill_delzdenied rmdir [%s]: %sr0  )r.   r~   r   r   r0   r   r   r8   r   r   rp  r
   r   r   r   rV   r   r   r   )r:   r   r   r   r   r   rR   s          r<   ro  zSFTP_Srv._rmdir  s    $%	?iimm''DJJut'TGBbkk3/BIIbMN 	*'AHHQ"b\")) 	?HHB/0&&44RXX>>	?s0   A;B 	DB?9D?D?D
DDc                 |    	 | j                  ||      S #  | j                  dt               d       t        cY S xY wr^   )_chattrr.   r   r   ri  s      r<   r   zSFTP_Srv.chattr  s8    	 <<d++	 HH&(<a@rm   c                 L   | j                  d|d|d       	 | j                  j                  j                  || j                  ddd      \  }}t
        j                  j                  |j                  |      }t        j                  j                  ||       t        S # t        $ r(}d}| j                  |||fz         t        cY d }~S d }~wt        $ rJ}| j                  d|d|       t        j                  j!                  |j"                        cY d }~S d }~ww xY w)	Nzchattr(rT   rY  FTrr  zdenied chattr [%s]: %sr0  )r.   r~   r   r   r0   r   r   r8   r   rV   r   r   r
   r   r   r   r   r   rm  s           r<   ru  zSFTP_Srv._chattr  s    R./	?iimm''DJJtd'SGBbkk3/B--b$7N 	*(AHHQ"b\")) 	?HHR01&&44RXX>>	?s0   BB! !	D#*CD#D#?DD#D#c                     t         S rG   )r   )r:   target_pathr   s      r<   symlinkzSFTP_Srv.symlink  s    ""r>   c                     |S rG   r   r+  s     r<   readlinkzSFTP_Srv.readlink  s    r>   c                     dt        |      S )Nr   )r   r+  s     r<   canonicalizezSFTP_Srv.canonicalize  s    d%%r>   r   )FFFF)r   r   r   r=   r.   r  r  r  r   r.  r*  r3  r2  rW  rV  ra  r^  rj  rh  rp  ro  r   ru  ry  r{  r}  r   r   s   @r<   r   r     s    !85 -7^
 1f  #, tl  ?D ?" ?" ? ?#&r>   r   c                   >    e Zd Zd Zd
dZd Zd Zd Zd Zd Z	d Z
y	)Sftpdc           	         || _         |j                  x| _        }|j                  | _        g | _        g | _        i | _        |j                  }d|v r|j                  d       |D cg c]  }|j                  d      r| }}|j                  r|D cg c]	  }d|vs| }}|s| j                  dd       y g | _        ddi fd	d
ddifddddifddi ff}|D ]  \  }}}|j                  d|j                         d}		 t        t        |      j!                  |	      }
| j                  j                  |
       |j&                  so| j                  d|
        t+        t-        j.                  |            }|D ]  }| j1                  |        | j                  d| j
                  d|j2                         y c c}w c c}w # t"        $ r}	 t        t        |      j$                  }nC# t"        $ r7}|j&                  s|dvr| j                  d|d|d       Y d }~Y d }~Qd }~ww xY w| j                  d|	d|        |di |}
|
j)                  |	       t        t        |      j!                  |	      }
Y d }~gd }~ww xY w)N::0.0.0.0)zunix:zfd:ru   z1cannot start sftp-server; no compatible IPs in -ir   ed25519
Ed25519KeyecdsaECDSAKeybitsi  rsaRSAKeyi   dsaDSSKeyz
/ssh_host__key)r  r  zcannot generate z
 hostkey: r;  zgenerating hostkey [z	] due to zloaded hostkey zlistening @ z port r   )r,   r-   r.   r/   srvboundsessionssftp_ir5   r3   sftp4hostkeys
sftp_hostkr   rH  rV   from_private_key_filer   generaterO   write_private_key_filelistr   fromkeys_bindsftp)r:   r,   r-   ipsr  hostkeytypesfnameanameoptsfpathpkeyr   genfunex2r2   s                  r<   r=   zSftpd.__init__  sX   88#	D
kk3;JJy!DQQ\\2B%CqDD::!2S\12C2HHH!Lb)j63-0Hvtn-Hb!	
 #/ 	8E5$,0OOU[[]KEMx/EEeL MM  &zz67'	8* 5>>#&' 	BJJrN	 	TZZCDU E 3"  M$Xu5>>F  zzU2D%D UC!PRSTH rJK~~++E2x/EEeLMsU   &F>=F>	GG?G	J
G-,J-	H-6(H(J(H--AJJ
c                 >    | j                   j                  d||       y )Nr  )r,   r.   rB   s      r<   r.   z	Sftpd.log  s    VS!$r>   c           	      J   | j                   j                  }	 d|v rt        j                  nt        j                  }t        j                  |t        j
                        }t        r| j                   j                  r/|j                  t        j                  t        j                  d       |j                  t        j                  t        j                  d       |j                  d       	 |j                  t        j                  t        j                  d       t!        | j                   dd      r/|j                  t        j"                  t        j$                  d       |j'                  ||f       |j)                  d       | j*                  j-                  |       | j.                  j-                  |       y #  Y xY w# t0        $ rV}|dk(  r,d| j.                  v r	 j3                          n#  Y nxY wY d }~y | j5                  d	|d
|d|d       Y d }~y d }~ww xY w)Nru   r   r   Ffreebind
   r  r  zcould not listen on (r+   r0  r;  )r-   r  socketAF_INET6AF_INETSOCK_STREAMr   	reuseaddr
setsockopt
SOL_SOCKETSO_REUSEADDRIPPROTO_TCPTCP_NODELAY
settimeoutIPPROTO_IPV6IPV6_V6ONLYrH  SOL_IPIP_FREEBINDbindlistenr  r5   r  r   closer.   )r:   r2   portipvr  r   s         r<   r  zSftpd._bind  s   yy~~	L%(BY&//FNNC--V%7%78CTYY00v00&2E2EqINN6--v/A/A1ENN1v22F4F4FN tyy*e4v}}f.@.@!DHHb$Z JJrNHHOOC JJb!  	LY44::#5IIKHH"dBGKK	LsO   CG ,/F< B G <G >G 	H"H G10H1G53H=HH"c                     |j                         \  }}| j                  |d       d|d   }| j                  ||       y )Nz is connectingzsftp-r   )acceptr.   _accept2)r:   r  clir1   r   s        r<   _acceptzSftpd._accept*  s:    JJL	Tt-.q'#c4 r>   c                    t        j                  |      }| j                  D ]  }|j                  |        |j	                  dt         j
                  t               t        | j                  |      }	 |j                  |       |j                         }|&| j                  |dd       |j                          y |||f| j                  |<   y # t        $ r1}| j                  |d|d       |j                          Y d }~y d }~ww xY w)Nr  )serverz! could not establish connection: r;  z did not open an sftp channel)rV   	Transportr  add_server_keyset_subsystem_handlerr   r   r$   r,   start_serverr   r.   r  r  r  )r:   r  r1   trahkeypsrvr   chans           r<   r  zSftpd._accept22  s      %MM 	%Dt$	%!!&(*=*=xHtxx&	D) zz|<HH$@!DIIK#S$/d  	HHbI1MIIK	s   4C 	D'DDc                 .   t        j                  d      }|j                  | j                  j                  rt         j
                  nt         j                         | j                  j                  r| j                  }n| j                  }t        |d       y )Nzparamiko.transportsftpd)r   	getLoggersetLevelr-   r   DEBUGINFOno_poll_run_select	_run_pollr   )r:   lgrfuns      r<   runz	Sftpd.runI  s`     45dii&6&6W]]GLLI99""C..CsGr>   c                     | j                   j                  sVt        j                  | j                  g g d      \  }}}|D ]  }| j	                  |        | j                   j                  sUy y )N   )r,   stoppingselectr  r  )r:   rxr  scks       r<   r  zSftpd._run_selectS  sW    ((##}}TXXr2s;HB1 "S!" ((##r>   c                    i }t        j                         }| j                  D ]7  }|j                         }|||<   |j	                  |t         j
                         9 | j                  j                  sm|j                  d      }|D cg c]!  }|d   t         j
                  z  s||d      # }}|D ]  }| j                  |        | j                  j                  sly y c c}w )Ni  r   r   )	r  pollr  r   registerPOLLINr,   r  r  )r:   fd2sckr  r  rT  prr  r  s           r<   r  zSftpd._run_pollY  s    {{}88 	-CBF2JMM"fmm,	- ((##:&B(*C1adV]].B&1,CBC "S!" ((##Cs   C!$
C!Nr   )r   r   r   r=   r.   r  r  r  r  r  r  r   r>   r<   r  r    s-    6Ep%L8!0.""r>   r  );
__future__r   r   r   rx   r   r   r  r  rg   	threadingr   rV   paramiko.commonparamiko.sftp_attrr   r   paramiko.sftpr   r	   r
   r   r   r=   r   r   authsrvr   r   r   r   utilr   r   r   r   r   r   r   r   r   r   r   r   r    r!   svchubr"   	sftp_attrSFTPAttributesr   ServerInterfacer$   
SFTPHandler   SFTPServerInterfacer   objectr  r   r>   r<   <module>r     s    7    	    $    8  , 0 0    " ))Dh&& DN?h!! ?4{&x++ {&|R"F R"r>   