
    }8'h^                        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 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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      Z,e,rd dl-m.Z. d dl/m0Z0m1Z1m2Z2 nd dl3m0Z0  G d d      Z.	 d dl4m1Z5 e5Z6 G d d      Z: G d de(      Z; G d dejx                        Z= G d d ej|                        Z? G d! d"ej                        ZA G d# d$ej                        ZB G d% d&ejx                        ZCd<d'ZD G d( d)      ZE G d* d+eE      ZF ee0       G d, d-e.             ZG G d. d/      ZH G d0 d1eE      ZI G d2 d3      ZJ G d4 d5eEeJe(      ZK G d6 d7eFeJe(      ZL G d8 d9eIeJe(      ZM G d: d;eFe(      ZNy# e+$ r Y <w xY w# e+$ rZ7dZ6 e8e7      Z9[7Y dZ7[7"dZ7[7ww xY w)=    N)count)implementer)
ConchError)privateRSA_opensshpublicRSA_opensshConchTestRealm)portal)deferprotocolreactor)ProcessExitedAlready)LoopingCall)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__     Y/var/www/html/trade_iq/venv/lib/python3.12/site-packages/twisted/conch/test/test_conch.pyr   r   +   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.loseWriteConnectionD   s     "r&   N)r"   r#   r$   __doc__r+   r.   r%   r&   r'   r)   r)   9   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+   )r-   r4   channels      r'   test_eofReceivedz-StdioInteractingSessionTests.test_eofReceivedS   s8    
 )+++,r&   )r"   r#   r$   r/   r3   _reasonskipr8   r%   r&   r'   r1   r1   K   s     &	-r&   r1   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.connectionMade`       &'r&   c                 .    t        j                  d       y )NzECHO CONNECTION DONEr>   r-   reasons     r'   connectionLostzEcho.connectionLostc   rA   r&   c                 x    | j                   j                  |       d|v r| j                   j                          y y )N   
)	transportwriteloseConnectionr-   datas     r'   dataReceivedzEcho.dataReceivedf   s0    T"D=NN))+ r&   N)r"   r#   r$   r@   rE   rM   r%   r&   r'   r<   r<   _   s    ((,r&   r<   c                       e Zd ZeZy)EchoFactoryN)r"   r#   r$   r<   r   r%   r&   r'   rO   rO   l   s    Hr&   rO   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r-   ds     r'   _getDeferredz$ConchTestOpenSSHProcess._getDeferred}       ==$4=r&   c                 .    | xj                   |z  c_         y rS   )bufrK   s     r'   outReceivedz#ConchTestOpenSSHProcess.outReceived   s    Dr&   c                 .    | xj                   |z  c_         y rS   )problemsrK   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   
rG   N)valueexitCoderX   errbackr   formatr^   decoder[   replacecallback)r-   rD   r[   s      r'   processEndedz$ConchTestOpenSSHProcess.processEnded   s     <<  A%''299--,,Y7 ((""7E2C((-r&   )r"   r#   r$   r/   rU   r[   r^   rX   r\   r_   ri   r%   r&   r'   rQ   rQ   p   s,     H
CH.r&   rQ   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bufferrL   )r-   rm   rL   s      r'   __init__z#ConchTestForwardingProcess.__init__   s     		r&   c                 .    | j                   d c}| _         |S rS   rT   rV   s     r'   rX   z'ConchTestForwardingProcess._getDeferred   rY   r&   c                 $    | j                          y rS   )_connectr,   s    r'   r@   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   ConchTestForwardingPortrL   
connectTCPrm   
addErrback
_ebConnect)r-   ccrW   s      r'   rr   z#ConchTestForwardingProcess._connect   sH     ##G-DdDIIVMM+tyy1	T__%r&   c                 D    t        j                  d| j                         y )Ng?)r   	callLaterrr   )r-   fs     r'   ry   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)rn   rH   rI   rJ   r   r|   
_reallyDie)r-   rn   s     r'   forwardingPortDisconnectedz5ConchTestForwardingProcess.forwardingPortDisconnected   sA     W%%%'!T__-r&   c                 Z    	 | j                   j                  d       y # t        $ r Y y w xY w)NKILL)rH   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)rX   rh   rn   rC   s     r'   ri   z'ConchTestForwardingProcess.processEnded   s    
 	$$T[[1r&   )r"   r#   r$   r/   rU   ro   rX   r@   rr   ry   r   r   ri   r%   r&   r'   rk   rk      s6    
 H
.	.2r&   rk   c                   (    e Zd ZdZd Zd Zd Zd Zy)rv   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   rL   )r-   r   rL   s      r'   ro   z ConchTestForwardingPort.__init__   s     !	r&   c                 \    d| _         | j                  j                  | j                         y )Nr&   )rn   rH   rI   rL   r,   s    r'   r@   z&ConchTestForwardingPort.connectionMade   s    TYY'r&   c                 .    | xj                   |z  c_         y rS   )rn   rK   s     r'   rM   z$ConchTestForwardingPort.dataReceived   s    tr&   c                 N    | j                   j                  | j                         y rS   )r   r   rn   rC   s     r'   rE   z&ConchTestForwardingPort.connectionLost  s    00=r&   N)r"   r#   r$   r/   ro   r@   rM   rE   r%   r&   r'   rv   rv      s    	(>r&   rv   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        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   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)	N)rsa_testrsa_test.pubkh_testr   wbr   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openrI   r   r   chmodr   getPermissionsgroupreadotherr   )r-   r}   permissionss      r'   _createFilesz"ConchServerSetupMixin._createFiles'  s   8 	Aww~~a 		!	 *d# 	(qGG&'	(.$' 	'1GG%&	'
U#z*99;!![%6%6%;%;* 
 )T" 	7aGGM$556	7 	7	( 	(	' 	'	7 	7s$   	D%3D1D=%D.1D:=Ec                     t        j                          }|j                  d       |j                         d   }|j                          |S )N) r      )socketbindgetsocknameclose)r-   srm   s      r'   _getFreePortz"ConchServerSetupMixin._getFreePort:  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   )r-   realmpfactorys       r'   _makeConchFactoryz'ConchServerSetupMixin._makeConchFactoryA  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   rt   )	interfacez::1)r   r   conchFactoryexpectedLoseConnectionr   	listenTCPconchServerrO   
