U
    ςd$L                     @   s\  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 de
eZ@ddlAmBZB dS )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                       s   e Zd ZdZefddZ fddZdd Z fdd	Ze	d
d Z
e	dd Zdd Zd ddZd!ddZdd Zdd Zdd Zdd Zdd Z  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                 O   sh   t |  t| ||| | }t| d | _| | _	d| _
i | _i | _||f||| _dS )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   Zget_transportr   Z
get_loggerZget_log_channelloggerZget_hexdumpZultra_debugnext_handle
file_tablefolder_tableserver)selfchannelnamer<   Zsftp_siargskwargs	transport rC   Q/var/www/html/myproject/myenv/lib/python3.8/site-packages/paramiko/sftp_server.pyr7   _   s    

zSFTPServer.__init__c                    s^   t t|tr:|D ]$}t |d| j  d |  qn t |d| j  d |  d S )Nz[chan z] )
issubclasstypelistsuper_logsockget_name)r=   levelmsgm	__class__rC   rD   rI      s    $zSFTPServer._logc           	   
   C   s8  || _ | td| |   | j  z|  \}}W nl tk
r\   | td Y d S  t	k
r } z.| tdt
|  | tt  W Y d S d }~X Y nX t|}| }z| ||| W q* t	k
r0 } zF| tdt
|  | tt  z| |t W n   Y nX W 5 d }~X Y q*X q*d S )Nz#Started sftp server on channel {!r}zEOF -- end of sessionzException on channel: z Exception in server processing: )rJ   rI   r   formatZ_send_server_versionr<   Zsession_startedZ_read_packetEOFError	Exceptionstrr   Z
tb_stringsr   get_int_process_send_statusr   )	r=   r?   rB   r>   tdataerM   request_numberrC   rC   rD   start_subsystem   s0    
zSFTPServer.start_subsystemc                    sT   | j   t   | j D ]}|  q| j D ]}|  q6i | _i | _d S )N)r<   Zsession_endedrH   finish_subsystemr:   valuescloser;   )r=   frO   rC   rD   r]      s    



zSFTPServer.finish_subsystemc                 C   s.   | t jkrtS | t jks"| t jkr&tS tS d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``.
        N)errnoEACCESr   ENOENTENOTDIRr	   r   )rZ   rC   rC   rD   convert_errno   s
    

zSFTPServer.convert_errnoc              	   C   s   t jdkrB|j|j@ r$t| |j |j|j@ rBt| |j	|j
 |j|j@ rbt| |j|jf |j|j@ rt| d}||j W 5 Q R X dS )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_flagsZFLAG_PERMISSIONSoschmodst_modeZFLAG_UIDGIDchownst_uidst_gidZFLAG_AMTIMEutimest_atimest_mtimeZ	FLAG_SIZEopentruncatest_size)filenameattrr`   rC   rC   rD   set_file_attr   s    
zSFTPServer.set_file_attrc                 G   s   t  }|| |D ]v}t|tr.|| qt|trD|| qt|ttfr^|| qt	|t
krv|| qtd|t	|q| || d S )Nzunknown type for {!r} type {!r})r   add_int
isinstancer
   Z	add_int64intrT   bytes
add_stringrF   r   _packrS   rQ   _send_packet)r=   r[   rX   r@   rM   itemrC   rC   rD   	_response   s    


zSFTPServer._responseFc                 C   sz   t t|ts| || d S |td| j |  jd7  _|rV|| j|	 < n|| j
|	 < | |t|	  d S )Nzhx{:d}r6   )rE   rF   
SFTPHandlerW   Z	_set_namer   rQ   r9   r;   Z	_get_namer:   r   r   )r=   r[   handlefolderrC   rC   rD   _send_handle_response   s    z SFTPServer._send_handle_responseNc                 C   sD   |d kr.zt | }W n tk
r,   d}Y nX | |t||d d S )NUnknown )r   
IndexErrorr   r   )r=   r[   codedescrC   rC   rD   rW      s    
zSFTPServer._send_statusc                 C   sL   | j |}tt|tr<t }|| | ||d d S | || d S )NT)	r<   Zlist_folderrE   rF   rG   r   Z
_set_filesr   rW   )r=   r[   pathrespr   rC   rC   rD   _open_folder
  s    
zSFTPServer._open_folderc                 C   s|   |  }t|dkr$| |t d S t }|| |t| |D ]$}||j || || qF| 	t
| d S )Nr   )Z_get_next_fileslenrW   r   r   ry   r}   rv   r~   r   r   )r=   r[   r   flistrM   rw   rC   rC   rD   _read_folder  s    

zSFTPServer._read_folderc                 C   s  |  }| }| }| }| }|| jkrD| |td d S | j| }|D ]}	|	tkrR|	}
t|	 } qqR| |td d S |dkr|	 }t
t|ts| ||d d S |j| }|dkr|}|dk r| |td d S t }|}||| k rt||| | }t|d}d}| }||k rv|||}t|tsT| ||d d S || |t|7 }||7 }q || 7 }qt }|| |d	 ||
 || | t| d S )
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_binaryZget_list	get_int64rU   r:   rW   r   _hash_classr   statrE   rF   r   ru   r|   minreadrz   updater   digestr   ry   r}   Z	add_bytesr   r   )r=   r[   rM   r   Zalg_liststartlength
block_sizer`   xZalgnamealgstZsum_outoffsetZblocklenZchunklencountZhash_objrY   rC   rC   rD   _check_file#  s    
  
  
  

  




