Ë
    oj3„  ã                   óN  — d Z ddlZddlmZ ddlmZmZmZ ddlm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZmZ ddlmZ ddlmZ  ed«      Z e rddl!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z( n
 G d„ d«      Z" G d„ d«      Z) G d„ de"jT                  «      Z+ G d„ d«      Z,ddlm-Z- e r e-j\                  e,e+e(j^                  «        G d„ dej`                  «      Z1 G d„ d«      Z2 G d„ d«      Z3 G d „ d!«      Z4 G d"„ d#«      Z5e �Âdd$l!m6Z6 dd%l$m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<  G d&„ d'«      Z= G d(„ d)e6j|                  «      Z? G d*„ d+e9j€                  «      ZA G d,„ d-«      ZB G d.„ d/eBe;j†                  «      ZD G d0„ d1eBe;jŠ                  «      ZF G d2„ d3e<jŽ                  «      ZH G d4„ d5e8j’                  «      ZJ G d6„ d7e7j–                  «      ZLd8„ ZM G d9„ d:ejœ                  «      ZO G d;„ d<ejœ                  «      ZP G d=„ d>ejœ                  «      ZQ G d?„ d@ejœ                  «      ZRy)Az!
Tests for L{twisted.conch.ssh}.
é    N)Úchain)ÚDictÚListÚTuple)ÚprivateDSA_opensshÚprivateRSA_opensshÚpublicDSA_opensshÚpublicRSA_openssh)ÚLoopbackRelay)Úportal)ÚUnauthorizedLogin)ÚdeferÚprotocolÚreactor)ÚProcessTerminated)ÚfailureÚlog)ÚrequireModule)ÚunittestÚcryptography)ÚavatarÚerror)Ú_kexÚcommonÚ
forwardingÚsessionc                   ó    — e Zd Z G d„ d«      Zy)r   c                   ó   — e Zd Zy)úavatar.ConchUserN)Ú__name__Ú
__module__Ú__qualname__© ó    ú=/usr/lib/python3/dist-packages/twisted/conch/test/test_ssh.pyÚ	ConchUserr   $   s   „ Ør$   r&   N)r    r!   r"   r&   r#   r$   r%   r   r   #   s   „ ÷	ò 	r$   r   c                   ó    — e Zd ZdZdZd„ Zd„ Zy)ÚConchTestRealma"  
    A realm which expects a particular avatarId to log in once and creates a
    L{ConchTestAvatar} for that request.

    @ivar expectedAvatarID: The only avatarID that this realm will produce an
        avatar for.

    @ivar avatar: A reference to the avatar after it is requested.
    Nc                 ó   — || _         y ©N)ÚexpectedAvatarID)Úselfr+   s     r%   Ú__init__zConchTestRealm.__init__5   s
   € Ø 0ˆÕr$   c                 óî   — || j                   k(  rL| j                  �t        d«      ‚t        «       | _        |d   | j                  | j                  j                  fS t        d| j                   ›d|›�«      ‚)zˆ
        Return a new L{ConchTestAvatar} if the avatarID matches the expected one
        and this is the first avatar request.
        zOnly one login allowedr   zOnly z may log in, not )r+   r   r   ÚConchTestAvatarÚlogout)r,   ÚavatarIDÚmindÚ
interfacess       r%   ÚrequestAvatarzConchTestRealm.requestAvatar8   sv   € ð
 �t×,Ñ,Ò,Ø�{‰{Ð&Ü'Ð(@ÓAÐAÜ)Ó+ˆDŒKØ˜a‘= $§+¡+¨t¯{©{×/AÑ/AÐAÐAÜØ�D×)Ñ)Ð,Ð,=¸h¸\ÐJó
ð 	
r$   )r    r!   r"   Ú__doc__r   r-   r4   r#   r$   r%   r(   r(   (   s   „ ñð €Fò1ó
r$   r(   c                   ó@   — e Zd ZdZesdZdZd„ Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zy
)r/   z§
    An avatar against which various SSH features can be tested.

    @ivar loggedOut: A flag indicating whether the avatar logout method has been
        called.
    úcannot run without cryptographyFc                 ó  — t         j                  j                  | «       i | _        i | _        | j
                  j                  t        j                  t        j                  dœ«       | j                  j                  dt        i«       y )N)ó   sessions   direct-tcpipó   crazy)r   r&   r-   Ú	listenersÚglobalRequestsÚchannelLookupÚupdater   Ú
SSHSessionr   ÚopenConnectForwardingClientÚsubsystemLookupÚCrazySubsystem©r,   s    r%   r-   zConchTestAvatar.__init__T   sk   € Ü×Ñ×!Ñ! $Ô'ØˆŒØ ˆÔØ×Ñ×!Ñ!ä#×.Ñ.Ü!+×!GÑ!Gñô	
ð 	×Ñ×#Ñ# X¬~Ð$>Õ?r$   c                 ó"   — || j                   d<   y)NÚfooé   ©r<   ©r,   Údatas     r%   Ú
global_foozConchTestAvatar.global_foo`   s   € Ø%)ˆ×Ñ˜EÑ"Ør$   c                 ó"   — || j                   d<   y)NÚfoo_2)rF   ó   datarG   rH   s     r%   Úglobal_foo_2zConchTestAvatar.global_foo_2d   s   € Ø'+ˆ×Ñ˜GÑ$Ør$   c                 ó0  — t        j                  |«      \  }}	 t        j                  |t        j                  | j
                  ||ft         j                  «      |¬«      }|| j                  ||f<   y# t        $ r t        j                  d d«       Y yw xY w)N)Ú	interfacerF   z2something went wrong with remote->local forwardingr   )r   ÚunpackGlobal_tcpip_forwardr   Ú	listenTCPÚSSHListenForwardingFactoryÚconnÚ SSHListenServerForwardingChannelr;   ÚBaseExceptionr   Úerr©r,   rI   ÚhostÚportÚlisteners        r%   Úglobal_tcpip_forwardz$ConchTestAvatar.global_tcpip_forwardh   s�   € Ü×:Ñ:¸4Ó@‰
ˆˆdð	Ü×(Ñ(ØÜ×5Ñ5Ø—I‘I  d˜|¬Z×-XÑ-Xóð ôˆHð ,4ˆD�N‰N˜D $˜<Ñ(Øøô ò 	Ü�G‰G�DÐNÔOÙð	ús   šAA3 Á3BÂBc                 ó´   — t        j                  |«      \  }}| j                  j                  ||fd «      }|sy| j                  ||f= |j	                  «        y)Nr   rF   )r   rQ   r;   ÚgetÚstopListeningrX   s        r%   Úglobal_cancel_tcpip_forwardz+ConchTestAvatar.global_cancel_tcpip_forwardy   sU   € Ü×:Ñ:¸4Ó@‰
ˆˆdØ—>‘>×%Ñ% t¨T l°DÓ9ˆÙØØ�N‰N˜D $˜<Ð(Ø×ÑÔ Ør$   c                 ó    — d| _         | j                  j                  «       D ]*  }t        j                  d|z  «       |j                  «        Œ, y )NTzstopListening %s)Ú	loggedOutr;   Úvaluesr   Úmsgr_   )r,   r[   s     r%   r0   zConchTestAvatar.logout‚   sC   € ØˆŒØŸ™×-Ñ-Ó/ò 	%ˆHÜ�G‰GÐ&¨Ñ1Ô2Ø×"Ñ"Õ$ñ	%r$   N)r    r!   r"   r5   r   Úskiprb   r-   rJ   rN   r\   r`   r0   r#   r$   r%   r/   r/   G   s5   „ ññ Ø0ˆà€Iò
@òòòò"ó%r$   r/   c                   ó4   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	ÚConchSessionForTestAvatarz2
    An ISession adapter for ConchTestAvatar.
    c                 óž   — || _         | | j                   _        d| _        d| _        d| _        d| _        t        j                  «       | _        y)zq
        Initialize the session and create a reference to it on the avatar for
        later inspection.
        NFr   )	r   Ú_testSessionÚcmdÚprotoÚptyReqÚeofr   ÚDeferredÚonClose)r,   r   s     r%   r-   z"ConchSessionForTestAvatar.__init__Ž   sA   € ð
 ˆŒØ#'ˆ�‰Ô ØˆŒØˆŒ
