o b@@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddlmZddlmZddlmZmZmZddlmZdd lmZmZmZdd lmZmZmZm Z m!Z!m"Z"dd l#m$Z$dd l%m&Z&dd l'm(Z(ddl)m*Z*ddl+m,Z,zddl-Z-Wn e.ydZ-Ynwe e$j/GdddZ0GdddeZ1e eGdddZ2e eGdddZ3e eGdddZ4GdddZ5e*6e3e1eje*6e2e1ejdS)z A UNIX SSH server. N) implementer)ttymodes) ConchUser) ConchError)ISession ISFTPFile ISFTPServer)lsLine) filetransfer forwardingsession) FXF_APPEND FXF_CREATFXF_EXCLFXF_READ FXF_TRUNC FXF_WRITE)portal)ProcessExitedAlready)Logger) components) nativeStringc@seZdZddZdS) UnixSSHRealmcGst|}|d||jfSNr) UnixConchUserlogout)selfusernamemind interfacesuserr!4/usr/lib/python3/dist-packages/twisted/conch/unix.py requestAvatar0szUnixSSHRealm.requestAvatarN)__name__ __module__ __qualname__r#r!r!r!r"r.s rc@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS)rcCst|||_t|j|_|jdg}tD]\}}}}||vr(||q||_ i|_ |j t jtjd|j dtjidS)N)ssessions direct-tcpipssftp)r__init__rpwdgetpwnampwdDatagrpgetgrallappend otherGroups listeners channelLookupupdater SSHSessionr openConnectForwardingClientsubsystemLookupr FileTransferServer)rrl groupnamepasswordgiduserlistr!r!r"r(6s   zUnixConchUser.__init__cCs|jddS)Nr+rr!r!r"getUserGroupIdIszUnixConchUser.getUserGroupIdcCs|jSN)r/r?r!r!r"getOtherGroupsLszUnixConchUser.getOtherGroupscC |jdS)Nr>r?r!r!r" getHomeDirO zUnixConchUser.getHomeDircCrC)Nr>r?r!r!r"getShellRrFzUnixConchUser.getShellcCst|\}}ddlm}z|j|j|t|j||ftj|d}Wn t y,YdSw||j ||f<|dkrF| d}dt d|fSdS)Nrreactor) interfacer<z>L)r unpackGlobal_tcpip_forwardtwisted.internetrJ _runAsUser listenTCPSSHListenForwardingFactoryconn SSHListenServerForwardingChannel BaseExceptionr0getHoststructpack)rdata hostToBind portToBindrJlistenerr!r!r"global_tcpip_forwardUs*   z"UnixConchUser.global_tcpip_forwardcCsDt|\}}|j||fd}|sdS|j||f=||jdS)NrrL)r rMr0getrO stopListening)rrXrYrZr[r!r!r"global_cancel_tcpip_forwardns  z)UnixConchUser.global_cancel_tcpip_forwardcCs:|jD]}||jq|jjd|jt|jddS)Nz,avatar {username} logging out ({nlisteners}))r nlisteners)r0valuesrOr^_loginforlen)rr[r!r!r"rws zUnixConchUser.logoutc OsDt}t}t}|\}}tdtdt|t|t|zt |}Wnt yB|||fg}YnwzD|D]%} | d} t | dkrV| dpWd}t | dkrb| dpci}| |i|} qFWtdtdt|t|t|| Stdtdt|t|t|w)NrrLr!r<) osgeteuidgetegid getgroupsr@setegidseteuid setgroupsrBiter TypeErrorrd) rfargskweuidegidgroupsuidr:ifuncrr!r!r"rOs@                zUnixConchUser._runAsUserN) r$r%r&r(r@rBrErHr\r_rrOr!r!r!r"r5s rc@sneZdZeZdddZdddZddZd d Zd d Z d dZ ddZ ddZ ddZ ddZddZdS)SSHSessionForUnixConchUserNcCs:|dur ddlm}||_||_ddi|_d|_d|_dS)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. NrrIPATHz/bin:/usr/bin:/usr/local/bin)rNrJ_reactoravatarenvironptyptyTuple)rr{rJr!r!r"r(s   z#SSHSessionForUnixConchUser.__init__rLc CstsdS|jjjjj}tdt |\}|j ddd}t }t |}t ||d}t }|r9tjp;tj|_|jj|_||_|dd|_||f|_|rg|jj|_t|d|_|dddf|_ttj} | || ttj } | || dS)NLr<rDg.Ar)!utmpr{rR transportgetPeerhostrVunpacksocket inet_atonr~timeint UtmpEntry USER_PROCESS DEAD_PROCESSut_typer}pidut_pidut_lineut_idut_tvrut_user gethostbyaddrut_host ut_addr_v6 UtmpRecord UTMP_FILE pututlineendutent WTMP_FILE) rloggedIn ipAddresspackedIpttyNamett1t2entryabr!r!r" addUTMPEntrys0        z'SSHSessionForUnixConchUser.addUTMPEntrycCsF||jd<||_||_t\}}t|}||jd<|||f|_dS)NTERMSSH_TTY)r|winSizemodesr}openptyrettynamer~)rterm windowSizermasterslaverr!r!r"getPtys    z!SSHSessionForUnixConchUser.getPtyc CsB|js |jdtd|j\}}|j}|j}|jj|j d<||j d<||j d<t j |}|jj jj}|jj jj}|jd|jd|j|j d<||jj||d|g|j ||||jd |_|t|jtjtjd g|jR|j r|!|jj"|_#|j$|j_"|jj jj%d dS) Nz'tried to get shell without pty, failingzno ptyUSERHOMESHELL SSH_CLIENT-usePTY4HrL)&r~rberrorrr{r@rErHrr|repathbasenamerRrrrUrportgetPtyOwnershiprz spawnProcessr}rfcntlioctlfilenotty TIOCSWINSZrVrWrrsetModeswriteoldWrite _writeHack setTcpNoDelay) rprotortr:homeDirshell shellExecpeerrr!r!r" openShells>         &  z$SSHSessionForUnixConchUser.openShellc Cs|j\}}|j}|jpd}||jd<|d|f}|jjjj}|jjjj} |j d|j d| j |jd<|j rD| |j j||||j||||j pSdd|_|j re||jre||jjjjddS) Nz/bin/shrz-crrrrrL)r{r@rErHr|rRrrrUrrr~rrzrr}rrrr) rrcmdrtr:rrcommandrrr!r!r" execCommands2     z&SSHSessionForUnixConchUser.execCommandc Cst|jdd}|j\}}tt}}tdtdzt |jd||Wt|t|dSt|t|w)Nr<rDr) restatr~r{r@rfrgrirjchown)rttyGidrtr:rqrrr!r!r"rs    z*SSHSessionForUnixConchUser.getPtyOwnershipc Cs|j}t|}|jD]n\}}|tjvrq tj|}t|dkrF|\}}tt|s,q t t|}|r<|||B||<q |||@||<q |dkrVt td||tj <q |dkrft td||tj <q tt|slq t t|}t |f|tj |<q t|tj|dS)Nr<OSPEEDBISPEED)r}r tcgetattrrrrTTYMODESrdhasattrgetattrrrbytesCC tcsetattrTCSANOW) rr}attrmode modeValuettyModeflagttyAttrttyvalr!r!r"rs.       z#SSHSessionForUnixConchUser.setModescCs|jr |jdSdSrA)r} closeStdinr?r!r!r" eofReceived8sz&SSHSessionForUnixConchUser.eofReceivedc Cs|jr tj|jdr t|jdd}t|jdd||jrAz|jdWn tt fy6Ynw|j | d|j ddS)Nr<rDrHUPz shell closed)r~rerexistsrrr} signalProcessOSErrorrloseConnectionrrbrc)rttyGIDr!r!r"closed<s  z!SSHSessionForUnixConchUser.closedcCs0||_t|jtjtjdg|jRdS)Nr) rrrr}rrrrVrW)rrr!r!r" windowChangedIs*z(SSHSessionForUnixConchUser.windowChangedcCs\|jdur't|jd}|tj@s'|tj@r'|jjj ddt || |dS)zF Hack to send ignore messages when we aren't echoing. Nr') r}rrrECHOICANONr{rRr sendIgnorerdr)rrXrr!r!r"rMs z%SSHSessionForUnixConchUser._writeHackrA)rL)r$r%r&rrbr(rrrrrrrrrrr!r!r!r"rxs   !  rxc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#S)$SFTPServerForUnixConchUsercCs ||_dSrA)r{)rr{r!r!r"r(ZrFz#SFTPServerForUnixConchUser.__init__cCsrd|vrd|vrt||d|dd|vrt||dd|vr5d|vr7t||d|dfdSdSdS)zl NOTE: this function assumes it runs as the logged-in user: i.e. under _runAsUser() rtr: permissionsatimemtimeN)rerchmodutimerrattrsr!r!r" _setAttrs]sz$SFTPServerForUnixConchUser._setAttrscCs&|j|j|j|jt|jt|jdS)N)sizertr:rrr)st_sizest_uidst_gidst_moderst_atimest_mtimersr!r!r" _getAttrsisz$SFTPServerForUnixConchUser._getAttrscCs"|j}tjt|jt|SrA)r{rErerjoinr)rrhomer!r!r"_absPathss z#SFTPServerForUnixConchUser._absPathcCsiSrAr!)r otherVersionextDatar!r!r" gotVersionwz%SFTPServerForUnixConchUser.gotVersioncCst|||||SrA) UnixSFTPFiler )rfilenameflagsrr!r!r"openFilezz#SFTPServerForUnixConchUser.openFilecC||}|jtj|SrA)r r{rOreremove)rrr!r!r" removeFile} z%SFTPServerForUnixConchUser.removeFilecCs&||}||}|jtj||SrA)r r{rOrerename)roldpathnewpathr!r!r" renameFile  z%SFTPServerForUnixConchUser.renameFilecCs,||}|jtj|ff|j||ffgSrA)r r{rOremkdirrrr!r!r" makeDirectorys z(SFTPServerForUnixConchUser.makeDirectorycCs||}|jtj|dSrA)r r{rOrermdirrrr!r!r"removeDirectorys z*SFTPServerForUnixConchUser.removeDirectorycCst|||SrA)UnixSFTPDirectoryr r#r!r!r" openDirectorysz(SFTPServerForUnixConchUser.openDirectorycCs:||}|r|jtj|}n|jtj|}||SrA)r r{rOrerlstatr )rr followLinksr r!r!r"getAttrss  z#SFTPServerForUnixConchUser.getAttrscCs ||}|j|j||dSrA)r r{rOrrr!r!r"setAttrss z#SFTPServerForUnixConchUser.setAttrscCrrA)r r{rOrereadlinkr#r!r!r"readLinkrz#SFTPServerForUnixConchUser.readLinkcCs&||}||}|jtj||SrA)r r{rOresymlink)rlinkPath targetPathr!r!r"makeLinkrz#SFTPServerForUnixConchUser.makeLinkcCstj||SrA)rerrealpathr r#r!r!r"realPathsz#SFTPServerForUnixConchUser.realPathcCtrANotImplementedError)rextNamerr!r!r"extendedRequestrz*SFTPServerForUnixConchUser.extendedRequestN)r$r%r&r(rr r rrrrr!r$r&r)r*r,r0r2r7r!r!r!r"rXs$   rc@s<eZdZddZddZddZddZd d Zd d Zd S)rcCs ||_d}|t@tkr|t@dkrtj}|t@tkr#|t@dkr#tj}|t@tkr2|t@tkr2tj}|t@tkr=|tjO}|t @t krH|tj O}|t @t krS|tj O}|t @t kr^|tjO}d|vrj|d}|d=nd}|jtj|||}|r|j|j||||_dS)Nrri)serverrrreO_RDONLYO_WRONLYO_RDWRr O_APPENDrO_CREATrO_TRUNCrO_EXCLr{rOopenrfd)rr8rrr openFlagsrrAr!r!r"r(s0         zUnixSFTPFile.__init__cCs|jjtj|jSrA)r8r{rOrecloserAr?r!r!r"rCrzUnixSFTPFile.closecC,|jjtj|j|dfftj|j|ffgSr)r8r{rOrelseekrAread)roffsetlengthr!r!r" readChunk zUnixSFTPFile.readChunkcCrDr)r8r{rOrerErAr)rrGrXr!r!r" writeChunkrJzUnixSFTPFile.writeChunkcCs |jjtj|j}|j|SrA)r8r{rOrefstatrAr rr!r!r"r)s zUnixSFTPFile.getAttrscCr3rAr4)rrr!r!r"r*rzUnixSFTPFile.setAttrsN) r$r%r&r(rCrIrKr)r*r!r!r!r"rs rc@s0eZdZddZddZddZeZddZd S) r%cCs"||_|jtj||_||_dSrA)r8r{rOrelistdirfilesdir)rr8 directoryr!r!r"r(s zUnixSFTPDirectory.__init__cCs|SrAr!r?r!r!r"__iter__rzUnixSFTPDirectory.__iter__cCsbz|jd}Wn tytw|jjtjtj |j |}t ||}|j |}|||fSr)rNpop IndexError StopIterationr8r{rOrer'rr rOr r )rrnr longnamerr!r!r"__next__s    zUnixSFTPDirectory.__next__cCs g|_dSrA)rNr?r!r!r"rCrFzUnixSFTPDirectory.closeN)r$r%r&r(rQrVnextrCr!r!r!r"r%s  r%)7__doc__rr,rer}r)rrVrrzope.interfacer twisted.conchrtwisted.conch.avatarrtwisted.conch.errorrtwisted.conch.interfacesrrrtwisted.conch.lsr twisted.conch.sshr r r twisted.conch.ssh.filetransferr rrrrr twisted.credrtwisted.internet.errorrtwisted.loggerrtwisted.pythonrtwisted.python.compatrr ImportErrorIRealmrrrxrrr%registerAdapterr!r!r!r"sV             i:V1