
    oh$L                     b   d 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 ddl	m
Z
mZmZmZmZmZ ddlmZ ddlmZ ddlmZ dd	l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'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> eedZ? G d de
e      Z@ddlAmBZB y)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                        e Zd ZdZefdZ fdZd Z fdZe	d        Z
e	d        Zd Zdd	Zdd
Zd Zd Zd Zd Zd Z xZS )
SFTPServerz
    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                 J   t        j                  |        t        j                  | |||       |j                         }t	        j
                  |j                         dz         | _        |j                         | _	        d| _
        i | _        i | _         ||g|i || _        y)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namerD   sftp_siargskwargs	transports           f/var/www/pru.catia.catastroantioquia-mas.com/tasa/lib/python3.12/site-packages/paramiko/sftp_server.pyr:   zSFTPServer.__init___   s    . 	$!!$v>))+	ooi&?&?&AG&KL$002f6t6v6    c                    t        t        |      t              r9|D ]3  }t        |   |d| j
                  j                         z   dz   |z          5 y t        |   |d| j
                  j                         z   dz   |z          y )Nz[chan z] )
issubclasstypelistsuper_logsockget_name)rE   levelmsgm	__class__s       rL   rS   zSFTPServer._log   sx    d3i& PUHtyy/A/A/C$Cd$JQ$NOP GL499+=+=+? ?$ F LMrM   c                 6   || _         | j                  t        dj                  |             | j	                          | j
                  j                          	 	 | j                         \  }}t        |      }|j                         }	 | j                  |||       D# t        $ r | j                  t        d       Y y t        $ rT}| j                  t        dt        |      z          | j                  t        t        j                                Y d }~y d }~ww xY w# t        $ rs}| j                  t        dt        |      z          | j                  t        t        j                                	 | j!                  |t"               n#  Y nxY wY d }~d }~ww xY w)Nz#Started sftp server on channel {!r}zEOF -- end of sessionzException on channel: z Exception in server processing: )rT   rS   r   format_send_server_versionrD   session_started_read_packetEOFError	Exceptionstrr   
tb_stringsr   get_int_process_send_statusr   )	rE   rG   rK   rF   tdataerW   request_numbers	            rL   start_subsystemzSFTPServer.start_subsystem   sB   			%>EEgNO!!###%++-4 $-C [[]N	a5   		%!89 		%!9CF!BC		%!23  		%!Cc!f!LM		%!23%%nlCsP   B D D=DA
DD	F%A
F0FFF	FFc                 .   | j                   j                          t        |           | j                  j                         D ]  }|j                           | j                  j                         D ]  }|j                           i | _        i | _        y N)rD   session_endedrR   finish_subsystemrB   valuescloserC   )rE   frY   s     rL   rn   zSFTPServer.finish_subsystem   s{    !!# " '') 	AGGI	""))+ 	AGGI	rM   c                     | t         j                  k(  rt        S | t         j                  k(  s| t         j                  k(  rt
        S t        S )au  
        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   )rh   s    rL   convert_errnozSFTPServer.convert_errno   s9     ))5<<Q%--%7$$rM   c                 Z   t         j                  dk7  r}|j                  |j                  z  r t	        j
                  | |j                         |j                  |j                  z  r+t	        j                  | |j                  |j                         |j                  |j                  z  r,t	        j                  | |j                  |j                  f       |j                  |j                  z  r1t!        | d      5 }|j#                  |j$                         ddd       yy# 1 sw Y   yxY w)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attrrq   s      rL   set_file_attrzSFTPServer.set_file_attr   s     <<7"{{T2224<<0{{T---4;;<;;)))HHXt}}=>;;'h% )

4<<() ) () )s   ;D!!D*c           	         t               }|j                  |       |D ]  }t        |t              r|j	                  |       %t        |t
              r|j                  |       Gt        |t        t        f      r|j                  |       ot        |      t        u r|j                  |       t        dj                  |t        |                   | j                  ||       y )Nzunknown type for {!r} type {!r})r   add_int
