o
    b%4                  	   @   s0  d Z ddlmZmZmZ ddlmZmZ ddlm	Z	m
Z
 ddlmZmZmZ ddlmZ ddlmZmZmZ ddlmZmZmZ dd	lmZ dd
lmZmZmZ ddlm Z  ddl!m"Z"m#Z#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, zddl-m.Z. W n e/y   dZ.Y nw ddl0m1Z1m2Z2m3Z3 G dd dZ4G dd dZ5eeG dd dZ6G dd dee5Z7G dd dZ8G dd de4e eZ9G d d! d!ee5Z:G d"d# d#e4e e5ee8Z;G d$d% d%e4e5e8e#e$e Z<e= >e;?  e= >e9?  e= >e< ?  G d&d' d'e e"e5Z@e= >e@?  dS )(z0
Tests for implementations of L{ITLSTransport}.
    )OptionalSequenceType)	Interfaceimplementer)DeferredDeferredList)SSL4ClientEndpointSSL4ServerEndpointTCP4ClientEndpoint)ConnectionClosed)IReactorSSLIStreamClientEndpointITLSTransport)ClientFactoryProtocolServerFactory)
Cooperator)BrokenContextFactoryConnectionTestsMixinEndpointCreator)ReactorBuilder)AbortConnectionMixinConnectToTCPListenerMixinStreamTransportTestsMixin)networkString)FilePath)platform)SkipTest)FILETYPE_PEMN)ClientContextFactoryKeyPairPrivateCertificatec                   @   sB   e Zd ZU egZeeee   e	d< e
 rdZeedZdS dS )TLSMixinrequiredInterfaceszcFor some reason, these reactors don't deal with SSL disconnection correctly on Windows.  See #3371.)z*twisted.internet.glib2reactor.Glib2Reactorz(twisted.internet.gtk2reactor.Gtk2ReactorN)__name__
__module____qualname__r   r$   r   r   r   r   __annotations__r   	isWindowsmsgskippedReactors r,   r,   @/usr/lib/python3/dist-packages/twisted/internet/test/test_tls.pyr#   3   s   
 
r#   c                   @   s@   e Zd ZddlZeeejddZ	[dd Z
dd ZdS )	ContextGeneratingMixinr   Ns   tests
   server.pemc                 C   s(   | j  }t|t|tt}| S )zM
        Return a new SSL context suitable for use in a test server.
        )_pem
getContentr"   loadr!   r   options)selfpemcertr,   r,   r-   getServerContextI   s
   
z'ContextGeneratingMixin.getServerContextc                 C   s   t  S N)r    r3   r,   r,   r-   getClientContextS   s   z'ContextGeneratingMixin.getClientContext)r%   r&   r'   twistedr   r   __file__siblingchildr/   r6   r9   r,   r,   r,   r-   r.   A   s    
r.   c                   @       e Zd ZdZdd Zdd ZdS )StartTLSClientEndpointa!  
    An endpoint which wraps another one and adds a TLS layer immediately when
    connections are set up.

    @ivar wrapped: A L{IStreamClientEndpoint} provider which will be used to
        really set up connections.

    @ivar contextFactory: A L{ContextFactory} to use to do TLS.
    c                 C   s   || _ || _d S r7   )wrappedcontextFactory)r3   r@   rA   r,   r,   r-   __init__c   s   
zStartTLSClientEndpoint.__init__c                    s$   G  fdddt }j| S )z
        Establish a connection using a protocol build by C{factory} and
        immediately start TLS on it.  Return a L{Deferred} which fires with the
        protocol instance.
        c                       s   e Zd Z fddZdS )z6StartTLSClientEndpoint.connect.<locals>.WrapperFactoryc                    s(    |  jf fdd	}| _ S )Nc                    s    j j |   d S r7   )	transportstartTLSrA   )orig)protocolr3   r,   r-   connectionMades   s   
