Ë
    oj-  ã                   ó¬  — 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jB                  «       rdZdZejD                  jG                  «       sdZdZejH                  jG                  «       sdZdZ G d„ de«      Z% G d„ de«      Z&y)z,
Tests for L{twisted.conch.client.default}.
é    N)ÚskipIf)Ú
ConchError)Úkeydata)ÚStringTransport)ÚnativeString)ÚFilePath)ÚrequireModule)Úplatform)ÚTestCaseFÚ Ú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                   ó¸   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Z eee«      d
„ «       Z eee«      d„ «       Z eee«      d„ «       Z eee«      d„ «       Zy)ÚSSHUserAuthClientTestszm
    Tests for L{SSHUserAuthClient}.

    @type rsaPublic: L{Key}
    @ivar rsaPublic: A public RSA key.
    c                 óÆ  — t        j                  t        j                  «      | _        t        | j                  «       «      | _        | j                  j                  «        | j                  j                  d«      | _
        | j                  j                  t        j                  «       | j                  j                  d«      j                  t        j                  «       y )NÚid_rsaú
id_rsa.pub)r   Ú
fromStringr   ÚpublicRSA_opensshÚ	rsaPublicr   ÚmktempÚtmpdirÚmakedirsÚchildÚrsaFileÚ
setContentÚprivateRSA_openssh©Úselfs    úA/usr/lib/python3/dist-packages/twisted/conch/test/test_default.pyÚsetUpzSSHUserAuthClientTests.setUp:   s‹   € ÜŸ™¬×(AÑ(AÓBˆŒÜ˜tŸ{™{›}Ó-ˆŒØ�‰×ÑÔØ—{‘{×(Ñ(¨Ó2ˆŒØ�‰×Ñ¤× :Ñ :Ô;Ø�‰×Ñ˜,Ó'×2Ñ2´7×3LÑ3LÕMó    c                 óJ  — t        dt        «       d«      }t        «       }t        «       }|j	                  |«       ||_        d}|j                  | j                  |«       | j                  |j                  «       d| j                  j                  «       z   dz   |z   dz   «       y)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   ÚmakeConnectionÚkeyAgentÚsignDatar   ÚassertEqualÚvalueÚblob)r#   ÚclientÚagentÚ	transportÚ	cleartexts        r$   Útest_signDataWithAgentz-SSHUserAuthClientTests.test_signDataWithAgentB   sœ   € ô
 # 7¬L«N¸DÓAˆÜÓ ˆÜ#Ó%ˆ	Ø×Ñ˜YÔ'ØˆŒØ ˆ	Ø�‰˜Ÿ™¨	Ô2Ø×ÑØ�O‰OÓØ1Ø�n‰n×!Ñ!Ó#ñ$àñ ð ñð "ñ	"õ	
r&   c                 ó,  — t        «       }| j                  j                  «       g|_        |j	                  «       }| j                  |j                  «       «       | j                  || j                  «       | j                  |j	                  «       «       y)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.   ÚblobsÚgetPublicKeyÚ
assertTrueÚisPublicr,   ÚassertIsNone)r#   r0   Úkeys      r$   Útest_agentGetPublicKeyz-SSHUserAuthClientTests.test_agentGetPublicKeyW   sn   € ô Ó ˆØ—~‘~×*Ñ*Ó,Ð-ˆŒØ× Ñ Ó"ˆØ�‰˜Ÿ™›Ô'Ø×Ñ˜˜dŸn™nÔ-Ø×Ñ˜%×,Ñ,Ó.Õ/r&   c                 ó   — t        «       }| j                  j                  g|_        t	        d|d«      }|j                  «       }| j                  |j                  «       «       | j                  || j                  «       y)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   r6   r7   r8   r,   r   )r#   Úoptionsr/   r:   s       r$   Útest_getPublicKeyFromFilez0SSHUserAuthClientTests.test_getPublicKeyFromFilee   sb   € ô “.ˆØ!Ÿ\™\×.Ñ.Ð/ˆÔÜ" 7¨G°TÓ:ˆØ×!Ñ!Ó#ˆØ�‰˜Ÿ™›Ô'Ø×Ñ˜˜dŸn™nÕ-r&   c                 ó"  — t        «       }| j                  j                  g|_        t	        «       }t        d|d«      }||_        |j                  «       }| j                  |j                  «       «       | j                  || j                  «       y)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=   r>   r   r   r*   r6   r7   r8   r,   r   )r#   r?   r0   r/   r:   s        r$   Útest_getPublicKeyAgentFallbackz5SSHUserAuthClientTests.test_getPublicKeyAgentFallbackr   sq   € ô
 “.ˆØ!Ÿ\™\×.Ñ.Ð/ˆÔÜÓ ˆÜ" 7¨G°TÓ:ˆØˆŒØ×!Ñ!Ó#ˆØ�‰˜Ÿ™›Ô'Ø×Ñ˜˜dŸn™nÕ-r&   c                 óô  — t        «       }| j                  j                  d«      j                  t        j
                  «       | j                  j                  d«      }|j                  t        j                  «       | j                  j                  |j                  g|_	        | j                  j                  d«      j                  d«       t        d|d«      }|j                  «       }| j                  |j                  «       «       | j                  |t        j                   t        j
                  «      «       | j                  |j"                  | j                  j                  |j                  g«       y)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.pubÚid_dsar   s
   not a key!r(   N)r   r   r   r    r   ÚpublicDSA_opensshÚprivateDSA_opensshr   r=   r>   r   r6   r7   r8   r,   r   r   Ú	usedFiles)r#   r?   ÚdsaFiler/   r:   s        r$   Útest_getPublicKeyBadKeyErrorz3SSHUserAuthClientTests.test_getPublicKeyBadKeyError€   s  € ô “.ˆØ�‰×Ñ˜,Ó'×2Ñ2´7×3LÑ3LÔMØ—+‘+×#Ñ# HÓ-ˆØ×Ñœ7×5Ñ5Ô6Ø!Ÿ\™\×.Ñ.°·±Ð=ˆÔØ�‰×Ñ˜,Ó'×2Ñ2°=ÔAÜ" 7¨G°TÓ:ˆØ×!Ñ!Ó#ˆØ�‰˜Ÿ™›Ô'Ø×Ñ˜œcŸn™n¬W×-FÑ-FÓGÔHØ×Ñ˜×)Ñ)¨D¯L©L×,=Ñ,=¸w¿|¹|Ð+LÕMr&   c                 ó  ‡ ‡— t        j                  t        j                  «      Št	        «       }‰ j
                  j                  g|_        t        d|d«      }|j                  «        ˆˆ fd„}|j                  «       j                  |«      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                 óh   •— ‰j                  | j                  «       «       ‰j                  | ‰«       y ©N©ÚassertFalser8   r,   ©r:   Ú
