U
    ª€lj-  ã                   @   s,  d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ dd	lmZ dd
lmZ ddlmZ dZdZedƒrÆddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ndZdZeZ e !¡ râdZdZej" #¡ sôdZdZej$ #¡ �sdZdZG dd„ deƒZ%G dd„ deƒZ&dS )z,
Tests for L{twisted.conch.client.default}.
é    N)ÚskipIf)Ú
ConchError)Úkeydata)ÚStringTransport)ÚnativeString)ÚFilePath)ÚrequireModule)Úplatform)ÚTestCaseFÚ Zcryptography)Údefault)ÚSSHAgentClient)ÚSSHUserAuthClient)ÚConchOptions)ÚKeyTz7cryptography required for twisted.conch.client.default.zlgenericAnswers and getPassword does not work on Windows. Should be fixed as part of fixing bug 6409 and 6410z#sys.stdin is not an interactive ttyz$sys.stdout is not an interactive ttyc                   @   s˜   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eeeƒdd„ ƒZeeeƒdd„ ƒZeeeƒdd„ ƒZeeeƒdd„ ƒZdS )ÚSSHUserAuthClientTestszm
    Tests for L{SSHUserAuthClient}.

    @type rsaPublic: L{Key}
    @ivar rsaPublic: A public RSA key.
    c                 C   sZ   t  tj¡| _t|  ¡ ƒ| _| j ¡  | j 	d¡| _
| j
 tj¡ | j 	d¡ tj¡ d S )NZid_rsaú
id_rsa.pub)r   Ú
fromStringr   ZpublicRSA_opensshÚ	rsaPublicr   ÚmktempÚtmpdirÚmakedirsÚchildÚrsaFileÚ
setContentÚprivateRSA_openssh©Úself© r   úC/tmp/pip-unpacked-wheel-aghyhbke/twisted/conch/test/test_default.pyÚsetUp:   s    
zSSHUserAuthClientTests.setUpc                 C   sf   t dtƒ dƒ}tƒ }tƒ }| |¡ ||_d}| | j|¡ |  | 	¡ d| j 
¡  d | d ¡ dS )z˜
        When connected to an agent, L{SSHUserAuthClient} can use it to
        request signatures of particular data with a particular L{Key}.
        ó   userNs	   Sign heres	     -  s      	s       )r   r   r   r   ZmakeConnectionÚkeyAgentZsignDatar   ÚassertEqualÚvalueÚblob)r   ÚclientÚagentÚ	transportZ	cleartextr   r   r   Útest_signDataWithAgentB   s&    
ÿþýüþz-SSHUserAuthClientTests.test_signDataWithAgentc                 C   sJ   t ƒ }| j ¡ g|_| ¡ }|  | ¡ ¡ |  || j¡ |  | ¡ ¡ dS )a  
        L{SSHUserAuthClient} looks up public keys from the agent using the
        L{SSHAgentClient} class.  That L{SSHAgentClient.getPublicKey} returns a
        L{Key} object with one of the public keys in the agent.  If no more
        keys are present, it returns L{None}.
        N)	r   r   r%   ZblobsÚgetPublicKeyÚ
assertTrueÚisPublicr#   ZassertIsNone)r   r'   Úkeyr   r   r   Útest_agentGetPublicKeyW   s    z-SSHUserAuthClientTests.test_agentGetPublicKeyc                 C   sF   t ƒ }| jjg|_td|dƒ}| ¡ }|  | ¡ ¡ |  || j	¡ dS )zÕ
        L{SSHUserAuthClient.getPublicKey()} is able to get a public key from
        the first file described by its options' C{identitys} list, and return
        the corresponding public L{Key} object.
        r!   N)
r   r   ÚpathÚ	identitysr   r*   r+   r,   r#   r   )r   Úoptionsr&   r-   r   r   r   Útest_getPublicKeyFromFilee   s    z0SSHUserAuthClientTests.test_getPublicKeyFromFilec                 C   sR   t ƒ }| jjg|_tƒ }td|dƒ}||_| ¡ }|  | 	¡ ¡ |  
|| j¡ dS )z’
        If an agent is present, but doesn't return a key,
        L{SSHUserAuthClient.getPublicKey} continue with the normal key lookup.
        r!   N)r   r   r/   r0   r   r   r"   r*   r+   r,   r#   r   )r   r1   r'   r&   r-   r   r   r   Útest_getPublicKeyAgentFallbackr   s    z5SSHUserAuthClientTests.test_getPublicKeyAgentFallbackc                 C   s¦   t ƒ }| j d¡ tj¡ | j d¡}| tj¡ | jj|jg|_	| j d¡ d¡ t
d|dƒ}| ¡ }|  | ¡ ¡ |  |t tj¡¡ |  |j| jj|jg¡ dS )z¼
        If L{keys.Key.fromFile} raises a L{keys.BadKeyError}, the
        L{SSHUserAuthClient.getPublicKey} tries again to get a public key by
        calling itself recursively.
        z
