U
    P|jñ  ã                   @  s   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 d dlmZmZ d dlmZmZ d dlmZmZmZmZ d d	lmZ er¨d d
lmZ d dlmZ G dd„ dejƒZG dd„ dej ƒZ ee e!e!e"gee# f Z$dddddddœdd„Z%dS )é    )Úannotations)ÚTYPE_CHECKINGÚCallable)Úerror)Ú	transport)ÚdeferÚprotocolÚreactor)ÚIPv4AddressÚIPv6Address)ÚDeferredÚmaybeDeferred)ÚIAddressÚ
IConnectorÚIListeningPortÚIReactorTCP)ÚFailure)ÚConchOptions)ÚSSHUserAuthClientc                   @  sV   e Zd Zddddddœdd„Zd	d
ddœdd„Zd	d
ddœdd„Zdddœdd„ZdS )ÚSSHClientFactoryúDeferred[None]r   Ú_VHKr   ÚNone)ÚdÚoptionsÚverifyHostKeyÚuserAuthObjectÚreturnc                 C  s   || _ || _|| _|| _d S ©N)r   r   r   r   )Úselfr   r   r   r   © r    ú?/tmp/pip-unpacked-wheel-audpp6lv/twisted/conch/client/direct.pyÚ__init__   s    zSSHClientFactory.__init__r   r   )Ú	connectorÚreasonr   c                 C  s   | j d r| ¡  d S )NZ	reconnect)r   Úconnect)r   r#   r$   r    r    r!   ÚclientConnectionLost'   s    
z%SSHClientFactory.clientConnectionLostc                 C  s*   | j d krd S | j d  }| _ | |¡ d S r   )r   Úerrback)r   r#   r$   r   r    r    r!   ÚclientConnectionFailed+   s    
z'SSHClientFactory.clientConnectionFailedr   ÚSSHClientTransport)Úaddrr   c                 C  sh   t | ƒ}| jd r| jd |_| jd r4| jd |_| jd rNdg|jdd…< | jd rd| jd |_|S )NÚciphersZmacsÚcompresss   zlibr   é   zhost-key-algorithms)r)   r   ZsupportedCiphersZsupportedMACsZsupportedCompressionsZsupportedPublicKeys)r   r*   Ztransr    r    r!   ÚbuildProtocol1   s    



zSSHClientFactory.buildProtocolN)Ú__name__Ú
__module__Ú__qualname__r"   r&   r(   r.   r    r    r    r!   r      s   r   c                   @  sr   e Zd ZU ded< dddœdd„Zdddd	œd
d„Zdd„ Zdd„ Zdd„ Zddddœdd„Z	dd„ Z
dd„ ZdS )r)   r   Úfactoryr   )r2   r   c                 C  s   || _ d | _d S r   )r2   Ú
unixServer)r   r2   r    r    r!   r"   B   s    zSSHClientTransport.__init__NzFailure | None)r$   r   c                   s<   ˆj rtˆj jƒ}d ˆ_ n
t d ¡}| ‡ ‡fdd„¡ d S )Nc                   s   t j ˆˆ ¡S r   )r   r)   ÚconnectionLost)Úx©r$   r   r    r!   Ú<lambda>T   ó    z3SSHClientTransport.connectionLost.<locals>.<lambda>)r3   r   ÚstopListeningr   ZsucceedZaddCallback)r   r$   r   r    r6   r!   r4   F   s    
ÿz!SSHClientTransport.connectionLostc                 C  s8   | j jd krd S | j jd  }| j _| t ||¡¡ d S r   )r2   r   r'   r   Ú
ConchError)r   ÚcodeÚdescr   r    r    r!   ÚreceiveErrorW   s    zSSHClientTransport.receiveErrorc                 C  sH   | j jd krd S | j jd  }| j _tj | ||¡ | t ||¡¡ d S r   )r2   r   r   r)   ÚsendDisconnectr'   r   r:   )r   r;   r$   r   r    r    r!   r>   ]   s
    z!SSHClientTransport.sendDisconnectc                 C  s$   | j jd|||d� |r t|ƒ d S )Nz!Received Debug Message: {message})ÚmessageÚalwaysDisplayÚlang)Ú_logÚdebugÚprint)r   r@   r?   rA   r    r    r!   ÚreceiveDebugd   s    üzSSHClientTransport.receiveDebugÚbytesÚstrzDeferred[bool])ÚpubKeyÚfingerprintr   c                 C  sJ   | j }|d k	st‚| ¡ }t|ttfƒs0tdƒ‚| j | |j 	d¡||¡S )Nz+Address must have a host to verify against.zutf-8)
r   ÚAssertionErrorZgetPeerÚ
isinstancer
   r   r2   r   ÚhostÚencode)r   rH   rI   r   Zpeerr    r    r!   r   n   s     ÿþ 
  ÿz SSHClientTransport.verifyHostKeyc                 C  sT   | j jd|d� tj | |¡ |jdkrP| jjd k	rP| jjd  }| j_| d ¡ d S )Nz"setting client server to {service})Úservicezssh-userauth)	rB   Úinfor   r)   Ú
setServiceÚnamer2   r   Úcallback)r   rN   r   r    r    r!   rP   y   s
    zSSHClientTransport.setServicec                 C  s   |   | jj¡ d S r   )ZrequestServicer2   r   )r   r    r    r!   ÚconnectionSecure€   s    z#SSHClientTransport.connectionSecure)N)r/   r0   r1   Ú__annotations__r"   r4   r=   r>   rE   r   rP   rS   r    r    r    r!   r)   >   s   

r)   rG   Úintr   r   r   r   )rL   Úportr   r   r   r   c                 C  s,   t  ¡ }t||||ƒ}ttƒ | ||¡ |S r   )r   r   r   r   r	   Z
connectTCP)rL   rV   r   r   r   r   r2   r    r    r!   r%   ‡   s    r%   N)&Ú
__future__r   Útypingr   r   Ztwisted.conchr   Ztwisted.conch.sshr   Ztwisted.internetr   r   r	   Ztwisted.internet.addressr
   r   Ztwisted.internet.deferr   r   Ztwisted.internet.interfacesr   r   r   r   Ztwisted.python.failurer   Ztwisted.conch.client.optionsr   Ztwisted.conch.ssh.userauthr   ZClientFactoryr   r)   rF   rG   Úboolr   r%   r    r    r    r!   Ú<module>   s   $F