rsaPrivater#   s    €€r$   Ú_cbGetPrivateKeyzCSSHUserAuthClientTests.test_getPrivateKey.<locals>._cbGetPrivateKeyŸ   ó'   ø€ Ø×Ñ˜SŸ\™\›^Ô,Ø×Ñ˜S *Õ-r&   )r   r   r   r!   r   r   r=   r>   r   r6   ÚgetPrivateKeyÚaddCallback)r#   r?   r/   rQ   rP   s   `   @r$   Útest_getPrivateKeyz)SSHUserAuthClientTests.test_getPrivateKey’   sq   ù€ ô —^‘^¤G×$>Ñ$>Ó?ˆ
Ü“.ˆØ!Ÿ\™\×.Ñ.Ð/ˆÔÜ" 7¨G°TÓ:ˆà×ÑÔõ	.ð ×#Ñ#Ó%×1Ñ1Ð2BÓCÐCr&   c                 ó¬  ‡ ‡‡— t        j                  t        j                  «      ŠdŠ‰ j                  j                  ‰j                  d‰¬«      «       t        «       }‰ j                  j                  g|_	        t        d|d«      }|j                  «        ˆˆ fd„}ˆˆ fd„}‰ j                  |d|«       |j                  «       j                  |«      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 passphraseÚopenssh)Ú
passphraser(   Nc                 ón   •— ‰j                  | d‰j                  j                  › d�«       t        ‰«      S )NzEnter passphrase for key 'z': )r,   r   r=   r   )ÚpromptrX   r#   s    €€r$   Ú_getPasswordzISSHUserAuthClientTests.test_getPrivateKeyPassphrase.<locals>._getPassword´   s8   ø€ Ø×ÑØÐ4°T·\±\×5FÑ5FÐ4GÀsÐKôô   
Ó+Ð+r&   c                 óh   •— ‰j                  | j                  «       «       ‰j                  | ‰«       y rL   rM   rO   s    €€r$   rQ   zMSSHUserAuthClientTests.test_getPrivateKeyPassphrase.<locals>._cbGetPrivateKeyº   rR   r&   r[   )r   r   r   r!   r   r    ÚtoStringr   r=   r>   r   r6   ÚpatchrS   rT   )r#   r?   r/   r[   rQ   rX   rP   s   `    @@r$   Útest_getPrivateKeyPassphrasez3SSHUserAuthClientTests.test_getPrivateKeyPassphrase¥   s­   ú€ ô —^‘^¤G×$>Ñ$>Ó?ˆ
Ø.ˆ
Ø�‰×Ñ 
× 3Ñ 3°IÈ*Ð 3Ó UÔVÜ“.ˆØ!Ÿ\™\×.Ñ.Ð/ˆÔÜ" 7¨G°TÓ:ˆà×ÑÔõ	,õ	.ð 	�
‰
�6˜>¨<Ô8Ø×#Ñ#Ó%×1Ñ1Ð2BÓCÐCr&   c                 ó  ‡ —  G d„ d«      }t        «       }t        d|d«      } |d«      |_        ˆ fd„}‰ j                  t        j
                  d|«       |j                  «       }|j                  ‰ j                  d«       |S )	zn
        Get the password using
        L{twisted.conch.client.default.SSHUserAuthClient.getPassword}
        c                   ó   — e Zd Zd„ Zd„ Zy)ú>SSHUserAuthClientTests.test_getPassword.<locals>.FakeTransportc                 ó    — | | _         || _        y rL   )r1   Úhost)r#   rd   s     r$   Ú__init__zGSSHUserAuthClientTests.test_getPassword.<locals>.FakeTransport.__init__É   s   € Ø!%�”Ø �•	r&   c                 ó   — | S rL   © r"   s    r$   ÚgetPeerzFSSHUserAuthClientTests.test_getPassword.<locals>.FakeTransport.getPeerÍ   s   € Ø�r&   N)Ú__name__Ú
