o
    b\                     @   s  d Z ddlZddlZddlZddlZddlZddlZddlZddl	m
Z ddlmZ ddlmZmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZ ddlm Z  ddl!m"Z"m#Z#m$Z$m%Z% dd	l&m'Z'm(Z( G d
d dej)Z*G dd de(j+Z,da-da.da/da0dd Z1dd Z2dd Z3G dd de#j4Z5G dd dej6Z6G dd dej7Z7G dd dej8Z8G dd dej9Z:e;dkre2  dS dS )z2
Implementation module for the `tkconch` command.
    N)ListTuple)error)isInKnownHosts)channelcommon
connection
forwardingkeyssession	transportuserauth)tkvt100)deferprotocolreactor	tksupport)logusagec                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TkConchMenuc                 O   s  t jj| g|R i | | jd t  | _| jd t j| ddddj	dddd t 
| | _| jj	d	d	dd
d t j| ddddj	dd	dd t 
| | _| jj	d	d	d	d
d t j| ddddj	dddd t 
| | _| jj	d	d	dd
d t j| ddddj	dddd t 
| | _| jj	d	d	dd
d t j| ddddj	dddd t 
| | _| jj	d	dd
d t j| | jddj	ddd
d t j| ddj	dddd t j| ddd| _| jj	d	d	dd
d t j| d| jdj	ddd t j| d| jdj	ddd t 
| | _| jj	d	dd
d t j| ddj	ddd
d t 
| | _| jj	d	dd
d t j| d dj	ddd
d t j| d!| jdd"| _| jj	d	d#d t j| d$| jd%d"| _| jj	dd#d t j| d&dj	ddd'd
d t j| ddd(dj	dd)dd t j
| d*d+| _| jj	d	d	d)d
d t j| ddd,dj	dd-dd t j
| d.d+| _| jj	d	d	d-d
d t j| ddd/dj	dd0dd t j
| d1d+| _| jj	d	d	d0d
d t j| d2| jdj	ddd3d
d | jddd4d5 | j d	dd	d5 | j!d6t"j# d S )7NTkConchlocalwleftHostname)anchorjustifytext   )columnrowsticky   nesw)r   
columnspanr    r!   PortUsername   Command   Identity   Browse)commandr   zPort Forwarding)r      r   )heightwidthAdd)r   r-      )r   r    Remove   HostLocal)r   variablevalue	   RemoteremotezAdvanced Options
   Cipher   cipher)nameMAC   maczEscape Char   escapezConnect!   @   )weightminsizeWM_DELETE_WINDOW)$TkinterFrame__init__mastertitle	StringVarlocalRemoteVarsetLabelgridEntryhostportuserr-   identityButtongetIdentityFileListboxforwards
addForwardremoveForwardforwardPortforwardHostRadiobuttonlocalForwardremoteForwardr?   rC   rE   	doConnectgrid_rowconfiguregrid_columnconfigurer   sysexit)selfargsparams rm   ?/usr/lib/python3/dist-packages/twisted/conch/scripts/tkconch.pyrM   '   s   


