Current File : //lib/python2.7/site-packages/paramiko/sftp_server.pyc
�
=OXc@sdZddlZddlZddlZddlmZmZddlmZddl	m
Z
mZmZm
Z
mZddlmZddlmZddlmZdd	lmZmZmZmZdd
lmZddl	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_typestbytes_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_RMDIRtCMD_OPENDIRtCMD_READDIRtCMD_STATt	CMD_ATTRSt	CMD_LSTATt	CMD_FSTATtCMD_SETSTATtCMD_FSETSTATtCMD_READLINKtCMD_SYMLINKtCMD_REALPATHtCMD_EXTENDEDtSFTP_OP_UNSUPPORTEDRRt
SFTPServercBs�eZdZed�Zd�Zd�Zd�Zed��Z	ed��Z
d�Ze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 class sftp_si:
            a subclass of `.SFTPServerInterface` to use for handling individual
            requests.
        s.sftpiN(Rt__init__Rt
get_transportRt
get_loggertget_log_channeltloggertget_hexdumptultra_debugtnext_handlet
file_tabletfolder_tabletserver(tselftchanneltnameR@tsftp_sitlargstkwargst	transport((s8/usr/lib/python2.7/site-packages/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/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyRLVs
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: (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~|jj�tt|�j�x!|jj�D]}|j�q0Wx!|jj�D]}|j�qTWi|_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_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�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_modetFLAG_UIDGIDtchowntst_uidtst_gidtFLAG_AMTIMEtutimetst_atimetst_mtimet	FLAG_SIZEtopenttruncatetst_size(tfilenametattrRg((s8/usr/lib/python2.7/site-packages/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dt
|�dt
t	|����qW|j||�dS(Nsunknown type for s type (Rtadd_intt
isinstanceRt	add_int64tintRR
t
add_stringRIR	t_packRXRRt_send_packet(RARaR^targRPtitem((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyt	_response�s	

.cCs�tt|�t�s)|j||�dS|jtd|j��|jd7_|rn||j|j�<n||j	|j�<|j
|t|j��dS(Nshx%di(RHRIt
SFTPHandleR]t	_set_nameRR=R?t	_get_nameR>R�R(RARathandletfolder((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyt_send_handle_response�scCsT|dkr7yt|}Wq7tk
r3d}q7Xn|j|t||d�dS(NtUnknownt(tNoneRt
IndexErrorR�R(RARatcodetdesc((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyR]�s

cCsh|jj|�}tt|�t�rTt�}|j|�|j||t�dS|j	||�dS(N(
R@tlist_folderRHRIRJR�t
_set_filesR�RUR](RARatpathtrespR�((s8/usr/lib/python2.7/site-packages/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�R�R�R�R(RARaR�tflistRPR�((s8/usr/lib/python2.7/site-packages/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}q�W|
|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/usr/lib/python2.7/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�|tjO}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|t�dS||jkr�|j|j�|j|=|j|t�dS|j|td�nM|tkr�|j
�}|j�}|j�}	||jkrh|j|td�dS|j|j||	�}
t|
ttf�r�t|
�dkr�|j|t�q�|j|t|
�q_|j||
�n{|tkr`|j
�}|j�}|j
�}
||jkr:|j|td�dS|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|td�dS|j|}
|j+||
�nx|t,krO|j�}|j
j-|�}t.t/|�t�r<|j|t0|�q_|j||�n|t1kr�|j�}|j
j2|�}t.t/|�t�r�|j|t0|�q_|j||�n�|t3krF|j
�}||jkr�|j|td�dS|j|j-�}t.t/|�t�r3|j|t0|�q_|j||�n|t4kr�|j�}tj|�}|j||j
j5||��n�|t6kr�|j
�}tj|�}||jkr�|j|td�dS|j||j|j5|��n`|t7krs|j�}|j
j8|�}t|ttf�r`|j|t9d|dt��q_|j||�n�|t:kr�|j�}|j�}|j||j
j;||��n�|t<kr|j�}|j
j=|�}|j|t9d|dt��nZ|t>krO|j�}|dkr<|j?||�q_|j|t@�n|j|t@�dS(NsRequest: %ssInvalid handleiiR�s
check-file(ARLR
RRtget_textR�R[R	t	_from_msgR�R@R~RR�R?R]R R>RfRR!R�R�R�R
RR�RR�R"R#twriteR$tremoveR%trenameR&tmkdirR'trmdirR(R�R)R�R*R�RHRIR+R,tlstatR-R.tchattrR/R0treadlinkRR1tsymlinkR2tcanonicalizeR3R�R4(RAR^RaRPR�R�R�R�R�R�R_toldpathtnewpathR�R�ttarget_pathtrpathttag((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyR\@s�%

&""
"#"""N(t__name__t
__module__t__doc__RR6RLRbRdtstaticmethodRlR�R�tFalseR�R�R]R�R�R�R�R\(((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyR55s				
				;	(R�(ER�RrRhRnthashlibRRtparamikoRt
paramiko.sftpRRRRRtparamiko.sftp_siRtparamiko.sftp_attrR	tparamiko.commonR
tparamiko.py3compatRRR
Rtparamiko.serverRRRRRRRRRRRRRRRRRR R!R"R#R$R%R&R'R(R)R*R+R,R-R.R/R0R1R2R3R4R�R5tparamiko.sftp_handleR�(((s8/usr/lib/python2.7/site-packages/paramiko/sftp_server.pyt<module>s$("�
��