zSFTPServer._check_filec                 C   sz   |t @ r|t@ rtj}n|t@ r(tj}ntj}|t@ r@|tjO }|t@ rR|tj	O }|t
@ rd|tjO }|t@ rv|tjO }|S )z;convert SFTP-style open() flags to Python's os.open() flags)r   r   rj   O_RDWRO_WRONLYO_RDONLYr   O_APPENDr   O_CREATr   O_TRUNCr   O_EXCL)r=   ZpflagsflagsrC   rC   rD   _convert_pflagsf  s    



zSFTPServer._convert_pflagsc                 C   s  |  tdt|  |tkrZ| }| | }t	|}| 
|| j||| nb|tkr| }|| jkr| j|= | |t d S || jkr| j|   | j|= | |t d S | |td n|tkrl| }| }| }	|| jkr| |td d S | j| ||	}
t|
ttfr\t|
dkrL| |t n| |t|
 n| ||
 nP|tkr| }| }| }
|| jkr| |td d S | || j|  ||
 n|t!kr| }| || j"| n|t#kr(| }| }| || j$|| n|t%kr^| }t	|}| || j&|| n^|t'kr| }| || j(| n4|t)kr| }| *|| d S |t+kr| }|| jkr| |td d S | j| }| ,|| n|t-krB| }| j.|}t/t0|tr2| |t1| n| || nz|t2kr| }| j3|}t/t0|tr| |t1| n| || n,|t4kr| }|| jkr| |td d S | j| . }t/t0|tr| |t1| n| || n|t5kr4| }t	|}| || j6|| n|t7kr| }t	|}|| jkrn| |td d S | || j| 6| n2|t8kr| }| j9|}t|ttfr| |t:d|dt  n| || n|t;kr| }| }| || j<|| n|t=krF| }| j>|}| |t:d|dt  nv|t?kr| }|dkrp| @|| n>|dkr| }| }| || jA|| n| |tB n| |tB d S )NzRequest: {}r   r   r6   r   r   zposix-rename@openssh.com)CrI   r   rQ   r   r   Zget_textr   rU   r   Z	_from_msgr   r<   rs   r   r   r;   rW   r    r:   r_   r   r!   r   r   rz   r|   rT   r   r   r   r"   r#   writer$   remover%   renamer&   mkdirr'   rmdirr(   r   r)   r   r*   r   rE   rF   r+   r,   lstatr-   r.   Zchattrr/   r0   readlinkr   r1   symlinkr2   Zcanonicalizer3   r   Zposix_renamer4   )r=   rX   r[   rM   r   r   rw   r   r   r   rY   Zoldpathnewpathr   r   target_pathZrpathtagrC   rC   rD   rV   x  s`   
 

  
  
   

 




  



  



   
     
 
     


 zSFTPServer._process)F)N)__name__
__module____qualname____doc__r   r7   rI   r\   r]   staticmethodre   rx   r   r   rW   r   r   r   r   rV   __classcell__rC   rC   rO   rD   r5   X   s$   
"




Cr5   )r   )Cr   rj   ra   rg   hashlibr   r   Zparamikor   Zparamiko.sftpr   r   r   r   r	   r
   Zparamiko.sftp_sir   Zparamiko.sftp_attrr   Zparamiko.commonr   Zparamiko.serverr   Z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.   r/   r0   r1   r2   r3   r4   r   r5   Zparamiko.sftp_handler   rC   rC   rC   rD   <module>   s$    (
   D