ØˆŒØˆŒÜ—~‘~Ó'ˆ�r$   c                 óX   — t        j                  d«       || _        || _        d| _        y )Nzpty reqT)r   rd   Ú_terminalTypeÚ_windowSizerl   )r,   ÚtermÚ
windowSizeÚattrss       r%   ÚgetPtyz ConchSessionForTestAvatar.getPty›   s%   € Ü�‰�	ÔØ!ˆÔØ%ˆÔØˆ�r$   c                 ó`   — t        j                  d«       || _        t        |«       d| _        y )Nzopening shelló   shell)r   rd   rk   ÚEchoTransportrj   )r,   rk   s     r%   Ú	openShellz#ConchSessionForTestAvatar.openShell¡   s$   € Ü�‰�Ô ØˆŒ
Ü�eÔØˆ�r$   c                 óZ  — || _         || _        |j                  «       d   }|dk(  r,t        |«      }t	        j
                  d|j                  «       n´|dk(  r0t        |«      }|j                  |dd  «       |j                  «        n|dk(  r0t        |«      }|j                  |dd  «       |j                  «        nJ|dk(  r0t        |«      }|j                  |dd  «       |j                  «        nt        j                  d«      ‚d	| j                  j                  j                  _        y )
Nr   ó   falses   echoé   s   sechoé   s   eechoúbad execrF   )rj   rk   ÚsplitÚFalseTransportr   Ú	callLaterÚloseConnectionry   ÚwriteÚSuperEchoTransportÚErrEchoTransportr   Ú
ConchErrorr   rT   Ú	transportÚexpectedLoseConnection)r,   rk   rj   ÚfÚts        r%   ÚexecCommandz%ConchSessionForTestAvatar.execCommand§   sþ   € ØˆŒØˆŒ
Ø�I‰I‹K˜‰NˆØ�Š=Ü˜uÓ%ˆAô ×Ñ˜a ×!1Ñ!1Õ2Ø�'Š\Ü˜eÓ$ˆAØ�G‰G�C˜˜�GÔØ×ÑÕØ�(Š]Ü" 5Ó)ˆAØ�G‰G�C˜˜�GÔØ×ÑÕØ�(Š]Ü  Ó'ˆAØ�G‰G�C˜˜�GÔØ×ÑÕä×"Ñ" :Ó.Ð.Ø<=ˆ�‰×Ñ×"Ñ"Õ9r$   c                 ó   — d| _         y ©NrF   )rm   rC   s    r%   ÚeofReceivedz%ConchSessionForTestAvatar.eofReceivedÀ   s	   € Øˆ�r$   c                 óÈ   — t        j                  d| j                  z  «       | j                  j                  j
                  | _        | j                  j                  d «       y )Nzclosed cmd "%s")	r   rd   rj   rk   r   ÚremoteWindowLeftÚremoteWindowLeftAtClosero   ÚcallbackrC   s    r%   Úclosedz ConchSessionForTestAvatar.closedÃ   sB   € Ü�‰Ð! D§H¡HÑ,Ô-Ø'+§z¡z×'9Ñ'9×'JÑ'JˆÔ$Ø�‰×Ñ˜dÕ#r$   N)
r    r!   r"   r5   r-   rv   rz   rŒ   r�   r”   r#   r$   r%   rg   rg   ‰   s%   „ ñò(òòò>ò2ó$r$   rg   )Ú
componentsc                   ó   — e Zd Zd„ Zd„ Zy)rB   c                  ó   — y r*   r#   )r,   ÚargsÚkws      r%   r-   zCrazySubsystem.__init__Ò   s   € Ør$   c                  ó   — y)z
        good ... good
        Nr#   rC   s    r%   ÚconnectionMadezCrazySubsystem.connectionMadeÕ   s   � r$   N)r    r!   r"   r-   r›   r#   r$   r%   rB   rB   Ñ   s   „ òór$   rB   c                   ó   — e Zd ZdZd„ Zd„ Zy)r�   a  
    False transport should act like a /bin/false execution, i.e. just exit with
    nonzero status, writing nothing to the terminal.

    @ivar proto: The protocol associated with this transport.
    @ivar closed: A flag tracking whether C{loseConnection} has been called yet.
    c                 óB   — || _         |j                  | «       d| _        y)zY
        @type p L{twisted.conch.ssh.session.SSHSessionProcessProtocol} instance
        r   N©rk   ÚmakeConnectionr”   ©r,   Úps     r%   r-   zFalseTransport.__init__ä   s    € ð ˆŒ
Ø	×Ñ˜ÔØˆ�r$   c           	      ó:  — | j                   ryd| _         | j                  j                  «        | j                  j                  «        | j                  j	                  «        | j                  j                  t        j                  t        ddd«      «      «       y)zI
        Disconnect the protocol associated with this transport.
        NrF   éÿ   ©	r”   rk   ÚinConnectionLostÚoutConnectionLostÚerrConnectionLostÚprocessEndedr   ÚFailurer   rC   s    r%   rƒ   zFalseTransport.loseConnectionì   sj   € ð �;Š;ØØˆŒØ�
‰
×#Ñ#Ô%Ø�
‰
×$Ñ$Ô&Ø�
‰
×$Ñ$Ô&Ø�
‰
×Ñ¤§¡Ô0AÀ#ÀtÈTÓ0RÓ SÕTr$   N)r    r!   r"   r5   r-   rƒ   r#   r$   r%   r�   r�   Û   s   „ ñòó
Ur$   r�   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)ry   c                 óB   — || _         |j                  | «       d| _        y ©Nr   rž   r    s     r%   r-   zEchoTransport.__init__ú   ó   € ØˆŒ
Ø	×Ñ˜ÔØˆ�r$   c                 óÖ   — t        j                  t        |«      «       | j                  j	                  |«       | j                  j	                  d«       d|v r| j                  «        y y )Nó   
ó    )r   rd   Úreprrk   ÚoutReceivedrƒ   rH   s     r%   r„   zEchoTransport.writeÿ   sN   € Ü�‰”�T“
ÔØ�
‰
×Ñ˜tÔ$Ø�
‰
×Ñ˜wÔ'Ø�d‰?Ø×ÑÕ!ð r$   c           	      ó:  — | j                   ry d| _         | j                  j                  «        | j                  j                  «        | j                  j	                  «        | j                  j                  t        j                  t        dd d «      «      «       y ©NrF   r   r¤   rC   s    r%   rƒ   zEchoTransport.loseConnection  óh   € Ø�;Š;ØØˆŒØ�
‰
×#Ñ#Ô%Ø�
‰
×$Ñ$Ô&Ø�
‰
×$Ñ$Ô&Ø�
‰
×Ñ¤§¡Ô0AÀ!ÀTÈ4Ó0PÓ QÕRr$   N©r    r!   r"   r-   r„   rƒ   r#   r$   r%   ry   ry   ù   s   „ òò
"óSr$   ry   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)r†   c                 óB   — || _         |j                  | «       d| _        y r¬   rž   r    s     r%   r-   zErrEchoTransport.__init__  r­   r$   c                 óp   — | j                   j                  |«       | j                   j                  d«       y ©Nr¯   )rk   ÚerrReceivedrH   s     r%   r„   zErrEchoTransport.write  s&   € Ø�
‰
×Ñ˜tÔ$Ø�
‰
×Ñ˜wÕ'r$   c           	      ó:  — | j                   ry d| _         | j                  j                  «        | j                  j                  «        | j                  j	                  «        | j                  j                  t        j                  t        dd d «      «      «       y r´   r¤   rC   s    r%   rƒ   zErrEchoTransport.loseConnection  rµ   r$   Nr¶   r#   r$   r%   r†   r†     s   „ òò
(óSr$   r†   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)r…   c                 óB   — || _         |j                  | «       d| _        y r¬   rž   r    s     r%   r-   zSuperEchoTransport.__init__%  r­   r$   c                 óÜ   — | j                   j                  |«       | j                   j                  d«       | j                   j                  |«       | j                   j                  d«       y rº   )rk   r²   r»   rH   s     r%   r„   zSuperEchoTransport.write*  sJ   € Ø�
‰
×Ñ˜tÔ$Ø�
‰
×Ñ˜wÔ'Ø�
‰
×Ñ˜tÔ$Ø�
‰
×Ñ˜wÕ'r$   c           	      ó:  — | j                   ry d| _         | j                  j                  «        | j                  j                  «        | j                  j	                  «        | j                  j                  t        j                  t        dd d «      «      «       y r´   r¤   rC   s    r%   rƒ   z!SuperEchoTransport.loseConnection0  rµ   r$   Nr¶   r#   r$   r%   r…   r…   $  s   „ òò
(óSr$   r…   )Úcheckers)ÚchannelÚ
connectionÚfactoryÚkeysrˆ   Úuserauthc                   ó,   — e Zd Zej                  fZd„ Zy)ÚConchTestPasswordCheckerc                 ó¸   — |j                   dk(  r.|j                  dk(  rt        j                  |j                   «      S t        j                  t        d«      «      S )Nó   testuseró   testpasszBad credentials)ÚusernameÚpasswordr   ÚsucceedÚfailÚ	Exception)r,   Úcredentialss     r%   ÚrequestAvatarIdz(ConchTestPasswordChecker.requestAvatarIdH  sH   € à×$Ñ$¨Ò3Ø×(Ñ(¨KÒ7ä—}‘} [×%9Ñ%9Ó:Ð:Ü—:‘:œiÐ(9Ó:Ó;Ð;r$   N)r    r!   r"   rÁ   ÚIUsernamePasswordÚcredentialInterfacesrÒ   r#   r$   r%   rÈ   rÈ   E  s   „ Ø (× :Ñ :Ð<Ðó	<r$   rÈ   c                   ó   — e Zd Zd„ Zy)ÚConchTestSSHCheckerc                 óF   — |dk7  st        | j                  |   «      dk  ryy)NrÊ   é   FT)ÚlenÚsuccessfulCredentials)r,   ÚavatarIds     r%   ÚareDonezConchTestSSHChecker.areDoneQ  s(   € Ø˜;Ò&¬#¨d×.HÑ.HÈÑ.RÓ*SÐVWÒ*WØØr$   N)r    r!   r"   rÜ   r#   r$   r%   rÖ   rÖ   P  s   „ ó	r$   rÖ   c                   ó€   — e Zd ZdZej
                  ej                  dœZd„ Z	d„ Z
d„ Zdeeeeeef      f   fd„Zd„ Zy	)
ÚConchTestServerFactoryF)s   ssh-userauthó   ssh-connectionc                 óô   — t        «       }t        t        j                  d„ | j                  j                  «       D «       «      «      |_        | |_        t        | d«      r| j                  |_	        || _
        |S )Nc              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr*   )ÚsupportedSignatureAlgorithms)Ú.0Úkeys     r%   ú	<genexpr>z7ConchTestServerFactory.buildProtocol.<locals>.<genexpr>a  s!   è ø€ ò $àð ×4Ñ4×6ñ$ùs   ‚r‰   )ÚConchTestServerÚlistr   Úfrom_iterableÚprivateKeysrc   ÚsupportedPublicKeysrÄ   Úhasattrr‰   rk   )r,   Úaddrrk   s      r%   ÚbuildProtocolz$ConchTestServerFactory.buildProtocol^  so   € Ü#Ó%ˆEÜ(,Ü×#Ñ#ñ $à#×/Ñ/×6Ñ6Ó8ô$ó ó)ˆEÔ%ð !ˆEŒMä�tÐ5Ô6Ø/3×/JÑ/J�Ô,àˆDŒJØˆLr$   c                 ó�   — t         j                  j                  t        «      t         j                  j                  t        «      dœS ©N)ó   ssh-rsaó   ssh-dss©rÅ   ÚKeyÚ
fromStringr
   r	   rC   s    r%   ÚgetPublicKeysz$ConchTestServerFactory.getPublicKeysn  s2   € ä ŸH™H×/Ñ/Ô0AÓBÜ ŸH™H×/Ñ/Ô0AÓBñð r$   c                 ó�   — t         j                  j                  t        «      t         j                  j                  t        «      dœS rï   ©rÅ   ró   rô   r   r   rC   s    r%   ÚgetPrivateKeysz%ConchTestServerFactory.getPrivateKeyst  s2   € ä ŸH™H×/Ñ/Ô0BÓCÜ ŸH™H×/Ñ/Ô0BÓCñð r$   Úreturnc                 ó2   — dt        j                  d«      giS )a%  
            Diffie-Hellman primes that can be used for the
            diffie-hellman-group-exchange-sha1 key exchange.

            @return: The primes and generators.
            @rtype: L{dict} mapping the key size to a C{list} of
                C{(generator, prime)} tupple.
            i   s   diffie-hellman-group14-sha1)r   ÚgetDHGeneratorAndPrimerC   s    r%   Ú	getPrimesz ConchTestServerFactory.getPrimesz  s   € ð œ4×6Ñ6Ð7UÓVÐWÐXÐXr$   c                 óD   — t         j                  j                  | ||«      S r*   )rÄ   Ú
SSHFactoryÚ
getService)r,   ÚtransÚnames      r%   rÿ   z!ConchTestServerFactory.getService‰  s   € Ü×%Ñ%×0Ñ0°°u¸dÓCÐCr$   N)r    r!   r"   ÚnoisyrÆ   ÚSSHUserAuthServerrÃ   ÚSSHConnectionÚservicesrí   rõ   rø   r   Úintr   r   rü   rÿ   r#   r$   r%   rÞ   rÞ   V  s\   „ Øˆð &×7Ñ7Ø)×7Ñ7ñ
ˆò
	ò 	ò	ð	Y˜t C¨¨e°C¸°H©oÑ)>Ð$>Ñ?ó 	Yó	Dr$   rÞ   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚConchTestBaser   c                 óz   — | j                   ry t        | d«      st        j                  d| › d|› �«      ‚d| _         y )Nr‰   zunexpectedly lost connection ú
rF   )Údonerë   r   ÚFailTest©r,   Úreasons     r%   ÚconnectionLostzConchTestBase.connectionLost�  sC   € Ø�yŠyØÜ˜4Ð!9Ô:Ü×'Ñ'Ø3°D°6¸¸F¸8ÐDóð ð ˆD�Ir$   c           
      ó¦   — d| _         |t        j                  k7  r't        j                  t        d| ›d|›d|›�«      «       | j                  «        y )NrF   zgot disconnect for z	: reason z, desc: )r‰   rˆ   ÚDISCONNECT_BY_APPLICATIONr   rW   rÐ   rƒ   )r,   Ú
reasonCodeÚdescs      r%   ÚreceiveErrorzConchTestBase.receiveError˜  sH   € Ø*+ˆDÔ'ð œY×@Ñ@Ò@Ü—‘Ýâ¢©Tð3óôð ×ÑÕ!r$   c                 ó2   — t        j                  d|› �«      ‚)Nzgot unimplemented: seqid )r   r  )r,   ÚseqIDs     r%   ÚreceiveUnimplementedz"ConchTestBase.receiveUnimplemented¨  s   € Ü×#Ñ#Ð&?À¸wÐ$GÓHÐHr$   N)r    r!   r"   r  r  r  r  r#   r$   r%   r  r  Œ  s   „ Øˆò	ò	"ó 	Ir$   r  c                   ó   — e Zd Zd„ Zy)ræ   c                 óp   — t         j                  | |«       t        j                  j                  | |«       y r*   )r  r  rˆ   ÚSSHServerTransportr  s     r%   r  zConchTestServer.connectionLost¬  ó(   € Ü×(Ñ(¨¨vÔ6Ü×(Ñ(×7Ñ7¸¸fÕEr$   N)r    r!   r"   r  r#   r$   r%   ræ   ræ   «  s   „ ó	Fr$   ræ   c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚConchTestClientz½
        @ivar _channelFactory: A callable which accepts an SSH connection and
            returns a channel which will be attached to a new channel on that
            connection.
        c                 ó   — || _         y r*   )Ú_channelFactory©r,   ÚchannelFactorys     r%   r-   zConchTestClient.__init__·  s
   € Ø#1ˆDÕ r$   c                 óp   — t         j                  | |«       t        j                  j                  | |«       y r*   )r  r  rˆ   ÚSSHClientTransportr  s     r%   r  zConchTestClient.connectionLostº  r  r$   c                 óâ   — |t         j                  j                  t        «      j	                  «       k(  }|dk(  }|r|rt        j                  d«      S t        j                  t        d«      «      S )Ns/   85:25:04:32:58:55:96:9f:57:ee:fb:a8:1a:ea:69:darF   zKey or fingerprint mismatch)	rÅ   ró   rô   r
   Úblobr   rÎ   rÏ   rÐ   )r,   rä   ÚfpÚkeyMatchÚfingerprintMatchs        r%   ÚverifyHostKeyzConchTestClient.verifyHostKey¾  s[   € ØœdŸh™h×1Ñ1Ô2CÓD×IÑIÓKÑKˆHØ!Ð%WÑWÐÙÑ,Ü—}‘} QÓ'Ð'Ü—:‘:œiÐ(EÓFÓGÐGr$   c                 ó`   — | j                  t        dt        | j                  «      «      «       y )NrÊ   )ÚrequestServiceÚConchTestClientAuthÚConchTestClientConnectionr  rC   s    r%   ÚconnectionSecurez ConchTestClient.connectionSecureÅ  s)   € Ø×ÑÜ#ØÔ!:¸4×;OÑ;OÓ!Póõr$   N)r    r!   r"   r5   r-   r  r)  r.  r#   r$   r%   r  r  °  s   „ ñ	ò	2ò	Fò	Hó	r$   r  c                   ó0   — e Zd ZdZdZdZd„ Zd„ Zd„ Zd„ Z	y)r,  r   c                 óž   — | j                   s!| j                  rt        j                  d«      ‚t        j
                  j                  | |«       y )Nz2got USERAUTH_SUCCESS before password and publickey)ÚcanSucceedPasswordÚcanSucceedPublicKeyr   r  rÆ   ÚSSHUserAuthClientÚssh_USERAUTH_SUCCESS)r,   Úpackets     r%   r4  z(ConchTestClientAuth.ssh_USERAUTH_SUCCESSÑ  sA   € Ø×*Ò*¨t×/GÒ/GÜ×'Ñ'ØHóð ô ×&Ñ&×;Ñ;¸DÀ&ÕIr$   c                 ó:   — d| _         t        j                  d«      S )NrF   rË   )r1  r   rÎ   rC   s    r%   ÚgetPasswordzConchTestClientAuth.getPasswordØ  s   € Ø&'ˆDÔ#Ü—=‘= Ó-Ð-r$   c                 ó|   — d| _         t        j                  t        j                  j                  t        «      «      S rŽ   )r2  r   rÎ   rÅ   ró   rô   r   rC   s    r%   ÚgetPrivateKeyz!ConchTestClientAuth.getPrivateKeyÜ  s)   € Ø'(ˆDÔ$Ü—=‘=¤§¡×!4Ñ!4Ô5GÓ!HÓIÐIr$   c                 óH   — t         j                  j                  t        «      S r*   )rÅ   ró   rô   r	   rC   s    r%   ÚgetPublicKeyz ConchTestClientAuth.getPublicKeyà  s   € Ü—8‘8×&Ñ&Ô'8Ó9Ð9r$   N)