__module__Ú__qualname__re   rh   rg   r&   r$   ÚFakeTransportrb   È   s   „ ò!ór&   rl   r(   Nz	127.0.0.1c                 ó*   •— ‰j                  | d«       y)Nzuser@127.0.0.1's password: úbad password©r,   ©rZ   r#   s    €r$   Úgetpassz8SSHUserAuthClientTests.test_getPassword.<locals>.getpassÔ   s   ø€ Ø×Ñ˜VÐ%BÔCØ!r&   rq   ó   bad password)	r   r   r1   r^   r   rq   ÚgetPasswordrT   r,   )r#   rl   r?   r/   rq   Úds   `     r$   Útest_getPasswordz'SSHUserAuthClientTests.test_getPasswordÁ   ss   ø€ ÷	ñ 	ô “.ˆÜ" 7¨G°TÓ:ˆÙ(¨Ó5ˆÔô	"ð 	�
‰
”7—?‘? I¨wÔ7Ø×ÑÓ ˆØ	�‰�d×&Ñ&¨Ô8Øˆr&   c                 óä   ‡ ‡— t        «       }t        d|d«      }dŠˆˆ fd„}‰ j                  t        j                  d|«       |j                  ‰«      }|j                  ‰ 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                 ó<   •— ‰j                  | t        ‰«      «       y)Nrn   )r,   r   )ÚprZ   r#   s    €€r$   rq   z>SSHUserAuthClientTests.test_getPasswordPrompt.<locals>.getpassè   s   ø€ Ø×Ñ˜Q¤¨VÓ 4Ô5Ø!r&   rq   rr   )r   r   r^   r   rq   rs   rT   r,   )r#   r?   r/   rq   rt   rZ   s   `    @r$   Útest_getPasswordPromptz-SSHUserAuthClientTests.test_getPasswordPromptÝ   sc   ù€ ô “.ˆÜ" 7¨G°TÓ:ˆØ)ˆõ	"ð 	�
‰
”7—?‘? I¨wÔ7Ø×Ñ˜vÓ&ˆØ	�‰�d×&Ñ&¨Ô8Øˆr&   c                 ó<  ‡ ‡‡— t        «       }t        d|d«      }d„ }‰ j                  t        j                  d|«       t
        j                  t
        j                  cŠŠ|j                  d«      }|j                  ˆ ˆˆfd„«       }‰ j                  |t        «       y)z­
        Get the password using
        L{twisted.conch.client.default.SSHUserAuthClient.getPassword}
        and trigger a {twisted.conch.error import ConchError}.
        r(   Nc                 ó   — t        d«      ‚)NzUser pressed CTRL-C)ÚKeyboardInterrupt)rZ   s    r$   rq   zBSSHUserAuthClientTests.test_getPasswordConchError.<locals>.getpassû   s   € Ü#Ð$9Ó:Ð:r&   rq   ó   ?c                 ól   •— ‰j                  ‰‰gt        j                  t        j                  g«       | S rL   )r,   ÚsysÚstdoutÚstdin)Úfailr#   r�   r€   s    €€€r$   Ú	check_syszDSSHUserAuthClientTests.test_getPasswordConchError.<locals>.check_sys  s)   ø€ à×Ñ˜f e˜_¬s¯z©z¼3¿9¹9Ð.EÔFØˆKr&   )r   r   r^   r   rq   r   r€   r�   rs   Ú
