U
    ¸~Hjé  ã                   @   sv   d Z ddlZddlmZmZmZ ddlmZmZ ddl	m
Z
 G dd„ dejƒZG dd	„ d	ejƒZG d
d„ dejƒZdS )zJ
Accesses the key agent for user authentication.

Maintainer: Paul Swartz
é    N)ÚagentÚchannelÚkeys)ÚprotocolÚreactor)ÚLoggerc                   @   s2   e Zd Zeƒ Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚSSHAgentClientc                 C   s   t j | ¡ g | _d S ©N)r   r   Ú__init__Úblobs©Úself© r   ú>/tmp/pip-unpacked-wheel-ewod1tgb/twisted/conch/client/agent.pyr
      s    zSSHAgentClient.__init__c                 C   s   |   ¡  | j¡S r	   )ZrequestIdentitiesÚaddCallbackÚ_cbPublicKeysr   r   r   r   ÚgetPublicKeys   s    zSSHAgentClient.getPublicKeysc                 C   s(   | j jdt|ƒd� dd„ |D ƒ| _d S )Nzgot {num_keys} public keys)Znum_keysc                 S   s   g | ]}|d  ‘qS )r   r   )Ú.0Úxr   r   r   Ú
<listcomp>   s     z0SSHAgentClient._cbPublicKeys.<locals>.<listcomp>)Ú_logÚdebugÚlenr   )r   Zblobcommr   r   r   r      s    zSSHAgentClient._cbPublicKeysc                 C   s   | j rtj | j  d¡¡S dS )zj
        Return a L{Key} from the first blob in C{self.blobs}, if any, or
        return L{None}.
        r   N)r   r   ZKeyZ
fromStringÚpopr   r   r   r   ÚgetPublicKey    s    zSSHAgentClient.getPublicKeyN)	Ú__name__Ú
__module__Ú__qualname__r   r   r
   r   r   r   r   r   r   r   r      s
   r   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚSSHAgentForwardingChannelc                    sD   t  tt¡}| tjd ¡}| ˆ j¡ | 	‡ fdd„¡ dˆ _
d S )NZSSH_AUTH_SOCKc                    s   ˆ   ¡ S r	   )ÚloseConnection)r   r   r   r   Ú<lambda>/   ó    z7SSHAgentForwardingChannel.channelOpen.<locals>.<lambda>Ú )r   ZClientCreatorr   ÚSSHAgentForwardingLocalZconnectUNIXÚosÚenvironr   Ú_cbGotLocalZ
addErrbackÚbuf)r   ZspecificDataÚccÚdr   r   r   ÚchannelOpen+   s
    z%SSHAgentForwardingChannel.channelOpenc                 C   s    || _ | j jj| _| j| j _d S r	   )ÚlocalÚ	transportÚwriteÚdataReceived)r   r+   r   r   r   r&   2   s    z%SSHAgentForwardingChannel._cbGotLocalc                 C   s   |  j |7  _ d S r	   )r'   )r   Údatar   r   r   r.   7   s    z&SSHAgentForwardingChannel.dataReceivedc                 C   s   | j r| j  ¡  d | _ d S r	   )r+   r   r   r   r   r   Úclosed:   s    
z SSHAgentForwardingChannel.closedN)r   r   r   r*   r&   r.   r0   r   r   r   r   r   *   s   r   c                   @   s   e Zd ZdS )r#   N)r   r   r   r   r   r   r   r#   @   s   r#   )Ú__doc__r$   Ztwisted.conch.sshr   r   r   Ztwisted.internetr   r   Ztwisted.loggerr   r   Z
SSHChannelr   ÚProtocolr#   r   r   r   r   Ú<module>   s   