
    Jfb                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZ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 d dlmZ d dl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) d dl*m+Z+m,Z, 	 d dlm-Z-m.Z.  e&d      Z0e0rd dl1m2Z2 d dl3m4Z4m5Z5m6Z6 nd dl7m4Z4  G d d      Z2	 d dl8m5Z9 e9Z: G d d      Z> G d de,      Z? G d dej                        ZA G d  d!ej                        ZC G d" d#ej                        ZE G d$ d%ej                        ZF G d& d'ej                        ZGd=d(ZH G d) d*      ZI G d+ d,eI      ZJ ee4       G d- d.e2             ZK G d/ d0      ZL G d1 d2eI      ZM G d3 d4      ZN G d5 d6eIeNe,      ZO G d7 d8eJeNe,      ZP G d9 d:eMeNe,      ZQ G d; d<eJe,      ZRy# e/$ r Y <w xY w# e/$ rZ;dZ: e<e;      Z=[;Y dZ;[;"dZ;[;ww xY w)>    N)count)implementer)
ConchError)privateDSA_opensshprivateRSA_opensshpublicDSA_opensshpublicRSA_opensshConchTestRealm)portal)deferprotocolreactor)ProcessExitedAlready)LoopingCall)getProcessValue)filepathlogruntime)FilePath)which)requireModule)HAS_IPV6skipWithoutIPv6)SkipTestTestCase)ConchTestServerFactoryconchTestPublicKeyCheckercryptography)	ConchUser)ISession
SSHSessionwrapProtocol)r!   c                       e Zd Zy)r    N)__name__
__module____qualname__     X/var/www/cs2snipe.com/venv/lib/python3.12/site-packages/twisted/conch/test/test_conch.pyr    r    1   s    r)   r    )r"   c                       e Zd ZdZdZd Zy)	FakeStdioz
    A fake for testing L{twisted.conch.scripts.conch.SSHSession.eofReceived} and
    L{twisted.conch.scripts.cftp.SSHSession.eofReceived}.

    @ivar writeConnLost: A flag which records whether L{loserWriteConnection}
        has been called.
    Fc                     d| _         y)z9
        Record the call to loseWriteConnection.
        TN)writeConnLostselfs    r*   loseWriteConnectionzFakeStdio.loseWriteConnectionJ   s     "r)   N)r%   r&   r'   __doc__r.   r1   r(   r)   r*   r,   r,   ?   s     M"r)   r,   c                       e Zd ZdZeeZd Zy)StdioInteractingSessionTestsz>
    Tests for L{twisted.conch.scripts.conch.SSHSession}.
    Nc                     t               }t               }||_        |j                          | j	                  |j
                         y)z}
        L{twisted.conch.scripts.conch.SSHSession.eofReceived} loses the
        write half of its stdio connection.
        N)r,   StdioInteractingSessionstdioeofReceived
