o
    >h)2                  	   @   s$  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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l.m/Z/m0Z0m1Z1 G dd dZ2G dd dZ3eeG dd dZ4G dd dee3Z5G dd dZ6G dd de2eeZ7G dd  d ee3Z8G d!d" d"e2ee3ee6Z9G d#d$ d$e2e3e6e!e"eZ:e; <e9=  e; <e7=  e; <e: =  G d%d& d&ee e3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)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+   ~/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/twisted/internet/test/test_tls.pyr"   2   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,   getServerContextH   s
   
z'ContextGeneratingMixin.getServerContextc                 C   s   t  S N)r   r2   r+   r+   r,   getClientContextR   s   z'ContextGeneratingMixin.getClientContext)r$   r%   r&   twistedr   r   __file__siblingchildr.   r5   r8   r+   r+   r+   r,   r-   @   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 r6   )wrappedcontextFactory)r2   r?   r@   r+   r+   r,   __init__b   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 r6   )	transportstartTLSr@   )orig)protocolr2   r+   r,   connectionMades   s   
z\StartTLSClientEndpoint.connect.<locals>.WrapperFactory.buildProtocol.<locals>.connectionMade)buildProtocolrF   )wrapperSelfaddrrF   factoryr2   )rE   r,   rG   p   s   
zDStartTLSClientEndpoint.connect.<locals>.WrapperFactory.buildProtocolN)r$   r%   r&   rG   r+   rJ   r+   r,   WrapperFactoryo   s    rL   )r   r?   connect)r2   rK   rL   r+   rJ   r,   rM   f   s   	zStartTLSClientEndpoint.connectN)r$   r%   r&   __doc__rA   rM   r+   r+   r+   r,   r>   V   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
   r5   r2   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   r2   rS   serverAddressr+   r+   r,   client   s   zStartTLSClientCreator.clientNr$   r%   r&   rN   rT   rY   r+   r+   r+   r,   rO   }   s    rO   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)r2   useItrS   excr+   r+   r,   _testBadContext   s   z$BadContextTestsMixin._testBadContextN)r$   r%   r&   rN   rd   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&   rN   rO   	endpointsr+   r+   r+   r,   re      s    
re   c                   @   r=   )
SSLCreatorz
    Create SSL endpoints.
    c                 C   rP   )zQ
        Create an SSL server endpoint on a TCP/IP-stack allocated port.
        r   rQ   rR   r+   r+   r,   rT      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}
        rU   )r	   rV   r   rW   r+   r+   r,   rY      s   zSSLCreator.clientNrZ   r+   r+   r+   r,   rg      s    rg   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 )NrU   i  )
connectSSLr   rS   r@   r+   r+   r,   rb      s   
z2SSLClientTestsMixin.test_badContext.<locals>.useItNrd   r2   rb   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   
providedByrB   rK   finishederrbackr   rC   contextwrite)r2   rq   r+   r+   r,   rF      s   z`SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.ShortProtocol.connectionMadec                 S   s   | j d | j   d S )N   y)rB   rt   loseConnection)r2   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 r6   )rK   rq   callback)r2   reasonrq   r+   r+   r,   connectionLost  s
   z`SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.ShortProtocol.connectionLostN)r$   r%   r&   rF   rx   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   rU   )	interfacec                    s      S r6   )stop)ign)rS   r+   r,   <lambda>/  s    zLSSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.<lambda>r~   N)r   r\   r   r   rq   rE   r5   rs   r   r8   methodr   addCallback	listenTCP
addCleanupstopListening
connectTCPgetHosthostrV   
disconnect
runReactortrapr   )r2   r|   serverFactoryclientFactoryrq   r   rV   	connectorr+   )r   rS   r,   &test_disconnectAfterWriteAfterStartTLS   s6   	!



z:SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLSN)r$   r%   r&   rN   rg   rf   rn   r   r+   r+   r+   r,   rh      s
    rh   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   )	listenSSLr5   )r2   rS   rK   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   rV   )r2   rV   rK   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   )r2   rV   r+   r+   r,   getExpectedConnectionLostLogMsgM  r   z3TLSPortTestsBuilder.getExpectedConnectionLostLogMsgc                 C   ri   )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   rk   r+   r+   r,   rb   Z  s   z2TLSPortTestsBuilder.test_badContext.<locals>.useItNrl   rm   r+   r+   r,   rn   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
        )rj   LISTENER_HOSTrV   r8   )r2   rS   addressrK   r+   r+   r,   connectToListener_  s   z%TLSPortTestsBuilder.connectToListenerN)	r$   r%   r&   rN   r   r   r   rn   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S )AbortSSLConnectionTestsz-
    C{abortConnection} tests using SSL.
    c                 C   s   t d u rtdd S )NzOpenSSL not available.)r   r   r7   r+   r+   r,   setUp  s   zAbortSSLConnectionTests.setUpN)	r$   r%   r&   rN   r   r#   rg   rf   r   r+   r+   r+   r,   r   ~  s
    r   )?rN   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.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>   rO   r[   re   rg   rh   r   globalsupdatemakeTestCaseClassesr   r+   r+   r+   r,   <module>   sf   &	

jD
