=OXc@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 efdYZBddlCmDZDdS(s Server-mode SFTP support. iN(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 SFTPServercBseZdZedZdZdZdZedZ edZ dZ e dZ dd Zd Zd Zd Zd ZdZRS(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. cOstj|tj|||||j}tj|jd|_|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 class 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/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyR6<s     cCstt|trWxm|D]4}tt|j|d|jjd|qWn.tt|j|d|jjd|dS(Ns[chan s] (t issubclassttypetlisttsuperR5t_logtsocktget_name(RAtleveltmsgtm((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyRLVs 5c Cs\||_|jtdt||j|jjxtrWy|j\}}Wnet k r}|jtddSt k r}|jtdt ||jtt j dSXt|}|j}y|j|||Wq=t k rS}|jtdt ||jtt j y|j|tWqTqTXq=Xq=WdS(Ns!Started sftp server on channel %ssEOF -- end of sessionsException on channel: s Exception in server processing: (RMRLR treprt_send_server_versionR@tsession_startedtTruet _read_packettEOFErrort ExceptiontstrRt tb_stringsRtget_intt_processt _send_statusR( RARCRGRBtttdatateRPtrequest_number((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pytstart_subsystem]s2       cCs~|jjtt|jx!|jjD]}|jq0Wx!|jjD]}|jqTWi|_i|_dS(N( R@t session_endedRKR5tfinish_subsystemR>tvaluestcloseR?(RAtf((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyRdys  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/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyt convert_errnos cCstjdkrd|j|j@r5tj||jn|j|j@rdtj||j |j qdn|j|j @rtj ||j |jfn|j|j@rt|d}|j|jWdQXndS(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/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyt set_file_attrscGst}|j|x|D]}t|trB|j|qt|tra|j|qt|ttfr|j|qt |t kr|j |qt dt |dt t |qW|j||dS(Nsunknown type for s type (Rtadd_intt isinstanceR t add_int64tintR R t add_stringRIR t_packRXRRt _send_packet(RARaR^targRPtitem((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyt _responses   .cCstt|ts)|j||dS|jtd|j|jd7_|rn||j|jRR(RARathandletfolder((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyt_send_handle_responsescCsT|dkr7yt|}Wq7tk r3d}q7Xn|j|t||ddS(NtUnknownt(tNoneRt IndexErrorRR(RARatcodetdesc((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyR]s    cCsh|jj|}tt|trTt}|j||j||tdS|j ||dS(N( R@t list_folderRHRIRJRt _set_filesRRUR](RARatpathtrespR((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyt _open_folders  cCs|j}t|dkr2|j|tdSt}|j||jt|x8|D]0}|j|j|j||j|qbW|j t |dS(Ni( t_get_next_filestlenR]RRRRRRRR(RARaRtflistRPR((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyt _read_folders     cCsq|j}|j}|j}|j}|j}||jkrb|j|tddS|j|}xE|D]&} | tkrv| } t| } PqvqvW|j|tddS|dkr |j } t t | t s|j|| ddS| j |}n|dkr |}n|dkrC|j|tddSt} |}x|||krt||||}t|d}d}| }xo||kr |j||}t|ts|j||ddS|j||t|7}||7}qW| |j7} 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 RtbytestmintreadRR tupdateRtdigestRRRt add_bytesRR(RARaRPRtalg_listtstarttlengtht block_sizeRgtxtalgnametalgtsttsum_outtoffsettblocklentchunklentcountthash_objR_((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyt _check_filesb                      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/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyt_convert_pflags.s        cCsc|jtdt||tkry|j}|j|j}tj|}|j ||j j |||n|t kr|j }||jkr|j|=|j|tdS||jkr|j|j|j|=|j|tdS|j|tdnM|tkr|j }|j}|j} ||jkrh|j|tddS|j|j|| } t| ttfrt| dkr|j|tq|j|t| q_|j|| n{|tkr`|j }|j}|j } ||jkr:|j|tddS|j||j|j|| n|t kr|j}|j||j j!|n|t"kr|j} |j} |j||j j#| | n|t$kr&|j}tj|}|j||j j%||n9|t&kr]|j}|j||j j'|n|t(kr|j}|j)||dS|t*kr|j }||jkr|j|tddS|j|} |j+|| nx|t,krO|j}|j j-|}t.t/|tr<|j|t0|q_|j||n|t1kr|j}|j j2|}t.t/|tr|j|t0|q_|j||n|t3krF|j }||jkr|j|tddS|j|j-}t.t/|tr3|j|t0|q_|j||n|t4kr|j}tj|}|j||j j5||n|t6kr|j }tj|}||jkr|j|tddS|j||j|j5|n`|t7krs|j}|j j8|}t|ttfr`|j|t9d|dtq_|j||n|t:kr|j}|j}|j||j j;||n|t<kr|j}|j j=|}|j|t9d|dtnZ|t>krO|j}|dkr<|j?||q_|j|t@n|j|t@dS(Ns Request: %ssInvalid handleiiRs check-file(ARLR RRtget_textRR[R t _from_msgRR@R~RRR?R]R R>RfRR!RRRR R RRRR"R#twriteR$tremoveR%trenameR&tmkdirR'trmdirR(RR)RR*RRHRIR+R,tlstatR-R.tchattrR/R0treadlinkRR1tsymlinkR2t canonicalizeR3RR4(RAR^RaRPRRRRRRR_toldpathtnewpathRRt target_pathtrpathttag((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyR\@s  %            &     "  "               "  #  "   "  "   N(t__name__t __module__t__doc__RR6RLRbRdt staticmethodRlRRtFalseRRR]RRRRR\(((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyR55s       ; (R(ERRrRhRnthashlibRRtparamikoRt 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/R0R1R2R3R4RR5tparamiko.sftp_handleR(((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyts$   ("