echoServergetHostrm   echoPortr   echoServerV6
echoPortV6r,   s    r'   setUpzConchServerSetupMixin.setUpM  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donerH   rJ   AttributeErrorr   maybeDeferredr   stopListeningr   r   r   r   gatherResults)r-   	deferredss     r'   tearDownzConchServerSetupMixin.tearDownZ  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    /+ +7&
?.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
executerQ   addCallbackassertEqualrV   s     r'   	test_execzForwardingMixin.test_execx  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   rk   r   r   r   r   r-   	localPortprocessrW   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$   r/   r   r   r   r%   r&   r'   r   r   j  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   ro   r   channelLookupr,   s    r'   ro   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sendRequestrJ   r   rI   )counterilinecallrH   s      r'   rI   z$RekeyAvatar.openShell.<locals>.write  sx    WABw		!!&&22%%~7J ((*%,{{7+%r&   g{Gz?N)r   ProtocolmakeConnectionr    r   r   r   )r-   rH   r   rI   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 rS   r%   r,   s    r'   r5   zRekeyAvatar.eofReceived      r&   c                      y rS   r%   )r-   r   commands      r'   execCommandzRekeyAvatar.execCommand  r  r&   c                      y rS   r%   )r-   term
windowSizemodess       r'   getPtyzRekeyAvatar.getPty  r  r&   c                      y rS   r%   )r-   newWindowSizes     r'   windowChangedzRekeyAvatar.windowChanged  r  r&   N)r"   r#   r$   r/   ro   r   r   r5   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 rS   r%   r%   r&   r'   <lambda>z*RekeyRealm.requestAvatar.<locals>.<lambda>  r   r&   )r   )r-   avatarIDmind
interfacess       r'   requestAvatarzRekeyRealm.requestAvatar  s    !}km\99r&   N)r"   r#   r$   r/   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   expectedResultr-   s      r'   finishedz2RekeyTestsMixin.test_clientRekey.<locals>.finished  sS    !YYU2Y'Ot(;'OPSWWN+227;NV^4 (Ps   A)rQ   r   r   )r-   r   rW   r  s   `   r'   test_clientRekeyz RekeyTestsMixin.test_clientRekey  s8    
 *+LLW&89	5
 	
hr&   N)r"   r#   r$   r/   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                 h   t        j                         |_        d|z   dz   |z   }| j                  j	                         j
                  }||z  j                         }g }|D ]"  }|j                  |j                  d             $ t        j                  |t        d      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}
        zssh -2 -l testuser -p %i -F /dev/null -oIdentitiesOnly=yes -oUserKnownHostsFile=kh_test -oPasswordAuthentication=no -oHostKeyAlgorithms=ssh-rsa -a -i rsa_test  127.0.0.1 r   r#  r   )r   DeferredrU   r   r   rm   splitr   r   r   spawnProcessr   )	r-   remoteCommandr   r   cmdlinerm   cmdsencodedCmdscmds	            r'   r   zOpenSSHClientMixin.execute  s      !>>+    	  '')..$%%' 	4Cszz'23	4WeEl1o{C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   rf   r'  BaseExceptionr   r   rQ   r   r   )r-   keyExchangeAlgokexAlgorithmsoutputrW   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r:  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-nistp384r<  r,   s    r'   test_ECDHSHA384z'OpenSSHKeyExchangeTests.test_ECDHSHA384e  r>  r&   c                 $    | j                  d      S )zb
        The ecdh-sha2-nistp521 key exchange algorithm is compatible with
        OpenSSH
        zecdh-sha2-nistp521r<  r,   s    r'   test_ECDHSHA521z'OpenSSHKeyExchangeTests.test_ECDHSHA521l  r>  r&   c                 $    | j                  d      S )zl
        The diffie-hellman-group14-sha1 key exchange algorithm is compatible
        with OpenSSH.
        zdiffie-hellman-group14-sha1r<  r,   s    r'   test_DH_GROUP14z'OpenSSHKeyExchangeTests.test_DH_GROUP14s  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-sha1r<  r,   s    r'   test_DH_GROUP_EXCHANGE_SHA1z3OpenSSHKeyExchangeTests.test_DH_GROUP_EXCHANGE_SHA1z  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-sha256r<  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   r:  r,   s    r'   test_unsupported_algorithmz2OpenSSHKeyExchangeTests.test_unsupported_algorithm  s     
 	d88:Q	
r&   N)r"   r#   r$   r/   r:  r=  r@  rB  rD  rF  rH  rK  r%   r&   r'   r/  r/  8  s5    
;@HHHQX

r&   r/  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   rk   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$   r/   r   rO  r%   r&   r'   rM  rM    s     
 
r&   rM  c                       e Zd ZdZy)OpenSSHClientRekeyTestszE
    Rekeying tests run against the OpenSSL command line client.
    N)r"   r#   r$   r/   r%   r&   r'   rQ  rQ    s    r&   rQ  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 rsa_test -v r%  
PYTHONPATHr   )env)r   r&  rU   r   r   rm   re   r   r'  r   environcopypathsepr  r   r   r   r   r   r   r   r(  r   )r-   r)  r   r   	conchArgsrm   r-  r+  rW  r,  
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logPathr-   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)r)  r   r[  r   )r   r   mktempr   rQ   r   r   r   )r-   re  rW   rd  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   )r)  r   r   r   rV   s     r'   %test_runWithNoHostAlgorithmsSpecifiedz8CmdLineClientTests.test_runWithNoHostAlgorithmsSpecified  s;     LL(2I2K  
 	
d&&5r&   )r   N)
r"   r#   r$   r/   r   platformTyper:   r   rg  ri  r%   r&   r'   rS  rS    s,     w&2# J6	r&   rS  )conch)Or   r   r3  r   	itertoolsr   zope.interfacer   twisted.conch.errorr   twisted.conch.test.keydatar   r   twisted.conch.test.test_sshr	   twisted.credr
   twisted.internetr   r   r   twisted.internet.errorr   twisted.internet.taskr   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_StdioInteractingSessionr3   er   r9   r)   r1   r   r<   FactoryrO   ProcessProtocolrQ   rk   rv   r   r   r   r   r  r  r"  r/  rM  rQ  rS  r%   r&   r'   <module>r     s  
 
   
  & * L 6  5 5 7 - 1 1 , * 0 < 5	 ^,.LL1 7R 7" "$-8 -(
,8 
,("" (.h66 (.VI2!9!9 I2X>h// ><4H. H.V/+ /l XA) A AH: :+ 2.  . bY
35G Y
x?4F &o/A8 Q( Q[  		"  
"!fG	
s*   :F6 .G 6F?>F?GGG