r    r!   r"   ÚhasTriedNoner2  r1  r4  r7  r9  r;  r#   r$   r%   r,  r,  Ì  s)   „ ØˆØÐØÐò	Jò	.ò	Jó	:r$   r,  c                   ó(   — e Zd ZdZdZdZdZd„ Zd„ Zy)r-  z�
        @ivar _completed: A L{Deferred} which will be fired when the number of
            results collected reaches C{totalResults}.
        rß   r   é   c                 óP   — t         j                  j                  | «       || _        y r*   )rÃ   r  r-   r  r   s     r%   r-   z"ConchTestClientConnection.__init__í  s   € Ü×$Ñ$×-Ñ-¨dÔ3Ø#1ˆDÕ r$   c                 óF   — | j                  | j                  | ¬«      «       y )N)rT   )ÚopenChannelr  rC   s    r%   ÚserviceStartedz(ConchTestClientConnection.serviceStartedñ  s   € Ø×Ñ˜T×1Ñ1°tÐ1Ó<Õ=r$   N)	r    r!   r"   r5   r  ÚresultsÚtotalResultsr-   rB  r#   r$   r%   r-  r-  ã  s"   „ ñ	ð
 !ˆØˆØˆò	2ó	>r$   r-  c                   ó<   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
y	)
ÚSSHTestChannelc                 ó´   — || _         || _        g | _        g | _        t	        j
                  «       | _        t        j                  j                  | g|¢­i |¤Ž y r*   )