zTkConchMenu.__init__c                 C   s4   t  }|r| jdtj | jtj| d S d S Nr   )tkFileDialogaskopenfilenamerY   deleterK   ENDinsert)rj   rrm   rm   rn   r[      s
   zTkConchMenu.getIdentityFilec                 C   s   | j  }| j dtj | j }| jdtj | j dkr1| jtjd| d|  d S | jtjd| d|  d S )Nr   r   L::R:)	r`   getrr   rK   rs   ra   rQ   r]   rt   )rj   rW   rV   rm   rm   rn   r^      s   

  zTkConchMenu.addForwardc                 C   s&   | j  }|r| j |d  d S d S ro   )r]   curselectionremove)rj   currm   rm   rn   r_      s   
zTkConchMenu.removeForwardc           	      C   s  d}| j  td< | j td< | j td< | j td< | j }| j }| j }|rA|t	j
v r9|gt	_
ntdd d}|rW|t	jv rM|gt	_n
|rWtdd	 d}|r|d
krbd td< n0|d dkr{t|dkr{tt|d d td< nt|dkr|td< n|rtdd|  d}| j rtj| j  | jdtjD ]}|d dkrt|dd   qt|dd   qdtd v rtd dd\td< td< td rtd s|rtdd d}|rJ| j  | j  td r	tj}t tj! |t_nt"  t#t_$tjsddgt_td }t%td p$d}t&||f t'(||t)  t*j+  t*j,d-td td  d S | .  d S )Nr   rV   rW   rX   r-   r   zBad cipher.r   zBad MAC.nonerE   ^r"   rG   zBad escape character '%s'.L@zMissing host or username.r   z~/.ssh/id_rsaz~/.ssh/id_dsa   z{}@{} - TkConch)/rV   ry   optionsrW   rX   r-   r?   rC   rE   SSHClientTransportsupportedCipherstkMessageBox	showerrorsupportedMACslenchrordrY   	identitysappendr]   rK   rs   opt_localforwardopt_remoteforwardsplitrN   quitdestroyrh   stdoutr   startLoggingstderrdiscardLogshandleErrordeferrintmsgr   
connectTCPSSHClientFactoryframe	deiconifyrO   formatfocus)	rj   finishedr?   rC   rE   linerealoutrV   rW   rm   rm   rn   re      sx   














zTkConchMenu.doConnectN)__name__
__module____qualname__rM   r[   r^   r_   re   rm   rm   rm   rn   r   &   s    ^
r   c                	   @   sj  e Zd ZU dZg dg dg dg dg dg dg dg d	gZg d
g dg dg dg dg dg dg dgZejjZ	ejj
Zejdgedd e	D edd eD ejddejddde ejddejdddgdZg Zee ed< g Zeeeeeef f  ed< g Zeeeeeef f  ed < d!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+S ),GeneralOptionsz,Usage:    tkconch [options] host [command]
 )rX   lNzLog in using this user name.)rY   iz~/.ssh/identityz&Identity for public key authentication)rE   e~z(Set escape character; ``none'' = disable)r?   cNzSelect encryption algorithm.)macsmNz.Specify MAC algorithms for protocol version 2.)rW   pNz7Connect to this port.  Server must be on the same port.)localforwardr   Nz<listen-port:host:port   Forward local port to remote address)remoteforwardRNz<listen-port:host:port   Forward remote port to local address)ttytz-Tty; allocate a tty even if command is given.)nottyTzDo not allocate a tty.)versionVzDisplay version number only.)compressCzEnable compression.)noshellNz"Do not execute a shell or command.)	subsystemsz-Invoke command (mandatory) as SSH2 subsystem.)r   vzLog to stderr)ansilogaz!Print the received data to stdout)r   r   c                 C      g | ]}|  qS rm   decode.0r   rm   rm   rn   
<listcomp>      zGeneralOptions.<listcomp>c                 C   r   rm   r   r   rm   rm   rn   r     r   zlisten-port:host:port)descr)r?   r   r   r   r-   argumentT)r   repeat)mutuallyExclusive
optActionsextraActionsr   localForwardsremoteForwardsc                 C   s   | j | d S N)r   r   )rj   r   rm   rm   rn   opt_identity     zGeneralOptions.opt_identityc                 C   8   | d\}}}t|}t|}| j|||ff d S Nrw   )r   r   r   r   )rj   f	localPort
remoteHost
remotePortrm   rm   rn   r         zGeneralOptions.opt_localforwardc                 C   r   r   )r   r   r   r   )rj   r   r   connHostconnPortrm   rm   rn   r   &  r   z GeneralOptions.opt_remoteforwardc                 C   s   dgt jdd< d S )Nzlibr   r   )r   supportedCompressionsrj   rm   rm   rn   opt_compress,  s   zGeneralOptions.opt_compressc                 G   s>   |r|d | d< d |dd  | d< d S d| d< d| d< d S )Nr   rV    r   r-    )join)rj   rk   rm   rm   rn   	parseArgs/  s
   zGeneralOptions.parseArgsN)r   r   r   synopsisoptParametersoptFlagsr   r   r   _ciphersr   _macsr   CompletionsCompleteList	CompleterCompleteUserAtHostcompDatar   r   str__annotations__r   r   r   r   r   r   r   r   r   rm   rm   rm   rn   r      sT   
 


  r   c                    sJ   t jrtdt  g }|f fdd	}|t _t |  t j   S )Nzcan't ask 2 questions at once!c                    s   | sd S | dkrt   | dkr%td d|}~d t_ | d S dt|   kr1dk rCn n||  rAt|  d S d S t| dkrX|rZrRtd |  d S d S d S )	Nz
r          r4   z )	r   stopr   writer   callbackr   r   pop)chrespstrespdechorm   rn   gotCharE  s*   




z!deferredAskFrame.<locals>.gotChar)r   r   
ValueErrorr   Deferredr   canvasfocus_force)questionr   r   r   rm   r   rn   deferredAskFrame?  s   

r  c               
   C   s  t jdd  } d| v r#| d}| ||d  |  } | |d |d = | d d  D ],}z!| |}|d d dkrK| |d  d dkrKg | ||d < W q) tyU   Y q)w t }|  t }t|a	t	j
tjtjdd t azt|  W n" tjy } ztd	|  t  t d W Y d }~nd }~ww t D ]\}}|rtt	|rtt	|tj| qtjD ]\}\}	}
t	jtjd
| d|	 d|
  qg t_tjD ]\}\}	}
t	jtjd| d|	 d|
  qg t_tj|d da| dtj!tj" d tj#tj$ d f  tj
tjd t%&| |  td r)td s0dtd v r5t	'  n|(  t)*  t t+ d S )Nr   z-lr"   r)   z-or   -)sidefillexpandz	ERROR: %srv   rw   rx   )r   z%dx%dr'   )r  rV   rX   r   ),rh   argvindexr   rK   TkwithdrawToplevelr   menupackTOPBOTHr   r   parseOptionsr   
UsageErrorprintopt_helpri   itemshasattrgetattrrt   rs   r   r]   r   r   
VT100Framer   geometry	fontWidthr0   
fontHeightr/   r   installre   mainloopr   run
exitStatus)rk   r   argroottopukr   r   rhrprm   rm   rn   r  `  sh   