z\StartTLSClientEndpoint.connect.<locals>.WrapperFactory.buildProtocol.<locals>.connectionMade)buildProtocolrG   )wrapperSelfaddrrG   factoryr3   )rF   r-   rH   p   s   
zDStartTLSClientEndpoint.connect.<locals>.WrapperFactory.buildProtocolN)r%   r&   r'   rH   r,   rK   r,   r-   WrapperFactoryo   s    rM   )r   r@   connect)r3   rL   rM   r,   rK   r-   rN   g   s   zStartTLSClientEndpoint.connectN)r%   r&   r'   __doc__rB   rN   r,   r,   r,   r-   r?   W   s    
r?   c                   @   r>   )StartTLSClientCreatorz{
    Create L{ITLSTransport.startTLS} endpoint for the client, and normal SSL
    for server just because it's easier.
    c                 C      t |d|  S )z
        Construct an SSL server endpoint.  This should be constructing a TCP
        server endpoint which immediately calls C{startTLS} instead, but that
        is hard.
        r   r
   r6   r3   reactorr,   r,   r-   server   s   zStartTLSClientCreator.serverc                 C   s   t t|d|jt S )zS
        Construct a TCP client endpoint wrapped to immediately start TLS.
        	127.0.0.1)r?   r   portr    r3   rT   serverAddressr,   r,   r-   client   s   zStartTLSClientCreator.clientNr%   r&   r'   rO   rU   rZ   r,   r,   r,   r-   rP   }   s    rP   c                   @   s   e Zd ZdZdd ZdS )BadContextTestsMixinz
    Mixin for L{ReactorBuilder} subclasses which defines a helper for testing
    the handling of broken context factories.
    c                 C   s0   |   }| t||t }| tjt| dS )a  
        Assert that the exception raised by a broken context factory's
        C{getContext} method is raised by some reactor method.  If it is not, an
        exception will be raised to fail the test.

        @param useIt: A two-argument callable which will be called with a
            reactor and a broken context factory and which is expected to raise
            the same exception as the broken context factory's C{getContext}
            method.
        N)buildReactorassertRaises
ValueErrorr   assertEqualmessagestr)r3   useItrT   excr,   r,   r-   _testBadContext   s   z$BadContextTestsMixin._testBadContextN)r%   r&   r'   rO   re   r,   r,   r,   r-   r\      s    r\   c                   @   s   e Zd ZdZe ZdS )StartTLSClientTestsMixinz
    Tests for TLS connections established using L{ITLSTransport.startTLS} (as
    opposed to L{IReactorSSL.connectSSL} or L{IReactorSSL.listenSSL}).
    N)r%   r&   r'   rO   rP   	endpointsr,   r,   r,   r-   rf      s    
rf   c                   @   r>   )
SSLCreatorz
    Create SSL endpoints.
    c                 C   rQ   )zQ
        Create an SSL server endpoint on a TCP/IP-stack allocated port.
        r   rR   rS   r,   r,   r-   rU      s   zSSLCreator.serverc                 C   s   t |d|jt S )z
        Create an SSL client endpoint which will connect localhost on
        the port given by C{serverAddress}.

        @type serverAddress: L{IPv4Address}
        rV   )r	   rW   r    rX   r,   r,   r-   rZ      s   zSSLCreator.clientNr[   r,   r,   r,   r-   rh      s    rh   c                   @   s&   e Zd ZdZe Zdd Zdd ZdS )SSLClientTestsMixinz<
    Mixin defining tests relating to L{ITLSTransport}.
    c                 C      dd }|  | dS )z
        If the context factory passed to L{IReactorSSL.connectSSL} raises an
        exception from its C{getContext} method, that exception is raised by
        L{IReactorSSL.connectSSL}.
        c                 S   s   |  ddt |S )NrV   i  )
connectSSLr   rT   rA   r,   r,   r-   rc      s   
z2SSLClientTestsMixin.test_badContext.<locals>.useItNre   r3   rc   r,   r,   r-   test_badContext   s   z#SSLClientTestsMixin.test_badContextc                    s  G dd dt }|  t }t |_||_|  |_t }t |_||_| 	 |_|jj
|j_
g  t|j|jgdd} fdd}|| jd|dd	}| |j | j| j|}| |j |fd
d |   d t  d t dS )aO  
        L{ITCPTransport.loseConnection} ends a connection which was set up with
        L{ITLSTransport.startTLS} and which has recently been written to.  This
        is intended to verify that a socket send error masked by the TLS
        implementation doesn't prevent the connection from being reported as
        closed.
        c                   @   s$   e Zd Zdd Zdd Zdd ZdS )zQSSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.ShortProtocolc                 S   sN   t | js| jj}d | j_|td d S | j| jj | j	d d S )NzNo ITLSTransport support   x)
r   
providedByrC   rL   finishederrbackr   rD   contextwrite)r3   rr   r,   r,   r-   rG      s   z`SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.ShortProtocol.connectionMadec                 S   s   | j d | j   d S )N   y)rC   ru   loseConnection)r3   datar,   r,   r-   dataReceived   s   z^SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.ShortProtocol.dataReceivedc                 S   s*   | j j}|d urd | j _|| d S d S r7   )rL   rr   callback)r3   reasonrr   r,   r,   r-   connectionLost  s
   z`SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.ShortProtocol.connectionLostN)r%   r&   r'   rG   ry   r|   r,   r,   r,   r-   ShortProtocol   s    
