ó
    Ö›‘h3„  ã                   ód  • S r SSKrSSKJr  SSKJrJrJr  SSKJ	r	J
r
JrJr  SSKJr  SSKJr  SSKJr  SS	KJrJrJr  SS
KJr  SSKJrJr  SSKJr  SSKJr  \" S5      r \ (       a  SSK!J"r"J#r#  SSK$J%r%J&r&J'r'J(r(  O
 " S S5      r" " S S5      r) " S S\"RT                  5      r+ " S S5      r,SSKJ-r-  \ (       a  \-R\                  " \,\+\(R^                  5         " S S\R`                  5      r1 " S S5      r2 " S S5      r3 " S  S!5      r4 " S" S#5      r5\ bÂ  SS$K!J6r6  SS%K$J7r7J8r8J9r9J:r:J;r;J<r<   " S& S'5      r= " S( S)\6R|                  5      r? " S* S+\9R€                  5      rA " S, S-5      rB " S. S/\B\;R†                  5      rD " S0 S1\B\;RŠ                  5      rF " S2 S3\<RŽ                  5      rH " S4 S5\8R’                  5      rJ " S6 S7\7R–                  5      rLS8 rM " S9 S:\Rœ                  5      rO " S; S<\Rœ                  5      rP " S= S>\Rœ                  5      rQ " S? S@\Rœ                  5      rRg)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                   ó(   • \ rS rSr " S S5      rSrg)r   é#   c                   ó   • \ rS rSrSrg)Úavatar.ConchUseré$   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r"   ó    Ú_C:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/conch/test/test_ssh.pyÚ	ConchUserr    $   s   † Úr(   r*   r"   N)r#   r$   r%   r&   r*   r'   r"   r(   r)   r   r   #   s   † ÷	ô 	r(   r   c                   ó(   • \ rS rSrSrSrS rS rSrg)ÚConchTestRealmé(   a
  
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                 ó   • Xl         g ©N)ÚexpectedAvatarID)Úselfr0   s     r)   Ú__init__ÚConchTestRealm.__init__5   s   € Ø 0Õr(   c                 óô   • XR                   :X  aM  U R                  b  [        S5      e[        5       U l        US   U R                  U R                  R                  4$ [        SU R                   < SU< 35      e)zp
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 )r0   r   r   ÚConchTestAvatarÚlogout)r1   ÚavatarIDÚmindÚ
interfacess       r)   ÚrequestAvatarÚConchTestRealm.requestAvatar8   st   € ð
 ×,Ñ,Ó,Ø�{‰{Ñ&Ü'Ð(@ÓAÐAÜ)Ó+ˆDŒKØ˜a‘= $§+¡+¨t¯{©{×/AÑ/AÐAÐAÜØ�D×)Ñ)Ñ,Ð,=¸h¹\ÐJó
ð 	
r(   )r   r0   )	r#   r$   r%   r&   Ú__doc__r   r2   r:   r'   r"   r(   r)   r,   r,   (   s   † ñð €Fò1õ
r(   r,   c                   óR   • \ rS rSrSr\(       d  SrSrS rS r	S r
S rS	 rS
 rSrg)r5   éG   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                 ó  • [         R                  R                  U 5        0 U l        0 U l        U R
                  R                  [        R                  [        R                  S.5        U R                  R                  S[        05        g )N)ó   sessions   direct-tcpipó   crazy)r   r*   r2   Ú	listenersÚglobalRequestsÚchannelLookupÚupdater   Ú
SSHSessionr   ÚopenConnectForwardingClientÚsubsystemLookupÚCrazySubsystem©r1   s    r)   r2   ÚConchTestAvatar.__init__T   sk   € Ü×Ñ×!Ñ! $Ô'ØˆŒØ ˆÔØ×Ñ×!Ñ!ä#×.Ñ.Ü!+×!GÑ!Gñô	
ð 	×Ñ×#Ñ# X¬~Ð$>Õ?r(   c                 ó    • XR                   S'   g)NÚfooé   ©rD   ©r1   Údatas     r)   Ú
global_fooÚConchTestAvatar.global_foo`   s   € Ø%)×Ñ˜EÑ"Ør(   c                 ó    • XR                   S'   g)NÚfoo_2)rO   ó   datarP   rQ   s     r)   Úglobal_foo_2ÚConchTestAvatar.global_foo_2d   s   € Ø'+×Ñ˜GÑ$Ør(   c                 ó,  • [         R                  " U5      u  p# [        R                  " U[         R                  " U R
                  X#4[         R                  5      US9nX@R                  X#4'   g! [         a    [        R                  " S S5         gf = f)N)Ú	interfacerO   z2something went wrong with remote->local forwardingr   )r   ÚunpackGlobal_tcpip_forwardr   Ú	listenTCPÚSSHListenForwardingFactoryÚconnÚ SSHListenServerForwardingChannelrC   ÚBaseExceptionr   Úerr©r1   rR   ÚhostÚportÚlisteners        r)   Úglobal_tcpip_forwardÚ$ConchTestAvatar.global_tcpip_forwardh   sˆ   € Ü×:Ò:¸4Ó@‰