id_dsa.pubZid_dsar   s
   not a key!r!   N)r   r   r   r   r   ZpublicDSA_opensshZprivateDSA_opensshr   r/   r0   r   r*   r+   r,   r#   r   r   Z	usedFiles)r   r1   ZdsaFiler&   r-   r   r   r   Útest_getPublicKeyBadKeyError€   s    z3SSHUserAuthClientTests.test_getPublicKeyBadKeyErrorc                    sN   t  tj¡‰ tƒ }ˆjjg|_td|dƒ}| 	¡  ‡ ‡fdd„}| 
¡  |¡S )zð
        L{SSHUserAuthClient.getPrivateKey} will load a private key from the
        last used file populated by L{SSHUserAuthClient.getPublicKey}, and
        return a L{Deferred} which fires with the corresponding private L{Key}.
        r!   Nc                    s   ˆ  |  ¡ ¡ ˆ | ˆ ¡ d S ©N©ZassertFalser,   r#   ©r-   ©Ú
rsaPrivater   r   r   Ú_cbGetPrivateKeyŸ   s    zCSSHUserAuthClientTests.test_getPrivateKey.<locals>._cbGetPrivateKey)r   r   r   r   r   r   r/   r0   r   r*   ÚgetPrivateKeyÚaddCallback)r   r1   r&   r:   r   r8   r   Útest_getPrivateKey’   s    z)SSHUserAuthClientTests.test_getPrivateKeyc                    s„   t  tj¡‰d‰ ˆj ˆjdˆ d�¡ tƒ }ˆjjg|_	t
d|dƒ}| ¡  ‡ ‡fdd„}‡‡fdd	„}ˆ |d
|¡ | ¡  |¡S )z·
        L{SSHUserAuthClient} can get a private key from a file, and return a
        Deferred called back with a private L{Key} object, even if the key is
        encrypted.
        s   this is the passphraseZopenssh)Ú
passphraser!   Nc                    s    ˆ  | dˆjj› d�¡ tˆ ƒS )NzEnter passphrase for key 'z': )r#   r   r/   r   ©Úprompt)r>   r   r   r   Ú_getPassword´   s
     ÿzISSHUserAuthClientTests.test_getPrivateKeyPassphrase.<locals>._getPasswordc                    s   ˆ  |  ¡ ¡ ˆ | ˆ ¡ d S r5   r6   r7   r8   r   r   r:   º   s    zMSSHUserAuthClientTests.test_getPrivateKeyPassphrase.<locals>._cbGetPrivateKeyrA   )r   r   r   r   r   r   ÚtoStringr   r/   r0   r   r*   Úpatchr;   r<   )r   r1   r&   rA   r:   r   )r>   r9   r   r   Útest_getPrivateKeyPassphrase¥   s    z3SSHUserAuthClientTests.test_getPrivateKeyPassphrasec                    s`   G dd„ dƒ}t ƒ }td|dƒ}|dƒ|_‡ fdd„}ˆ  tjd|¡ | ¡ }| ˆ jd	¡ |S )
zn
        Get the password using
        L{twisted.conch.client.default.SSHUserAuthClient.getPassword}
        c                   @   s   e Zd Zdd„ Zdd„ ZdS )z>SSHUserAuthClientTests.test_getPassword.<locals>.FakeTransportc                 S   s   | | _ || _d S r5   )r(   Úhost)r   rE   r   r   r   Ú__init__É   s    zGSSHUserAuthClientTests.test_getPassword.<locals>.FakeTransport.__init__c                 S   s   | S r5   r   r   r   r   r   ÚgetPeerÍ   s    zFSSHUserAuthClientTests.test_getPassword.<locals>.FakeTransport.getPeerN)Ú__name__Ú
__module__Ú__qualname__rF   rG   r   r   r   r   ÚFakeTransportÈ   s   rK   r!   Nz	127.0.0.1c                    s   ˆ   | d¡ dS )Nzuser@127.0.0.1's password: úbad password©r#   r?   r   r   r   ÚgetpassÔ   s    z8SSHUserAuthClientTests.test_getPassword.<locals>.getpassrN   ó   bad password)	r   r   r(   rC   r   rN   ÚgetPasswordr<   r#   )r   rK   r1   r&   rN   Údr   r   r   Útest_getPasswordÁ   s    
z'SSHUserAuthClientTests.test_getPasswordc                    sP   t ƒ }td|dƒ}d‰ ‡ ‡fdd„}ˆ tjd|¡ | ˆ ¡}| ˆjd¡ |S )z�
        Get the password using
        L{twisted.conch.client.default.SSHUserAuthClient.getPassword}
        using a different prompt.
        r!   Ns   Give up your passwordc                    s   ˆ  | tˆ ƒ¡ dS )NrL   )r#   r   )Úp©r@   r   r   r   rN   è   s    z>SSHUserAuthClientTests.test_getPasswordPrompt.<locals>.getpassrN   rO   )r   r   rC   r   rN   rP   r<   r#   )r   r1   r&   rN   rQ   r   rT   r   Útest_getPasswordPromptÝ   s    
z-SSHUserAuthClientTests.test_getPasswordPromptc                    sh   t ƒ }td|dƒ}dd„ }ˆ  tjd|¡ tjtj ‰‰| d¡}|j	‡ ‡‡fdd„ƒ}ˆ  
|t¡ dS )	z­
        Get the password using
        L{twisted.conch.client.default.SSHUserAuthClient.getPassword}
        and trigger a {twisted.conch.error import ConchError}.
        r!   Nc                 S   s   t dƒ‚d S )NzUser pressed CTRL-C)ÚKeyboardInterruptr?   r   r   r   rN   û   s    zBSSHUserAuthClientTests.test_getPasswordConchError.<locals>.getpassrN   ó   ?c                    s   ˆ   ˆˆgtjtjg¡ | S r5   )r#   ÚsysÚstdoutÚstdin)Zfail©r   rZ   rY   r   r   Ú	check_sys  s    zDSSHUserAuthClientTests.test_getPasswordConchError.<locals>.check_sys)r   r   rC   r   rN   rX   rY   rZ   rP   Z
addErrbackZassertFailurer   )r   r1   r&   rN   rQ   r\   r   r[   r   Útest_getPasswordConchErrorñ   s    
z1SSHUserAuthClientTests.test_getPasswordConchErrorc                    sp   t ƒ }td|dƒ}‡ fdd„}ˆ  tjd|¡ ‡ fdd„}ˆ  td|¡ | d	d
ddg¡}| ˆ jddg¡ |S )zU
        L{twisted.conch.client.default.SSHUserAuthClient.getGenericAnswers}
        r!   Nc                    s   ˆ   | d¡ dS )Nzpass promptrN   rM   r?   r   r   r   rN     s    z>SSHUserAuthClientTests.test_getGenericAnswers.<locals>.getpassrN   c                    s   ˆ   | d¡ dS )Nzraw_input promptÚ	raw_inputrM   r?   r   r   r   r^     s    z@SSHUserAuthClientTests.test_getGenericAnswers.<locals>.raw_inputÚ_inputs   Names   Instruction)s   pass promptF)s   raw_input promptTr^   )r   r   rC   r   rN   ZgetGenericAnswersr<   ZassertListEqual)r   r1   r&   rN   r^   rQ   r   r   r   Útest_getGenericAnswers	  s    ýz-SSHUserAuthClientTests.test_getGenericAnswersN)rH   rI   rJ   Ú__doc__r    r)   r.   r2   r3   r4   r=   rD   r   ÚdoSkipÚ
skipReasonrR   rU   r]   r`   r   r   r   r   r   2   s"   


