ó õùPc@s­dZddlZddlZddlmZmZddlTddlmZddl Tddl Tddl Tied6ed6Z de efd „ƒYZdd lmZdS( s Server-mode SFTP support. iÿÿÿÿN(tMD5tSHA(t*(tSubsystemHandlertsha1tmd5t SFTPServercBs­eZdZed„Zd„Zd„Zd„Zd„Ze eƒZd„Z e e ƒZ d„Z e d„Z dd „Zd „Zd „Zd „Zd „Zd„ZRS(sä Server-side SFTP subsystem support. Since this is a L{SubsystemHandler}, it can be (and is meant to be) set as the handler for C{"sftp"} requests. Use L{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 L{Transport} as a subsystem handler. C{server} and any additional parameters or keyword parameters are passed from the original call to L{Transport.set_subsystem_handler}. @param channel: channel passed from the L{Transport}. @type channel: L{Channel} @param name: name of the requested subsystem. @type name: str @param server: the server object associated with this channel and subsystem @type server: L{ServerInterface} @param sftp_si: a subclass of L{SFTPServerInterface} to use for handling individual requests. @type sftp_si: class s.sftpiN(tBaseSFTPt__init__Rt get_transporttutilt get_loggertget_log_channeltloggert get_hexdumpt ultra_debugt next_handlet file_tablet folder_tabletserver(tselftchanneltnameRtsftp_sitlargstkwargst transport((s/..\python\site-packages\paramiko\sftp_server.pyR0s     cCs‰tt|ƒtƒrWxm|D]4}tt|ƒj|d|jjƒd|ƒqWn.tt|ƒj|d|jjƒd|ƒdS(Ns[chan s] (t issubclassttypetlisttsuperRt_logtsocktget_name(Rtleveltmsgtm((s/..\python\site-packages\paramiko\sftp_server.pyRMs 5c Cs\||_|jtdt|ƒƒ|jƒ|jjƒxtrWy|jƒ\}}Wnet k r}|jtdƒdSt k rÀ}|jtdt |ƒƒ|jtt j ƒƒdSXt|ƒ}|jƒ}y|j|||ƒWq=t k rS}|jtdt |ƒƒ|jtt j ƒƒy|j|tƒWqTqTXq=Xq=WdS(Ns!Started sftp server on channel %ssEOF -- end of sessionsException on channel: s Exception in server processing: (R RtDEBUGtreprt_send_server_versionRtsession_startedtTruet _read_packettEOFErrort ExceptiontstrR t tb_stringstMessagetget_intt_processt _send_statust SFTP_FAILURE( RRRRtttdatateR#trequest_number((s/..\python\site-packages\paramiko\sftp_server.pytstart_subsystemTs2       cCs~|jjƒtt|ƒjƒx!|jjƒD]}|jƒq0Wx!|jjƒD]}|jƒqTWi|_i|_dS(N( Rt session_endedRRtfinish_subsystemRt itervaluestcloseR(Rtf((s/..\python\site-packages\paramiko\sftp_server.pyR:ps  cCs=|tjkrtS|tjks1|tjkr5tStSdS(s Convert an errno value (as from an C{OSError} or C{IOError}) into a standard SFTP result code. This is a convenience function for trapping exceptions in server code and returning an appropriate result. @param e: an errno code, as from C{OSError.errno}. @type e: int @return: an SFTP error code like L{SFTP_NO_SUCH_FILE}. @rtype: int N(terrnotEACCEStSFTP_PERMISSION_DENIEDtENOENTtENOTDIRtSFTP_NO_SUCH_FILER3(R6((s/..\python\site-packages\paramiko\sftp_server.pyt convert_errno{s 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ƒndS(sn Change a file's attributes on the local filesystem. The contents of C{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 C{attr}. This is meant to be a handy helper function for translating SFTP file requests into local file operations. @param filename: name of the file to alter (should usually be an absolute path). @type filename: str @param attr: attributes to change. @type attr: L{SFTPAttributes} twin32sw+N(tsystplatformt_flagstFLAG_PERMISSIONStostchmodtst_modet FLAG_UIDGIDtchowntst_uidtst_gidt FLAG_AMTIMEtutimetst_atimetst_mtimet FLAG_SIZEtopenttruncatetst_size(tfilenametattr((s/..\python\site-packages\paramiko\sftp_server.pyt set_file_attrscGsótƒ}|j|ƒxÀ|D]¸}t|ƒtkrE|j|ƒqt|ƒtkrg|j|ƒqt|ƒtkr‰|j|ƒqt|ƒtkr«|j |ƒqt dt |ƒdt t|ƒƒƒ‚qW|j |t|ƒƒdS(Nsunknown type for s type ( R/tadd_intRtinttlongt add_int64R-t add_stringtSFTPAttributest_packR,R&t _send_packet(RR7R4targR#titem((s/..\python\site-packages\paramiko\sftp_server.pyt _response°s   .cCs˜tt|ƒtƒs)|j||ƒdS|jd|jƒ|jd7_|rh||j|jƒ|D]6}|j|jƒ|jt|ƒƒ|j |ƒqbW|j t t|ƒƒdS(Ni( t_get_next_filestlenR2tSFTP_EOFR/R\R`RYR-RbRctCMD_NAME(RR7RltflistR#RZ((s/..\python\site-packages\paramiko\sftp_server.pyt _read_folderás    cCsz|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ƒdSd} |}xÑ|||kr"t||||ƒ}t|dƒ}d}| jƒ}xr||kr|j||ƒ}t |ƒtk rä|j||d ƒdS|j|ƒ|t|ƒ7}||7}qW| |jƒ7} qRWtƒ}|j|ƒ|jd ƒ|j| ƒ|j| ƒ|jtt|ƒƒdS( NsInvalid handlesNo supported hash types foundisUnable to stat fileisBlock size too smallRoisUnable to hash files check-file(t get_stringtget_listt get_int64R0RR2tSFTP_BAD_MESSAGEt _hash_classR3tstatRRRaRXtmintnewtreadR-tupdateR|tdigestR/R\R`t add_bytesRctCMD_EXTENDED_REPLY(RR7R#Rktalg_listtstarttlengtht block_sizeR=txtalgnametalgtsttsum_outtoffsettblocklentchunklentcountthash_objR5((s/..\python\site-packages\paramiko\sftp_server.pyt _check_fileïsb                     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(tSFTP_FLAG_READtSFTP_FLAG_WRITERJtO_RDWRtO_WRONLYtO_RDONLYtSFTP_FLAG_APPENDtO_APPENDtSFTP_FLAG_CREATEtO_CREATtSFTP_FLAG_TRUNCtO_TRUNCtSFTP_FLAG_EXCLtO_EXCL(Rtpflagstflags((s/..\python\site-packages\paramiko\sftp_server.pyt_convert_pflags*s        cCs]|jtdt|ƒ|tkry|jƒ}|j|jƒƒ}tj|ƒ}|j ||j j |||ƒƒnà|t kr|jƒ}||j kr¾|j |=|j|tƒdS||jkrü|j|jƒ|j|=|j|tƒdS|j|tdƒnG|tkrá|jƒ}|jƒ}|jƒ} ||jkrh|j|tdƒdS|j|j|| ƒ} t| ƒtkrÎt| ƒdkr¸|j|tƒqÞ|j|t| ƒqY|j|| ƒnx|tkr]|jƒ}|jƒ}|jƒ} ||jkr7|j|tdƒdS|j||j|j|| ƒƒnü|tkr”|jƒ}|j||j j|ƒƒnÅ|t krÚ|jƒ} |jƒ} |j||j j!| | ƒƒn|t"kr#|jƒ}tj|ƒ}|j||j j#||ƒƒn6|t$krZ|jƒ}|j||j j%|ƒƒnÿ|t&kr†|jƒ}|j'||ƒdS|t(krä|jƒ}||j krÄ|j|tdƒdS|j |} |j)|| ƒnu|t*krL|jƒ}|j j+|ƒ}t,t|ƒtƒr9|j|t-|ƒqY|j||ƒn |t.kr´|jƒ}|j j/|ƒ}t,t|ƒtƒr¡|j|t-|ƒqY|j||ƒn¥|t0krC|jƒ}||jkrò|j|tdƒdS|j|j+ƒ}t,t|ƒtƒr0|j|t-|ƒqY|j||ƒn|t1krŒ|jƒ}tj|ƒ}|j||j j2||ƒƒnÍ|t3krü|jƒ}tj|ƒ}||jkrÙ|j|tdƒdS|j||j|j2|ƒƒn]|t4krm|jƒ}|j j5|ƒ}t|ƒtkrZ|j|t6d|dtƒƒqY|j||ƒnì|t7kr³|jƒ}|jƒ}|j||j j8||ƒƒn¦|t9krÿ|jƒ}|j j:|ƒ}|j|t6d|dtƒƒnZ|t;krI|jƒ}|dkr6|j<||ƒqY|j|t=ƒn|j|t=ƒdS(Ns Request: %ssInvalid handleiiRos check-file(>RR%t CMD_NAMEStCMD_OPENRR¬R0Rat _from_msgRmRRVt CMD_CLOSERR2tSFTP_OKRR<R„tCMD_READRƒR‰RR-R|R}RftCMD_DATAt CMD_WRITEtwritet CMD_REMOVEtremovet CMD_RENAMEtrenamet CMD_MKDIRtmkdirt CMD_RMDIRtrmdirt CMD_OPENDIRRzt CMD_READDIRR€tCMD_STATR†Rt CMD_ATTRSt CMD_LSTATtlstatt CMD_FSTATt CMD_SETSTATtchattrt CMD_FSETSTATt CMD_READLINKtreadlinkR~t CMD_SYMLINKtsymlinkt CMD_REALPATHt canonicalizet CMD_EXTENDEDRœtSFTP_OP_UNSUPPORTED(RR4R7R#RxR«RZRkR—RR5toldpathtnewpathRlRyt target_pathtrpathttag((s/..\python\site-packages\paramiko\sftp_server.pyR1<sè  %            &     "  "               "  #  "   "  "   N(t__name__t __module__t__doc__tSFTPServerInterfaceRRR8R:RDt staticmethodR[RftFalseRmRpR2RzR€RœR¬R1(((s/..\python\site-packages\paramiko\sftp_server.pyR)s"          ; (Rg(R×RJR>t Crypto.HashRRtparamiko.commontparamiko.serverRt paramiko.sftptparamiko.sftp_sitparamiko.sftp_attrR…RRtparamiko.sftp_handleRg(((s/..\python\site-packages\paramiko\sftp_server.pyts       ÿ”