ˆð	Ü×(Ò(ØÜ×5Ò5Ø—I‘I ˜|¬Z×-XÑ-Xóð ñˆHð ,4�N‰N˜D˜<Ñ(Øøô ó 	Ü�GŠG�DÐNÔOÙð	ús   šAA/ Á/!BÂBc                 óº   • [         R                  " U5      u  p#U R                  R                  X#4S 5      nU(       d  gU R                  X#4	 UR	                  5         g)Nr   rO   )r   r\   rC   ÚgetÚstopListeningrc   s        r)   Úglobal_cancel_tcpip_forwardÚ+ConchTestAvatar.global_cancel_tcpip_forwardy   sO   € Ü×:Ò:¸4Ó@‰
ˆØ—>‘>×%Ñ% t l°DÓ9ˆÞØØ�N‰N˜D˜<Ð(Ø×ÑÔ Ør(   c                 ó¦   • SU l         U R                  R                  5        H,  n[        R                  " SU-  5        UR                  5         M.     g )NTzstopListening %s)Ú	loggedOutrC   Úvaluesr   Úmsgrk   )r1   rf   s     r)   r6   ÚConchTestAvatar.logout‚   s>   € ØˆŒØŸ™×-Ñ-Ö/ˆHÜ�GŠGÐ&¨Ñ1Ô2Ø×"Ñ"Ö$ò 0r(   )rD   rC   ro   N)r#   r$   r%   r&   r<   r   Úskipro   r2   rS   rX   rg   rl   r6   r'   r"   r(   r)   r5   r5   G   s5   † ñö Ø0ˆà€Iò
@òòòò"õ%r(   r5   c                   ó<   • \ rS rSrSrS rS rS rS rS r	S r
S	rg
)ÚConchSessionForTestAvataré‰   z*
An ISession adapter for ConchTestAvatar.
c                 óœ   • Xl         X R                   l        SU l        SU l        SU l        SU l        [        R                  " 5       U l        g)zY
Initialize the session and create a reference to it on the avatar for
later inspection.
NFr   )	r   Ú_testSessionÚcmdÚprotoÚptyReqÚeofr   ÚDeferredÚonClose)r1   r   s     r)   r2   Ú"ConchSessionForTestAvatar.__init__Ž   s=   € ð
 ŒØ#'�‰Ô ØˆŒØˆŒ
ØˆŒØˆŒÜ—~’~Ó'ˆ�r(   c                 óV   • [         R                  " S5        Xl        X l        SU l        g )Nzpty reqT)r   rq   Ú_terminalTypeÚ_windowSizer{   )r1   ÚtermÚ
windowSizeÚattrss       r)   ÚgetPtyÚ ConchSessionForTestAvatar.getPty›   s!   € Ü�Š�	ÔØ!ÔØ%ÔØˆ�r(   c                 ó`   • [         R                  " S5        Xl        [        U5        SU l        g )Nzopening shelló   shell)r   rq   rz   ÚEchoTransportry   )r1   rz   s     r)   Ú	openShellÚ#ConchSessionForTestAvatar.openShell¡   s"   € Ü�Š�Ô ØŒ
Ü�eÔØˆ�r(   c                 ób  • X l         Xl        UR                  5       S   nUS:X  a-  [        U5      n[        R
                  " SUR                  5        O¸US:X  a0  [        U5      nUR                  USS  5        UR                  5         O‚US:X  a0  [        U5      nUR                  USS  5        UR                  5         OLUS:X  a0  [        U5      nUR                  USS  5        UR                  5         O[        R                  " S5      eS	U R                  R                  R                  l        g )
Nr   ó   falses   echoé   s   sechoé   s   eechoúbad execrO   )ry   rz   ÚsplitÚFalseTransportr   Ú	callLaterÚloseConnectionrŠ   ÚwriteÚSuperEchoTransportÚErrEchoTransportr   Ú
ConchErrorr   r_   Ú	transportÚexpectedLoseConnection)r1   rz   ry   ÚfÚts        r)   ÚexecCommandÚ%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                 ó   • SU l         g ©NrO   )r|   rK   s    r)   ÚeofReceivedÚ%ConchSessionForTestAvatar.eofReceivedÀ   s	   € Øˆ�r(   c                 óÊ   • [         R                  " SU R                  -  5        U R                  R                  R
                  U l        U R                  R                  S 5        g )Nzclosed cmd "%s")	r   rq   ry   rz   r   ÚremoteWindowLeftÚremoteWindowLeftAtCloser~   ÚcallbackrK   s    r)   ÚclosedÚ ConchSessionForTestAvatar.closedÃ   sB   € Ü�ŠÐ! D§H¡HÑ,Ô-Ø'+§z¡z×'9Ñ'9×'JÑ'JˆÔ$Ø�‰×Ñ˜dÕ#r(   )	r�   r‚   r   ry   r|   r~   rz   r{   r¦   N)r#   r$   r%   r&   r<   r2   r†   r‹   rž   r¢   r¨   r'   r"   r(   r)   ru   ru   ‰   s%   † ñò(òòò>ò2õ$r(   ru   )Ú
componentsc                   ó    • \ rS rSrS rS rSrg)rJ   éÑ   c                 ó   • g r/   r"   )r1   ÚargsÚkws      r)   r2   ÚCrazySubsystem.__init__Ò   s   € Ør(   c                 ó   • g)z
good ... good
Nr"   rK   s    r)   ÚconnectionMadeÚCrazySubsystem.connectionMadeÕ   s   � r(   r"   N)r#   r$   r%   r&   r2   r²   r'   r"   r(   r)   rJ   rJ   Ñ   s   † òõr(   rJ   c                   ó$   • \ rS rSrSrS rS rSrg)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                 ó@   • Xl         UR                  U 5        SU l        g)zI
@type p L{twisted.conch.ssh.session.SSHSessionProcessProtocol} instance
r   N©rz   ÚmakeConnectionr¨   ©r1   Úps     r)   r2   ÚFalseTransport.__init__ä   s   € ð Œ
Ø	×Ñ˜ÔØˆ�r(   c           	      óF  • U R                   (       a  gSU l         U R                  R                  5         U R                  R                  5         U R                  R	                  5         U R                  R                  [        R                  " [        SSS5      5      5        g)z9
Disconnect the protocol associated with this transport.
NrO   éÿ   ©	r¨   rz   ÚinConnectionLostÚoutConnectionLostÚerrConnectionLostÚprocessEndedr   ÚFailurer   rK   s    r)   r•   ÚFalseTransport.loseConnectionì   sj   € ð �;�;ØØˆŒØ�
‰
×#Ñ#Ô%Ø�
‰
×$Ñ$Ô&Ø�
‰
×$Ñ$Ô&Ø�
‰
×Ñ¤§¢Ô0AÀ#ÀtÈTÓ0RÓ SÕTr(   ©r¨   rz   N)r#   r$   r%   r&   r<   r2   r•   r'   r"   r(   r)   r“   r“   Û   s   † ñòõ
Ur(   r“   c                   ó&   • \ rS rSrS rS rS rSrg)rŠ   éù   c                 ó@   • Xl         UR                  U 5        SU l        g ©Nr   r·   r¹   s     r)   r2   ÚEchoTransport.__init__ú   ó   € ØŒ
Ø	×Ñ˜ÔØˆ�r(   c                 óÜ   • [         R                  " [        U5      5        U R                  R	                  U5        U R                  R	                  S5        SU;   a  U R                  5         g g )Nó   
ó    )r   rq   Úreprrz   ÚoutReceivedr•   rQ   s     r)   r–   ÚEchoTransport.writeÿ   sN   € Ü�Š”�T“
ÔØ�
‰
×Ñ˜tÔ$Ø�
‰
×Ñ˜wÔ'Ø�d‹?Ø×ÑÕ!ð r(   c           	      óF  • U R                   (       a  g SU l         U R                  R                  5         U R                  R                  5         U R                  R	                  5         U R                  R                  [        R                  " [        SS S 5      5      5        g ©NrO   r   r¾   rK   s    r)   r•   ÚEchoTransport.loseConnection  óh   € Ø�;�;ØØˆŒØ�
‰
×#Ñ#Ô%Ø�
‰
×$Ñ$Ô&Ø�
‰
×$Ñ$Ô&Ø�
‰
×Ñ¤§¢Ô0AÀ!ÀTÈ4Ó0PÓ QÕRr(   rÅ   N©r#   r$   r%   r&   r2   r–   r•   r'   r"   r(   r)   rŠ   rŠ   ù   s   † òò
"õSr(   rŠ   c                   ó&   • \ rS rSrS rS rS rSrg)r˜   i  c                 ó@   • Xl         UR                  U 5        SU l        g rÉ   r·   r¹   s     r)   r2   ÚErrEchoTransport.__init__  rË   r(   c                 óp   • U R                   R                  U5        U R                   R                  S5        g ©NrÍ   )rz   ÚerrReceivedrQ   s     r)   r–   ÚErrEchoTransport.write  s&   € Ø�
‰
×Ñ˜tÔ$Ø�
‰
×Ñ˜wÕ'r(   c           	      óF  • U R                   (       a  g SU l         U R                  R                  5         U R                  R                  5         U R                  R	                  5         U R                  R                  [        R                  " [        SS S 5      5      5        g rÓ   r¾   rK   s    r)   r•   ÚErrEchoTransport.loseConnection  rÕ   r(   rÅ   NrÖ   r"   r(   r)   r˜   r˜     s   † òò
(õSr(   r˜   c                   ó&   • \ rS rSrS rS rS rSrg)r—   i$  c                 ó@   • Xl         UR                  U 5        SU l        g rÉ   r·   r¹   s     r)   r2   ÚSuperEchoTransport.__init__%  rË   r(   c                 óÜ   • U R                   R                  U5        U R                   R                  S5        U R                   R                  U5        U R                   R                  S5        g rÛ   )rz   rÐ   rÜ   rQ   s     r)   r–   ÚSuperEchoTransport.write*  sJ   € Ø�
‰
×Ñ˜tÔ$Ø�
‰
×Ñ˜wÔ'Ø�
‰
×Ñ˜tÔ$Ø�
‰
×Ñ˜wÕ'r(   c           	      óF  • U R                   (       a  g SU l         U R                  R                  5         U R                  R                  5         U R                  R	                  5         U R                  R                  [        R                  " [        SS S 5      5      5        g rÓ   r¾   rK   s    r)   r•   Ú!SuperEchoTransport.loseConnection0  rÕ   r(   rÅ   NrÖ   r"   r(   r)   r—   r—   $  s   † òò
(õSr(   r—   )Úcheckers)ÚchannelÚ
connectionÚfactoryÚkeysrš   Úuserauthc                   ó4   • \ rS rSr\R
                  4rS rSrg)ÚConchTestPasswordCheckeriE  c                 óÀ   • UR                   S:X  a0  UR                  S:X  a   [        R                  " UR                   5      $ [        R                  " [        S5      5      $ )Nó   testuseró   testpasszBad credentials)ÚusernameÚpasswordr   ÚsucceedÚfailÚ	Exception)r1   Úcredentialss     r)   ÚrequestAvatarIdÚ(ConchTestPasswordChecker.requestAvatarIdH  sH   € à×$Ñ$¨Ó3Ø×(Ñ(¨KÓ7ä—}’} [×%9Ñ%9Ó:Ð:Ü—:’:œiÐ(9Ó:Ó;Ð;r(   r"   N)	r#   r$   r%   r&   rç   ÚIUsernamePasswordÚcredentialInterfacesrø   r'   r"   r(   r)   rî   rî   E  s   † Ø (× :Ñ :Ð<Ðõ	<r(   rî   c                   ó   • \ rS rSrS rSrg)ÚConchTestSSHCheckeriP  c                 óJ   • US:w  d  [        U R                  U   5      S:  a  gg)Nrð   é   FT)ÚlenÚsuccessfulCredentials)r1   ÚavatarIds     r)   ÚareDoneÚConchTestSSHChecker.areDoneQ  s(   € Ø˜;Ó&¬#¨d×.HÑ.HÈÑ.RÓ*SÐVWÓ*WØØr(   r"   N)r#   r$   r%   r&   r  r'   r"   r(   r)   rý   rý   P  s   † õ	r(   rý   c                   óŠ   • \ rS rSrSr\R                  \R                  S.r	S r
S rS rS\\\\\\4      4   4S jrS	 rS
rg)ÚConchTestServerFactoryiV  F)s   ssh-userauthó   ssh-connectionc                 óü   • [        5       n[        [        R                  " S U R                  R                  5        5       5      5      Ul        Xl        [        U S5      (       a  U R                  Ul	        X l
        U$ )Nc              3   óB   #   • U  H  nUR                  5       v •  M     g 7fr/   )ÚsupportedSignatureAlgorithms)Ú.0Úkeys     r)   Ú	<genexpr>Ú7ConchTestServerFactory.buildProtocol.<locals>.<genexpr>a  s#   é € ð $â8˜ð ×4Ñ4×6Ð6Ú8ùs   ‚r›   )ÚConchTestServerÚlistr   Úfrom_iterableÚprivateKeysrp   ÚsupportedPublicKeysrê   Úhasattrr›   rz   )r1   Úaddrrz   s      r)   ÚbuildProtocolÚ$ConchTestServerFactory.buildProtocol^  sn   € Ü#Ó%ˆEÜ(,Ü×#Ò#ñ $à#×/Ñ/×6Ñ6Ô8ó$ó ó)ˆEÔ%ð !ŒMä�tÐ5×6Ñ6Ø/3×/JÑ/J�Ô,àŒJØˆLr(   c                 ó�   • [         R                  R                  [        5      [         R                  R                  [        5      S.$ ©N)ó   ssh-rsaó   ssh-dss©rë   ÚKeyÚ
fromStringr
   r	   rK   s    r)   ÚgetPublicKeysÚ$ConchTestServerFactory.getPublicKeysn  s2   € ä ŸH™H×/Ñ/Ô0AÓBÜ ŸH™H×/Ñ/Ô0AÓBñð r(   c                 ó�   • [         R                  R                  [        5      [         R                  R                  [        5      S.$ r  ©rë   r  r  r   r   rK   s    r)   ÚgetPrivateKeysÚ%ConchTestServerFactory.getPrivateKeyst  s2   € ä ŸH™H×/Ñ/Ô0BÓCÜ ŸH™H×/Ñ/Ô0BÓCñð r(   Úreturnc                 ó4   • S[         R                  " S5      /0$ )zÝ
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   ÚgetDHGeneratorAndPrimerK   s    r)   Ú	getPrimesÚ ConchTestServerFactory.getPrimesz  s   € ð œ4×6Ò6Ð7UÓVÐWÐXÐXr(   c                 óB   • [         R                  R                  XU5      $ r/   )rê   Ú
SSHFactoryÚ
getService)r1   ÚtransÚnames      r)   r,  Ú!ConchTestServerFactory.getService‰  s   € Ü×%Ñ%×0Ñ0°¸dÓCÐCr(   )rz   N)r#   r$   r%   r&   Únoisyrì   ÚSSHUserAuthServerré   ÚSSHConnectionÚservicesr  r  r#  r   Úintr   r   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                   ó*   • \ rS rSrSrS rS rS rSrg)ÚConchTestBaseiŒ  r   c                 ó�   • U R                   (       a  g [        U S5      (       d  [        R                  " SU  SU 35      eSU l         g )Nr›   zunexpectedly lost connection Ú
rO   )Údoner  r   ÚFailTest©r1   Úreasons     r)   ÚconnectionLostÚConchTestBase.connectionLost�  sF   € Ø�y�yØÜ˜4Ð!9×:Ñ:Ü×'Ò'Ø3°D°6¸¸F¸8ÐDóð ð ˆD�Ir(   c           
      ó°   • SU l         U[        R                  :w  a+  [        R                  " [        SU < SU< SU< 35      5        U R                  5         g )NrO   zgot disconnect for z	: reason z, desc: )r›   rš   ÚDISCONNECT_BY_APPLICATIONr   rb   rö   r•   )r1   Ú
reasonCodeÚdescs      r)   ÚreceiveErrorÚConchTestBase.receiveError˜  sH   € Ø*+ˆDÔ'ð œY×@Ñ@Ó@Ü—’Ýã£ªTð3óôð ×ÑÕ!r(   c                 ó4   • [         R                  " SU 35      e)Nzgot unimplemented: seqid )r   r:  )r1   ÚseqIDs     r)   ÚreceiveUnimplementedÚ"ConchTestBase.receiveUnimplemented¨  s   € Ü×#Ò#Ð&?À¸wÐ$GÓHÐHr(   )r9  r›   N)	r#   r$   r%   r&   r9  r=  rC  rG  r'   r"   r(   r)   r6  r6  Œ  s   † Øˆò	ò	"õ 	Ir(   r6  c                   ó   • \ rS rSrS rSrg)r  i«  c                 ól   • [         R                  X5        [        R                  R                  X5        g r/   )r6  r=  rš   ÚSSHServerTransportr;  s     r)   r=  ÚConchTestServer.connectionLost¬  ó$   € Ü×(Ñ(¨Ô6Ü×(Ñ(×7Ñ7¸ÕEr(   r"   N)r#   r$   r%   r&   r=  r'   r"   r(   r)   r  r  «  s   † õ	Fr(   r  c                   ó0   • \ rS rSrSrS rS rS rS rSr	g)	ÚConchTestClienti°  z�
@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                 ó   • Xl         g r/   ©Ú_channelFactory©r1   ÚchannelFactorys     r)   r2   ÚConchTestClient.__init__·  s   € Ø#1Õ r(   c                 ól   • [         R                  X5        [        R                  R                  X5        g r/   )r6  r=  rš   ÚSSHClientTransportr;  s     r)   r=  ÚConchTestClient.connectionLostº  rM  r(   c                 óú   • U[         R                  R                  [        5      R	                  5       :H  nUS:H  nU(       a  U(       a  [
        R                  " S5      $ [
        R                  " [        S5      5      $ )Ns/   85:25:04:32:58:55:96:9f:57:ee:fb:a8:1a:ea:69:darO   zKey or fingerprint mismatch)	rë   r  r  r
   Úblobr   rô   rõ   rö   )r1   r  ÚfpÚkeyMatchÚfingerprintMatchs        r)   ÚverifyHostKeyÚConchTestClient.verifyHostKey¾  s[   € ØœdŸh™h×1Ñ1Ô2CÓD×IÑIÓKÑKˆHØ!Ð%WÑWÐÞÖ,Ü—}’} QÓ'Ð'Ü—:’:œiÐ(EÓFÓGÐGr(   c                 ó`   • U R                  [        S[        U R                  5      5      5        g )Nrð   )ÚrequestServiceÚConchTestClientAuthÚConchTestClientConnectionrR  rK   s    r)   ÚconnectionSecureÚ ConchTestClient.connectionSecureÅ  s)   € Ø×ÑÜ#ØÔ!:¸4×;OÑ;OÓ!Póõr(   rQ  N)
r#   r$   r%   r&   r<   r2   r=  r^  rd  r'   r"   r(   r)   rO  rO  °  s   † ñ	ò	2ò	Fò	Hõ	r(   rO  c                   ó8   • \ rS rSrSrSrSrS rS rS r	S r
Srg)	rb  iÌ  r   c                 ó²   • U R                   (       d'  U R                  (       a  [        R                  " S5      e[        R
                  R                  X5        g )Nz2got USERAUTH_SUCCESS before password and publickey)ÚcanSucceedPasswordÚcanSucceedPublicKeyr   r:  rì   ÚSSHUserAuthClientÚssh_USERAUTH_SUCCESS)r1   Úpackets     r)   rk  Ú(ConchTestClientAuth.ssh_USERAUTH_SUCCESSÑ  s?   € Ø×*×*¨t×/G×/GÜ×'Ò'ØHóð ô ×&Ñ&×;Ñ;¸DÕIr(   c                 ó<   • SU l         [        R                  " S5      $ )NrO   rñ   )rh  r   rô   rK   s    r)   ÚgetPasswordÚConchTestClientAuth.getPasswordØ  s   € Ø&'ˆDÔ#Ü—=’= Ó-Ð-r(   c                 ó~   • SU l         [        R                  " [        R                  R                  [        5      5      $ r¡   )ri  r   rô   rë   r  r  r   rK   s    r)   ÚgetPrivateKeyÚ!ConchTestClientAuth.getPrivateKeyÜ  s)   € Ø'(ˆDÔ$Ü—=’=¤§¡×!4Ñ!4Ô5GÓ!HÓIÐIr(   c                 óH   • [         R                  R                  [        5      $ r/   ©rë   r  r  r
   rK   s    r)   ÚgetPublicKeyÚ ConchTestClientAuth.getPublicKeyà  s   € Ü—8‘8×&Ñ&Ô'8Ó9Ð9r(   )rh  ri  N)r#   r$   r%   r&   ÚhasTriedNoneri  rh  rk  ro  rr  rv  r'   r"   r(   r)   rb  rb  Ì  s)   † ØˆØÐØÐò	Jò	.ò	Jõ	:r(   rb  c                   ó0   • \ rS rSrSrSrSrSrS rS r	Sr
g	)
rc  iã  zw
@ivar _completed: A L{Deferred} which will be fired when the number of
    results collected reaches C{totalResults}.