r  Ú_openedÚreceivedÚreceivedExtr   rn   ro   rÂ   Ú
SSHChannelr-   )r,   r  Úopenedr˜   Úkwargss        r%   r-   zSSHTestChannel.__init__õ  sK   € ØˆDŒIØ!ˆDŒLØˆDŒMØ!ˆDÔÜ Ÿ>™>Ó+ˆDŒLÜ×Ñ×'Ñ'¨Ð>¨tÒ>°vÓ>r$   c                 ó:   — | j                   j                  |«       y r*   )rH  Úerrbackr  s     r%   Ú
openFailedzSSHTestChannel.openFailedý  s   € Ø�L‰L× Ñ  Õ(r$   c                 ó:   — | j                   j                  | «       y r*   )rH  r“   )r,   Úignores     r%   ÚchannelOpenzSSHTestChannel.channelOpen   ó   € Ø�L‰L×!Ñ! $Õ'r$   c                 ó:   — | j                   j                  |«       y r*   )rI  ÚappendrH   s     r%   ÚdataReceivedzSSHTestChannel.dataReceived  s   € Ø�M‰M× Ñ  Õ&r$   c                 ó’   — |t         j                  k(  r| j                  j                  |«       y t	        j
                  d|›�«       y )NzUnrecognized extended data: )rÃ   ÚEXTENDED_DATA_STDERRrJ  rV  r   rd   )r,   ÚdataTyperI   s      r%   ÚextReceivedzSSHTestChannel.extReceived  s8   € Øœ:×:Ñ:Ò:Ø× Ñ ×'Ñ'¨Õ-ä—‘Ð6°x°lÐCÕDr$   c                 ó>   — t        j                  d|«      \  | _        y )Nz>L)ÚstructÚunpackÚstatus)r,   r_  s     r%   Úrequest_exit_statusz"SSHTestChannel.request_exit_status  s   € Ü"ŸM™M¨$°Ó7‰MˆT�[r$   c                 ó   — d| _         y )NT)Ú	eofCalledrC   s    r%   r�   zSSHTestChannel.eofReceived  s	   € Ø!ˆD�Nr$   c                 ó:   — | j                   j                  d «       y r*   )ro   r“   rC   s    r%   r”   zSSHTestChannel.closed  rT  r$   N)r    r!   r"   r-   rP  rS  rW  r[  r`  r�   r”   r#   r$   r%   rF  rF  ô  s+   „ ò	?ò	)ò	(ò	'ò	Eò	8ò	"ó	(r$   rF  c                  óž   — t        j                  dt        j                  j	                  t
        «      gi«      } t        j                  | «      S )z´
        Produces a SSHPublicKeyChecker with an in-memory key mapping with
        a single use: 'testuser'

        @return: L{twisted.conch.checkers.SSHPublicKeyChecker}
        rÊ   )rÁ   ÚInMemorySSHKeyDBrÅ   ró   rô   r	   ÚSSHPublicKeyChecker)ÚconchTestPublicKeyDBs    r%   ÚconchTestPublicKeyCheckerrh    sD   € ô  (×8Ñ8Øœ4Ÿ8™8×.Ñ.Ô/@ÓAÐBÐCó 
Ðô ×+Ñ+Ð,@ÓAÐAr$   c                   óP   — e Zd ZdZesdZdd„Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zd„ Zy)ÚSSHProtocolTestsz^
    Tests for communication between L{SSHServerTransport} and
    L{SSHClientTransport}.
    úcan't run without cryptographyc                 óÀ  ‡‡‡— t        j                  «       Št        d«      | _        t	        j
                  | j                  «      }t        «       }|j                  t        «       «       |j                  t        «       «       |j                  |«       t        «       }||_        |j                  «        |j                  d«      | _        t        | j                  «      | _        t!        ˆˆˆfd„«      | _        t        | j"                  «      | _        | j                  j'                  | j$                  «       | j"                  j'                  | j                  «       ‰S )zÏ
        Create a connected SSH client and server protocol pair and return a
        L{Deferred} which fires with an L{SSHTestChannel} instance connected to
        a channel on that SSH connection.
        rÊ   Nc                 ó"   •— t        ‰‰fd| i‰¤ŽS )NrT   )rF  )rT   rM  r  Úresults    €€€r%   ú<lambda>z:SSHProtocolTests._ourServerOurClientTest.<locals>.<lambda>>  s   ø€ œ¨¨fÑJ¸4ÐJÀ6ÑJ€ r$   )r   rn   r(   Úrealmr   ÚPortalrÖ   ÚregisterCheckerrÈ   rh  rÞ   ÚstartFactoryrí   Úserverr   ÚclientTransportr  ÚclientÚserverTransportrŸ   )r,   r  rM  r¡   ÚsshpcÚfacrn  s    ``   @r%   Ú_ourServerOurClientTestz(SSHProtocolTests._ourServerOurClientTest+  sþ   ú€ ô —‘Ó!ˆÜ# KÓ0ˆŒ