$$$
"
r  c                  C   s(   ddl m}  dat|   t   )Nr   failurer"   )twisted.pythonr)  r   r   errFailurer   r   r(  rm   rm   rn   r     s
   r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r   Tc                 C   s   t   d S r   )r   r   r   rm   rm   rn   stopFactory  s   zSSHClientFactory.stopFactoryc                 C   s   t  S r   )r   )rj   addrrm   rm   rn   buildProtocol  s   zSSHClientFactory.buildProtocolc                 C   s    t dd|j d|j  d S )Nr   zConnection Failed, Reason:
 z: )r   showwarningtyper8   )rj   	connectorreasonrm   rm   rn   clientConnectionFailed  s   z'SSHClientFactory.clientConnectionFailedN)r   r   r   noisyr-  r/  r4  rm   rm   rm   rn   r     s
    r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )r   c                 C   s   d||f a d S )NzDconch:	Remote side disconnected with error code %i
conch:	reason: %s)r   )rj   codedescrm   rm   rn   receiveError  s   zSSHClientTransport.receiveErrorc                 C   s    d||f a tj| || d S )Nz>conch:	Sending disconnect with error code %i
conch:	reason: %s)r   r   r   sendDisconnect)rj   r6  r3  rm   rm   rn   r9    s
   z!SSHClientTransport.sendDisconnectc                 C   s"   |st d rtd|  d S d S )Nr   zReceived Debug Message: %s)r   r   r   )rj   alwaysDisplaymessagelangrm   rm   rn   receiveDebug  s   zSSHClientTransport.receiveDebugc                 C   s   t td |dd i}|dkrtdS |dkrttdS td | j j	kr2td }td }nd