isinstancer   	add_int64intra   bytes
add_stringrP   r   _packr`   r[   _send_packet)rE   ri   rf   rI   rW   items         rL   	_responsezSFTPServer._response   s    iN# 	D$&d#D#&D!D3,/t$d~-

35<<T4:N 	 	!S!rM   c                    t        t        |      t              s| j                  ||       y |j	                  t        dj                  | j                                     | xj                  dz  c_        |r|| j                  |j                         <   n|| j                  |j                         <   | j                  |t        |j                                y )Nzhx{:d}r9   )rO   rP   
SFTPHandlere   	_set_namer   r[   rA   rC   	_get_namerB   r   r   )rE   ri   handlefolders       rL   _send_handle_responsez SFTPServer._send_handle_response   s    $v,
3nf58??4+;+;<=>A4:Df..0128DOOF,,./~z63C3C3EFrM   c                 p    |
	 t         |   }| j                  |t        ||d       y # t        $ r d}Y 'w xY w)NUnknown )r   
IndexErrorr   r   )rE   ri   codedescs       rL   re   zSFTPServer._send_status   sA    <! 
 	~z4rB	  ! !s   	' 55c                     | j                   j                  |      }t        t        |      t              r/t               }|j                  |       | j                  ||d       y | j                  ||       y )NT)	rD   list_folderrO   rP   rQ   r   
_set_filesr   re   )rE   ri   pathrespr   s        rL   _open_folderzSFTPServer._open_folder
  s^    {{&&t,d4j$'\Fd#&&~vtD.$/rM   c                    |j                         }t        |      dk(  r| j                  |t               y t	               }|j                  |       |j                  t        |             |D ]?  }|j                  |j                         |j                  |       |j                  |       A | j                  t        |       y )Nr   )_get_next_fileslenre   r   r   r   r   r   r   r   r   )rE   ri   r   flistrW   r   s         rL   _read_folderzSFTPServer._read_folder  s    &&(u:?nh7iN#CJ 	DNN4==)NN4 JJsO	 	(C(rM   c                    |j                         }|j                         }|j                         }|j                         }|j                         }|| j                  vr| j                  |t        d       y | j                  |   }|D ]  }	|	t        v s|	}
t        |	   } n | j                  |t        d       y |dk(  rL|j                         }t        t        |      t              s| j                  ||d       y |j                  |z
  }|dk(  r|}|dk  r| j                  |t        d       y t               }|}|||z   k  rt        |||z   |z
        }t        |d      }d} |       }||k  r`|j!                  ||      }t#        |t              s| j                  ||d       y |j%                  |       |t'        |      z  }||z  }||k  r`||j)                         z  }|||z   k  rt+               }|j-                  |       |j/                  d	       |j/                  |
       |j1                  |       | j3                  t4        |       y )
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_int64rc   rB   re   r   _hash_classr   statrO   rP   r   r   r   minreadr   updater   digestr   r   r   	add_bytesr   r   )rE   ri   rW   r   alg_liststartlength
block_sizerq   xalgnamealgstsum_outoffsetblocklenchunklencounthash_objrg   s                       rL   _check_filezSFTPServer._check_file#  sD   
 !<<>[[]
( 02B OOF# 		AK!!n			 .M Q;Bd2h7!!."6KLZZ%'F?J.D 'uv~%:uv~'>?H8U+HEuH("vvfh/!$.%%&.C %T"% (" x((G! uv~%$ iN#|$wg,c2rM   c                    |t         z  r|t        z  rt        j                  }n*|t        z  rt        j                  }nt        j
                  }|t        z  r|t        j                  z  }|t        z  r|t        j                  z  }|t        z  r|t        j                  z  }|t        z  r|t        j                  z  }|S )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)rE   pflagsflagss      rL   _convert_pflagszSFTPServer._convert_pflagsf  s    ^#&?*BIIEo%KKEKKE$$R[[ E$$RZZEO#RZZEN"RYYErM   c           	         | j                  t        dj                  t        |                |t        k(  rr|j                         }| j                  |j                               }t        j                  |      }| j                  || j                  j                  |||             y |t        k(  r|j                         }|| j                  v r$| j                  |= | j!                  |t"               y || j$                  v rA| j$                  |   j'                          | j$                  |= | j!                  |t"               y | j!                  |t(        d       y |t*        k(  r|j                         }|j-                         }|j                         }	|| j$                  vr| j!                  |t(        d       y | j$                  |   j/                  ||	      }