Ü�M‰M˜$Ÿ*™*Ó%ˆÜ#Ó%ˆØ×ÑÔ6Ó8Ô9Ø×ÑÔ7Ó9Ô:Ø	×Ñ˜%Ô Ü$Ó&ˆØˆŒ
Ø×ÑÔØ×'Ñ'¨Ó-ˆŒÜ,¨T¯[©[Ó9ˆÔÜ%ÝJó
ˆŒô  -¨T¯[©[Ó9ˆÔà�‰×"Ñ" 4×#7Ñ#7Ô8Ø�‰×"Ñ" 4×#7Ñ#7Ô8Øˆr$   c                 óà   ‡ — ‰ j                  «       }ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       |S )zå
        Run the Conch server against the Conch client.  Set up several different
        channels which exercise different behaviors and wait for them to
        complete.  Verify that the channels with errors log them.
        c           	      óœ   •— | ‰_         ‰j                  | j                  j                  | dt	        j
                  d«      d«      t        «      S )Nó	   subsystems	   not-crazyrF   ©rÂ   ÚassertFailurerT   ÚsendRequestr   ÚNSrÐ   ©rÂ   r,   s    €r%   ÚcbSubsystemzFSSHProtocolTests.test_subsystemsAndGlobalRequests.<locals>.cbSubsystemO  sF   ø€ Ø"ˆDŒLØ×%Ñ%Ø—‘×(Ñ(Ø˜\¬6¯9©9°\Ó+BÀAóô ó	ð r$   c                 ó~   •— ‰j                   }|j                  j                  |dt        j                  d«      d«      S )Nr}  r:   rF   ©rÂ   rT   r€  r   r�  ©ÚignoredrÂ   r,   s     €r%   ÚcbNotCrazyFailedzKSSHProtocolTests.test_subsystemsAndGlobalRequests.<locals>.cbNotCrazyFailedZ  s5   ø€ Ø—l‘lˆGØ—<‘<×+Ñ+Ø˜¤v§y¡y°Ó':¸Aóð r$   c                 óZ  •— ‰j                   }|j                  j                  ddd«      }|j                  j                  ddd«      }|j                  ‰j                  d«       ‰j                  |j                  j                  ddd«      t        «      }t        j                  |||g«      S )Nó   fooó   barrF   s   foo-2ó   bar2rM   )	rÂ   rT   ÚsendGlobalRequestÚaddCallbackÚassertEqualr  rÐ   r   ÚgatherResults)r‡  rÂ   Úd1Úd2Úd3r,   s        €r%   ÚcbGlobalRequestszKSSHProtocolTests.test_subsystemsAndGlobalRequests.<locals>.cbGlobalRequestsb  s‘   ø€ Ø—l‘lˆGØ—‘×/Ñ/°¸ÀÓBˆBà—‘×/Ñ/°¸'À1ÓEˆBØ�N‰N˜4×+Ñ+¨WÔ5à×#Ñ#Ø—‘×.Ñ.¨v°v¸qÓAÄ9óˆBô ×&Ñ&¨¨B° |Ó4Ð4r$   c                 ó  •— ‰j                  ‰j                  j                  j                  dddœ«       ‰j                  }d|j
                  j                  _        |j
                  j                  «         |j                  «        y )Nr‹  rŒ  )rE   rL   T)
r�  rp  r   r<   rÂ   rT   rˆ   r‰   ÚserviceStoppedrƒ   r†  s     €r%   Ú
disconnectzESSHProtocolTests.test_subsystemsAndGlobalRequests.<locals>.disconnectq  sf   ø€ Ø×ÑØ—
‘
×!Ñ!×0Ñ0¸&È7Ñ2Sôð —l‘lˆGØ<@ˆG�L‰L×"Ñ"Ô9Ø�L‰L×'Ñ'Ô)Ø"ˆG×"Ñ"Õ$r$   ©rz  rŽ  )r,   rÂ   rƒ  rˆ  r”  r—  s   `     r%   Ú test_subsystemsAndGlobalRequestsz1SSHProtocolTests.test_subsystemsAndGlobalRequestsG  sv   ø€ ð ×.Ñ.Ó0ˆô	ð 	ˆ×Ñ˜KÔ(ô	ð 	ˆ×ÑÐ,Ô-ô	5ð 	ˆ×ÑÐ,Ô-ô	%ð 	ˆ×Ñ˜JÔ'àˆr$   c                 ó  ‡ ‡— ‰ j                  «       }t        j                  ddd«      Šˆˆ fd„} |j                  |«       ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       |S )z‹
        L{SSHChannel.sendRequest} can open a shell with a I{pty-req} request,
        specifying a terminal type and window size.
        ó   conch-test-term©é   éP   r   r   r$   c                 óN   •— | ‰_         | j                  j                  | d‰d«      S )Ns   pty-reqrF   )rÂ   rT   r€  )rÂ   rI   r,   s    €€r%   Ú	cbChannelz.SSHProtocolTests.test_shell.<locals>.cbChannel‡  s%   ø€ Ø"ˆDŒLØ—<‘<×+Ñ+¨G°ZÀÀqÓIÐIr$   c                 óÌ  •— ‰j                   j                  j                  j                  d   j                  }‰j                  |j                  ‰j                   j                  «       ‰j                  |j                  d«       ‰j                  |j                  d«       ‰j                  |j                  «       ‰j                  }|j                  j                  |ddd«      S )Nr   r›  rœ  rx   r$   rF   )rp  r   rT   Úchannelsr   ÚassertIsr�  rq   rr   Ú
assertTruerl   rÂ   r€  )r‡  r   rÂ   r,   s      €r%   ÚcbPtyz*SSHProtocolTests.test_shell.<locals>.cbPty�  s¦   ø€ à—j‘j×'Ñ'×,Ñ,×5Ñ5°aÑ8×@Ñ@ˆGØ�M‰M˜'Ÿ.™.¨$¯*©*×*;Ñ*;Ô<Ø×Ñ˜W×2Ñ2Ð4FÔGØ×Ñ˜W×0Ñ0°.ÔAØ�O‰O˜GŸN™NÔ+Ø—l‘lˆGØ—<‘<×+Ñ+¨G°X¸sÀAÓFÐFr$   c                 ó>  •— ‰j                   j                  d«       ‰j                   j                  j                  ‰j                   «       t	        j
                  ‰j                   j                  ‰j                  j                  j                  j                  g«      S )Ns   testing the shell! )