assertTruer.   )r0   r7   channels      r*   test_eofReceivedz-StdioInteractingSessionTests.test_eofReceivedY   s8    
 )+++,r)   )r%   r&   r'   r2   r6   _reasonskipr;   r(   r)   r*   r4   r4   Q   s     &	-r)   r4   c                       e Zd Zd Zd Zd Zy)Echoc                 .    t        j                  d       y )NzECHO CONNECTION MADEr   msgr/   s    r*   connectionMadezEcho.connectionMadef       &'r)   c                 .    t        j                  d       y )NzECHO CONNECTION DONErA   r0   reasons     r*   connectionLostzEcho.connectionLosti   rD   r)   c                 x    | j                   j                  |       d|v r| j                   j                          y y )N   
)	transportwriteloseConnectionr0   datas     r*   dataReceivedzEcho.dataReceivedl   s0    T"D=NN))+ r)   N)r%   r&   r'   rC   rH   rP   r(   r)   r*   r?   r?   e   s    ((,r)   r?   c                       e Zd ZeZy)EchoFactoryN)r%   r&   r'   r?   r   r(   r)   r*   rR   rR   r   s    Hr)   rR   c                   4    e Zd ZdZdZdZdZd Zd Zd Z	d Z
y)ConchTestOpenSSHProcessa  
    Test protocol for launching an OpenSSH client process.

    @ivar deferred: Set by whatever uses this object. Accessed using
    L{_getDeferred}, which destroys the value so the Deferred is not
    fired twice. Fires when the process is terminated.
    Nr)   c                 .    | j                   d c}| _         |S Ndeferredr0   ds     r*   _getDeferredz$ConchTestOpenSSHProcess._getDeferred       ==$4=r)   c                 .    | xj                   |z  c_         y rV   )bufrN   s     r*   outReceivedz#ConchTestOpenSSHProcess.outReceived   s    Dr)   c                 .    | xj                   |z  c_         y rV   )problemsrN   s     r*   errReceivedz#ConchTestOpenSSHProcess.errReceived   s    r)   c           
      x   |j                   j                  dk7  rf| j                         j                  t	        dj                  |j                   j                  | j                  j                  d                         y| j                  j                  dd      }| j                         j                  |       y)z~
        Called when the process has ended.

        @param reason: a Failure giving the reason for the process' end.
        r   zexit code was not 0: {} ({})charmaps   
rJ   N)valueexitCoder[   errbackr   formatra   decoder^   replacecallback)r0   rG   r^   s      r*   processEndedz$ConchTestOpenSSHProcess.processEnded   s     <<  A%''299--,,Y7 ((""7E2C((-r)   )r%   r&   r'   r2   rX   r^   ra   r[   r_   rb   rl   r(   r)   r*   rT   rT   v   s,     H
CH.r)   rT   c                   D    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)ConchTestForwardingProcessa  
    Manages a third-party process which launches a server.

    Uses L{ConchTestForwardingPort} to connect to the third-party server.
    Once L{ConchTestForwardingPort} has disconnected, kill the process and fire
    a Deferred with the data received by the L{ConchTestForwardingPort}.

    @ivar deferred: Set by whatever uses this object. Accessed using
    L{_getDeferred}, which destroys the value so the Deferred is not
    fired twice. Fires when the process is terminated.
    Nc                 .    || _         d| _        || _        y)aF  
        @type port: L{int}
        @param port: The port on which the third-party server is listening.
        (it is assumed that the server is running on localhost).

        @type data: L{str}
        @param data: This is sent to the third-party server. Must end with '
'
        in order to trigger a disconnect.
        N)portbufferrO   )r0   rp   rO   s      r*   __init__z#ConchTestForwardingProcess.__init__   s     		r)   c                 .    | j                   d c}| _         |S rV   rW   rY   s     r*   r[   z'ConchTestForwardingProcess._getDeferred   r\   r)   c                 $    | j                          y rV   )_connectr/   s    r*   rC   z)ConchTestForwardingProcess.connectionMade   s    r)   c                     t        j                  t        t        | | j                        }|j                  d| j                        }|j                  | j                         |S )a  
        Connect to the server, which is often a third-party process.
        Tries to reconnect if it fails because we have no way of determining
        exactly when the port becomes available for listening -- we can only
        know when the process starts.
        	127.0.0.1)	r   ClientCreatorr   ConchTestForwardingPortrO   
connectTCPrp   
addErrback
_ebConnect)r0   ccrZ   s      r*   ru   z#ConchTestForwardingProcess._connect   sH     ##G-DdDIIVMM+tyy1	T__%r)   c                 D    t        j                  d| j                         y )Ng?)r   	callLaterru   )r0   fs     r*   r|   z%ConchTestForwardingProcess._ebConnect   s    #t}}-r)   c                     || _         | j                  j                  d       | j                  j                          t	        j
                  d| j                         y)z
        The network connection has died; save the buffer of output
        from the network and attempt to quit the process gracefully,
        and then (after the reactor has spun) send it a KILL signal.
           r   N)rq   rK   rL   rM   r   r   