td | j j	}d
td | j j	}t|d }d	
|d
dd| |}|d7 }t|d| j|||S )NrV   zknown-hostsr   r"   bad host keyz{} ({})z{},{}r   zNThe authenticity of host '{}' can't be established.
{} key fingerprint is {}.DSARSAs   ssh-dsss   ssh-rsaz9
Are you sure you want to continue connecting (yes/no)? )r   r   r   succeedfailr   
ConchErrorr   getPeerrV   r   r   getNSr  addCallback_cbVerifyHostKey)rj   pubKeyfingerprintgoodKeyrV   khHostkeyTypequesrm   rm   rn   verifyHostKey  s,   



z SSHClientTransport.verifyHostKeyc              	   C   s   |  dvrtdd| j|||S |  dkr"td tdz?td|dd	d
| f  tt	j
dd}t|}|d| d| d|  W d    W d S 1 sZw   Y  W d S  tyo   t  tjw )N)yesnozPlease type  'yes' or 'no': r   rQ  zHost key verification failed.
r>  zBWarning: Permanently added '%s' (%s) to the list of known hosts.
r?  r@  rA  z~/.ssh/known_hostsr   
r   )lowerr  rG  rH  r   r   r   rD  openospath
expanduserbase64	b64encodeBaseExceptionr   r   )rj   ansrI  rL  rM  known_hosts
encodedKeyrm   rm   rn   rH    s*   




&z#SSHClientTransport._cbVerifyHostKeyc                 C   s0   t d r	t d }nt }| t|t  d S )NrX   )r   getpassgetuserrequestServiceSSHUserAuthClientSSHConnection)rj   rX   rm   rm   rn   connectionSecure  s   
z#SSHClientTransport.connectionSecureN)	r   r   r   r8  r9  r=  rO  rH  rc  rm   rm   rm   rn   r     s    r   c                   @   s@   e Zd ZU g Zee ed< dddZdd Zdd Z	d	d
 Z
dS )ra  	usedFilesNc                 C   s    |sd | jtd }t|dS )Nz{}@{}'s password: rV   r   )r   rX   r   r  )rj   promptrm   rm   rn   getPassword  s   
zSSHUserAuthClient.getPasswordc                    s    fddt jD }|sd S |d }t|  j| tj|}|d7 }tj	|s/d S z	t
j| W S  tyE      Y S w )Nc                    s   g | ]	}| j vr|qS rm   )rd  )r   xr   rm   rn   r     s    z2SSHUserAuthClient.getPublicKey.<locals>.<listcomp>r   z.pub)r   r   r   r   rd  r   rU  rV  rW  existsr
   KeyfromFileblobrZ  getPublicKey)rj   filesfilerm   r   rn   rl    s   
zSSHUserAuthClient.getPublicKeyc              
   C   s   t j| jd }t j|sd S zttj	|j
W S  tjyN } z%|jd dkrCd| jd  }t|d| jdW  Y d }~S W Y d }~d S d }~ww )Nr   zencrypted key with no passwordEnter passphrase for key '%s': )rU  rV  rW  rd  rh  r   rB  r
   ri  rj  	keyObjectBadKeyErrorrk   r  rG  _cbGetPrivateKey)rj   rn  r   re  rm   rm   rn   getPrivateKey  s    zSSHUserAuthClient.getPrivateKeyc                 C   sl   t j| jd }z