rÂ   r„   rT   ÚsendEOFr   r�  ro   rp  r   ri   ©r‡  r,   s    €r%   ÚcbShellz,SSHProtocolTests.test_shell.<locals>.cbShell™  sm   ø€ Ø�L‰L×ÑÐ8Ô9Ø�L‰L×Ñ×%Ñ% d§l¡lÔ3Ü×&Ñ&Ø—‘×%Ñ% t§z¡z×'8Ñ'8×'EÑ'E×'MÑ'MÐNóð r$   c                 ó¸  •— ‰j                   j                  dk7  r-t        j                  d‰j                   j                  fz  «       ‰j	                  dj                  ‰j                   j                  «      d«       ‰j                  ‰j                   j                  «       ‰j                  ‰j                  j                  j                  j                  «       y )Nr   zshell exit status was not 0: %ir$   s   testing the shell! 
)rÂ   r_  r   rd   r�  ÚjoinrI  r¤  rb  rp  r   ri   rm   r¨  s    €r%   ÚcbExitedz-SSHProtocolTests.test_shell.<locals>.cbExited¢  s•   ø€ Ø�|‰|×"Ñ" aÒ'Ü—‘Ð9¸T¿\¹\×=PÑ=PÐ<RÑRÔSØ×ÑØ—‘˜Ÿ™×.Ñ.Ó/Ð1Nôð �O‰O˜DŸL™L×2Ñ2Ô3Ø�O‰O˜DŸJ™J×-Ñ-×:Ñ:×>Ñ>Õ?r$   )rz  r   ÚpackRequest_pty_reqrŽ  )r,   rÂ   r   r¥  r©  r¬  rI   s   `     @r%   Ú
test_shellzSSHProtocolTests.test_shell~  sŒ   ù€ ð
 ×.Ñ.Ó0ˆä×*Ñ*Ð+=¸~ÈsÓSˆõ	Jð 	ˆ×Ñ˜IÔ&ô	Gð 	ˆ×Ñ˜EÔ"ô	ð 	ˆ×Ñ˜GÔ$ô	@ð 	ˆ×Ñ˜HÔ%Øˆr$   c                 ó„   ‡ — ‰ j                  «       }ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       |S )zŸ
        If L{SSHChannel.sendRequest} issues an exec which the server responds to
        with an error, the L{Deferred} it returns fires its errback.
        c           	      óœ   •— | ‰_         ‰j                  | j                  j                  | dt	        j
                  d«      d«      t        «      S )Nó   execs	   jumboliahrF   r~  r‚  s    €r%   r   z3SSHProtocolTests.test_failedExec.<locals>.cbChannelµ  sB   ø€ Ø"ˆDŒLØ×%Ñ%Ø—‘×(Ñ(¨°'¼6¿9¹9À\Ó;RÐTUÓVÜóð r$   c                 ó–   •— ‰j                  t        j                  «      }‰j                  |d   j                  j
                  d«       y )Nr   )r   N)ÚflushLoggedErrorsr   r‡   r�  Úvaluer˜   ©r‡  Úerrorsr,   s     €r%   ÚcbFailedz2SSHProtocolTests.test_failedExec.<locals>.cbFailed¾  s:   ø€ ð ×+Ñ+¬E×,<Ñ,<Ó=ˆFØ×Ñ˜V A™YŸ_™_×1Ñ1Ð3EÕFr$   r˜  )r,   rÂ   r   r·  s   `   r%   Útest_failedExecz SSHProtocolTests.test_failedExec®  sG   ø€ ð
 ×.Ñ.Ó0ˆô	ð 	ˆ×Ñ˜IÔ&ô	Gð 	ˆ×Ñ˜HÔ%Øˆr$   c                 ó²   ‡ — ‰ j                  «       }ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       |S )z‘
        When the process started by a L{SSHChannel.sendRequest} exec request
        exits, the exit status is reported to the channel.
        c                 ót   •— | ‰_         | j                  j                  | dt        j                  d«      d«      S )Nr±  r|   rF   r…  r‚  s    €r%   r   z5SSHProtocolTests.test_falseChannel.<locals>.cbChannelÎ  s/   ø€ Ø"ˆDŒLØ—<‘<×+Ñ+¨G°W¼f¿i¹iÈÓ>QÐSTÓUÐUr$   c                 ó0   •— ‰j                   j                  S r*   ©rÂ   ro   r¨  s    €r%   ÚcbExecz2SSHProtocolTests.test_falseChannel.<locals>.cbExecÔ  ó   ø€ Ø—<‘<×'Ñ'Ð'r$   c                 óž   •— ‰j                  ‰j                  j                  g «       ‰j                  ‰j                  j                  d«       y r¬   )r�  rÂ   rI  ÚassertNotEqualr_  r¨  s    €r%   ÚcbClosedz4SSHProtocolTests.test_falseChannel.<locals>.cbClosedÙ  s7   ø€ à×Ñ˜TŸ\™\×2Ñ2°BÔ7Ø×Ñ §¡× 3Ñ 3°QÕ7r$   r˜  ©r,   rÂ   r   r½  rÁ  s   `    r%   Útest_falseChannelz"SSHProtocolTests.test_falseChannelÇ  s^   ø€ ð
 ×.Ñ.Ó0ˆô	Vð 	ˆ×Ñ˜IÔ&ô	(ð 	ˆ×Ñ˜FÔ#ô	8ð
 	ˆ×Ñ˜HÔ%Øˆr$   c                 ó¸   ‡ — ‰ j                  dd¬«      }ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       |S )z„
        Bytes sent over the extended channel for stderr data are delivered to
        the channel's C{extReceived} method.
        é   r}   ©ÚlocalWindowÚlocalMaxPacketc                 ót   •— | ‰_         | j                  j                  | dt        j                  d«      d«      S )Nr±  s   eecho hellorF   r…  r‚  s    €r%   r   z5SSHProtocolTests.test_errorChannel.<locals>.cbChannelè  ó3   ø€ Ø"ˆDŒLØ—<‘<×+Ñ+Ø˜¤&§)¡)¨NÓ";¸Qóð r$   c                 óª   •— t        j                  ‰j                  j                  ‰j                  j
                  j                  j                  g«      S r*   ©r   r�  rÂ   ro   rp  r   ri   r¨  s    €r%   r½  z2SSHProtocolTests.test_errorChannel.<locals>.cbExecð  ó>   ø€ Ü×&Ñ&Ø—‘×%Ñ% t§z¡z×'8Ñ'8×'EÑ'E×'MÑ'MÐNóð r$   c                 ó:  •— ‰j                  ‰j                  j                  g «       ‰j                  dj                  ‰j                  j                  «      d«       ‰j                  ‰j                  j
                  d«       ‰j                  ‰j                  j                  «       ‰j                  ‰j                  j                  d«       ‰j                  ‰j                  j                  ‰j                  j                  j                  j                  «       y )Nr$   ó   hello
