o b\@sdZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m ZddlmZmZddlmZddlmZddlmZmZmZmZmZmZmZmZddlm Z ddl!m"Z"m#Z#m$Z$m%Z%dd l&m'Z'm(Z(Gd d d ej)Z*Gd d d e(j+Z,da-da.da/da0ddZ1ddZ2ddZ3Gddde#j4Z5Gdddej6Z6Gdddej7Z7Gdddej8Z8Gdddej9Z:e;dkre2dSdS)z2 Implementation module for the `tkconch` command. N)ListTuple)error)isInKnownHosts)channelcommon connection forwardingkeyssession transportuserauth)tkvt100)deferprotocolreactor tksupport)logusagec@s4eZdZddZddZddZddZd d Zd S) TkConchMenucOstjj|g|Ri||jdt|_|jdtj|ddddj ddddt ||_ |j j d d dd d tj|ddd dj dd ddt ||_ |j j d d d d d tj|ddd dj ddddt ||_ |j j d d dd d tj|ddddj ddddt ||_|jj d d dd d tj|ddddj ddddt ||_|jj d dd dtj||jddj ddd dtj|ddj ddddtj|ddd|_|jj d d dd d tj|d|jdj dddtj|d|jdj dddt ||_|jj d dd dtj|d dj ddd dt ||_|jj d dd dtj|d dj ddd dtj|d!|jdd"|_|jj d d#dtj|d$|jd%d"|_|jj dd#dtj|d&dj ddd'd d tj|ddd(dj dd)ddtj |d*d+|_|jj d d d)d d tj|ddd,dj dd-ddtj |d.d+|_|jj d d d-d d tj|ddd/dj dd0ddtj |d1d+|_|jj d d d0d d tj|d2|jdj ddd3d d |jddd4d5|j d dd d5|j!d6t"j#dS)7NTkConchlocalwleftHostname)anchorjustifytext)columnrowstickynesw)r columnspanr r!PortUsernameCommandIdentityBrowse)commandrzPort Forwarding)rr)heightwidthAdd)rr-)rr RemoveHostLocal)rvariablevalue RemoteremotezAdvanced Options Cipher cipher)nameMAC macz Escape Char escapezConnect!@)weightminsizeWM_DELETE_WINDOW)$TkinterFrame__init__mastertitle StringVarlocalRemoteVarsetLabelgridEntryhostportuserr-identityButtongetIdentityFileListboxforwards addForward removeForward forwardPort forwardHost Radiobutton localForward remoteForwardr?rCrE doConnectgrid_rowconfiguregrid_columnconfigurersysexit)selfargsparamsrm?/usr/lib/python3/dist-packages/twisted/conch/scripts/tkconch.pyrM's            zTkConchMenu.__init__cCs4t}|r|jdtj|jtj|dSdSNr) tkFileDialogaskopenfilenamerYdeleterKENDinsert)rjrrmrmrnr[s zTkConchMenu.getIdentityFilecCs|j}|jdtj|j}|jdtj|jdkr1|jtjd|d|dS|jtjd|d|dS)NrrL::R:) r`getrrrKrsrarQr]rt)rjrWrVrmrmrnr^s    zTkConchMenu.addForwardcCs&|j}|r|j|ddSdSro)r] curselectionremove)rjcurrmrmrnr_s zTkConchMenu.removeForwardc Csd}|jtd<|jtd<|jtd<|jtd<|j}|j}|j}|rA|t j vr9|gt _ nt ddd}|rW|t j vrM|gt _ n |rWt dd d}|r|d krbdtd <n0|dd kr{t|d kr{tt|ddtd <nt|dkr|td <n |rt dd|d}|jrtj|j|jdtjD]}|ddkrt|d dqt|d dqdtdvrtddd\td<td<tdrtds|rt ddd}|rJ|j|jtdr tj}t tj!|t_nt"t#t_$tjsddgt_td}t%tdp$d}t&||ft'(||t)t*j+t*j,d-tdtddS|.dS)NrrVrWrXr-rz Bad cipher.rzBad MAC.nonerE^r"rGzBad escape character '%s'.L@zMissing host or username.rz ~/.ssh/id_rsaz ~/.ssh/id_dsaz{}@{} - TkConch)/rVryoptionsrWrXr-r?rCrESSHClientTransportsupportedCiphers tkMessageBox showerror supportedMACslenchrordrY identitysappendr]rKrsopt_localforwardopt_remoteforwardsplitrNquitdestroyrhstdoutr startLoggingstderr discardLogs handleErrordeferrintmsgr connectTCPSSHClientFactoryframe deiconifyrOformatfocus) rjfinishedr?rCrElinerealoutrVrWrmrmrnresx                       zTkConchMenu.doConnectN)__name__ __module__ __qualname__rMr[r^r_rermrmrmrnr&s ^ rc @sjeZdZUdZgdgdgdgdgdgdgdgd gZgd gd gd gd gdgdgdgdgZejjZ ejj Z e j dge dde De dde De jdde jddde e jdde jdddgdZgZeeed<gZeeeeeeffed<gZeeeeeeffed <d!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+S),GeneralOptionsz,Usage: tkconch [options] host [command] )rXlNzLog in using this user name.)rYiz~/.ssh/identityz&Identity for public key authentication)rEe~z(Set escape character; ``none'' = disable)r?cNzSelect encryption algorithm.)macsmNz.Specify MAC algorithms for protocol version 2.)rWpNz7Connect to this port. Server must be on the same port.) localforwardrNz zGeneralOptions.cCrrmrrrmrmrnrrzlisten-port:host:port)descr)r?rrrr-argumentT)rrepeat)mutuallyExclusive optActions extraActionsr localForwardsremoteForwardscCs|j|dSN)rr)rjrrmrmrn opt_identityzGeneralOptions.opt_identitycC8|d\}}}t|}t|}|j|||ffdSNrw)rrrr)rjf localPort remoteHost remotePortrmrmrnr zGeneralOptions.opt_localforwardcCrr)rrrr)rjrrconnHostconnPortrmrmrnr&rz GeneralOptions.opt_remoteforwardcCsdgtjdd<dS)Nzlibrr)rsupportedCompressionsrjrmrmrn opt_compress,szGeneralOptions.opt_compresscGs>|r|d|d<d|dd|d<dSd|d<d|d<dS)NrrV rr-)join)rjrkrmrmrn parseArgs/s   zGeneralOptions.parseArgsN)rrrsynopsis optParametersoptFlagsr rr_ciphersr_macsr Completions CompleteList CompleterCompleteUserAtHostcompDatarrstr__annotations__rrrrrrrrrrmrmrmrnrsT         rcsJtjrtdtg}|ffdd }|t_t|tjS)Nzcan't ask 2 questions at once!cs|sdS|dkr t|dkr%tdd|}~dt_|dSdt|kr1dkrCnn||rAt|dSdSt|dkrX|rZrRtd|dSdSdS) N z r r4z ) rstoprwritercallbackrrpop)chrespstrespdechormrngotCharEs*      z!deferredAskFrame..gotChar)rr ValueErrorrDeferredrcanvas focus_force)questionrrrrmrrndeferredAskFrame?s  rc Cstjdd}d|vr#|d}|||d|}||d|d=|ddD],}z!||}|dddkrK||dddkrKg|||d<Wq)tyUYq)wt}|t}t|a t j tj tj ddt azt|Wn"tjy}ztd |ttdWYd}~nd}~wwtD]\}}|rtt |rtt |tj|qtjD]\}\} } t jtjd |d | d | qgt_tjD]\}\} } t jtjd |d | d | qgt_tj|dd a| dtj!tj"dtj#tj$dftj tj dt%&||tdr)tds0dtdvr5t 'n|(t)*tt+dS)Nrz-lr"r)z-or-)sidefillexpandz ERROR: %srvrwrx)rz%dx%dr')rrVrXr),rhargvindexrrKTkwithdrawToplevelrmenupackTOPBOTHrr parseOptionsr UsageErrorprintopt_helpriitemshasattrgetattrrtrsrr]rr VT100Framergeometry fontWidthr0 fontHeightr/rinstallremainlooprrun exitStatus) rkrargroottopukrrrhrprmrmrnr`sh  $  $$ " rcCs(ddlm}dat|t)Nrfailurer")twisted.pythonr)r rerrFailurerrr(rmrmrnrs rc@s(eZdZdZddZddZddZdS) rTcCs tdSr)rrrrmrmrn stopFactorys zSSHClientFactory.stopFactorycCstSr)r)rjaddrrmrmrn buildProtocolszSSHClientFactory.buildProtocolcCs tdd|jd|jdS)NrzConnection Failed, Reason: z: )r showwarningtyper8)rj connectorreasonrmrmrnclientConnectionFailedsz'SSHClientFactory.clientConnectionFailedN)rrrnoisyr-r/r4rmrmrmrnrs  rc@s<eZdZddZddZddZddZd d Zd d Zd S)rcCsd||fadS)NzDconch: Remote side disconnected with error code %i conch: reason: %s)r )rjcodedescrmrmrn receiveErrorszSSHClientTransport.receiveErrorcCs d||fatj|||dS)Nz>conch: Sending disconnect with error code %i conch: reason: %s)r r rsendDisconnect)rjr6r3rmrmrnr9s z!SSHClientTransport.sendDisconnectcCs"|stdrtd|dSdS)NrzReceived Debug Message: %s)rrr)rj alwaysDisplaymessagelangrmrmrn receiveDebugs zSSHClientTransport.receiveDebugcCsttd|ddi}|dkrtdS|dkrttdStd|jj kr2td}td}nd td|jj }d td|jj }t |d}d |d d d ||}|d 7}t |d|j|||S)NrVz known-hostsrr" bad host keyz{} ({})z{},{}rzNThe authenticity of host '{}' can't be established. {} key fingerprint is {}.DSARSAsssh-dsssssh-rsaz9 Are you sure you want to continue connecting (yes/no)? )rrrsucceedfailr ConchErrorr getPeerrVrrgetNSr addCallback_cbVerifyHostKey)rjpubKey fingerprintgoodKeyrVkhHostkeyTypequesrmrmrn verifyHostKeys,     z SSHClientTransport.verifyHostKeyc Cs|dvrtdd|j|||S|dkr"tdtdz?td|dd d |ftt j d d }t |}|d |d|d|WdWdS1sZwYWdStyottjw)N)yesnozPlease type 'yes' or 'no': rrQzHost key verification failed. r>zBWarning: Permanently added '%s' (%s) to the list of known hosts. r?r@rAz~/.ssh/known_hostsr r)lowerrrGrHrrrrDopenospath expanduserbase64 b64encode BaseExceptionrr)rjansrIrLrM known_hosts encodedKeyrmrmrnrHs*       & z#SSHClientTransport._cbVerifyHostKeycCs0tdr td}nt}|t|tdS)NrX)rgetpassgetuserrequestServiceSSHUserAuthClient SSHConnection)rjrXrmrmrnconnectionSecures z#SSHClientTransport.connectionSecureN) rrrr8r9r=rOrHrcrmrmrmrnrs rc@s@eZdZUgZeeed<d ddZddZddZ d d Z dS) ra usedFilesNcCs |s d|jtd}t|dS)Nz{}@{}'s password: rVr)rrXrr)rjpromptrmrmrn getPasswords zSSHUserAuthClient.getPasswordcsfddtjD}|sdS|d}t|j|tj|}|d7}tj |s/dSz t j | WStyEYSw)Ncsg|] }|jvr|qSrm)rd)rxrrmrnrsz2SSHUserAuthClient.getPublicKey..rz.pub)rrrrrdrrUrVrWexistsr KeyfromFileblobrZ getPublicKey)rjfilesfilermrrnrls      zSSHUserAuthClient.getPublicKeyc Cstj|jd}tj|sdSz ttj |j WStj yN}z%|j ddkrCd|jd}t |d|jdWYd}~SWYd}~dSd}~ww)Nrzencrypted key with no passwordEnter passphrase for key '%s': )rUrVrWrdrhrrBr rirj keyObject BadKeyErrorrkrrG_cbGetPrivateKey)rjrnrrermrmrn getPrivateKeys  zSSHUserAuthClient.getPrivateKeycCsltj|jd}z tjj||djWStjy5|dkr d|jd}t |d |j |dYSw)Nro)passwordr"rprr) rUrVrWrdr rirjrqrrrrGrs)rjr[countrnrermrmrnrss  z"SSHUserAuthClient._cbGetPrivateKeyr) rrrrdrrrrfrlrtrsrmrmrmrnras   rac@seZdZddZdS)rbc Cstds |ttjr!tjD]\}}t|t||tjqtj rGtj D]!\}}t d ||t d|f}|d|||j |<q'dSdS)Nrz&asking for remote forwarding for {}:{}z0.0.0.0z tcpip-forward)r openChannel SSHSessionrr listenTCPr SSHListenForwardingFactory SSHListenClientForwardingChannelrrrrpackGlobal_tcpip_forwardsendGlobalRequest)rjrhostportrdatarmrmrnserviceStarted-s,   zSSHConnection.serviceStartedN)rrrrrmrmrmrnrb,s rbc@sPeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ dS)rxssessioncCsd|_t}tdr|j|_n|j|_|j|_|jt _ t j tdr3|j |dttdnRtdratdrStjdd}d }t||d }|j |d ||j |d ttdn$td s}tjdd}d }t||d }|j |d ||j |dd|j jjddS)NrrErs subsystemr-rTERMxterm)Prrrspty-reqexecrsshell) escapeModer SSHSessionClientr handleInput dataReceivedrsendEOFconnectionLostrrrrconn sendRequestrNSrUenvironrypackRequest_pty_reqr setTcpNoDelay)rjfoortermwinSize ptyReqDatarmrmrn channelOpenHs0  zSSHSession.channelOpencCs|dvrd|_||dS|jdkr|tdkrd|_dS|jdkr^d|_|dkr5tdtdS|dkrDtt t j dS|dkrUtd |j j dS|d |dSd |_||dS) N)rRrrrEr".zdisconnecting from escaperzrekeying connectionrr)rrrrrrrrUkillgetpidsignalSIGSTOPrr sendKexInit)rjcharrmrmrnris*     zSSHSession.handleInputcCs,|d}tdrtt|t|dS)Nzutf-8r)rrrreprrrrjrrmrmrnrs  zSSHSession.dataReceivedcCs:|tjkrtdt|tj|tjdSdS)Nzgot %s stderr data) rEXTENDED_DATA_STDERRrrrrhrrflush)rjrrrmrmrn extReceiveds  zSSHSession.extReceivedcCstdtjdS)Nzgot eof)rrrhstdincloserrmrmrn eofReceiveds zSSHSession.eofReceivedcCs.td|t|jjdkrtdSdS)Nz closed %sr)rrrrchannelsrrrrmrmrncloseds zSSHSession.closedcCs&ttd|datdtdS)Nz>Lrzexit status: %s)rstructunpackr rrrrmrmrnrequest_exit_statusszSSHSession.request_exit_statuscCs|j|dSr)rrrrmrmrnrrzSSHSession.sendEOFN) rrrr@rrrrrrrrrmrmrmrnrxDs! rx__main__)<__doc__rXr^rUrrrhtkinterrKtkinter.filedialog filedialogrptkinter.messagebox messageboxrtypingrr twisted.conchrtwisted.conch.client.defaultrtwisted.conch.sshrrrr r r r r twisted.conch.uirtwisted.internetrrrrr*rrrLrOptionsrrrr rrrr ClientFactoryrrrarb SSHChannelrxrrmrmrmrnsF    ( >V!3 O0]