_reallyDie)r0   rq   s     r*   forwardingPortDisconnectedz5ConchTestForwardingProcess.forwardingPortDisconnected   sA     W%%%'!T__-r)   c                 Z    	 | j                   j                  d       y # t        $ r Y y w xY w)NKILL)rK   signalProcessr   r/   s    r*   r   z%ConchTestForwardingProcess._reallyDie   s+    	NN((0# 		s    	**c                 V    | j                         j                  | j                         y)z
        Fire the Deferred at self.deferred with the data collected
        from the L{ConchTestForwardingPort} connection, if any.
        N)r[   rk   rq   rF   s     r*   rl   z'ConchTestForwardingProcess.processEnded   s    
 	$$T[[1r)   )r%   r&   r'   r2   rX   rr   r[   rC   ru   r|   r   r   rl   r(   r)   r*   rn   rn      s6    
 H
.	.2r)   rn   c                   (    e Zd ZdZd Zd Zd Zd Zy)ry   z
    Connects to server launched by a third-party process (managed by
    L{ConchTestForwardingProcess}) sends data, then reports whatever it
    received back to the L{ConchTestForwardingProcess} once the connection
    is ended.
    c                      || _         || _        y)z
        @type protocol: L{ConchTestForwardingProcess}
        @param protocol: The L{ProcessProtocol} which made this connection.

        @type data: str
        @param data: The data to be sent to the third-party server.
        N)r   rO   )r0   r   rO   s      r*   rr   z ConchTestForwardingPort.__init__   s     !	r)   c                 \    d| _         | j                  j                  | j                         y )Nr)   )rq   rK   rL   rO   r/   s    r*   rC   z&ConchTestForwardingPort.connectionMade   s    TYY'r)   c                 .    | xj                   |z  c_         y rV   )rq   rN   s     r*   rP   z$ConchTestForwardingPort.dataReceived  s    tr)   c                 N    | j                   j                  | j                         y rV   )r   r   rq   rF   s     r*   rH   z&ConchTestForwardingPort.connectionLost  s    00=r)   N)r%   r&   r'   r2   rr   rC   rP   rH   r(   r)   r*   ry   ry      s    	(>r)   ry   c                     t         j                  d|z  g}g }|t        |       z   D ]4  }t        |t              r|j                  d      }|j                  |       6 |S )Na$  -c
### Twisted Preamble
import sys, os
path = os.path.abspath(sys.argv[0])
while os.path.dirname(path) != path:
    if os.path.basename(path).startswith('Twisted'):
        sys.path.insert(0, path)
        break
    path = os.path.dirname(path)

from twisted.conch.scripts.%s import run
run()utf-8)sys
executablelist
isinstancestrencodeappend)argsmodstartmadeArgsargs        r*   	_makeArgsr     si    		 	E" HtDz! c3**W%C Or)   c                   B    e Zd ZesdZed        Zd Zd Zd Z	d Z
d Zy)	ConchServerSetupMixinzcan't run without cryptographyc                      t        d      S )Ns   testuserr
   r(   r)   r*   realmFactoryz"ConchServerSetupMixin.realmFactory)  s    k**r)   c                    dD ]7  }t         j                  j                  |      s#t        j                  |       9 t	        dd      5 }|j                  t               d d d        t	        dd      5 }|j                  t               d d d        t	        dd      5 }|j                  t               d d d        t	        dd      5 }|j                  t               d d d        t        j                  dd       t        j                  dd       t        d      j                         }|j                  j                  s|j                  j                  rt!        d      t	        d	d      5 }|j                  d
