o
    ÞÜg$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   sn   t  | ¡ t | |||¡ | ¡ }t | ¡ d ¡| _| ¡ | _	d| _
i | _i | _||g|¢R i |¤Ž| _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   Úget_transportr   Ú
get_loggerÚget_log_channelÚloggerÚget_hexdumpÚultra_debugÚnext_handleÚ
file_tableÚfolder_tableÚserver)ÚselfÚchannelÚnamerA   Úsftp_siÚargsÚkwargsÚ	transport© rI   úN/var/www/html/api-tag/env/lib/python3.10/site-packages/paramiko/sftp_server.pyr7   _   s   

zSFTPServer.__init__c                    s`   t t|ƒtƒr|D ]}tƒ  |d| j ¡  d | ¡ q	d S tƒ  |d| j ¡  d | ¡ d S )Nz[chan z] )Ú
issubclassÚtypeÚlistÚsuperÚ_logÚsockÚget_name)rB   ÚlevelÚmsgÚm©Ú	__class__rI   rJ   rO      s
   "ÿ$zSFTPServer._logc           	   
   C   s.  || _ |  td |¡¡ |  ¡  | j ¡  	 z|  ¡ \}}W n4 ty.   |  td¡ Y d S  t	yR } z|  tdt
|ƒ ¡ |  tt ¡ ¡ W Y d }~d S d }~ww t|ƒ}| ¡ }z	|  |||¡ W n1 t	y• } z%|  tdt
|ƒ ¡ |  tt ¡ ¡ z|  |t¡ W n   Y W Y d }~nd }~ww q)Nz#Started sftp server on channel {!r}TzEOF -- end of sessionzException on channel: z Exception in server processing: )rP   rO   r   ÚformatÚ_send_server_versionrA   Úsession_startedÚ_read_packetÚEOFErrorÚ	ExceptionÚstrr   Ú
tb_stringsr   Úget_intÚ_processÚ_send_statusr   )	rB   rD   rH   rC   ÚtÚdataÚerS   Úrequest_numberrI   rI   rJ   Ústart_subsystemˆ   s<   
€ý€ùòzSFTPServer.start_subsystemc                    sT   | j  ¡  tƒ  ¡  | j ¡ D ]}| ¡  q| j ¡ D ]}| ¡  qi | _i | _d S ©N)rA   Úsession_endedrN   Úfinish_subsystemr?   ÚvaluesÚcloser@   )rB   ÚfrU   rI   rJ   ri   ¤   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 )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   )rd   rI   rI   rJ   Úconvert_errno°   s
   

zSFTPServer.convert_errnoc                 C   s®   t jdkr!|j|j@ rt | |j¡ |j|j@ r!t | |j	|j
¡ |j|j@ r1t | |j|jf¡ |j|j@ rUt| dƒ}| |j¡ W d  ƒ dS 1 sNw   Y  dS 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Ú_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Úattrrl   rI   rI   rJ   Úset_file_attrÃ   s   
"ÿÿzSFTPServer.set_file_attrc                 G   sš   t ƒ }| |¡ |D ]:}t|tƒr| |¡ q
t|tƒr"| |¡ q
t|ttfƒr/| |¡ q
t	|ƒt
u r;| |¡ q
td |t	|ƒ¡ƒ‚|  ||¡ d S )Nzunknown type for {!r} type {!r})r   Úadd_intÚ
isinstancer
   Ú	add_int64Úintr]   ÚbytesÚ
add_stringrL   r   Ú_packr\   rW   Ú_send_packet)rB   re   rb   rF   rS   ÚitemrI   rI   rJ   Ú	_responseà   s   


ÿzSFTPServer._responseFc                 C   sz   t t|ƒtƒs|  ||¡ d S | td | j¡ƒ¡ |  jd7  _|r+|| j| 	¡ < n|| j
| 	¡ < |  |t| 	¡ ¡ d S )Nzhx{:d}r6   )rK   rL   Ú
SFTPHandlera   Ú	_set_namer   rW   r>   r@   Ú	_get_namer?   r’   r   )rB   re   ÚhandleÚfolderrI   rI   rJ   Ú_send_handle_responseó   s   z SFTPServer._send_handle_responseNc                 C   sB   |d u rzt | }W n ty   d}Y nw |  |t||d¡ d S )NÚUnknownÚ )r   Ú
IndexErrorr’   r   )rB   re   ÚcodeÚdescrI   rI   rJ   ra      s   ÿzSFTPServer._send_statusc                 C   sL   | j  |¡}tt|ƒtƒrtƒ }| |¡ |  ||d¡ d S |  ||¡ d S )NT)	rA   Úlist_folderrK   rL   rM   r“   Ú
_set_filesr˜   ra   )rB   re   ÚpathÚrespr—   rI   rI   rJ   Ú_open_folder
  s   
zSFTPServer._open_folderc                 C   s|   |  ¡ }t|ƒdkr|  |t¡ d S tƒ }| |¡ | t|ƒ¡ |D ]}| |j¡ | |¡ | |¡ q#|  	t
|¡ d S )Nr   )Ú_get_next_filesÚlenra   r   r   r‰   rŽ   r†   r   r   r   )rB   re   r—   ÚflistrS   r‡   rI   rI   rJ   Ú_read_folder  s   

zSFTPServer._read_folderc                 C   sÊ  |  ¡ }| ¡ }| ¡ }| ¡ }| ¡ }|| jvr"|  |td¡ d S | j| }|D ]}	|	tv r7|	}
t|	 } n
q)|  |td¡ d S |dkr^| 	¡ }t
t|ƒtƒsY|  ||d¡ d S |j| }|dkrd|}|dk rq|  |td¡ d S tƒ }|}||| k rÆt||| | ƒ}t|dƒ}d}|ƒ }||k rº| ||¡}t|tƒs§|  ||d¡ d S | |¡ |t|ƒ7 }||7 }||k s“|| ¡ 7 }||| k s|tƒ }| |¡ | 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_binaryÚget_listÚ	get_int64r_   r?   ra   r   Ú_hash_classr   ÚstatrK   rL   r   r…   r   ÚminÚreadrŠ   Úupdater¤   Údigestr   r‰   rŽ   Ú	add_bytesr   r   )rB   re   rS   r–   Úalg_listÚstartÚlengthÚ
block_sizerl   ÚxÚalgnameÚalgÚstÚsum_outÚoffsetÚblocklenÚchunklenÚcountÚhash_objrc   rI   rI   rJ   Ú_check_file#  sx   
ÿ
ýÿ
ÿ

ÿ
÷
ð



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@ r)|tj	O }|t
@ r2|tjO }|t@ r;|tjO }|S )z;convert SFTP-style open() flags to Python's os.open() flags)r   r   rw   ÚO_RDWRÚO_WRONLYÚO_RDONLYr   ÚO_APPENDr   ÚO_CREATr   ÚO_TRUNCr   ÚO_EXCL)rB   ÚpflagsÚflagsrI   rI   rJ   Ú_convert_pflagsf  s   



zSFTPServer._convert_pflagsc                 C   sÊ  |   td t| ¡¡ |tkr-| ¡ }|  | ¡ ¡}t 	|¡}|  
|| j |||¡¡ d S |tkrg| ¡ }|| jv rF| j|= |  |t¡ d S || jv r^| j|  ¡  | j|= |  |t¡ d S |  |td¡ d S |tkr´| ¡ }| ¡ }| ¡ }	|| jvr…|  |td¡ d S | j|  ||	¡}
t|
ttfƒr¬t|
ƒdkr£|  |t¡ d S |  |t|
¡ d S |  ||
¡ d S |tkrá| ¡ }| ¡ }| ¡ }
|| jvrÒ|  |td¡ d S |  || j|   ||
¡¡ d S |t!krõ| ¡ }|  || j "|¡¡ d S |t#kr| ¡ }| ¡ }|  || j $||¡¡ d S |t%kr*| ¡ }t 	|¡}|  || j &||¡¡ d S |t'kr?| ¡ }|  || j (|¡¡ d S |t)krP| ¡ }|  *||¡ d S |t+kru| ¡ }|| jvrh|  |td¡ d S | j| }|  ,||¡ d S |t-kr| ¡ }| j .|¡}t/t0|ƒtƒr•|  |t1|¡ d S |  ||¡ d S |t2krÅ| ¡ }| j 3|¡}t/t0|ƒtƒr½|  |t1|¡ d S |  ||¡ d S |t4krý| ¡ }|| jvrÝ|  |td¡ d S | j|  .¡ }t/t0|ƒtƒrõ|  |t1|¡ d S |  ||¡ d S |t5kr| ¡ }t 	|¡}|  || j 6||¡¡ d S |t7krC| ¡ }t 	|¡}|| jvr5|  |td¡ d S |  || j|  6|¡¡ d S |t8kro| ¡ }| j 9|¡}t|ttfƒrg|  |t:d|dtƒ ¡ d S |  ||¡ d S |t;kr‰| ¡ }| ¡ }|  || j <||¡¡ d S |t=kr¥| ¡ }| j >|¡}|  |t:d|dtƒ ¡ d S |t?krÝ| ¡ }|dkr»|  @||¡ d S |dkrÕ| ¡ }| ¡ }|  || j A||¡¡ d S |  |tB¡ d S |  |tB¡ d S )NzRequest: {}r§   r   r6   rš   r©   zposix-rename@openssh.com)CrO   r   rW   r   r   Úget_textrÌ   r_   r   Ú	_from_msgr˜   rA   rƒ   r   rª   r@   ra   r    r?   rk   r   r!   r¬   r°   rŠ   r   r]   r¤   r   r’   r"   r#   Úwriter$   Úremover%   Úrenamer&   Úmkdirr'   Úrmdirr(   r¢   r)   r¦   r*   r®   rK   rL   r+   r,   Úlstatr-   r.   Úchattrr/   r0   Úreadlinkr   r1   Úsymlinkr2   Úcanonicalizer3   rÂ   Úposix_renamer4   )rB   rb   re   rS   r    rË   r‡   r–   r½   r¶   rc   ÚoldpathÚnewpathr—   r¡   Útarget_pathÚrpathÚtagrI   rI   rJ   r`   x  s(  
ÿ

ÿ
ÿ
ÿÿ
ÿ




ÿ



ÿ



ÿÿ
ÿ
ÿ
ÿ


ÿzSFTPServer._process)Frg   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r7   rO   rf   ri   Ústaticmethodrq   rˆ   r’   r˜   ra   r¢   r¦   rÂ   rÌ   r`   Ú__classcell__rI   rI   rU   rJ   r5   X   s&    
û"




Cr5   )r“   )Crâ   rw   rm   rs   Ú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.   r/   r0   r1   r2   r3   r4   r­   r5   Úparamiko.sftp_handler“   rI   rI   rI   rJ   Ú<module>   s&    œ
(   D