tjj||djW S  tjy5   |dkr  d| jd  }t	|d
| j|d  Y S w )Nro  )passwordr"   rp  r   r   )rU  rV  rW  rd  r
   ri  rj  rq  rr  r  rG  rs  )rj   r[  countrn  re  rm   rm   rn   rs    s   

z"SSHUserAuthClient._cbGetPrivateKeyr   )r   r   r   rd  r   r   r   rf  rl  rt  rs  rm   rm   rm   rn   ra    s   
 
ra  c                   @   s   e Zd Zdd ZdS )rb  c              	   C   s   t d s
| t  t jr!t jD ]\}}t|t| |tj qt j	rGt j	D ]!\}}t
d|| td|f}| d| || j	|< q'd S d S )Nr   z&asking for remote forwarding for {}:{}z0.0.0.0ztcpip-forward)r   openChannel
SSHSessionr   r   	listenTCPr	   SSHListenForwardingFactory SSHListenClientForwardingChannelr   r   r   r   packGlobal_tcpip_forwardsendGlobalRequest)rj   r   hostportr   datarm   rm   rn   serviceStarted-  s,   zSSHConnection.serviceStartedN)r   r   r   r  rm   rm   rm   rn   rb  ,  s    rb  c                   @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )rx  s   sessionc                 C   s  d| _ t }td r| j|_n| j|_| j|_|jt	_
t	j  td r3| j| dttd  nRtd ratd rStjdd}d	}t||d
}| j| d| | j| dttd  n$td s}tjdd}d	}t||d
}| j| d| | j| dd | jjjd d S )Nr   rE   r   s	   subsystemr-   r   TERMxterm)   P   r   r   r   s   pty-reqexecr   s   shell    )
escapeModer   SSHSessionClientr   handleInputdataReceivedr   sendEOFconnectionLostr   r   r  r  connsendRequestr   NSrU  environry   packRequest_pty_reqr   setTcpNoDelay)rj   foor   termwinSize
ptyReqDatarm   rm   rn   channelOpenH  s0   

zSSHSession.channelOpenc                 C   s   |dv rd| _ | | d S | j dkr|td krd| _ d S | j dkr^d| _ |dkr5td t  d S |dkrDtt	 t
j d S |dkrUtd	 | jj  d S | d
|  d S d| _ | | d S )N)rR  r   r   rE   r"   .zdisconnecting from escaper   zrekeying connectionr   r   )r  r   r   r   r   r   r   rU  killgetpidsignalSIGSTOPr  r   sendKexInit)rj   charrm   rm   rn   r  i  s*   



zSSHSession.handleInputc                 C   s,   | d}td rtt| t| d S )Nzutf-8r   )r   r   r  reprr   r   rj   r  rm   rm   rn   r    s   
zSSHSession.dataReceivedc                 C   s:   |t jkrtdt|  tj| tj  d S d S )Nzgot %s stderr data)	r   EXTENDED_DATA_STDERRr   r   r   rh   r   r   flush)rj   r   r  rm   rm   rn   extReceived  s
   
zSSHSession.extReceivedc                 C   s   t d tj  d S )Nzgot eof)r   r   rh   stdincloser   rm   rm   rn   eofReceived  s   
zSSHSession.eofReceivedc                 C   s.   t d|   t| jjdkrt  d S d S )Nz	closed %sr   )r   r   r   r  channelsr   r   r   rm   rm   rn   closed  s   zSSHSession.closedc                 C   s&   t td|d atdt  d S )Nz>Lr   zexit status: %s)r   structunpackr   r   r   r  rm   rm   rn   request_exit_status  s   zSSHSession.request_exit_statusc                 C   s   | j |  d S r   )r  r  r   rm   rm   rn   r    r   zSSHSession.sendEOFN)r   r   r   r@   r  r  r  r  r  r  r  r  rm   rm   rm   rn   rx  D  s    !rx  __main__)<__doc__rX  r^  rU  r  r  rh   tkinterrK   tkinter.filedialog
filedialogrp   tkinter.messagebox
messageboxr   typingr   r   twisted.conchr   twisted.conch.client.defaultr   twisted.conch.sshr   r   r   r	   r
   r   r   r   twisted.conch.uir   twisted.internetr   r   r   r   r*  r   r   rL   r   Optionsr   r   r  r   r   r  r  r   ClientFactoryr   r   ra  rb  
SSHChannelrx  r   rm   rm   rm   rn   <module>   sF   (
 >V!3
O0]