t        z          d d d        y # 1 sw Y   2xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)N)rsa_testrsa_test.pubdsa_testdsa_test.pubkh_testr   wbr   r   r   i  zgprivate key readable by others despite chmod; possible windows permission issue? see https://tm.tl/9767r   s
   127.0.0.1 )ospathexistsremoveopenrL   r   r	   r   r   chmodr   getPermissionsgroupreadotherr   )r0   r   permissionss      r*   _createFilesz"ConchServerSetupMixin._createFiles-  s~   T 	Aww~~a 		!	 *d# 	(qGG&'	(.$' 	'1GG%&	'.$' 	'1GG%&	'*d# 	(qGG&'	(
U#
U#z*99;!![%6%6%;%;* 
 )T" 	7aGGM$556	7 	7#	( 	(	' 	'	' 	'	( 	(	7 	7s<   	F3FF)F5-GFF&)F25F>G
c                     t        j                          }|j                  d       |j                         d   }|j                          |S )N) r      )socketbindgetsocknameclose)r0   srp   s      r*   _getFreePortz"ConchServerSetupMixin._getFreePortE  s6    MMO	w}}q!		r)   c                     | j                         }t        j                  |      }|j                  t	                      t               }||_        |S )z
        Make a L{ConchTestServerFactory}, which allows us to start a
        L{ConchTestServer} -- i.e. an actually listening conch.
        )r   r   PortalregisterCheckerr   r   )r0   realmpfactorys       r*   _makeConchFactoryz'ConchServerSetupMixin._makeConchFactoryL  sF    
 !!#MM% 	356(*r)   c                     | j                          | j                         | _        d| j                  _        t	        j
                  d| j                  d      | _        t	        j
                  dt                     | _        | j                  j                         j                  | _        t        rOt	        j
                  dt               d      | _        | j                  j                         j                  | _        y y )Nr   r   rw   )	interfacez::1)r   r   conchFactoryexpectedLoseConnectionr   	listenTCPconchServerrR   
echoServergetHostrp   echoPortr   echoServerV6
echoPortV6r/   s    r*   setUpzConchServerSetupMixin.setUpX  s     224340",,t  K
 "++A{}=//166 ' 1 1![]e TD"//779>>DO r)   c                    	 d| j                   j                  _        | j                   j                  j                  j	                          t        j                  | j                  j                        t        j                  | j                  j                        g}t        r8|j                  t        j                  | j                  j                               t        j                  |      S # t
        $ r Y w xY w)Nr   )r   protodonerK   rM   AttributeErrorr   maybeDeferredr   stopListeningr   r   r   r   gatherResults)r0   	deferredss     r*   tearDownzConchServerSetupMixin.tearDowne  s    	?+,D##( ##--<<> 0 0 > >? = =>
	 U001B1B1P1PQR""9--  		s   C0 0	C<;C<N)r%   r&   r'   r   r=   staticmethodr   r   r   r   r   r   r(   r)   r*   r   r   %  s5    /+ +70
?.r)   r   c                   "    e Zd ZdZd Zd Zd Zy)ForwardingMixina  
    Template class for tests of the Conch server's ability to forward arbitrary
    protocols over SSH.

    These tests are integration tests, not unit tests. They launch a Conch
    server, a custom TCP server (just an L{EchoProtocol}) and then call
    L{execute}.

    L{execute} is implemented by subclasses of L{ForwardingMixin}. It should
    cause an SSH client to connect to the Conch server, asking it to forward
    data to the custom TCP server.
    c                 n    | j                  dt                     }|j                  | j                  d      S )z
        Test that we can use whatever client to send the command "echo goodbye"
        to the Conch server. Make sure we receive "goodbye" back from the
        server.
        echo goodbye   goodbye
executerT   addCallbackassertEqualrY   s     r*   	test_execzForwardingMixin.test_exec  s/     LL)@)BC}}T--|<<r)   c                     | j                         }t        |d      }| j                  d|d|| j                  fz        }|j	                  | j
                  d       |S )zy
        Test that we can use whatever client to forward a local port to a
        specified port on the server.
           test
