U vù¾f$Lã@s\dZddlZddlZddlZddlmZmZddlmZddl m Z m Z m Z m Z mZmZddlmZddlmZddlmZdd lmZdd lmZdd l mZmZmZmZmZmZm 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;mZ>eed œZ?Gd d„de eƒZ@ddlAmBZBdS)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)rrcsœeZdZdZefdd„Z‡fdd„Zdd„Z‡fdd „Ze d d „ƒZ e d d „ƒZ dd„Z d dd„Z d!dd„Zdd„Zdd„Zdd„Zdd„Zdd„Z‡ZS)"Ú 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. cOsht |¡t ||||¡| ¡}t | ¡d¡|_| ¡|_ d|_ i|_ i|_ ||f|ž|Ž|_ dS)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__rZ get_transportrZ get_loggerZget_log_channelÚloggerZ get_hexdumpZ ultra_debugÚ next_handleÚ file_tableÚ folder_tableÚserver)ÚselfÚchannelÚnamer<Zsftp_siÚargsÚkwargsÚ transport©rCúE/opt/alt/python38/lib/python3.8/site-packages/paramiko/sftp_server.pyr7_s  zSFTPServer.__init__cs^tt|ƒtƒr:|D]$}tƒ |d|j ¡d|¡qn tƒ |d|j ¡d|¡dS)Nz[chan z] )Ú issubclassÚtypeÚlistÚsuperÚ_logÚsockÚget_name)r=ÚlevelÚmsgÚm©Ú __class__rCrDrIs$zSFTPServer._logc Cs8||_| td |¡¡| ¡|j ¡z| ¡\}}Wnltk r\| td¡YdSt k r¦}z.| tdt |ƒ¡| tt   ¡¡WY¢dSd}~XYnXt |ƒ}| ¡}z| |||¡Wq*t k r0}zF| tdt |ƒ¡| tt   ¡¡z| |t¡Wn YnXW5d}~XYq*Xq*dS)Nz#Started sftp server on channel {!r}zEOF -- end of sessionzException on channel: z Exception in server processing: )rJrIr ÚformatZ_send_server_versionr<Zsession_startedZ _read_packetÚEOFErrorÚ ExceptionÚstrrZ tb_stringsrÚget_intÚ_processÚ _send_statusr) r=r?rBr>ÚtÚdataÚerMÚrequest_numberrCrCrDÚstart_subsystemˆs0  zSFTPServer.start_subsystemcsT|j ¡tƒ ¡|j ¡D] }| ¡q|j ¡D] }| ¡q6i|_i|_dS)N)r<Z session_endedrHÚfinish_subsystemr:ÚvaluesÚcloser;)r=ÚfrOrCrDr]¤s    zSFTPServer.finish_subsystemcCs.|tjkrtS|tjks"|tjkr&tStSdS)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)rZrCrCrDÚ convert_errno°s zSFTPServer.convert_errnoc Cs”tjdkrB|j|j@r$t ||j¡|j|j@rBt ||j |j ¡|j|j @rbt  ||j |jf¡|j|j@rt|dƒ}| |j¡W5QRXdS)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. Úwin32zw+N)ÚsysÚplatformÚ_flagsZFLAG_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`rCrCrDÚ set_file_attrÃs      zSFTPServer.set_file_attrcGsœtƒ}| |¡|D]v}t|tƒr.| |¡qt|tƒrD| |¡qt|ttfƒr^| |¡qt |ƒt krv|  |¡qt d  |t |ƒ¡ƒ‚q| ||¡dS)Nzunknown type for {!r} type {!r})rÚadd_intÚ isinstancer Z add_int64ÚintrTÚbytesÚ add_stringrFr Ú_packrSrQÚ _send_packet)r=r[rXr@rMÚitemrCrCrDÚ _responseàs        ÿzSFTPServer._responseFcCsztt|ƒtƒs| ||¡dS| td |j¡ƒ¡|jd7_|rV||j|  ¡<n||j |  ¡<|  |t |  ¡¡dS)Nzhx{:d}r6) rErFÚ SFTPHandlerWZ _set_namerrQr9r;Z _get_namer:rr)r=r[ÚhandleÚfolderrCrCrDÚ_send_handle_responseós z SFTPServer._send_handle_responseNcCsD|dkr.z t|}Wntk r,d}YnX| |t||d¡dS)NÚUnknownÚ)rÚ IndexErrorrr)r=r[ÚcodeÚdescrCrCrDrWs   zSFTPServer._send_statuscCsL|j |¡}tt|ƒtƒr|¡}| |t:d|dtƒ¡nv|t?kr°| ¡}|dkrp| @||¡n>|dkr¢| ¡} | ¡} | ||j  A| | ¡¡n | |tB¡n | |tB¡dS)Nz Request: {}r‘rr6r‡r“zposix-rename@openssh.com)CrIr rQrrZget_textr­rUr Z _from_msgr…r<rsrr”r;rWr r:r_rr!r•r™rzr|rTrŽrrr"r#Úwriter$Úremover%Úrenamer&Úmkdirr'Úrmdirr(rr)rr*r—rErFr+r,Úlstatr-r.Zchattrr/r0Úreadlinkrr1Úsymlinkr2Ú canonicalizer3r¤Z posix_renamer4)r=rXr[rMr‹r¬rwrƒr¢rrYZoldpathÚnewpathr„rŒÚ target_pathZrpathÚtagrCrCrDrVxs` ÿ    ÿ  ÿ  ÿÿ   ÿ       ÿ       ÿ     ÿÿ  ÿ  ÿ  ÿ    ÿzSFTPServer._process)F)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__r r7rIr\r]Ú staticmethodrerxrr…rWrrr¤r­rVÚ __classcell__rCrCrOrDr5Xs$ û "      Cr5)r‚)Cr½rjrargÚhashlibrrZparamikorZ paramiko.sftprrrrr r Zparamiko.sftp_sir Zparamiko.sftp_attrr Zparamiko.commonr Zparamiko.serverrZ paramiko.utilrrrrrrrrrrrrrrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r–r5Zparamiko.sftp_handler‚rCrCrCrDÚs$       œ( D