
    Ii$L                     b   S 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SK	J
r
JrJrJrJrJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSK	JrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<J=r=J>r>  \\S.r? " S S\
\5      r@SSKAJBrB  g)z
Server-mode SFTP support.
    N)md5sha1)util)BaseSFTPMessageSFTP_FAILURESFTP_PERMISSION_DENIEDSFTP_NO_SUCH_FILEint64)SFTPServerInterface)SFTPAttributes)DEBUG)SubsystemHandler)b)%
CMD_HANDLE	SFTP_DESC
CMD_STATUSSFTP_EOFCMD_NAMESFTP_BAD_MESSAGECMD_EXTENDED_REPLYSFTP_FLAG_READSFTP_FLAG_WRITESFTP_FLAG_APPENDSFTP_FLAG_CREATESFTP_FLAG_TRUNCSFTP_FLAG_EXCL	CMD_NAMESCMD_OPEN	CMD_CLOSESFTP_OKCMD_READCMD_DATA	CMD_WRITE
CMD_REMOVE
CMD_RENAME	CMD_MKDIR	CMD_RMDIRCMD_OPENDIRCMD_READDIRCMD_STAT	CMD_ATTRS	CMD_LSTAT	CMD_FSTATCMD_SETSTATCMD_FSETSTATCMD_READLINKCMD_SYMLINKCMD_REALPATHCMD_EXTENDEDSFTP_OP_UNSUPPORTED)r   r   c                      ^  \ rS rSrSr\4S jrU 4S jrS rU 4S jr	\
S 5       r\
S 5       rS	 rSS
 jrSS jrS rS rS rS rS rSrU =r$ )