r   z-N -L%i:127.0.0.1:%isshArgsr   rn   r   r   r   r   r0   	localPortprocessrZ   s       r*   test_localToRemoteForwardingz,ForwardingMixin.test_localToRemoteForwarding  sb    
 %%'	,Y	BLL!79dmm:T!T  
 	
d&&	2r)   c                     | j                         }t        |d      }| j                  d|d|| j                  fz        }|j	                  | j
                  d       |S )zs
        Test that we can use whatever client to forward a port from the server
        to a port locally.
        r   r   z-N -R %i:127.0.0.1:%ir   r   r   s       r*   test_remoteToLocalForwardingz,ForwardingMixin.test_remoteToLocalForwarding  sb    
 %%'	,Y	BLL!8It}};U!U  
 	
d&&	2r)   N)r%   r&   r'   r2   r   r   r   r(   r)   r*   r   r   u  s    =r)   r   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
RekeyAvatara#  
    This avatar implements a shell which sends 60 numbered lines to whatever
    connects to it, then closes the session with a 0 exit status.

    60 lines is selected as being enough to send more than 2kB of traffic, the
    amount the client is configured to initiate a rekey after.
    c                 T    t        j                  |        t        | j                  d<   y )Ns   session)r    rr   r"   channelLookupr/   s    r*   rr   zRekeyAvatar.__init__  s     4 )3:&r)   c                     t        j                         }|j                         j                  t        |             fd}t	        |t                     j                  d       y)zE
        Write 60 lines of data to the transport, then exit.
        c                    t        |       }|dk(  rRj                          j                  j                  j	                  j                  dd       j                          y d|fz  }|j                  d      }j                  |       y )N<   s   exit-statuss       zline #%02d
r   )nextstopsessionconnsendRequestrM   r   rL   )counterilinecallrK   s      r*   rL   z$RekeyAvatar.openShell.<locals>.write  sx    WABw		!!&&22%%~7J ((*%,{{7+%r)   g{Gz?N)r   ProtocolmakeConnectionr#   r   r   r   )r0   rK   r   rL   r   s    `  @r*   	openShellzRekeyAvatar.openShell  sU     !!#Y'  e!45	&( 5%'*

4r)   c                      y)z2
        Ignore the close of the session.
        Nr(   r/   s    r*   closedzRekeyAvatar.closed      r)   c                      y rV   r(   r/   s    r*   r8   zRekeyAvatar.eofReceived      r)   c                      y rV   r(   )r0   r   commands      r*   execCommandzRekeyAvatar.execCommand  r  r)   c                      y rV   r(   )r0   term
windowSizemodess       r*   getPtyzRekeyAvatar.getPty  r  r)   c                      y rV   r(   )r0   newWindowSizes     r*   windowChangedzRekeyAvatar.windowChanged  r  r)   N)r%   r&   r'   r2   rr   r  r  r8   r	  r  r  r(   r)   r*   r   r     s+    4B
r)   r   c                       e Zd ZdZd Zy)
RekeyRealmzS
    This realm gives out new L{RekeyAvatar} instances for any avatar request.
    c                 $    |d   t               d fS )Nr   c                       y rV   r(   r(   r)   r*   <lambda>z*RekeyRealm.requestAvatar.<locals>.<lambda>  r  r)   )r   )r0   avatarIDmind
interfacess       r*   requestAvatarzRekeyRealm.requestAvatar  s    !}km\99r)   N)r%   r&   r'   r2   r  r(   r)   r*   r  r    s    :r)   r  c                       e Zd ZdZeZd Zy)RekeyTestsMixinzp
    TestCase mixin which defines tests exercising L{SSHTransportBase}'s handling
    of rekeying messages.
    c                 n     t               } j                  d|d      } fd}|j                  |       |S )z
        After a client-initiated rekey is completed, application data continues
        to be passed over the SSH connection.
        r   z-o RekeyLimit=2Kc                     dj                  t        d      D cg c]  }d|fz  
 c}      dz   }|j                  d      }j                  | |       y c c}w )N