r}   T)consumeErrorsc                    s"     | d d | d d g d S )Nr      )extend)results)lostConnectionResultsr,   r-   
cbFinished"  s   "zNSSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.cbFinishedr   rV   )	interfacec                    s      S r7   )stop)ignrT   r,   r-   <lambda>/  s    zLSSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.<lambda>r   N)r   r]   r   r   rr   rF   r6   rt   r   r9   methodr   addCallback	listenTCP
addCleanupstopListening
connectTCPgetHosthostrW   
disconnect
runReactortrapr   )r3   r}   serverFactoryclientFactoryrr   r   rW   	connectorr,   )r   rT   r-   &test_disconnectAfterWriteAfterStartTLS   s6   	!



z:SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLSN)r%   r&   r'   rO   rh   rg   ro   r   r,   r,   r,   r-   ri      s
    ri   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )TLSPortTestsBuilderz,
    Tests for L{IReactorSSL.listenSSL}
    c                 C   s   | d||  S )z0
        Get a TLS port from a reactor.
        r   )	listenSSLr6   )r3   rT   rL   r,   r,   r-   getListeningPortA     z$TLSPortTestsBuilder.getListeningPortc                 C   s   d||  jf S )zY
        Get the message expected to be logged when a TLS port starts listening.
        z%s (TLS) starting on %dr   rW   )r3   rW   rL   r,   r,   r-   #getExpectedStartListeningLogMessageG  r   z7TLSPortTestsBuilder.getExpectedStartListeningLogMessagec                 C   s   d|  j dS )zJ
        Get the expected connection lost message for a TLS port.
        z
(TLS Port z Closed)r   )r3   rW   r,   r,   r-   getExpectedConnectionLostLogMsgM  r   z3TLSPortTestsBuilder.getExpectedConnectionLostLogMsgc                 C   rj   )z
        If the context factory passed to L{IReactorSSL.listenSSL} raises an
        exception from its C{getContext} method, that exception is raised by
        L{IReactorSSL.listenSSL}.
        c                 S   s   |  dt |S )Nr   )r   r   rl   r,   r,   r-   rc   Z  s   z2TLSPortTestsBuilder.test_badContext.<locals>.useItNrm   rn   r,   r,   r-   ro   S  s   z#TLSPortTestsBuilder.test_badContextc                 C   s   | | j|j||  S )a  
        Connect to the given listening TLS port, assuming the
        underlying transport is TCP.

        @param reactor: The reactor under test.
        @type reactor: L{IReactorSSL}

        @param address: The listening's address.  Only the C{port}
            component is used; see
            L{ConnectToTCPListenerMixin.LISTENER_HOST}.
        @type address: L{IPv4Address} or L{IPv6Address}

        @param factory: The client factory.
        @type factory: L{ClientFactory}

        @return: The connector
        )rk   LISTENER_HOSTrW   r9   )r3   rT   addressrL   r,   r,   r-   connectToListener_  s   z%TLSPortTestsBuilder.connectToListenerN)	r%   r&   r'   rO   r   r   r   ro   r   r,   r,   r,   r-   r   5  s    r   c                   @   s,   e Zd ZdZefZe Zdd Zdd Z	dS )AbortSSLConnectionTestsz-
    C{abortConnection} tests using SSL.
    c                    s<   t |  ddlm} t fddd}| |d|j  S )Nr   )_producer_helpersc                    s     d| S )Ngh㈵>)	callLater)xr   r,   r-   r     s    z6AbortSSLConnectionTests.buildReactor.<locals>.<lambda>)	scheduler	cooperate)r   r]   twisted.internetr   r   patchr   )r3   r   
cooperatorr,   r   r-   r]     s
   
z$AbortSSLConnectionTests.buildReactorc                 C   s   t d u rtdd S )NzOpenSSL not available.)r   r   r8   r,   r,   r-   setUp  s   zAbortSSLConnectionTests.setUpN)
r%   r&   r'   rO   r   r$   rh   rg   r]   r   r,   r,   r,   r-   r   ~  s    
r   )ArO   typingr   r   r   zope.interfacer   r   twisted.internet.deferr   r   twisted.internet.endpointsr	   r
   r   twisted.internet.errorr   twisted.internet.interfacesr   r   r   twisted.internet.protocolr   r   r   twisted.internet.taskr   &twisted.internet.test.connectionmixinsr   r   r   #twisted.internet.test.reactormixinsr   twisted.internet.test.test_tcpr   r   r   twisted.python.compatr   twisted.python.filepathr   twisted.python.runtimer   twisted.trial.unittestr   OpenSSL.cryptor   ImportErrortwisted.internet.sslr    r!   r"   r#   r.   r?   rP   r\   rf   rh   ri   r   globalsupdatemakeTestCaseClassesr   r,   r,   r,   r-   <module>   sh   %	

jD