r   rÅ  )r�  rÂ   rI  r«  rJ  r_  r¤  rb  ÚlocalWindowLeftrp  r   ri   r’   r¨  s    €r%   rÁ  z4SSHProtocolTests.test_errorChannel.<locals>.cbClosed÷  s¾   ø€ Ø×Ñ˜TŸ\™\×2Ñ2°BÔ7Ø×Ñ˜SŸX™X d§l¡l×&>Ñ&>Ó?ÀÔNØ×Ñ˜TŸ\™\×0Ñ0°!Ô4Ø�O‰O˜DŸL™L×2Ñ2Ô3Ø×Ñ˜TŸ\™\×9Ñ9¸1Ô=Ø×ÑØ—‘×,Ñ,Ø—
‘
×!Ñ!×.Ñ.×FÑFõr$   r˜  rÂ  s   `    r%   Útest_errorChannelz"SSHProtocolTests.test_errorChannelá  sd   ø€ ð
 ×.Ñ.¸1ÈQÐ.ÓOˆô	ð 	ˆ×Ñ˜IÔ&ô	ð
 	ˆ×Ñ˜FÔ#ô		ð 	ˆ×Ñ˜HÔ%Øˆr$   c                 ó~   ‡ — ‰ j                  ‰ j                  d«      t        «      }ˆ fd„}|j                  |«       |S )z›
        When an attempt is made to open an unknown channel type, the L{Deferred}
        returned by L{SSHChannel.sendRequest} fires its errback.
        s   crazy-unknown-channelc                 óÌ   •— ‰j                  t        j                  «      }‰j                  |d   j                  j
                  d«       ‰j                  t        |«      d«       y )Nr   )é   zunknown channelrF   )r³  r   r‡   r�  r´  r˜   rÙ   rµ  s     €r%   r·  z6SSHProtocolTests.test_unknownChannel.<locals>.cbFailed  sL   ø€ Ø×+Ñ+¬E×,<Ñ,<Ó=ˆFØ×Ñ˜V A™YŸ_™_×1Ñ1Ð3IÔJØ×ÑœS ›[¨!Õ,r$   )r  rz  rÐ   rŽ  )r,   Údr·  s   `  r%   Útest_unknownChannelz$SSHProtocolTests.test_unknownChannel  s>   ø€ ð
 ×ÑØ×(Ñ(Ð)AÓBÄIó
ˆô	-ð
 	
�‰�hÔØˆr$   c                 ó¸   ‡ — ‰ j                  dd¬«      }ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       |S )zc
        An L{SSHChannel} can be configured with a maximum packet size to
        receive.
        é   rF   rÆ  c                 ót   •— | ‰_         | j                  j                  | dt        j                  d«      d«      S )Nr±  s   secho hellorF   r…  r‚  s    €r%   r   z2SSHProtocolTests.test_maxPacket.<locals>.cbChannel  rÊ  r$   c                 ó0   •— ‰j                   j                  S r*   r¼  r¨  s    €r%   r½  z/SSHProtocolTests.test_maxPacket.<locals>.cbExec'  r¾  r$   c                 ó¼  •— ‰j                  ‰j                  j                  d«       ‰j                  dj                  ‰j                  j                  «      d«       ‰j                  dj                  ‰j                  j
                  «      d«       ‰j                  ‰j                  j                  d«       ‰j                  ‰j                  j                  «       y )Nr   r$   rÏ  rØ  )	r�  rÂ   r_  r«  rI  rJ  rÐ  r¤  rb  r¨  s    €r%   rÁ  z1SSHProtocolTests.test_maxPacket.<locals>.cbClosed,  s“   ø€ Ø×Ñ˜TŸ\™\×0Ñ0°!Ô4Ø×Ñ˜SŸX™X d§l¡l×&;Ñ&;Ó<¸lÔKØ×Ñ˜SŸX™X d§l¡l×&>Ñ&>Ó?ÀÔNØ×Ñ˜TŸ\™\×9Ñ9¸2Ô>Ø�O‰O˜DŸL™L×2Ñ2Õ3r$   r˜  rÂ  s   `    r%   Útest_maxPacketzSSHProtocolTests.test_maxPacket  sd   ø€ ð ×.Ñ.¸2ÈaÐ.ÓPˆô	ð 	ˆ×Ñ˜IÔ&ô	(ð 	ˆ×Ñ˜FÔ#ô	4ð 	ˆ×Ñ˜HÔ%Øˆr$   c                 ó¸   ‡ — ‰ j                  dd¬«      }ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       ˆ fd„} |j                  |«       |S )ze
        Normal standard out bytes are sent to the channel's C{dataReceived}
        method.
        rÅ  r}   rÆ  c                 ót   •— | ‰_         | j                  j                  | dt        j                  d«      d«      S )Nr±  s
   echo hellorF   r…  r‚  s    €r%   r   z-SSHProtocolTests.test_echo.<locals>.cbChannel=  s3   ø€ Ø"ˆDŒLØ—<‘<×+Ñ+Ø˜¤&§)¡)¨MÓ":¸Aóð r$   c                 óª   •— t        j                  ‰j                  j                  ‰j                  j
                  j                  j                  g«      S r*   rÌ  r¨  s    €r%   ÚcbEchoz*SSHProtocolTests.test_echo.<locals>.cbEchoE  rÍ  r$   c                 óî  •— ‰j                  ‰j                  j                  d«       ‰j                  dj                  ‰j                  j                  «      d«       ‰j                  ‰j                  j
                  d«       ‰j                  ‰j                  j                  «       ‰j                  ‰j                  j
                  ‰j                  j                  j                  j                  «       y )Nr   r$   rÏ  rÅ  )r�  rÂ   r_  r«  rI  rÐ  r¤  rb  rp  r   ri   r’   r¨  s    €r%   rÁ  z,SSHProtocolTests.test_echo.<locals>.cbClosedL  s¤   ø€ Ø×Ñ˜TŸ\™\×0Ñ0°!Ô4Ø×Ñ˜SŸX™X d§l¡l×&;Ñ&;Ó<¸lÔKØ×Ñ˜TŸ\™\×9Ñ9¸1Ô=Ø�O‰O˜DŸL™L×2Ñ2Ô3Ø×ÑØ—‘×,Ñ,Ø—
‘
×!Ñ!×.Ñ.×FÑFõr$   r˜  )r,   rÂ   r   rà  rÁ  s   `    r%   Ú	test_echozSSHProtocolTests.test_echo6  sd   ø€ ð
 ×.Ñ.¸1ÈQÐ.ÓOˆô	ð 	ˆ×Ñ˜IÔ&ô	ð
 	ˆ×Ñ˜FÔ#ô	ð 	ˆ×Ñ˜HÔ%Øˆr$   N)r9   )r    r!   r"   r5   r   re   rz  r™  r®  r¸  rÃ  rÑ  rÖ  rÜ  râ  r#   r$   r%   rj  rj  "  sB   „ ññ
 Ø/ˆóò85òn.ò`ò2ò4"òHò"ó@!r$   rj  c                   ó@   — e Zd ZesdZd
d„Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy)ÚSSHFactoryTestsrk  Nc                 ó„   ‡— t        j                  «       }ˆfd„|_        d„ |_        d„ |_        |j                  «        |S )Nc                  ó   •— ‰ S r*   r#   ©Úprimess   €r%   ro  z0SSHFactoryTests.makeSSHFactory.<locals>.<lambda>`  s   ø€  v€ r$   c                  óL   — dt         j                  j                  t        «      iS ©Nrð   )rÅ   ró   rô   r
   r#   r$   r%   ro  z0SSHFactoryTests.makeSSHFactory.<locals>.<lambda>a  s   € ØœŸ™×+Ñ+Ô,=Ó>ð,