SFTPServerX   z
Server-side SFTP subsystem support.  Since this is a `.SubsystemHandler`,
it can be (and is meant to be) set as the handler for ``"sftp"`` requests.
Use `.Transport.set_subsystem_handler` to activate this class.
c                 L   [         R                  " U 5        [        R                  " XX#5        UR                  5       n[        R
                  " UR                  5       S-   5      U l        UR                  5       U l	        SU l
        0 U l        0 U l        U" U/UQ70 UD6U l        g)a-  
The constructor for SFTPServer is meant to be called from within the
`.Transport` as a subsystem handler.  ``server`` and any additional
parameters or keyword parameters are passed from the original call to
`.Transport.set_subsystem_handler`.

:param .Channel channel: channel passed from the `.Transport`.
:param str name: name of the requested subsystem.
:param .ServerInterface server:
    the server object associated with this channel and subsystem
:param sftp_si:
    a subclass of `.SFTPServerInterface` to use for handling individual
    requests.
z.sftp   N)r   __init__r   get_transportr   
get_loggerget_log_channelloggerget_hexdumpultra_debugnext_handle
file_tablefolder_tableserver)selfchannelnamerE   sftp_siargskwargs	transports           :/venv/lib/python3.13/site-packages/paramiko/sftp_server.pyr;   SFTPServer.__init___   s    . 	$!!$>))+	ooi&?&?&AG&KL$002f6t6v6    c                   > [        [        U5      [        5      (       a;  U H4  n[        TU ]  USU R
                  R                  5       -   S-   U-   5        M6     g [        TU ]  USU R
                  R                  5       -   S-   U-   5        g )Nz[chan z] )
issubclasstypelistsuper_logsockget_name)rF   levelmsgm	__class__s       rM   rU   SFTPServer._log   st    d3i&&UHtyy/A/A/C$Cd$JQ$NO  GL499+=+=+? ?$ F LMrO   c                 B   X0l         U R                  [        SR                  U5      5        U R	                  5         U R
                  R                  5           U R                  5       u  pE[        U5      nUR                  5       n U R                  XHU5        MC  ! [         a    U R                  [        S5         g [         aU  nU R                  [        S[        U5      -   5        U R                  [        [        R                  " 5       5         S nAg S nAff = f! [         aw  nU R                  [        S[        U5      -   5        U R                  [        [        R                  " 5       5         U R!                  U["        5         S nAN!     S nAN= fS nAff = f)Nz#Started sftp server on channel {!r}zEOF -- end of sessionzException on channel: z Exception in server processing: )rV   rU   r   format_send_server_versionrE   session_started_read_packetEOFError	Exceptionstrr   
tb_stringsr   get_int_process_send_statusr   )	rF   rH   rL   rG   tdataerY   request_numbers	            rM   start_subsystemSFTPServer.start_subsystem   s>   			%>EEgNO!!###%++- $-C [[]N	a5   		%!89 		%!9CF!BC		%!23  		%!Cc!f!LM		%!23%%nlCCsP   B D  D<	DADD
F'AF3FFFFFc                 6  > U R                   R                  5         [        TU ]  5         U R                  R                  5        H  nUR                  5         M     U R                  R                  5        H  nUR                  5         M     0 U l        0 U l        g N)rE   session_endedrT   finish_subsystemrC   valuescloserD   )rF   fr[   s     rM   rr   SFTPServer.finish_subsystem   sq    !!# " '')AGGI *""))+AGGI ,rO   c                     U [         R                  :X  a  [        $ U [         R                  :X  d  U [         R                  :X  a  [
        $ [        $ )aE  
Convert an errno value (as from an ``OSError`` or ``IOError``) into a
standard SFTP result code.  This is a convenience function for trapping
exceptions in server code and returning an appropriate result.

:param int e: an errno code, as from ``OSError.errno``.
:return: an `int` SFTP error code like ``SFTP_NO_SUCH_FILE``.
)errnoEACCESr	   ENOENTENOTDIRr
   r   )rk   s    rM   convert_errnoSFTPServer.convert_errno   s9     ))5<<Q%--%7$$rO   c                    [         R                  S:w  a  UR                  UR                  -  (       a   [        R
                  " XR                  5        UR                  UR                  -  (       a+  [        R                  " XR                  UR                  5        UR                  UR                  -  (       a,  [        R                  " XR                  UR                  45        UR                  UR                  -  (       a1  [!        U S5       nUR#                  UR$                  5        SSS5        gg! , (       d  f       g= f)a  
Change a file's attributes on the local filesystem.  The contents of
``attr`` are used to change the permissions, owner, group ownership,
and/or modification & access time of the file, depending on which
attributes are present in ``attr``.

This is meant to be a handy helper function for translating SFTP file
requests into local file operations.

:param str filename:
    name of the file to alter (should usually be an absolute path).
:param .SFTPAttributes attr: attributes to change.
win32zw+N)sysplatform_flagsFLAG_PERMISSIONSoschmodst_modeFLAG_UIDGIDchownst_uidst_gidFLAG_AMTIMEutimest_atimest_mtime	FLAG_SIZEopentruncatest_size)filenameattrru   s      rM   set_file_attrSFTPServer.set_file_attr   s     <<7"{{T222<<0{{T---;;<;;)))HHXt}}=>;;'h%

4<<( &% (%%s   D66
Ec           	         [        5       nUR                  U5        U H  n[        U[        5      (       a  UR	                  U5        M+  [        U[
        5      (       a  UR                  U5        MS  [        U[        [        45      (       a  UR                  U5        M  [        U5      [        L a  UR                  U5        M  [        SR                  U[        U5      5      5      e   U R                  X$5        g )Nzunknown type for {!r} type {!r})r   add_int
isinstancer   	add_int64intrd   bytes
add_stringrR   r   _packrc   r^   _send_packet)rF   rl   ri   rJ   rY   items         rM   	_responseSFTPServer._response   s    iN#D$&&d#D#&&D!D3,//t$d~-

35<<T4:N   	!!rO   c                    [        [        U5      [        5      (       d  U R                  X5        g UR	                  [        SR                  U R                  5      5      5        U =R                  S-  sl        U(       a  X R                  UR                  5       '   OX R                  UR                  5       '   U R                  U[        UR                  5       5        g )Nzhx{:d}r:   )rQ   rR   
SFTPHandlerh   	_set_namer   r^   rB   rD   	_get_namerC   r   r   )rF   rl   handlefolders       rM   _send_handle_response SFTPServer._send_handle_response   s    $v,
33n58??4+;+;<=>A4:f..0128OOF,,./~z63C3C3EFrO   c                 r    Uc
   [         U   nU R                  U[        X#S5        g ! [         a    Sn N'f = f)NUnknown )r   
IndexErrorr   r   )rF   rl   codedescs       rM   rh   SFTPServer._send_status   s?    <! 
 	~z4rB	  ! !s   	' 66c                     U R                   R                  U5      n[        [        U5      [        5      (       a.  [        5       nUR                  U5        U R                  XS5        g U R                  X5        g )NT)	rE   list_folderrQ   rR   rS   r   
_set_filesr   rh   )rF   rl   pathrespr   s        rM   _open_folderSFTPServer._open_folder
  s]    {{&&t,d4j$''\Fd#&&~tD./rO   c                    UR                  5       n[        U5      S:X  a  U R                  U[        5        g [	        5       nUR                  U5        UR                  [        U5      5        U H@  nUR                  UR                  5        UR                  U5        UR                  U5        MB     U R                  [        U5        g )Nr   )_get_next_fileslenrh   r   r   r   r   r   r   r   r   )rF   rl   r   flistrY   r   s         rM   _read_folderSFTPServer._read_folder  s    &&(u:?nh7iN#CJDNN4==)NN4 JJsO  	(C(rO   c                    UR                  5       nUR                  5       nUR                  5       nUR                  5       nUR                  5       nX0R                  ;  a  U R                  U[        S5        g U R                  U   nU H  n	U	[        ;   d  M  U	n
[        U	   n  O   U R                  U[        S5        g US:X  aP  UR                  5       n[        [        U5      [        5      (       d  U R                  XS5        g UR                  U-
  nUS:X  a  UnUS:  a  U R                  U[        S5        g [        5       nUnXU-   :  a  [        XuU-   U-
  5      n[        US5      nSnU" 5       nUU:  ag  UR!                  UU5      n[#        U[        5      (       d  U R                  UUS5        g UR%                  U5        U['        U5      -  nUU-  nUU:  a  Mg  UUR)                  5       -  nXU-   :  a  M  [+        5       nUR-                  U5        UR/                  S	5        UR/                  U
5        UR1                  U5        U R3                  [4        U5        g )
NInvalid handlezNo supported hash types foundr   zUnable to stat file   zBlock size too smalli   zUnable to hash file
check-file)
get_binaryget_list	get_int64rf   rC   rh   r   _hash_classr   statrQ   rR   r   r   r   minreadr   updater   digestr   r   r   	add_bytesr   r   )rF   rl   rY   r   alg_liststartlength
block_sizeru   xalgnamealgstsum_outoffsetblocklenchunklencounthash_objrj   s                       rM   _check_fileSFTPServer._check_file#  s;   
 !<<>[[]
( 02B OOF#AK!!n	  .M Q;Bd2h77!!.6KLZZ%'F?J.D 'v~%:v~'>?H8U+HEuH("vvfh/!$..%%&.C %T"% (" x((G! v~%$ iN#|$wg,c2rO   c                    U[         -  (       a  U[        -  (       a  [        R                  nO/U[        -  (       a  [        R                  nO[        R
                  nU[        -  (       a  U[        R                  -  nU[        -  (       a  U[        R                  -  nU[        -  (       a  U[        R                  -  nU[        -  (       a  U[        R                  -  nU$ )z;convert SFTP-style open() flags to Python's os.open() flags)r   r   r   O_RDWRO_WRONLYO_RDONLYr   O_APPENDr   O_CREATr   O_TRUNCr   O_EXCL)rF   pflagsflagss      rM   _convert_pflagsSFTPServer._convert_pflagsf  s    ^#&?*BIIEo%KKEKKE$$R[[ E$$RZZEO#RZZEN"RYYErO   c           	         U R                  [        SR                  [        U   5      5        U[        :X  aq  UR                  5       nU R                  UR                  5       5      n[        R                  " U5      nU R                  X R                  R                  XEU5      5        g U[        :X  a  UR                  5       nXpR                  ;   a$  U R                  U	 U R!                  U["        5        g XpR$                  ;   aA  U R$                  U   R'                  5         U R$                  U	 U R!                  U["        5        g U R!                  U[(        S5        g U[*        :X  a  UR                  5       nUR-                  5       nUR                  5       n	XpR$                  ;  a  U R!                  U[(        S5        g U R$                  U   R/                  X5      n
[1        U
[2        [4        45      (       a>  [7        U
5      S:X  a  U R!                  U[8        5        g U R;                  U[<        U
5        g U R!                  X*5        g U[>        :X  a  UR                  5       nUR-                  5       nUR                  5       n
XpR$                  ;  a  U R!                  U[(        S5        g U R!                  X R$                  U   RA                  X5      5        g U[B        :X  a;  UR                  5       nU R!                  X R                  RE                  U5      5        g U[F        :X  aK  UR                  5       nUR                  5       nU R!                  X R                  RI                  X5      5        g U[J        :X  aQ  UR                  5       n[        R                  " U5      nU R!                  X R                  RM                  XF5      5        g U[N        :X  a;  UR                  5       nU R!                  X R                  RQ                  U5      5        g U[R        :X  a"  UR                  5       nU RU                  X$5        g U[V        :X  aX  UR                  5       nXpR                  ;  a  U R!                  U[(        S5        g U R                  U   nU RY                  X-5        g U[Z        :X  as  UR                  5       nU R                  R]                  U5      n[_        [a        U5      [        5      (       a  U R;                  U[b        U5        g U R!                  X.5        g U[d        :X  as  UR                  5       nU R                  Rg                  U5      n[_        [a        U5      [        5      (       a  U R;                  U[b        U5        g U R!                  X.5        g U[h        :X  a  UR                  5       nXpR$                  ;  a  U R!                  U[(        S5        g U R$                  U   R]                  5       n[_        [a        U5      [        5      (       a  U R;                  U[b        U5        g U R!                  X.5        g U[j        :X  aQ  UR                  5       n[        R                  " U5      nU R!                  X R                  Rm                  XF5      5        g U[n        :X  a{  UR                  5       n[        R                  " U5      nXpR$                  ;  a  U R;                  U[(        S5        g U R!                  X R$                  U   Rm                  U5      5        g U[p        :X  a{  UR                  5       nU R                  Rs                  U5      n[1        U[2        [4        45      (       a#  U R;                  U[t        SUS[        5       5        g U R!                  X.5        g U[v        :X  aK  UR                  5       nUR                  5       nU R!                  X R                  Ry                  X5      5        g U[z        :X  aN  UR                  5       nU R                  R}                  U5      nU R;                  U[t        SUS[        5       5        g U[~        :X  a  UR                  5       nUS:X  a  U R                  X#5        g US:X  aK  UR                  5       nUR                  5       nU R!                  X R                  R                  X5      5        g U R!                  U[        5        g U R!                  U[        5        g )NzRequest: {}r   r   r:   r   r   zposix-rename@openssh.com)CrU   r   r^   r   r   get_textr   rf   r   	_from_msgr   rE   r   r    r   rD   rh   r!   rC   rt   r   r"   r   r   r   r   rd   r   r   r   r#   r$   writer%   remover&   renamer'   mkdirr(   rmdirr)   r   r*   r   r+   r   rQ   rR   r,   r-   lstatr.   r/   chattrr0   r1   readlinkr   r2   symlinkr3   canonicalizer4   r   posix_renamer5   )rF   ri   rl   rY   r   r   r   r   r   r   rj   oldpathnewpathr   r   target_pathrpathtags                     rM   rg   SFTPServer._processx  s   		%--il;<=<<>D((7E!++C0D&& 0 0d C )^^^%F***%%f-!!.':('--/OOF+!!.': 02B (]^^%F]]_F[[]F__,!!"$46F ??6*//?D$--t9>%%nh?NN>8TB!!.7)^^^%F]]_F>>#D__,!!"$46F  7 = =f K *_<<>Dnkk.@.@.FG*_llnGllnG 2 27 D )^<<>D!++C0Dnkk.?.?.KL)^<<>Dnkk.?.?.EF+<<>Dn3+^^%F...!!"$46F &&v.Fn5(]<<>D;;##D)D$t*n55~y$?!!.7)^<<>D;;$$T*D$t*n55~y$?!!.7)^^^%F__,!!"$46F ??6*//1D$t*n55~y$?!!.7+<<>D!++C0Dnkk.@.@.LM,^^%F!++C0D__,"$46F  7 > >t D ,<<>D;;''-D$--"Har>;K !!.7+ ,,.K<<>D 3 3K F ,<<>DKK,,T2ENN!UB8H ,,,.Cl"  522,,.,,.!!"KK$<$<W$N !!.2EFn.ABrO   )rC   rD   r?   rB   rE   rV   rA   )Frp   )__name__
__module____qualname____firstlineno____doc__r   r;   rU   rm   rr   staticmethodr|   r   r   r   rh   r   r   r   r   rg   __static_attributes____classcell__)r[   s   @rM   r7   r7   X   s     $ 7DN8
    $ ) )8"&GC	0)A3F$^C ^CrO   r7   )r   )Cr  r   rx   r   hashlibr   r   paramikor   paramiko.sftpr   r   r   r	   r
   r   paramiko.sftp_sir   paramiko.sftp_attrr   paramiko.commonr   paramiko.serverr   paramiko.utilr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r   r7   paramiko.sftp_handler    rO   rM   <module>r     s   & 
  
    1 - ! , & & & & & & & & & &P C(~C+ ~CB ,rO   