o
    ¯bé  ã                   @   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   ú</usr/lib/python3/dist-packages/twisted/conch/client/agent.pyr
      s   
zSSHAgentClient.__init__c                 C   s   |   ¡  | j¡S r	   )Ú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)Únum_keysc                 S   s   g | ]}|d  ‘qS )r   r   )Ú.0Úxr   r   r   Ú
<listcomp>   s    z0SSHAgentClient._cbPublicKeys.<locals>.<listcomp>)Ú_logÚdebugÚlenr   )r   Ú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   ÚKeyÚ
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 )NÚSSH_AUTH_SOCKc                    s   ˆ   ¡ S r	   )ÚloseConnection)r   r   r   r   Ú<lambda>/   s    z7SSHAgentForwardingChannel.channelOpen.<locals>.<lambda>Ú )r   ÚClientCreatorr   ÚSSHAgentForwardingLocalÚconnectUNIXÚosÚenvironr   Ú_cbGotLocalÚ
addErrbackÚbuf)r   Ú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   r4   r   r   r   r-   2   s   z%SSHAgentForwardingChannel._cbGotLocalc                 C   s   |  j |7  _ d S r	   )r/   )r   Údatar   r   r   r7   7   s   z&SSHAgentForwardingChannel.dataReceivedc                 C   s   | j r| j  ¡  d | _ d S d S r	   )r4   r%   r   r   r   r   Úclosed:   s   

þz SSHAgentForwardingChannel.closedN)r    r!   r"   r3   r-   r7   r9   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+   Útwisted.conch.sshr   r   r   Útwisted.internetr   r   Útwisted.loggerr   r   Ú
SSHChannelr#   ÚProtocolr)   r   r   r   r   Ú<module>   s   