€ r$   c                  óL   — dt         j                  j                  t        «      iS rê  )rÅ   ró   rô   r   r#   r$   r%   ro  z0SSHFactoryTests.makeSSHFactory.<locals>.<lambda>d  s   € ØœŸ™×+Ñ+Ô,>Ó?ð-
€ r$   )rÄ   rþ   rü   rõ   rø   rs  )r,   rè  Ú
sshFactorys    ` r%   ÚmakeSSHFactoryzSSHFactoryTests.makeSSHFactory^  sA   ø€ Ü×'Ñ'Ó)ˆ
Û-ˆ
Ôñ$
ˆ
Ô ñ%
ˆ
Ô!ð 	×ÑÔ!ØÐr$   c                 óˆ   — | j                  «       } |j                  d«      }| j                  |t        j                  «       y)zc
        By default, buildProtocol() constructs an instance of
        SSHServerTransport.
        N)rí  rí   ÚassertIsInstancerˆ   r  )r,   rÄ   r   s      r%   Útest_buildProtocolz"SSHFactoryTests.test_buildProtocolj  s:   € ð
 ×%Ñ%Ó'ˆØ(�7×(Ñ(¨Ó.ˆØ×Ñ˜h¬	×(DÑ(DÕEr$   c                 óŒ   ‡— g Šˆfd„}| j                  «       }||_         |j                  d«       | j                  dg‰«       y)zc
        buildProtocol() calls 'self.protocol()' to construct a protocol
        instance.
        c                  óN   •— ‰j                  | «       t        j                  «       S r*   )rV  rˆ   r  )r˜   Úcallss    €r%   ÚmakeProtocolzHSSHFactoryTests.test_buildProtocolRespectsProtocol.<locals>.makeProtocolz  s   ø€ Ø�L‰L˜ÔÜ×/Ñ/Ó1Ð1r$   Nr#   )rí  r   rí   r�  )r,   rô  rÄ   ró  s      @r%   Ú"test_buildProtocolRespectsProtocolz2SSHFactoryTests.test_buildProtocolRespectsProtocols  sI   ø€ ð
 ˆô	2ð ×%Ñ%Ó'ˆØ'ˆÔØˆ×Ñ˜dÔ#Ø×Ñ˜"˜˜uÕ%r$   c                 óÊ   — t        j                  «       }d„ |_        d„ |_        |j	                  «        |j                  d«      }| j                  g d¢|j                  «       y)zq
        buildProtocol() sets supportedPublicKeys to the list of supported
        signature algorithms.
        c                  ó�   — t         j                  j                  t        «      t         j                  j                  t        «      dœS rï   rò   r#   r$   r%   ro  zGSSHFactoryTests.test_buildProtocolSignatureAlgorithms.<locals>.<lambda>‰  s/   € ÜŸ™×+Ñ+Ô,=Ó>ÜŸ™×+Ñ+Ô,=Ó>ñ#
€ r$   c                  ó�   — t         j                  j                  t        «      t         j                  j                  t        «      dœS rï   r÷   r#   r$   r%   ro  zGSSHFactoryTests.test_buildProtocolSignatureAlgorithms.<locals>.<lambda>�  s/   € ÜŸ™×+Ñ+Ô,>Ó?ÜŸ™×+Ñ+Ô,>Ó?ñ$
€ r$   N)s   rsa-sha2-512s   rsa-sha2-256rð   rñ   )rÄ   rþ   rõ   rø   rs  rí   r�  rê   )r,   rŠ   r¡   s      r%   Ú%test_buildProtocolSignatureAlgorithmsz5SSHFactoryTests.test_buildProtocolSignatureAlgorithmsƒ  sY   € ô
 ×ÑÓ ˆñ
ˆŒñ
ˆÔð 	
�‰ÔØ�O‰O˜DÓ!ˆØ×ÑÚFØ×!Ñ!õ	
r$   c                 óº   — | j                  d¬«      }|j                  d«      }| j                  d|j                  «       | j                  d|j                  «       y)zg
        Group key exchanges are not supported when we don't have the primes
        database.
        Nrç  ó"   diffie-hellman-group-exchange-sha1ó$   diffie-hellman-group-exchange-sha256)rí  rí   ÚassertNotInÚsupportedKeyExchanges)r,   Úf1Úp1s      r%   Útest_buildProtocolNoPrimesz*SSHFactoryTests.test_buildProtocolNoPrimes˜  s[   € ð
 × Ñ ¨Ð Ó-ˆà×Ñ˜dÓ#ˆà×ÑØ1°2×3KÑ3Kô	
ð 	×ÑØ3°R×5MÑ5Mõ	
r$   c                 ó¾   — | j                  ddi¬«      }|j                  d«      }| j                  d|j                  «       | j                  d|j                  «       y)zU
        Group key exchanges are supported when we have the primes database.
        rF   )rØ   rÔ  rç  Nrû  rü  )rí  rí   ÚassertInrþ  ©r,   Úf2Úp2s      r%   Útest_buildProtocolWithPrimesz,SSHFactoryTests.test_buildProtocolWithPrimes¨  sU   € ð × Ñ ¨¨F¨Ð Ó4ˆà×Ñ˜dÓ#ˆà�‰Ð;¸R×=UÑ=UÔVØ�‰Ð=¸r×?WÑ?WÕXr$   c                 óœ   — | j                  «       }|j                  d«      }| j                  ddj                  |j                  «      «       y)z_
        ECDSA key exchanges are listed with 256 having a higher priority among ECDSA.
        Ns8   ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521ó   ,)rí  rí   r  r«  rþ  r  s      r%   Útest_buildProtocolKexECDSAz*SSHFactoryTests.test_buildProtocolKexECDSA³  sE   € ð × Ñ Ó"ˆà×Ñ˜dÓ#ˆð 	�‰ØGØ�I‰I�b×.Ñ.Ó/õ	
r$   r*   )r    r!   r"   r   re   rí  rð  rõ  rù  r  r  r
  r#   r$   r%   rä  rä  Z  s/   „ ÙØ/ˆó
òFò&ò 
ò*
ò 	Yó
r$   rä  c                   ó^   — e Zd ZdZesdZer eej                  «      Zd„ Z	d„ Z
d„ Zd„ Zd„ Zy)	ÚMPTestszs
    Tests for L{common.getMP}.

    @cvar getMP: a method providing a MP parser.
    @type getMP: C{callable}
    rk  c                 óF   — | j                  | j                  d«      d«       y)zŸ
        L{common.getMP} should parse the a multiple precision integer from a
        string: a 4-byte length followed by length bytes of the integer.
        s         )rF   r$   N©r�  ÚgetMPrC   s    r%   Ú
test_getMPzMPTests.test_getMPÑ  s   € ð
 	×Ñ˜Ÿ™Ð$GÓHÈ(ÕSr$   c                 óF   — | j                  | j                  d«      d«       y)zv
        L{common.getMP} should be able to parse a big enough integer
        (that doesn't fit on one byte).
        s      )ir$   Nr  rC   s    r%   Útest_getMPBigIntegerzMPTests.test_getMPBigIntegerØ  s!   € ð
 	×ÑØ�J‰JÐ:Ó;¸_õ	
r$   c                 óH   — | j                  | j                  dd«      d«       y)zg
        L{common.getMP} has the ability to parse multiple integer in the same
        string.
        s               rØ   )rF   rØ   r$   Nr  rC   s    r%   Útest_multipleGetMPzMPTests.test_multipleGetMPá  s)   € ð
 	×ÑØ�J‰JØWØóð õ	
r$   c                 óF   — | j                  | j                  d«      d«       y)zu
        When more data than needed is sent to L{common.getMP}, it should return
        the remaining data.
        s         foo)rF   rŠ  Nr  rC   s    r%   Útest_getMPRemainingDatazMPTests.test_getMPRemainingDataî  s!   € ð
 	×ÑØ�J‰JÐ=Ó>Àõ	
r$   c                 óZ   — | j                  t        j                  | j                  d«       y)z�
        When the string passed to L{common.getMP} doesn't even make 5 bytes,
        it should raise a L{struct.error}.
        s    N)ÚassertRaisesr]  r   r  rC   s    r%   Útest_notEnoughDatazMPTests.test_notEnoughData÷  s   € ð
 	×Ñœ&Ÿ,™,¨¯
©
°KÕ@r$   N)r    r!   r"   r5   r   re   Ústaticmethodr   r  r  r  r  r  r  r#   r$   r%   r  r  Ã  s=   „ ññ Ø/ˆáÙ˜VŸ\™\Ó*ˆòTò
ò
ò
óAr$   r  c                   ó   — e Zd ZdZesdZd„ Zy)ÚGMPYInstallDeprecationTestszI
    Tests for the deprecation of former GMPY accidental public API.
    r7   c                 óÊ   — t        j                  «        | j                  | j                  g«      }| j	                  t        |«      d«       | j	                  |d   d   d«       y)zD
        L{twisted.conch.ssh.common.install} is deprecated.
        rF   r   ÚmessagezAtwisted.conch.ssh.common.install was deprecated in Twisted 16.5.0N)r   ÚinstallÚflushWarningsÚtest_deprecatedr�  rÙ   )r,   Úwarningss     r%   r!  z+GMPYInstallDeprecationTests.test_deprecated  sX   € ô 	�‰ÔØ×%Ñ% t×';Ñ';Ð&<Ó=ˆØ×Ñœ˜X›¨Ô*Ø×ÑØ�Q‰K˜	Ñ"ØOõ	
r$   N)r    r!   r"   r5   r   re   r!  r#   r$   r%   r  r  ÿ  s   „ ññ Ø0ˆó

r$   r  )Sr5   r]  Ú	itertoolsr   Útypingr   r   r   Útwisted.conch.test.keydatar   r   r	   r
   Útwisted.conch.test.loopbackr   Útwisted.credr   Útwisted.cred.errorr   Útwisted.internetr   r   r   Útwisted.internet.errorr   Útwisted.pythonr   r   Útwisted.python.reflectr   Útwisted.trialr   r   Útwisted.conchr   r   Útwisted.conch.sshr   r   r   r   r(   r&   r/   rg   r•   ÚregisterAdapterÚISessionÚProtocolrB   r�   ry   r†   r…   rÁ   rÂ   rÃ   rÄ   rÅ   rˆ   rÆ   rÈ   ÚSSHProtocolCheckerrÖ   rþ   rÞ   r  r  ræ   r#  r  r3  r,  r  r-  rK  rF  rh  ÚTestCaserj  rä  r  r  r#   r$   r%   ú<module>r5     sø  ðñó
 Ý ß $Ñ $÷ó õ 6Ý Ý 0ß 5Ñ 5Ý 4ß 'Ý 0Ý "á˜^Ó,€áß+ßCÔC÷ñ ÷

ñ 
ô>?%�f×&Ñ&ô ?%÷D=$ñ =$õ@ &áØ€J×ÑØ! ?°G×4DÑ4Dôô
�X×&Ñ&ô ÷Uñ U÷<Sñ S÷.Sñ S÷(Sñ Sð, ÐÝ&÷÷ ÷	<ñ 	<ô˜h×9Ñ9ô ô4D ×!3Ñ!3ô 4D÷lIñ Iô>F˜-¨×)EÑ)Eô Fô
˜-¨×)EÑ)Eô ô8:˜h×8Ñ8ô :ô.> J×$<Ñ$<ô >ô"(˜×+Ñ+ô (òB
Bôu�x×(Ñ(ô uôp	f
�h×'Ñ'ô f
ôR9Aˆh×Ñô 9Aôx
 (×"3Ñ"3õ 
r$   