addErrbackÚassertFailurer   )r#   r?   r/   rq   rt   rƒ   r�   r€   s   `     @@r$   Útest_getPasswordConchErrorz1SSHUserAuthClientTests.test_getPasswordConchErrorñ   s€   ú€ ô “.ˆÜ" 7¨G°TÓ:ˆò	;ð 	�
‰
”7—?‘? I¨wÔ7ÜŸ
™
¤C§I¡Iˆˆ�Ø×Ñ˜tÓ$ˆà	
�‰õ	ó 
ð	ð 	×Ñ˜1œjÕ)r&   c                 ó   ‡ — t        «       }t        d|d«      }ˆ fd„}‰ j                  t        j                  d|«       ˆ fd„}‰ j                  t        d|«       |j                  ddd	d
g«      }|j                  ‰ j                  ddg«       |S )zU
        L{twisted.conch.client.default.SSHUserAuthClient.getGenericAnswers}
        r(   Nc                 ó*   •— ‰j                  | d«       y)Nzpass promptrq   ro   rp   s    €r$   rq   z>SSHUserAuthClientTests.test_getGenericAnswers.<locals>.getpass  s   ø€ Ø×Ñ˜V ]Ô3Ør&   rq   c                 ó*   •— ‰j                  | d«       y)Nzraw_input promptÚ	raw_inputro   rp   s    €r$   rŠ   z@SSHUserAuthClientTests.test_getGenericAnswers.<locals>.raw_input  s   ø€ Ø×Ñ˜VÐ%7Ô8Ør&   Ú_inputs   Names   Instruction)s   pass promptF)s   raw_input promptTrŠ   )r   r   r^   r   rq   ÚgetGenericAnswersrT   ÚassertListEqual)r#   r?   r/   rq   rŠ   rt   s   `     r$   Útest_getGenericAnswersz-SSHUserAuthClientTests.test_getGenericAnswers	  s‹   ø€ ô
 “.ˆÜ" 7¨G°TÓ:ˆô	ð 	�
‰
”7—?‘? I¨wÔ7ô	ð 	�
‰
”7˜H iÔ0Ø×$Ñ$ØØØ$Ð&AÐBó
ˆð
 	