r   z
line #%02dr   )joinranger   r   )resultr   expectedResultr0   s      r*   finishedz2RekeyTestsMixin.test_clientRekey.<locals>.finished	  sS    !YYU2Y'Ot(;'OPSWWN+227;NV^4 (Ps   A)rT   r   r   )r0   r   rZ   r$  s   `   r*   test_clientRekeyz RekeyTestsMixin.test_clientRekey  s8    
 *+LLW&89	5
 	
hr)   N)r%   r&   r'   r2   r  r   r%  r(   r)   r*   r  r    s    
 Lr)   r  c                   (    e Zd Z ed      sdZddZy)OpenSSHClientMixinsshz$no ssh command-line client availablec                 l     t        t        d      d   d      } fd}|j                  |      S )a  
        Connects to the SSH server started in L{ConchServerSetupMixin.setUp} by
        running the 'ssh' command line tool.

        @type remoteCommand: str
        @param remoteCommand: The command (with arguments) to run on the
        remote end.

        @type process: L{ConchTestOpenSSHProcess}

        @type sshArgs: str
        @param sshArgs: Arguments to pass to the 'ssh' process.

        @return: L{defer.Deferred}
        r(  r   )z-ozPubkeyAcceptedKeyTypes=ssh-dssz-Vc                    | dk(  rd}nd}t        j                         _        d|z   
z   dz   z   }	j                  j	                         j
                  }||z  j                         }g }|D ]4  }t        |t              r|j                  d      }|j                  |       6 t        j                  t        d      d   |       j                  S )Nr   z!-oPubkeyAcceptedKeyTypes=ssh-dss r   zssh -2 -l testuser -p %i -F /dev/null -oUserKnownHostsFile=kh_test -oPasswordAuthentication=no -oHostKeyAlgorithms=ssh-rsa -a -i dsa_test  127.0.0.1 r   r(  )r   DeferredrX   r   r   rp   splitr   r   r   r   r   spawnProcessr   )statusoptscmdlinerp   cmdsencodedCmdscmdr   remoteCommandr0   r   s          r*   hasPAKTz+OpenSSHClientMixin.execute.<locals>.hasPAKT.  s    {:$~~/G# 
          ##++-22DdN))+DK (c3'**W-C""3'(   %,q/;G###r)   )r   r   r   )r0   r5  r   r   rZ   r6  s   ````  r*   r   zOpenSSHClientMixin.execute  s4    ( %LOK
"	$H }}W%%r)   N)r   )r%   r&   r'   r   r=   r   r(   r)   r*   r'  r'    s    <5<&r)   r'  c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)OpenSSHKeyExchangeTestsz\
    Tests L{SSHTransportBase}'s key exchange algorithm compatibility with
    OpenSSH.
    c                    g }	 t        j                  t        d      d   ddgt         j                        }t	        |t
              s|j                  d      }|j                         }||vrt        | d      | j                  dt               d	|z         }|j                  | j                  d
      S # t        $ r Y Ww xY w)aI  
        Call execute() method of L{OpenSSHClientMixin} with an ssh option that
        forces the exclusive use of the key exchange algorithm specified by
        keyExchangeAlgo

        @type keyExchangeAlgo: L{str}
        @param keyExchangeAlgo: The key exchange algorithm to use

        @return: L{defer.Deferred}
        r(  r   z-Qkex)stderrr   z not supported by ssh clientz