r   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚConchOptionsParsingz
    Options parsing.
    c                 C   s†   t ƒ }|  t|jd¡}|  d|j¡ t ƒ }| d¡ |  |d dg¡ | d¡ |  |d dg¡ | d¡ |  |d ddd	g¡ d
S )z)
        Specify MAC algorithms.
        zinvalid-maczUnknown mac typezhmac-sha2-512Zmacss   hmac-sha2-512z hmac-sha2-256,hmac-sha1,hmac-md5s   hmac-sha2-256s	   hmac-sha1s   hmac-md5N)r   ÚassertRaisesÚ
SystemExitZopt_macsÚassertInÚcoder#   ©r   ÚoptsÚer   r   r   Ú	test_macs*  s    


zConchOptionsParsing.test_macsc                 C   s„   t ƒ }|  t|jd¡}|  d|j¡ t ƒ }| d¡ |  |d dg¡ | d¡ |  |d dg¡ | d¡ |  |d ddg¡ dS )	z.
        Specify host key algorithms.
        zinvalid-keyzUnknown host key typezssh-rsazhost-key-algorithmss   ssh-rsas   ssh-dsszssh-rsa,ssh-dssN)r   re   rf   Zopt_host_key_algorithmsrg   rh   r#   ri   r   r   r   Útest_host_key_algorithms9  s    


z,ConchOptionsParsing.test_host_key_algorithmsN)rH   rI   rJ   ra   rl   rm   r   r   r   r   rd   %  s   rd   )'ra   rX   Zunittestr   Ztwisted.conch.errorr   Ztwisted.conch.testr   Ztwisted.internet.testingr   Ztwisted.python.compatr   Ztwisted.python.filepathr   Ztwisted.python.reflectr   Ztwisted.python.runtimer	   Ztwisted.trial.unittestr
   rb   rc   Ztwisted.conch.clientr   Ztwisted.conch.client.agentr   Ztwisted.conch.client.defaultr   Ztwisted.conch.client.optionsr   Ztwisted.conch.ssh.keysr   ÚskipZ	isWindowsrZ   ÚisattyrY   r   rd   r   r   r   r   Ú<module>   sD   ÿ
 t