ó Ú_e[c@sdZddlZddlZddlZddlmZmZddlmZddl m Z m Z m Z m Z mZddlmZddlmZddlmZdd lmZmZmZmZdd lmZdd l mZmZmZmZm 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>m?Z?m@Z@ied 6ed 6ZAde efd„ƒYZBddlCmDZDdS(s Server-mode SFTP support. iÿÿÿÿN(tmd5tsha1(tutil(tBaseSFTPtMessaget SFTP_FAILUREtSFTP_PERMISSION_DENIEDtSFTP_NO_SUCH_FILE(tSFTPServerInterface(tSFTPAttributes(tDEBUG(tlongt string_typest bytes_typestb(tSubsystemHandler(%t CMD_HANDLEt SFTP_DESCt CMD_STATUStSFTP_EOFtCMD_NAMEtSFTP_BAD_MESSAGEtCMD_EXTENDED_REPLYtSFTP_FLAG_READtSFTP_FLAG_WRITEtSFTP_FLAG_APPENDtSFTP_FLAG_CREATEtSFTP_FLAG_TRUNCtSFTP_FLAG_EXCLt CMD_NAMEStCMD_OPENt CMD_CLOSEtSFTP_OKtCMD_READtCMD_DATAt CMD_WRITEt CMD_REMOVEt CMD_RENAMEt CMD_MKDIRt CMD_RMDIRt CMD_OPENDIRt CMD_READDIRtCMD_STATt CMD_ATTRSt CMD_LSTATt CMD_FSTATt CMD_SETSTATt CMD_FSETSTATt CMD_READLINKt CMD_SYMLINKt CMD_REALPATHt CMD_EXTENDEDtSFTP_OP_UNSUPPORTEDRRt SFTPServercBs¡eZdZed„Zd„Zd„Zd„Zed„ƒZ ed„ƒZ d„Z e d„Z dd „Zd „Zd „Zd „Zd „Zd„ZRS(så 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. cOsŽtj|ƒtj||||ƒ|jƒ}tj|jƒdƒ|_|jƒ|_ d|_ i|_ i|_ ||||Ž|_ dS(s 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. s.sftpiN(Rt__init__Rt get_transportRt get_loggertget_log_channeltloggert get_hexdumpt ultra_debugt next_handlet file_tablet folder_tabletserver(tselftchanneltnameR@tsftp_sitlargstkwargst transport((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyR6?s     cCs‰tt|ƒtƒrWxm|D]4}tt|ƒj|d|jjƒd|ƒqWn.tt|ƒj|d|jjƒd|ƒdS(Ns[chan s] (t issubclassttypetlisttsuperR5t_logtsocktget_name(RAtleveltmsgtm((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyRLZs #c Cs[||_|jtdj|ƒƒ|jƒ|jjƒxtrVy|jƒ\}}Wnet k r||jtdƒdSt k r¿}|jtdt |ƒƒ|jtt j ƒƒdSXt|ƒ}|jƒ}y|j|||ƒWq<t k rR}|jtdt |ƒƒ|jtt j ƒƒy|j|tƒWqSqSXq<Xq<WdS(Ns#Started sftp server on channel {!r}sEOF -- end of sessionsException on channel: s Exception in server processing: (RMRLR tformatt_send_server_versionR@tsession_startedtTruet _read_packettEOFErrort ExceptiontstrRt tb_stringsRtget_intt_processt _send_statusR( RARCRGRBtttdatateRPtrequest_number((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pytstart_subsystemes2       cCs~|jjƒtt|ƒjƒx!|jjƒD]}|jƒq0Wx!|jjƒD]}|jƒqTWi|_i|_dS(N( R@t session_endedRKR5tfinish_subsystemR>tvaluestcloseR?(RAtf((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyRds  cCs=|tjkrtS|tjks1|tjkr5tStSdS(su 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(terrnotEACCESRtENOENTtENOTDIRRR(R`((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyt convert_errnos cCsÒtjdkrd|j|j@r5tj||jƒn|j|j@rdtj||j |j ƒqdn|j|j @r“tj ||j |jfƒn|j|j@rÎt|dƒ}|j|jƒWdQXndS(s: 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. twin32sw+N(tsystplatformt_flagstFLAG_PERMISSIONStostchmodtst_modet FLAG_UIDGIDtchowntst_uidtst_gidt FLAG_AMTIMEtutimetst_atimetst_mtimet FLAG_SIZEtopenttruncatetst_size(tfilenametattrRg((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyt set_file_attr scGsÞtƒ}|j|ƒx±|D]©}t|tƒrB|j|ƒqt|tƒra|j|ƒqt|ttfƒr†|j|ƒqt |ƒt kr¨|j |ƒqt dj |t |ƒƒƒ‚qW|j||ƒdS(Nsunknown type for {!r} type {!r}(Rtadd_intt isinstanceR t add_int64tintR R t add_stringRIR t_packRXRRt _send_packet(RARaR^targRPtitem((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyt _response½s   cCs£tt|ƒtƒs)|j||ƒdS|jtdj|jƒƒƒ|jd7_|rs||j|j ƒRR(RARathandletfolder((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyt_send_handle_responseÏscCsT|dkr7yt|}Wq7tk r3d}q7Xn|j|t||dƒdS(NtUnknownt(tNoneRt IndexErrorRR(RARatcodetdesc((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyR]Üs    cCsh|jj|ƒ}tt|ƒtƒrTtƒ}|j|ƒ|j||tƒdS|j ||ƒdS(N( R@t list_folderRHRIRJRŽt _set_filesR“RUR](RARatpathtrespR’((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyt _open_folderæs  cCsª|jƒ}t|ƒdkr2|j|tƒdStƒ}|j|ƒ|jt|ƒƒx8|D]0}|j|jƒ|j|ƒ|j|ƒqbW|j t |ƒdS(Ni( t_get_next_filestlenR]RRR„RˆRR‰RŠR(RARaR’tflistRPR‚((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyt _read_folderñs     cCsq|jƒ}|jƒ}|jƒ}|jƒ}|jƒ}||jkrb|j|tdƒdS|j|}xE|D]&} | tkrv| } t| } PqvqvW|j|tdƒdS|dkr |j ƒ} t t | ƒt ƒsû|j|| dƒdS| j |}n|dkr |}n|dkrC|j|tdƒdStƒ} |}xË|||krt||||ƒ}t|dƒ}d}| ƒ}xo||kr |j||ƒ}t|tƒsá|j||dƒdS|j|ƒ|t|ƒ7}||7}qW| |jƒ7} qUWtƒ}|j|ƒ|jd ƒ|j| ƒ|j| ƒ|jt|ƒdS( NsInvalid handlesNo supported hash types foundisUnable to stat fileisBlock size too smallisUnable to hash files check-file(t get_binarytget_listt get_int64R[R>R]Rt _hash_classRtstatRHRIR R€tbytestmintreadR…R tupdateR tdigestRR„Rˆt add_bytesRŠR(RARaRPR‘talg_listtstarttlengtht block_sizeRgtxtalgnametalgtsttsum_outtoffsettblocklentchunklentcountthash_objR_((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyt _check_fileÿsj                          cCs«|t@r |t@r tj}n|t@r6tj}n tj}|t@rY|tjO}n|t@rs|tj O}n|t @r|tj O}n|t @r§|tj O}n|S(s;convert SFTP-style open() flags to Python's os.open() flags(RRRrtO_RDWRtO_WRONLYtO_RDONLYRtO_APPENDRtO_CREATRtO_TRUNCRtO_EXCL(RAtpflagstflags((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyt_convert_pflags>s        cCs®|jtdjt|ƒƒ|tkr~|jƒ}|j|jƒƒ}tj |ƒ}|j ||j j |||ƒƒn,|t kr|jƒ}||jkrÃ|j|=|j|tƒdS||jkr|j|jƒ|j|=|j|tƒdS|j|tdƒn“|tkré|jƒ}|jƒ}|jƒ} ||jkrm|j|tdƒdS|j|j|| ƒ} t| ttfƒrÖt| ƒdkrÀ|j|tƒqæ|j|t| ƒqª|j|| ƒnÁ|tkre|jƒ}|jƒ}|jƒ} ||jkr?|j|tdƒdS|j||j|j || ƒƒnE|t!krœ|jƒ}|j||j j"|ƒƒn|t#krâ|jƒ} |jƒ} |j||j j$| | ƒƒnÈ|t%kr+|jƒ}tj |ƒ}|j||j j&||ƒƒn|t'krb|jƒ}|j||j j(|ƒƒnH|t)krŽ|jƒ}|j*||ƒdS|t+krì|jƒ}||jkrÌ|j|tdƒdS|j|} |j,|| ƒn¾|t-krT|jƒ}|j j.|ƒ}t/t0|ƒtƒrA|j|t1|ƒqª|j||ƒnV|t2kr¼|jƒ}|j j3|ƒ}t/t0|ƒtƒr©|j|t1|ƒqª|j||ƒnî|t4krK|jƒ}||jkrú|j|tdƒdS|j|j.ƒ}t/t0|ƒtƒr8|j|t1|ƒqª|j||ƒn_|t5kr”|jƒ}tj |ƒ}|j||j j6||ƒƒn|t7kr|jƒ}tj |ƒ}||jkrá|j|tdƒdS|j||j|j6|ƒƒn¦|t8krx|jƒ}|j j9|ƒ}t|ttfƒre|j|t:d|dtƒƒqª|j||ƒn2|t;kr¾|jƒ}|jƒ}|j||j j<||ƒƒnì|t=kr |jƒ}|j j>|ƒ}|j|t:d|dtƒƒn |t?krš|jƒ}|dkrA|j@||ƒqª|dkr‡|jƒ} |jƒ} |j||j jA| | ƒƒqª|j|tBƒn|j|tBƒdS(Ns Request: {}sInvalid handleiiR•s check-filesposix-rename@openssh.com(CRLR RRRRtget_textRÆR[R t _from_msgR“R@R~RR£R?R]R R>RfRR!R¥RªR…R R R RRR"R#twriteR$tremoveR%trenameR&tmkdirR'trmdirR(RžR)R¢R*R§RHRIR+R,tlstatR-R.tchattrR/R0treadlinkRR1tsymlinkR2t canonicalizeR3R¼t posix_renameR4(RAR^RaRPRœRÅR‚R‘R·R°R_toldpathtnewpathR’Rt target_pathtrpathttag((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyR\Ps                         "                 "                N(t__name__t __module__t__doc__RR6RLRbRdt staticmethodRlRƒRtFalseR“R–R]RžR¢R¼RÆR\(((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyR58s      ? (RŽ(ERÛRrRhRnthashlibRRtparamikoRt paramiko.sftpRRRRRtparamiko.sftp_siRtparamiko.sftp_attrR tparamiko.commonR tparamiko.py3compatR R R Rtparamiko.serverRRRRRRRRRRRRRRRRRR R!R"R#R$R%R&R'R(R)R*R+R,R-R.R/R0R1R2R3R4R¦R5tparamiko.sftp_handleRŽ(((s8/tmp/pip-install-KP2Jbq/paramiko/paramiko/sftp_server.pyts$   ("è  ÿ­