�‰�d×*Ñ*¨Y¸Ð,DÔEØˆr&   N)ri   rj   rk   Ú__doc__r%   r3   r;   r@   rB   rI   rU   r_   r   ÚdoSkipÚ
skipReasonru   ry   r†   rŽ   rg   r&   r$   r   r   2   sŸ   „ ñòNò
ò*0ò.ò.òNò$Dò&Dñ8 ˆF�JÓñó  ðñ6 ˆF�JÓñó  ðñ& ˆF�JÓñ*ó  ð*ñ. ˆF�JÓñó  ñr&   r   c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚConchOptionsParsingz
    Options parsing.
    c                 ó’  — t        «       }| j                  t        |j                  d«      }| j	                  d|j
                  «       t        «       }|j                  d«       | j                  |d   dg«       |j                  d«       | j                  |d   dg«       |j                  d«       | j                  |d   g d¢«       y)	z)
        Specify MAC algorithms.
        zinvalid-maczUnknown mac typezhmac-sha2-512Úmacss   hmac-sha2-512z hmac-sha2-256,hmac-sha1,hmac-md5)s   hmac-sha2-256s	   hmac-sha1s   hmac-md5N)r   ÚassertRaisesÚ
SystemExitÚopt_macsÚassertInÚcoder,   ©r#   ÚoptsÚes      r$   Ú	test_macszConchOptionsParsing.test_macs*  s¨   € ô ‹~ˆØ×Ñœj¨$¯-©-¸ÓGˆØ�‰Ð(¨!¯&©&Ô1Ü‹~ˆØ�‰�oÔ&Ø×Ñ˜˜f™Ð(8Ð'9Ô:Ø�‰Ð&Ô'Ø×Ñ˜˜f™Ð(8Ð'9Ô:Ø�‰Ð8Ô9Ø×Ñ˜˜f™Ò'TÕUr&   c                 ó’  — t        «       }| j                  t        |j                  d«      }| j	                  d|j
                  «       t        «       }|j                  d«       | j                  |d   dg«       |j                  d«       | j                  |d   dg«       |j                  d«       | j                  |d   ddg«       y)	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   r–   r—   Úopt_host_key_algorithmsr™   rš   r,   r›   s      r$   Útest_host_key_algorithmsz,ConchOptionsParsing.test_host_key_algorithms9  sµ   € ô ‹~ˆØ×Ñœj¨$×*FÑ*FÈÓVˆØ�‰Ð-¨q¯v©vÔ6Ü‹~ˆØ×$Ñ$ YÔ/Ø×Ñ˜Ð3Ñ4°z°lÔCØ×$Ñ$ ZÔ0Ø×Ñ˜Ð3Ñ4°z°lÔCØ×$Ñ$Ð%6Ô7Ø×Ñ˜Ð3Ñ4°zÀ:Ð6NÕOr&   N)ri   rj   rk   r�   rž   r¡   rg   r&   r$   r“   r“   %  s   „ ñòVóPr&   r“   )'r�   r   Úunittestr   Útwisted.conch.errorr   Útwisted.conch.testr   Útwisted.internet.testingr   Útwisted.python.compatr   Útwisted.python.filepathr   Útwisted.python.reflectr	   Útwisted.python.runtimer
   Útwisted.trial.unittestr   r�   r‘   Útwisted.conch.clientr   Útwisted.conch.client.agentr   Útwisted.conch.client.defaultr   Útwisted.conch.client.optionsr   Útwisted.conch.ssh.keysr   ÚskipÚ	isWindowsr�   Úisattyr€   r   r“   rg   r&   r$   ú<module>r³      sÊ   ðñó
 Ý å *Ý &Ý 4Ý .Ý ,Ý 0Ý +Ý +à	€Ø€
á�Ô Ý,Ý9Ý>Ý9Þ*à€FØJ€JØ€Dà€8×ÑÔØ€Fð	?ð ð
 ‡y�y×ÑÔØ€FØ6€JØ
‡z�z×ÑÔØ€FØ7€Jôp˜Xô pôf!P˜(õ !Pr&   