ϪfBdZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z mZmZddlmZddlmZddlmZddlmZdd lmZmZmZdd lmZdd lmZm Z m!Z!dd l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(dd l)m*Z*ddl+m,Z,ddl-m.Z.ddl/m0Z0ddl1m2Z2ddl3m4Z4ddl5m6Z6 ddl7Z7ee*jrGddZ:GddeZ;eeGddZ<eeGddZ=eeGddZ>GddZ?e4je=e;ej6e4jeL)runpackGlobal_tcpip_forwardtwisted.internetr^ _runAsUser listenTCPSSHListenForwardingFactoryconn SSHListenServerForwardingChannelr@getHoststructpack BaseException)r'data hostToBind portToBindr^listeners r,global_tcpip_forwardz"UnixConchUser.global_tcpip_forwardcs!+!F!Ft!L J, !!55II,?? %' H8@DNNJ 3 4Q%--/2 &++dJ777  sAB00 B<;B<ctj|\}}|jj||fd}|sy|j||f=|j |j y)Nrr`)rrar@getrc stopListening)r'rlrmrnros r,global_cancel_tcpip_forwardz)UnixConchUser.global_cancel_tcpip_forward|s^!+!F!Ft!L J>>%%z:&>E NNJ 3 4 ../r.c|jjD]}|j|j|jj d|j t|jy)Nz,avatar {username} logging out ({nlisteners}))r( nlisteners)r@valuesrcrs_loginfor(len)r'ros r,r&zUnixConchUser.logouts[--/ 4H OOH22 3 4  :]]4>>*  r.ctj}tj}tj}|j \}}tj dtj dtj|jtj |tj | t|} |D]A} | d} t| dkDxr| dxsd}t| dkDxr| dxsi}| |i|} C tj dtj dtj|tj |tj | S#t$r |||fg}YwxYw#tj dtj dtj|tj |tj |wxYw)Nrr`r4rM) osgeteuidgetegid getgroupsrQsetegidseteuid setgroupsrTiter TypeErrorrz) r'fargskweuidegidgroupsuidrJifuncrs r,rczUnixConchUser._runAsUserszz|zz|&&(S 1  1  T((*+ 3 3 QA  &t1vz*ad0bVaZ(AaD.B$%"%  & JJqM JJqM LL JJt  JJt  T2A  JJqM JJqM LL JJt  JJt s  FAFFFA+HN)r(strr0None)r0r) r1r2r3r8rQrTrWr[rprtr&rcr4r.r,r$r$As0P*! 2 r.r$c`eZdZeZd dZddZdZdZdZ dZ dZ d Z d Z d Zd Zy)SSHSessionForUnixConchUserNc^|ddlm}||_||_ddi|_d|_d|_y)a Construct an C{SSHSessionForUnixConchUser}. @param avatar: The L{UnixConchUser} for whom this is an SSH session. @param reactor: An L{IReactorProcess} used to handle shell and exec requests. Uses the default reactor if None. Nrr]PATHz/bin:/usr/bin:/usr/local/bin)rbr^_reactoravatarenvironptyptyTuple)r'rr^s r,r8z#SSHSessionForUnixConchUser.__init__s5 ? 0   >?  r.ctsy|jjjjj j }t jdtj|\}|jddd}tj}t|}t||z dz}tj}|xrtjxstj|_|j"j$|_||_|dd|_||f|_|rC|jj.|_tj2|d|_|dddf|_tj8tj:} | j=|| j?tj8tj@} | j=|| j?y)NLrMrVg.Ar)!utmprrf transportgetPeerhostriunpacksocket inet_atonrtimeint UtmpEntry USER_PROCESS DEAD_PROCESSut_typerpidut_pidut_lineut_idut_tvr(ut_user gethostbyaddrut_host ut_addr_v6 UtmpRecord UTMP_FILE pututlineendutent WTMP_FILE) r'loggedIn ipAddresspackedIpttyNamett1t2entryabs r, addUTMPEntryz'SSHSessionForUnixConchUser.addUTMPEntrysk KK$$..88@@BGG mmC)9)9))DE --"12& IIK V !b&C   6T%6%6K$:K:K xx||  bcl 2h  KK00EM"00;A>EM (!Q2E  OODNN + E OODNN + E r.c||jd<||_||_tj\}}t j |}||jd<|||f|_y)NTERMSSH_TTY)rwinSizemodesropenptyr|ttynamer)r'term windowSizermasterslavers r,getPtyz!SSHSessionForUnixConchUser.getPtysW# V!   **U#") Y0 r.c |js&|jjdtd|jj \}}|jj }|jj}|jj|jd<||jd<||jd<tjj|}|jjjjj}|jjjjj!}|j"d|j$d|j$|jd<|j'|j(j+||d|g|j||||j |_|j/t1j2|j,j5t6j8t;j<d g|j>|j@r|jC|jjD|_#|jH|j_"|jjjjjKd y) Nz'tried to get shell without pty, failingzno ptyUSERHOMESHELL SSH_CLIENT-usePTY4Hr`)&rrxerrorr rrQrWr[r(rr|pathbasenamerfrrrhrportgetPtyOwnershipr spawnProcessrrfcntlioctlfilenotty TIOCSWINSZrirjrrsetModeswriteoldWrite _writeHack setTcpNoDelay) r'protorrJhomeDirshell shellExecpeerrs r, openShellz$SSHSessionForUnixConchUser.openShells}} IIOOE FX& &;;--/S++((* $$&#{{33 V& V % WGG$$U+ {{))33;;={{))33;;=(, {!DII;a {%K \" ==--   _  LL   ==.    DHHOO%s~~v{{47W$,,7WX :: MMO-- $ "",,::1=r.c |jj\}}|jj}|jjxsd}||jd<|d|f}|jj j j j}|jj j j j} |jd|jd| j|jd<|jr|j|jj||||j||||jxsd|_|jr,|j!|j"r|j%|jj j j j'dy) Nz/bin/shrz-crrrrr`)rrQrWr[rrfrrrhrrrrrrrrrrr) r'rcmdrrJrrcommandrrs r, execCommandz&SSHSessionForUnixConchUser.execCommandsj;;--/S++((* $$&3)& V$${{))33;;={{))33;;=(, {!DII;a {%K \" ==  "==--    LL   ==%A.   ==    zz  "",,::1=r.c(tj|jdd}|jj \}}tj tj }}tjdtjd tj|jd||tj|tj|y#tj|tj|wxYw)NrMrVr) r|statrrrQr}r~rrchown)r'ttyGidrrJrrs r,rz*SSHSessionForUnixConchUser.getPtyOwnershipsq)*1-;;--/SZZ\2::|j jjjddt|zz|j|y)zF Hack to send ignore messages when we aren't echoing. Nr7) rrrrECHOICANONrrfr sendIgnorerzr)r'rlrs r,rz%SSHSessionForUnixConchUser._writeHack[sy 88 ==!23A6D#((?tcjj'8   **55fCI 6NO dr.rS)r`)r1r2r3rrxr8rrrrrrr rrrr4r.r,rrsB 8D 41>B>6 76" 'Yr.rcreZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZy)SFTPServerForUnixConchUserc||_yrS)r)r'rs r,r8z#SFTPServerForUnixConchUser.__init__hs  r.cd|vr!d|vrtj||d|dd|vrtj||dd|vr$d|vrtj||d|dfyyy)zl NOTE: this function assumes it runs as the logged-in user: i.e. under _runAsUser() rrJ permissionsatimemtimeN)r|rchmodutimer'rattrss r, _setAttrsz$SFTPServerForUnixConchUser._setAttrsksv E>eun HHT5<u 6 E ! HHT5/ 0 e 5 0 HHTE'NE'N; <!1 r.c|j|j|j|jt |j t |j dS)N)sizerrJr r!r")st_sizest_uidst_gidst_moderst_atimest_mtimer'ss r, _getAttrsz$SFTPServerForUnixConchUser._getAttrsws>II888899__   r.c|jj}tjj t |jt |SrS)rrWr|rjoinr)r'rhomes r,_absPathz#SFTPServerForUnixConchUser._absPaths7{{%%'ww||L3\$5GHHr.ciSrSr4)r' otherVersionextDatas r, gotVersionz%SFTPServerForUnixConchUser.gotVersions r.c<t||j|||SrS) UnixSFTPFiler6)r'filenameflagsr&s r,openFilez#SFTPServerForUnixConchUser.openFilesD$--"95%HHr.cx|j|}|jjtj|SrS)r6rrcr|remove)r'r=s r, removeFilez%SFTPServerForUnixConchUser.removeFiles+==*{{%%bii::r.c|j|}|j|}|jjtj||SrS)r6rrcr|rename)r'oldpathnewpaths r, renameFilez%SFTPServerForUnixConchUser.renameFiles;--(--({{%%bii'BBr.c|j|}|jjtj|ff|j ||ffgSrS)r6rrcr|mkdirr'r%s r, makeDirectoryz(SFTPServerForUnixConchUser.makeDirectorysG}}T"{{%%hh 4>>D%="A B  r.cz|j|}|jjtj|yrS)r6rrcr|rmdirr'rs r,removeDirectoryz*SFTPServerForUnixConchUser.removeDirectorys(}}T" rxx.r.c8t||j|SrS)UnixSFTPDirectoryr6rMs r, openDirectoryz(SFTPServerForUnixConchUser.openDirectorys t}}T':;;r.c|j|}|r+|jjtj|}n*|jjtj |}|j |SrS)r6rrcr|rlstatr2)r'r followLinksr1s r,getAttrsz#SFTPServerForUnixConchUser.getAttrssV}}T"  &&rww5A &&rxx6A~~a  r.ct|j|}|jj|j||yrS)r6rrcr'r%s r,setAttrsz#SFTPServerForUnixConchUser.setAttrss*}}T" t~~tU;r.cx|j|}|jjtj|SrS)r6rrcr|readlinkrMs r,readLinkz#SFTPServerForUnixConchUser.readLinks+}}T"{{%%bkk488r.c|j|}|j|}|jjtj||SrS)r6rrcr|symlink)r'linkPath targetPaths r,makeLinkz#SFTPServerForUnixConchUser.makeLinks;==*]]:. {{%%bjj*hGGr.c^tjj|j|SrS)r|rrealpathr6rMs r,realPathz#SFTPServerForUnixConchUser.realPaths ww d 344r.ctrSNotImplementedError)r'extNamer9s r,extendedRequestz*SFTPServerForUnixConchUser.extendedRequest!!r.N)r1r2r3r8r'r2r6r:r?rBrGrJrNrQrUrWrZr_rbrgr4r.r,rrfs[ = II;C  /<!<9H 5"r.rc0eZdZdZdZdZdZdZdZy)r<c||_d}|tztk(r|tzdk(rtj}|tztk(r|tzdk(rtj }|tztk(r |tztk(rtj }|tztk(r|tjz}|tztk(r|tjz}|tztk(r|tjz}|tztk(r|tjz}d|vr |d}|d=nd}|jj!tj"|||}|r'|jj!|j$||||_y)Nrr i)serverrrr|O_RDONLYO_WRONLYO_RDWRrO_APPENDrO_CREATrO_TRUNCrO_EXCLrrcopenr'fd)r'rkr=r>r& openFlagsrrts r,r8zUnixSFTPFile.__init__sC  8 x 'EI,=,B I 9  )eh.>!.C I 9  )eh.>(.J I :  +  $I 9  )  #I 9  )  #I 8 x '  "I E !'Dm$D ]] % %bggxD I  MM $ $V%5%5x Gr.c~|jjjtj|j SrS)rkrrcr|closertrPs r,rwzUnixSFTPFile.closes'{{!!,,RXXtww??r.c|jjjtj|j |dfftj |j |ffgSNr)rkrrcr|lseekrtread)r'offsetlengths r, readChunkzUnixSFTPFile.readChunksM{{!!,,hh&!, -$''69J/K L  r.c|jjjtj|j |dfftj |j |ffgSry)rkrrcr|rzrtr)r'r|rls r, writeChunkzUnixSFTPFile.writeChunksL{{!!,,hh&!, -477D//J K  r.c|jjjtj|j }|jj |SrS)rkrrcr|fstatrtr2r0s r,rUzUnixSFTPFile.getAttrss; KK   ) )"((DGG <{{$$Q''r.ctrSrd)r'r&s r,rWzUnixSFTPFile.setAttrsrhr.N) r1r2r3r8rwr~rrUrWr4r.r,r<r<s!6@  ("r.r<c(eZdZdZdZdZeZdZy)rPc~||_|jjtj||_||_yrS)rkrrcr|listdirfilesdir)r'rk directorys r,r8zUnixSFTPDirectory.__init__s, ]]--bjj)D r.c|SrSr4rPs r,__iter__zUnixSFTPDirectory.__iter__s r.cp |jjd}|jjj t j t jj|j|}t||}|jj|}|||fS#t$rtwxYwry)rpoprkrrcr|rSrr4rrr2 IndexError StopIteration)r'rr1longnamer&s r,__next__zUnixSFTPDirectory.__next__s ( q!A ""--bhh TXXq8QRAa|HKK))!,Ex' '    s B%%B5cg|_yrS)rrPs r,rwzUnixSFTPDirectory.closes  r.N)r1r2r3r8rrnextrwr4r.r,rPrPs  ( Dr.rP)A__doc__ __future__rrr<r|rr9rrirrtypingrrrzope.interfacer twisted.conchrtwisted.conch.avatarr twisted.conch.errorr twisted.conch.interfacesr r r twisted.conch.lsrtwisted.conch.sshrrrtwisted.conch.ssh.filetransferrrrrrr twisted.credrtwisted.cred.errorrtwisted.internet.errorrtwisted.internet.interfacesrtwisted.loggerrtwisted.pythonrtwisted.python.compatrr ImportErrorIRealmr r$rrr<rPregisterAdapterr4r.r,rse# ((&"**EE#?? *76!%.  V]] 0 0 0hIhV Xvvvr [S"S"S"l Y."."."b4  |/G/G 5}gFVFVW{ Ds$EE"!E"