echo helloz-oKexAlgorithms=s   hello
)
subprocesscheck_outputr   STDOUTr   r   ri   r-  BaseExceptionr   r   rT   r   r   )r0   keyExchangeAlgokexAlgorithmsoutputrZ   s        r*   assertExecuteWithKexAlgorithmz5OpenSSHKeyExchangeTests.assertExecuteWithKexAlgorithm[  s     	,,ua$.z7H7HF fc*w/"LLNM -/o..JKLLLL#%0

 }}T--z::  		s   A%B5 5	C Cc                 $    | j                  d      S )zb
        The ecdh-sha2-nistp256 key exchange algorithm is compatible with
        OpenSSH
        zecdh-sha2-nistp256rC  r/   s    r*   test_ECDHSHA256z'OpenSSHKeyExchangeTests.test_ECDHSHA256{      
 112FGGr)   c                 $    | j                  d      S )zb
        The ecdh-sha2-nistp384 key exchange algorithm is compatible with
        OpenSSH
        zecdh-sha2-nistp384rE  r/   s    r*   test_ECDHSHA384z'OpenSSHKeyExchangeTests.test_ECDHSHA384  rG  r)   c                 $    | j                  d      S )zb
        The ecdh-sha2-nistp521 key exchange algorithm is compatible with
        OpenSSH
        zecdh-sha2-nistp521rE  r/   s    r*   test_ECDHSHA521z'OpenSSHKeyExchangeTests.test_ECDHSHA521  rG  r)   c                 $    | j                  d      S )zl
        The diffie-hellman-group14-sha1 key exchange algorithm is compatible
        with OpenSSH.
        zdiffie-hellman-group14-sha1rE  r/   s    r*   test_DH_GROUP14z'OpenSSHKeyExchangeTests.test_DH_GROUP14  s    
 112OPPr)   c                 $    | j                  d      S )zs
        The diffie-hellman-group-exchange-sha1 key exchange algorithm is
        compatible with OpenSSH.
        z"diffie-hellman-group-exchange-sha1rE  r/   s    r*   test_DH_GROUP_EXCHANGE_SHA1z3OpenSSHKeyExchangeTests.test_DH_GROUP_EXCHANGE_SHA1  s    
 112VWWr)   c                 $    | j                  d      S )zu
        The diffie-hellman-group-exchange-sha256 key exchange algorithm is
        compatible with OpenSSH.
        z$diffie-hellman-group-exchange-sha256rE  r/   s    r*   test_DH_GROUP_EXCHANGE_SHA256z5OpenSSHKeyExchangeTests.test_DH_GROUP_EXCHANGE_SHA256  s    
 112
 	
r)   c                 F    | j                  t        | j                  d       y)zy
        The list of key exchange algorithms supported
        by OpenSSH client is obtained with C{ssh -Q kex}.
        zunsupported-algorithmN)assertRaisesr   rC  r/   s    r*   test_unsupported_algorithmz2OpenSSHKeyExchangeTests.test_unsupported_algorithm  s     
 	d88:Q	
r)   N)r%   r&   r'   r2   rC  rF  rI  rK  rM  rO  rQ  rT  r(   r)   r*   r8  r8  U  s5    
;@HHHQX

r)   r8  c                        e Zd ZdZed        Zy)OpenSSHClientForwardingTestszR
    Connection forwarding tests run against the OpenSSL command line client.
    c                     | j                         }t        |d      }| j                  d|d|| j                  fz        }|j	                  | j
                  d       |S )zG
        Forwarding of arbitrary IPv6 TCP connections via SSH.
        r   r   z-N -L%i:[::1]:%ir   )r   rn   r   r   r   r   r   s       r*   test_localToRemoteForwardingV6z;OpenSSHClientForwardingTests.test_localToRemoteForwardingV6  sb    
 %%'	,Y	BLL!3y$//6R!R  
 	
d&&	2r)   N)r%   r&   r'   r2   r   rX  r(   r)   r*   rV  rV    s     
 
r)   rV  c                       e Zd ZdZy)OpenSSHClientRekeyTestszE
    Rekeying tests run against the OpenSSL command line client.
    N)r%   r&   r'   r2   r(   r)   r*   rZ  rZ    s    r)   rZ  c                   F    e Zd ZdZej
                  dk(  rdZddZd Zd Z	y)	CmdLineClientTestszP
    Connection forwarding tests run against the Conch command line client.
    win32z!can't run cmdline client on win32Nc                    |g }t        j                         |_        | j                  j	                         j
                  }dj                  |      |z   dz   |z   }t        ||j                         z         }t        j                  j                         }t        j                  j                  t        j                        |d<   g }	i }
