�
=OXc@sdZddlZddlZddlZddlmZmZddlmZddl m
Z
mZmZm
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@ied6ed
6ZAde
efd��YZBddlCmDZDdS(s
Server-mode SFTP support.
i����N(tmd5tsha1(tutil(tBaseSFTPtMessagetSFTP_FAILUREtSFTP_PERMISSION_DENIEDtSFTP_NO_SUCH_FILE(tSFTPServerInterface(tSFTPAttributes(tDEBUG(tlongtstring_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_SETSTATtCMD_FSETSTATtCMD_READLINKtCMD_SYMLINKtCMD_REALPATHtCMD_EXTENDEDtSFTP_OP_UNSUPPORTEDRRt
SFTPServercBs�eZdZed�Zd�Zd�Zd�Zed��Z ed��Z
d�Zed�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_tabletfolder_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|��|jttj
��dSXt|�}|j�}y|j|||�Wq=t
k
rS}|jtdt|��|jttj
��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|�qtdt
|�dt
t |����qW|j||�dS(Nsunknown type for s type (Rtadd_intt
isinstanceRt add_int64tintRR
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�|tkr|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
RR�RR�R"R#twriteR$tremoveR%trenameR&tmkdirR'trmdirR(R�R)R�R*R�RHRIR+R,tlstatR-R.tchattrR/R0treadlinkRR1tsymlinkR2tcanonicalizeR3R�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__RR6RLRbRdtstaticmethodRlR�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.py3compatRRR
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$("�
�� |