U
    
W[Â  ã                   @   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)Úlogc                   @   s,   e Zd 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   ú</usr/lib/python3/dist-packages/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&   t  dt|ƒ ¡ dd„ |D ƒ| _d S )Nzgot %i public keysc                 S   s   g | ]}|d  ‘qS )r   r   )Ú.0Úxr   r   r   Ú
<listcomp>    s     z0SSHAgentClient._cbPublicKeys.<locals>.<listcomp>)r   ÚmsgÚ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      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>4   ó    z7SSHAgentForwardingChannel.channelOpen.<locals>.<lambda>Ú )r   ZClientCreatorr   ÚSSHAgentForwardingLocalZconnectUNIXÚosÚenvironr   Ú_cbGotLocalZ
addErrbackÚbuf)r   ZspecificDataZccÚdr   r   r   ÚchannelOpen0   s
    z%SSHAgentForwardingChannel.channelOpenc                 C   s    || _ | j jj| _| j| j _d S r	   )ÚlocalZ	transportÚwriteÚdataReceived)r   r)   r   r   r   r%   8   s    z%SSHAgentForwardingChannel._cbGotLocalc                 C   s   |  j |7  _ d S r	   )r&   )r   Údatar   r   r   r+   >   s    z&SSHAgentForwardingChannel.dataReceivedc                 C   s   | j r| j  ¡  d | _ d S r	   )r)   r   r   r   r   r   ÚclosedB   s    
z SSHAgentForwardingChannel.closedN)r   r   r   r(   r%   r+   r-   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"   H   s   r"   )Ú__doc__r#   Ztwisted.conch.sshr   r   r   Ztwisted.internetr   r   Ztwisted.pythonr   r   Z
SSHChannelr   ZProtocolr"   r   r   r   r   Ú<module>   s   