|D ]4  }t!        |t"              r|j%                  d      }|	j'                  |       6 |D ]N  }||   }t!        |t"              r|j%                  d      }t!        |t"              r|j%                  d      }||
|<   P t)        j*                  |t        j,                  |	|
       |j                  S )z{
        As for L{OpenSSHClientTestCase.execute}, except it runs the 'conch'
        command line tool, not 'ssh'.
        z[-p {} -l testuser --known-hosts kh_test --user-authentications publickey -a -i dsa_test -v r+  
PYTHONPATHr   )env)r   r,  rX   r   r   rp   rh   r   r-  r   environcopypathsepr   r   r   r   r   r   r   r   r.  r   )r0   r5  r   r   	conchArgsrp   r4  r2  r`  r3  
encodedEnvvarvals                r*   r   zCmdLineClientTests.execute  sd   
 I >>+'')..
 &,)
 ,99
 <II 	 SYY[01jjooJJOOCHH5L
 	$C#s#jj)s#	$  	"Cc(C#s#jj)#s#jj)!JsO	" 	WcnnkzRr)   c           	           fd}t        j                   j                                j                  dt	               ddj
                  ddg      }|j                   j                  d       |j                  |       |S )	z4
        It can store logs to a local file.
        c                 J    j                         }j                  d|       y )Ns   Log opened.)
getContentassertIn)r"  
logContentlogPathr0   s     r*   cb_check_logz<CmdLineClientTests.test_runWithLogFile.<locals>.cb_check_log  s     ++-JMM.*5r)   r   z--logz	--logfilez--host-key-algorithmszssh-rsa)r5  r   rd  r   )r   r   mktempr   rT   r   r   r   )r0   rn  rZ   rm  s   `  @r*   test_runWithLogFilez&CmdLineClientTests.test_runWithLogFile  s{    
	6 ##DKKM2LL(+-'  

 	
d&&5	l#r)   c                 t    | j                  dt                     }|j                  | j                  d       |S )zH
        Do not use --host-key-algorithms flag on command line.
        r   )r5  r   r   r   rY   s     r*   %test_runWithNoHostAlgorithmsSpecifiedz8CmdLineClientTests.test_runWithNoHostAlgorithmsSpecified  s;     LL(2I2K  
 	
d&&5r)   )r   N)
r%   r&   r'   r2   r   platformTyper=   r   rp  rr  r(   r)   r*   r\  r\    s,     w&2# J6	r)   r\  )conch)Sr   r   r<  r   	itertoolsr   zope.interfacer   twisted.conch.errorr   twisted.conch.test.keydatar   r   r   r	   twisted.conch.test.test_sshr   twisted.credr   twisted.internetr   r   r   twisted.internet.errorr   twisted.internet.taskr   twisted.internet.utilsr   twisted.pythonr   r   r   twisted.python.filepathr   twisted.python.procutilsr   twisted.python.reflectr   twisted.test.testutilsr   r   twisted.trial.unittestr   r   r   r   ImportErrorr   twisted.conch.avatarr    twisted.conch.ssh.sessionr!   r"   r#   twisted.conch.interfacestwisted.conch.scripts.conch_StdioInteractingSessionr6   er   r<   r,   r4   r   r?   FactoryrR   ProcessProtocolrT   rn   ry   r   r   r   r   r  r  r'  r8  rV  rZ  r\  r(   r)   r*   <module>r     s  
 
   
  & *  7  5 5 7 - 2 1 1 , * 0 < 5	 ^,.LL1 7R 7" "$-8 -(
,8 
,("" (.h66 (.VI2!9!9 I2X>h// ><4M. M.`/+ /l XA) A AH: :+ 2@& @&FY
35G Y
x?4F &o/A8 Q( QI  		"  
"!fG	
s*   G  8G  G	G	G'G""G'