r  r   é   c                 óN   • [         R                  R                  U 5        Xl        g r/   )ré   r2  r2   rR  rS  s     r)   r2   Ú"ConchTestClientConnection.__init__í  s   € Ü×$Ñ$×-Ñ-¨dÔ3Ø#1Õ r(   c                 ó@   • U R                  U R                  U S95        g )N)r_   )ÚopenChannelrR  rK   s    r)   ÚserviceStartedÚ(ConchTestClientConnection.serviceStartedñ  s   € Ø×Ñ˜T×1Ñ1°tÐ1Ð<Õ=r(   rQ  N)r#   r$   r%   r&   r<   r.  ÚresultsÚtotalResultsr2   r  r'   r"   r(   r)   rc  rc  ã  s"   † ñ	ð
 !ˆØˆØˆò	2õ	>r(   rc  c                   óD   • \ rS rSrS rS rS rS rS rS r	S r
S	 rS
rg)ÚSSHTestChanneliô  c                 ó´   • Xl         X l        / U l        / U l        [        R
                  " 5       U l        [        R                  R                  " U /UQ70 UD6  g r/   )
r.  Ú_openedÚreceivedÚreceivedExtr   r}   r~   rè   Ú
SSHChannelr2   )r1   r.  Úopenedr®   Úkwargss        r)   r2   ÚSSHTestChannel.__init__õ  sG   € ØŒIØ!ŒLØˆDŒMØ!ˆDÔÜ Ÿ>š>Ó+ˆDŒLÜ×Ñ×'Ò'¨Ð>¨tÒ>°vÓ>r(   c                 ó:   • U R                   R                  U5        g r/   )r†  Úerrbackr;  s     r)   Ú
openFailedÚSSHTestChannel.openFailedý  s   € Ø�L‰L× Ñ  Õ(r(   c                 ó:   • U R                   R                  U 5        g r/   )r†  r§   )r1   Úignores     r)   ÚchannelOpenÚSSHTestChannel.channelOpen   ó   € Ø�L‰L×!Ñ! $Õ'r(   c                 ó:   • U R                   R                  U5        g r/   )r‡  ÚappendrQ   s     r)   ÚdataReceivedÚSSHTestChannel.dataReceived  s   € Ø�M‰M× Ñ  Õ&r(   c                 ó˜   • U[         R                  :X  a  U R                  R                  U5        g [        R
                  " SU< 35        g )NzUnrecognized extended data: )ré   ÚEXTENDED_DATA_STDERRrˆ  r—  r   rq   )r1   ÚdataTyperR   s      r)   ÚextReceivedÚSSHTestChannel.extReceived  s8   € Øœ:×:Ñ:Ó:Ø× Ñ ×'Ñ'¨Õ-ä—’Ð6°x±lÐCÕDr(   c                 ó@   • [         R                  " SU5      u  U l        g )Nz>L)ÚstructÚunpackÚstatus)r1   r¢  s     r)   Úrequest_exit_statusÚ"SSHTestChannel.request_exit_status  s   € Ü"ŸMšM¨$°Ó7‰MˆT�[r(   c                 ó   • SU l         g )NT)Ú	eofCalledrK   s    r)   r¢   ÚSSHTestChannel.eofReceived  s	   € Ø!ˆD�Nr(   c                 ó:   • U R                   R                  S 5        g r/   )r~   r§   rK   s    r)   r¨   ÚSSHTestChannel.closed  r•  r(   )r†  r¦  r.  r~   r‡  rˆ  r¢  N)r#   r$   r%   r&   r2   r�  r“  r˜  r�  r£  r¢   r¨   r'   r"   r(   r)   r„  r„  ô  s+   † ò	?ò	)ò	(ò	'ò	Eò	8ò	"õ	(r(   r„  c                  ó¢   • [         R                  " S[        R                  R	                  [
        5      /05      n [         R                  " U 5      $ )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)   ÚconchTestPublicKeyCheckerr®    sD   € ô  (×8Ò8Øœ4Ÿ8™8×.Ñ.Ô/@ÓAÐBÐCó 
Ðô ×+Ò+Ð,@ÓAÐAr(   c                   ód   • \ rS rSrSr\(       d  SrSS jrS rS r	S r
S rS	 rS
 rS rS rSrg)ÚSSHProtocolTestsi"  zR
Tests for communication between L{SSHServerTransport} and
L{SSHClientTransport}.
úcan't run without cryptographyc                 óÄ  ^^^• [         R                  " 5       m[        S5      U l        [        R
                  " U R                  5      n[        5       nUR                  [        5       5        UR                  [        5       5        UR                  U5        [        5       nX5l        UR                  5         UR                  S5      U l        [        U R                  5      U l        [!        UUU4S j5      U l        [        U R"                  5      U l        U R                  R'                  U R$                  5        U R"                  R'                  U R                  5        T$ )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T4SU 0TD6$ )Nr_   )r„  )r_   r‹  r.  Úresults    €€€r)   Ú<lambda>Ú:SSHProtocolTests._ourServerOurClientTest.<locals>.<lambda>>  s   ø€ œ¨¨fÑJ¸4ÐJÀ6ÒJr(   )r   r}   r,   Úrealmr   ÚPortalrý   ÚregisterCheckerrî   r®  r  ÚstartFactoryr  Úserverr   ÚclientTransportrO  ÚclientÚserverTransportr¸   )r1   r.  r‹  rº   ÚsshpcÚfacr´  s    ``   @r)   Ú_ourServerOurClientTestÚ(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                 óè   ^ • T R                  5       nU 4S jnUR                  " U5        U 4S jnUR                  " U5        U 4S jnUR                  " U5        U 4S jnUR                  " U5        U$ )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           	      óž   >• U Tl         TR                  U R                  R                  U S[        R
                  " S5      S5      [        5      $ )Nó	   subsystems	   not-crazyrO   ©rè   ÚassertFailurer_   ÚsendRequestr   ÚNSrö   ©rè   r1   s    €r)   ÚcbSubsystemÚFSSHProtocolTests.test_subsystemsAndGlobalRequests.<locals>.cbSubsystemO  sF   ø€ Ø"ˆDŒLØ×%Ñ%Ø—‘×(Ñ(Ø˜\¬6¯9ª9°\Ó+BÀAóô ó	ð r(   c                 ó€   >• TR                   nUR                  R                  US[        R                  " S5      S5      $ )NrÅ  rB   rO   ©rè   r_   rÈ  r   rÉ  ©Úignoredrè   r1   s     €r)   ÚcbNotCrazyFailedÚKSSHProtocolTests.test_subsystemsAndGlobalRequests.<locals>.cbNotCrazyFailedZ  s5   ø€ Ø—l‘lˆGØ—<‘<×+Ñ+Ø˜¤v§y¢y°Ó':¸Aóð r(   c                 óZ  >• TR                   nUR                  R                  SSS5      nUR                  R                  SSS5      nUR                  TR                  S5        TR                  UR                  R                  SSS5      [        5      n[        R                  " X#U/5      $ )Nó   fooó   barrO   s   foo-2ó   bar2rW   )	rè   r_   ÚsendGlobalRequestÚaddCallbackÚassertEqualrÇ  rö   r   ÚgatherResults)rÐ  rè   Úd1Úd2Úd3r1   s        €r)   ÚcbGlobalRequestsÚKSSHProtocolTests.test_subsystemsAndGlobalRequests.<locals>.cbGlobalRequestsb  s�   ø€ Ø—l‘lˆGØ—‘×/Ñ/°¸ÀÓBˆBà—‘×/Ñ/°¸'À1ÓEˆBØ�N‰N˜4×+Ñ+¨WÔ5à×#Ñ#Ø—‘×.Ñ.¨v°v¸qÓAÄ9óˆBô ×&Ò&¨° |Ó4Ð4r(   c                 ó  >• TR                  TR                  R                  R                  SSS.5        TR                  nSUR
                  R                  l        UR
                  R                  5         UR                  " 5         g )NrÕ  rÖ  )rN   rV   T)
rÙ  r·  r   rD   rè   r_   rš   r›   ÚserviceStoppedr•   rÏ  s     €r)   Ú
disconnectÚESSHProtocolTests.test_subsystemsAndGlobalRequests.<locals>.disconnectq  sd   ø€ Ø×ÑØ—
‘
×!Ñ!×0Ñ0¸&È7Ñ2Sôð —l‘lˆGØ<@ˆG�L‰L×"Ñ"Ô9Ø�L‰L×'Ñ'Ô)Ø×"Ò"Õ$r(   ©rÁ  rØ  )r1   rè   rË  rÑ  rÞ  râ  s   `     r)   Ú test_subsystemsAndGlobalRequestsÚ1SSHProtocolTests.test_subsystemsAndGlobalRequestsG  sn   ø€ ð ×.Ñ.Ó0ˆõ	ð 	×Ò˜KÔ(õ	ð 	×ÒÐ,Ô-õ	5ð 	×ÒÐ,Ô-õ	%ð 	×Ò˜JÔ'àˆr(   c                 ó  ^ ^• T R                  5       n[        R                  " SSS5      mUU 4S jnUR                  " U5        U 4S jnUR                  " U5        U 4S jnUR                  " U5        U 4S jnUR                  " U5        U$ )zs
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   >• U Tl         U R                  R                  U STS5      $ )Ns   pty-reqrO   )rè   r_   rÈ  )rè   rR   r1   s    €€r)   Ú	cbChannelÚ.SSHProtocolTests.test_shell.<locals>.cbChannel‡  s%   ø€ Ø"ˆDŒLØ—<‘<×+Ñ+¨G°ZÀÀqÓIÐIr(   c                 óÌ  >• TR                   R                  R                  R                  S   R                  nTR                  UR                  TR                   R                  5        TR                  UR                  S5        TR                  UR                  S5        TR                  UR                  5        TR                  nUR                  R                  USSS5      $ )Nr   rè  ré  r‰   r(   rO   )r·  r   r_   Úchannelsr   ÚassertIsrÙ  r�   r‚   Ú
assertTruer{   rè   rÈ  )rÐ  r   rè   r1   s      €r)   ÚcbPtyÚ*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                 ó@  >• TR                   R                  S5        TR                   R                  R                  TR                   5        [        R
                  " TR                   R                  TR                  R                  R                  R                  /5      $ )Ns   testing the shell! )
rè   r–   r_   ÚsendEOFr   rÚ  r~   r·  r   rx   ©rÐ  r1   s    €r)   ÚcbShellÚ,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                 ó¼  >• TR                   R                  S:w  a.  [        R                  " STR                   R                  4-  5        TR	                  SR                  TR                   R                  5      S5        TR                  TR                   R                  5        TR                  TR                  R                  R                  R                  5        g )Nr   zshell exit status was not 0: %ir(   s   testing the shell! 
)rè   r¢  r   rq   rÙ  Újoinr‡  rò  r¦  r·  r   rx   r|   r÷  s    €r)   ÚcbExitedÚ-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(   )rÁ  r   ÚpackRequest_pty_reqrØ  )r1   rè   rí  ró  rø  rü  rR   s   `     @r)   Ú
test_shellÚSSHProtocolTests.test_shell~  s„   ù€ ð
 ×.Ñ.Ó0ˆä×*Ò*Ð+=¸~ÈsÓSˆö	Jð 	×Ò˜IÔ&õ	Gð 	×Ò˜EÔ"õ	ð 	×Ò˜GÔ$õ	@ð 	×Ò˜HÔ%Øˆr(   c                 óˆ   ^ • T R                  5       nU 4S jnUR                  " U5        U 4S jnUR                  " U5        U$ )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           	      óž   >• U Tl         TR                  U R                  R                  U S[        R
                  " S5      S5      [        5      $ )Nó   execs	   jumboliahrO   rÆ  rÊ  s    €r)   rí  Ú3SSHProtocolTests.test_failedExec.<locals>.cbChannelµ  sB   ø€ Ø"ˆDŒLØ×%Ñ%Ø—‘×(Ñ(¨°'¼6¿9º9À\Ó;RÐTUÓVÜóð r(   c                 ó–   >• TR                  [        R                  5      nTR                  US   R                  R
                  S5        g )Nr   )r‘   N)ÚflushLoggedErrorsr   r™   rÙ  Úvaluer®   ©rÐ  Úerrorsr1   s     €r)   ÚcbFailedÚ2SSHProtocolTests.test_failedExec.<locals>.cbFailed¾  s:   ø€ ð ×+Ñ+¬E×,<Ñ,<Ó=ˆFØ×Ñ˜V A™YŸ_™_×1Ñ1Ð3EÕFr(   rä  )r1   rè   rí  r
  s   `   r)   Útest_failedExecÚ SSHProtocolTests.test_failedExec®  sC   ø€ ð
 ×.Ñ.Ó0ˆõ	ð 	×Ò˜IÔ&õ	Gð 	×Ò˜HÔ%Øˆr(   c                 ó¸   ^ • T R                  5       nU 4S jnUR                  " U5        U 4S jnUR                  " U5        U 4S jnUR                  " U5        U$ )zy
When the process started by a L{SSHChannel.sendRequest} exec request
exits, the exit status is reported to the channel.
c                 óv   >• U Tl         U R                  R                  U S[        R                  " S5      S5      $ )Nr  rŽ   rO   rÎ  rÊ  s    €r)   rí  Ú5SSHProtocolTests.test_falseChannel.<locals>.cbChannelÎ  s/   ø€ Ø"ˆDŒLØ—<‘<×+Ñ+¨G°W¼f¿iºiÈÓ>QÐSTÓUÐUr(   c                 ó0   >• TR                   R                  $ r/   ©rè   r~   r÷  s    €r)   ÚcbExecÚ2SSHProtocolTests.test_falseChannel.<locals>.cbExecÔ  ó   ø€ Ø—<‘<×'Ñ'Ð'r(   c                 óž   >• TR                  TR                  R                  / 5        TR                  TR                  R                  S5        g rÉ   )rÙ  rè   r‡  ÚassertNotEqualr¢  r÷  s    €r)   ÚcbClosedÚ4SSHProtocolTests.test_falseChannel.<locals>.cbClosedÙ  s7   ø€ à×Ñ˜TŸ\™\×2Ñ2°BÔ7Ø×Ñ §¡× 3Ñ 3°QÕ7r(   rä  ©r1   rè   rí  r  r  s   `    r)   Útest_falseChannelÚ"SSHProtocolTests.test_falseChannelÇ  sX   ø€ ð
 ×.Ñ.Ó0ˆõ	Vð 	×Ò˜IÔ&õ	(ð 	×Ò˜FÔ#õ	8ð
 	×Ò˜HÔ%Øˆr(   c                 ó¸   ^ • T R                  SSS9nU 4S jnUR                  " U5        U 4S jnUR                  " U5        U 4S jnUR                  " U5        U$ )zl
Bytes sent over the extended channel for stderr data are delivered to
the channel's C{extReceived} method.
é   r�   ©ÚlocalWindowÚlocalMaxPacketc                 óv   >• U Tl         U R                  R                  U S[        R                  " S5      S5      $ )Nr  s   eecho hellorO   rÎ  rÊ  s    €r)   rí  Ú5SSHProtocolTests.test_errorChannel.<locals>.cbChannelè  ó3   ø€ Ø"ˆDŒLØ—<‘<×+Ñ+Ø˜¤&§)¢)¨NÓ";¸Qóð r(   c                 ó¬   >• [         R                  " TR                  R                  TR                  R
                  R                  R                  /5      $ r/   ©r   rÚ  rè   r~   r·  r   rx   r÷  s    €r)   r  Ú2SSHProtocolTests.test_errorChannel.<locals>.cbExecð  ó>   ø€ Ü×&Ò&Ø—‘×%Ñ% t§z¡z×'8Ñ'8×'EÑ'E×'MÑ'MÐNóð r(   c                 ó:  >• TR                  TR                  R                  / 5        TR                  SR                  TR                  R                  5      S5        TR                  TR                  R
                  S5        TR                  TR                  R                  5        TR                  TR                  R                  S5        TR                  TR                  R                  TR                  R                  R                  R                  5        g )Nr(   ó   hello
r   r  )rÙ  rè   r‡  rû  rˆ  r¢  rò  r¦  ÚlocalWindowLeftr·  r   rx   r¦   r÷  s    €r)   r  Ú4SSHProtocolTests.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_errorChannelÚ"SSHProtocolTests.test_errorChannelá  s^   ø€ ð
 ×.Ñ.¸1ÈQÐ.ÐOˆõ	ð 	×Ò˜IÔ&õ	ð
 	×Ò˜FÔ#õ		ð 	×Ò˜HÔ%Øˆr(   c                 ó€   ^ • T R                  T R                  S5      [        5      nU 4S jnUR                  U5        U$ )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                 óÌ   >• TR                  [        R                  5      nTR                  US   R                  R
                  S5        TR                  [        U5      S5        g )Nr   )é   zunknown channelrO   )r  r   r™   rÙ  r  r®   r   r  s     €r)   r
  Ú6SSHProtocolTests.test_unknownChannel.<locals>.cbFailed  sL   ø€ Ø×+Ñ+¬E×,<Ñ,<Ó=ˆFØ×Ñ˜V A™YŸ_™_×1Ñ1Ð3IÔJØ×ÑœS ›[¨!Õ,r(   )rÇ  rÁ  rö   rØ  )r1   Údr
  s   `  r)   Útest_unknownChannelÚ$SSHProtocolTests.test_unknownChannel  s>   ø€ ð
 ×ÑØ×(Ñ(Ð)AÓBÄIó
ˆõ	-ð
 	
�‰�hÔØˆr(   c                 ó¸   ^ • T R                  SSS9nU 4S jnUR                  " U5        U 4S jnUR                  " U5        U 4S jnUR                  " U5        U$ )zK
An L{SSHChannel} can be configured with a maximum packet size to
receive.
é   rO   r  c                 óv   >• U Tl         U R                  R                  U S[        R                  " S5      S5      $ )Nr  s   secho hellorO   rÎ  rÊ  s    €r)   rí  Ú2SSHProtocolTests.test_maxPacket.<locals>.cbChannel  r$  r(   c                 ó0   >• TR                   R                  $ r/   r  r÷  s    €r)   r  Ú/SSHProtocolTests.test_maxPacket.<locals>.cbExec'  r  r(   c                 ó¼  >• TR                  TR                  R                  S5        TR                  SR                  TR                  R                  5      S5        TR                  SR                  TR                  R
                  5      S5        TR                  TR                  R                  S5        TR                  TR                  R                  5        g )Nr   r(   r*  r7  )	rÙ  rè   r¢  rû  r‡  rˆ  r+  rò  r¦  r÷  s    €r)   r  Ú1SSHProtocolTests.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_maxPacketÚSSHProtocolTests.test_maxPacket  s^   ø€ ð ×.Ñ.¸2ÈaÐ.ÐPˆõ	ð 	×Ò˜IÔ&õ	(ð 	×Ò˜FÔ#õ	4ð 	×Ò˜HÔ%Øˆr(   c                 ó¸   ^ • T R                  SSS9nU 4S jnUR                  " U5        U 4S jnUR                  " U5        U 4S jnUR                  " U5        U$ )zM
Normal standard out bytes are sent to the channel's C{dataReceived}
method.
r  r�   r  c                 óv   >• U Tl         U R                  R                  U S[        R                  " S5      S5      $ )Nr  s
   echo hellorO   rÎ  rÊ  s    €r)   rí  Ú-SSHProtocolTests.test_echo.<locals>.cbChannel=  s3   ø€ Ø"ˆDŒLØ—<‘<×+Ñ+Ø˜¤&§)¢)¨MÓ":¸Aóð r(   c                 ó¬   >• [         R                  " TR                  R                  TR                  R
                  R                  R                  /5      $ r/   r&  r÷  s    €r)   ÚcbEchoÚ*SSHProtocolTests.test_echo.<locals>.cbEchoE  r(  r(   c                 óî  >• TR                  TR                  R                  S5        TR                  SR                  TR                  R                  5      S5        TR                  TR                  R
                  S5        TR                  TR                  R                  5        TR                  TR                  R
                  TR                  R                  R                  R                  5        g )Nr   r(   r*  r  )rÙ  rè   r¢  rû  r‡  r+  rò  r¦  r·  r   rx   r¦   r÷  s    €r)   r  Ú,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ä  )r1   rè   rí  rD  r  s   `    r)   Ú	test_echoÚSSHProtocolTests.test_echo6  s^   ø€ ð
 ×.Ñ.¸1ÈQÐ.ÐOˆõ	ð 	×Ò˜IÔ&õ	ð
 	×Ò˜FÔ#õ	ð 	×Ò˜HÔ%Øˆr(   )rè   r½  r¼  r·  r»  r¾  N)rA   )r#   r$   r%   r&   r<   r   rs   rÁ  rå  rÿ  r  r  r-  r4  r>  rH  r'   r"   r(   r)   r°  r°  "  sB   † ñö
 Ø/ˆôò85òn.ò`ò2ò4"òHò"õ@!r(   r°  c                   óT   • \ rS rSr\(       d  SrSS jrS rS rS r	S r
S	 rS
 rSrg)ÚSSHFactoryTestsiZ  r±  Nc                 óˆ   ^• [         R                  " 5       nU4S jUl        S Ul        S Ul        UR                  5         U$ )Nc                  ó   >• T $ r/   r"   ©Úprimess   €r)   rµ  Ú0SSHFactoryTests.makeSSHFactory.<locals>.<lambda>`  s   ø€ ¡vr(   c                  óL   • S[         R                  R                  [        5      0$ ©Nr  ru  r"   r(   r)   rµ  rP  a  s   € ØœŸ™×+Ñ+Ô,=Ó>ñ,
r(   c                  óL   • S[         R                  R                  [        5      0$ rR  )rë   r  r  r   r"   r(   r)   rµ  rP  d  s   € ØœŸ™×+Ñ+Ô,>Ó?ñ-
r(   )rê   r+  r(  r  r#  rº  )r1   rO  Ú
sshFactorys    ` r)   ÚmakeSSHFactoryÚSSHFactoryTests.makeSSHFactory^  sA   ø€ Ü×'Ò'Ó)ˆ
Ü-ˆ
Ôñ$
ˆ
Ô ñ%
ˆ
Ô!ð 	×ÑÔ!ØÐr(   c                 óˆ   • U R                  5       nUR                  " S5      nU R                  U[        R                  5        g)zK
By default, buildProtocol() constructs an instance of
SSHServerTransport.
N)rU  r  ÚassertIsInstancerš   rK  )r1   rê   r   s      r)   Útest_buildProtocolÚ"SSHFactoryTests.test_buildProtocolj  s8   € ð
 ×%Ñ%Ó'ˆØ×(Ò(¨Ó.ˆØ×Ñ˜h¬	×(DÑ(DÕEr(   c                 óŒ   ^• / mU4S jnU R                  5       nXl        UR                  " S5        U R                  S/T5        g)zK
buildProtocol() calls 'self.protocol()' to construct a protocol
instance.
c                  óP   >• TR                  U 5        [        R                  " 5       $ r/   )r—  rš   rK  )r®   Úcallss    €r)   ÚmakeProtocolÚHSSHFactoryTests.test_buildProtocolRespectsProtocol.<locals>.makeProtocolz  s   ø€ Ø�L‰L˜ÔÜ×/Ò/Ó1Ð1r(   Nr"   )rU  r   r  rÙ  )r1   r^  rê   r]  s      @r)   Ú"test_buildProtocolRespectsProtocolÚ2SSHFactoryTests.test_buildProtocolRespectsProtocols  sE   ø€ ð
 ˆõ	2ð ×%Ñ%Ó'ˆØ'ÔØ×Ò˜dÔ#Ø×Ñ˜"˜˜uÕ%r(   c                 óÌ   • [         R                  " 5       nS Ul        S Ul        UR	                  5         UR                  S5      nU R                  / SQUR                  5        g)zY
buildProtocol() sets supportedPublicKeys to the list of supported
signature algorithms.
c                  ó�   • [         R                  R                  [        5      [         R                  R                  [        5      S.$ r  r  r"   r(   r)   rµ  ÚGSSHFactoryTests.test_buildProtocolSignatureAlgorithms.<locals>.<lambda>‰  s-   € ÜŸ™×+Ñ+Ô,=Ó>ÜŸ™×+Ñ+Ô,=Ó>ò#
r(   c                  ó�   • [         R                  R                  [        5      [         R                  R                  [        5      S.$ r  r"  r"   r(   r)   rµ  rd  �  s-   € ÜŸ™×+Ñ+Ô,>Ó?ÜŸ™×+Ñ+Ô,>Ó?ò$
r(   N)s   rsa-sha2-512s   rsa-sha2-256r  r  )rê   r+  r  r#  rº  r  rÙ  r  )r1   rœ   rº   s      r)   Ú%test_buildProtocolSignatureAlgorithmsÚ5SSHFactoryTests.test_buildProtocolSignatureAlgorithmsƒ  sY   € ô
 ×ÒÓ ˆñ
ˆŒñ
ˆÔð 	
�‰ÔØ�O‰O˜DÓ!ˆØ×ÑÚFØ×!Ñ!õ	
r(   c                 ó´   • U R                  SS9nUR                  S5      nU R                  SUR                  5        U R                  SUR                  5        g)zO
Group key exchanges are not supported when we don't have the primes
database.
NrN  ó"   diffie-hellman-group-exchange-sha1ó$   diffie-hellman-group-exchange-sha256)rU  r  ÚassertNotInÚsupportedKeyExchanges)r1   Úf1Úp1s      r)   Útest_buildProtocolNoPrimesÚ*SSHFactoryTests.test_buildProtocolNoPrimes˜  s[   € ð
 × Ñ ¨Ð Ð-ˆà×Ñ˜dÓ#ˆà×ÑØ1°2×3KÑ3Kô	
ð 	×ÑØ3°R×5MÑ5Mõ	
r(   c                 ó¸   • U R                  SS0S9nUR                  S5      nU R                  SUR                  5        U R                  SUR                  5        g)zE
Group key exchanges are supported when we have the primes database.
rO   )rÿ   r1  rN  Nri  rj  )rU  r  ÚassertInrl  ©r1   Úf2Úp2s      r)   Útest_buildProtocolWithPrimesÚ,SSHFactoryTests.test_buildProtocolWithPrimes¨  sU   € ð × Ñ ¨¨F¨Ð Ð4ˆà×Ñ˜dÓ#ˆà�‰Ð;¸R×=UÑ=UÔVØ�‰Ð=¸r×?WÑ?WÕXr(   c                 óœ   • U R                  5       nUR                  S5      nU R                  SSR                  UR                  5      5        g)zO
ECDSA key exchanges are listed with 256 having a higher priority among ECDSA.
Ns8   ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521ó   ,)rU  r  rr  rû  rl  rs  s      r)   Útest_buildProtocolKexECDSAÚ*SSHFactoryTests.test_buildProtocolKexECDSA³  sE   € ð × Ñ Ó"ˆà×Ñ˜dÓ#ˆð 	�‰ØGØ�I‰I�b×.Ñ.Ó/õ	
r(   r"   r/   )r#   r$   r%   r&   r   rs   rU  rY  r`  rf  ro  rv  rz  r'   r"   r(   r)   rK  rK  Z  s/   † ÞØ/ˆô
òFò&ò 
ò*
ò 	Yõ
r(   rK  c                   óz   • \ rS rSrSr\(       d  Sr\(       a  \" \R                  5      r	S r
S rS rS rS rS	rg
)ÚMPTestsiÃ  zc
Tests for L{common.getMP}.

@cvar getMP: a method providing a MP parser.
@type getMP: C{callable}
r±  c                 óF   • U R                  U R                  S5      S5        g)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         )rO   r(   N©rÙ  ÚgetMPrK   s    r)   Ú
test_getMPÚMPTests.test_getMPÑ  s   € ð
 	×Ñ˜Ÿ™Ð$GÓHÈ(ÕSr(   c                 óF   • U R                  U R                  S5      S5        g)z^
L{common.getMP} should be able to parse a big enough integer
(that doesn't fit on one byte).
s      )ir(   Nr  rK   s    r)   Útest_getMPBigIntegerÚMPTests.test_getMPBigIntegerØ  s!   € ð
 	×ÑØ�J‰JÐ:Ó;¸_õ	
r(   c                 óH   • U R                  U R                  SS5      S5        g)zO
L{common.getMP} has the ability to parse multiple integer in the same
string.
s               rÿ   )rO   rÿ   r(   Nr  rK   s    r)   Útest_multipleGetMPÚMPTests.test_multipleGetMPá  s)   € ð
 	×ÑØ�J‰JØWØóð õ	
r(   c                 óF   • U R                  U R                  S5      S5        g)z]
When more data than needed is sent to L{common.getMP}, it should return
the remaining data.
s         foo)rO   rÔ  Nr  rK   s    r)   Útest_getMPRemainingDataÚMPTests.test_getMPRemainingDataî  s!   € ð
 	×ÑØ�J‰JÐ=Ó>Àõ	
r(   c                 óZ   • U R                  [        R                  U R                  S5        g)zi
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€  rK   s    r)   Útest_notEnoughDataÚMPTests.test_notEnoughData÷  s   € ð
 	×Ñœ&Ÿ,™,¨¯
©
°KÕ@r(   r"   N)r#   r$   r%   r&   r<   r   rs   Ústaticmethodr   r€  r�  r„  r‡  rŠ  rŽ  r'   r"   r(   r)   r}  r}  Ã  s=   † ñö Ø/ˆæÙ˜VŸ\™\Ó*ˆòTò
ò
ò
õAr(   r}  c                   ó0   • \ rS rSrSr\(       d  SrS rSrg)ÚGMPYInstallDeprecationTestsiÿ  zA
Tests for the deprecation of former GMPY accidental public API.
r?   c                 óÌ   • [         R                  " 5         U R                  U R                  /5      nU R	                  [        U5      S5        U R	                  US   S   S5        g)z4
L{twisted.conch.ssh.common.install} is deprecated.
rO   r   ÚmessagezAtwisted.conch.ssh.common.install was deprecated in Twisted 16.5.0N)r   ÚinstallÚflushWarningsÚtest_deprecatedrÙ  r   )r1   Úwarningss     r)   r—  Ú+GMPYInstallDeprecationTests.test_deprecated  sX   € ô 	�ŠÔØ×%Ñ% t×';Ñ';Ð&<Ó=ˆØ×Ñœ˜X›¨Ô*Ø×ÑØ�Q‰K˜	Ñ"ØOõ	
r(   r"   N)	r#   r$   r%   r&   r<   r   rs   r—  r'   r"   r(   r)   r’  r’  ÿ  s   † ñö Ø0ˆõ

r(   r’  )Sr<   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*   r5   ru   rª   ÚregisterAdapterÚISessionÚProtocolrJ   r“   rŠ   r˜   r—   rç   rè   ré   rê   rë   rš   rì   rî   ÚSSHProtocolCheckerrý   r+  r  r6  rK  r  rW  rO  rj  rb  r2  rc  r‰  r„  r®  ÚTestCaser°  rK  r}  r’  r"   r(   r)   Ú<module>r¬     sö  ðñó
 Ý ß $Ñ $÷ó õ 6Ý Ý 0ß 5Ñ 5Ý 4ß 'Ý 0Ý "á˜^Ó,€æß+ßCÔC÷ñ ÷

ñ 
ô>?%�f×&Ñ&ô ?%÷D=$ñ =$õ@ &æØ×ÒØ! ?°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(   