t1        |
t2        t4        f      r=t7        |
      dk(  r| j!                  |t8               y | j;                  |t<        |
       y | j!                  ||
       y |t>        k(  r|j                         }|j-                         }|j                         }
|| j$                  vr| j!                  |t(        d       y | j!                  || j$                  |   jA                  ||
             y |tB        k(  r<|j                         }| j!                  || j                  jE                  |             y |tF        k(  rM|j                         }|j                         }| j!                  || j                  jI                  ||             y |tJ        k(  rR|j                         }t        j                  |      }| j!                  || j                  jM                  ||             y |tN        k(  r<|j                         }| j!                  || j                  jQ                  |             y |tR        k(  r#|j                         }| jU                  ||       y |tV        k(  rX|j                         }|| j                  vr| j!                  |t(        d       y | j                  |   }| jY                  ||       y |tZ        k(  ro|j                         }| j                  j]                  |      }t_        ta        |      t              r| j;                  |tb        |       y | j!                  ||       y |td        k(  ro|j                         }| j                  jg                  |      }t_        ta        |      t              r| j;                  |tb        |       y | j!                  ||       y |th        k(  r|j                         }|| j$                  vr| j!                  |t(        d       y | j$                  |   j]                         }t_        ta        |      t              r| j;                  |tb        |       y | j!                  ||       y |tj        k(  rR|j                         }t        j                  |      }| j!                  || j                  jm                  ||             y |tn        k(  rz|j                         }t        j                  |      }|| j$                  vr| j;                  |t(        d       y | j!                  || j$                  |   jm                  |             y |tp        k(  rw|j                         }| j                  js                  |      }t1        |t2        t4        f      r#| j;                  |tt        d|dt                      y | j!                  ||       y |tv        k(  rM|j                         }|j                         }| j!                  || j                  jy                  ||             y |tz        k(  rN|j                         }| j                  j}                  |      }| j;                  |tt        d|dt                      y |t~        k(  r|j                         }|dk(  r| j                  ||       y |dk(  rM|j                         }|j                         }| j!                  || j                  j                  ||             y | j!                  |t               y | j!                  |t               y )NzRequest: {}r   r   r9   r   r   zposix-rename@openssh.com)CrS   r   r[   r   r   get_textr   rc   r   	_from_msgr   rD   r   r    r   rC   re   r!   rB   rp   r   r"   r   r   r   r   ra   r   r   r   r#   r$   writer%   remover&   renamer'   mkdirr(   rmdirr)   r   r*   r   r+   r   rO   rP   r,   r-   lstatr.   r/   chattrr0   r1   readlinkr   r2   symlinkr3   canonicalizer4   r   posix_renamer5   )rE   rf   ri   rW   r   r   r   r   r   r   rg   oldpathnewpathr   r   target_pathrpathtags                     rL   rd   zSFTPServer._processx  s   		%--il;<=<<>D((7E!++C0D&& 0 0ud C )^^^%F***%%f-!!.':('--/OOF+!!.': 02B (]^^%F]]_F[[]FT__,!!"$46F ??6*//?D$-t9>%%nh?NN>8TB!!.$7)^^^%F]]_F>>#DT__,!!"$46F  7 = =fd K *_<<>Dndkk.@.@.FG*_llnGllnG 2 27G D )^<<>D!++C0Dndkk.?.?d.KL)^<<>Dndkk.?.?.EF+<<>Dnd3+^^%FT...!!"$46F &&v.Fnf5(]<<>D;;##D)D$t*n5~y$?!!.$7)^<<>D;;$$T*D$t*n5~y$?!!.$7)^^^%FT__,!!"$46F ??6*//1D$t*n5~y$?!!.$7+<<>D!++C0Dndkk.@.@t.LM,^^%F!++C0DT__,"$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,,.,,.!!"DKK$<$<Wg$N !!.2EFn.ABrM   )Frl   )__name__
__module____qualname____doc__r   r:   rS   rj   rn   staticmethodrw   r   r   r   re   r   r   r   r   rd   __classcell__)rY   s   @rL   r7   r7   X   sy     $ 7DN8
    $ ) )8"&GC	0)A3F$^CrM   r7   )r   )Cr   r~   rs   rz   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    rM   rL   <module>r      s   & 
  
    1 - ! , & & & & & & & & & &P C(~C+ ~CB ,rM   