o
    Òó·i)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   Z	isWindowsÚmsgZskippedReactors© r)   r)   údC:\Users\psant\Downloads\PAF backend\school\venv\Lib\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.
        N)Ú_pemZ
getContentr!   Úloadr    r   Úoptions)ÚselfZpemÚcertr)   r)   r*   ÚgetServerContextH   s
   
ÿz'ContextGeneratingMixin.getServerContextc                 C   s   t ƒ S ©N)r   ©r/   r)   r)   r*   ÚgetClientContextR   s   z'ContextGeneratingMixin.getClientContext)r$   r%   r&   Ztwistedr   r   Ú__file__ZsiblingÚchildr,   r1   r4   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 r2   )ÚwrappedÚcontextFactory)r/   r9   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 r2   )Ú	transportÚstartTLSr:   )Úorig)Úprotocolr/   r)   r*   ÚconnectionMades   s   
z\StartTLSClientEndpoint.connect.<locals>.WrapperFactory.buildProtocol.<locals>.connectionMade)ÚbuildProtocolr@   )ZwrapperSelfÚaddrr@   ©Úfactoryr/   )r?   r*   rA   p   s   
zDStartTLSClientEndpoint.connect.<locals>.WrapperFactory.buildProtocolN)r$   r%   r&   rA   r)   rC   r)   r*   ÚWrapperFactoryo   s    rE   N)r   r9   Úconnect)r/   rD   rE   r)   rC   r*   rF   f   s   	zStartTLSClientEndpoint.connectN)r$   r%   r&   Ú__doc__r;   rF   r)   r)   r)   r*   r8   V   s    
r8   c                   @   r7   )Ú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   N©r
   r1   ©r/   Ú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.1N)r8   r   Úportr   ©r/   rL   ZserverAddressr)   r)   r*   Úclient‹   s   þzStartTLSClientCreator.clientN©r$   r%   r&   rG   rM   rQ   r)   r)   r)   r*   rH   }   s    rH   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)r/   ÚuseItrL   Úexcr)   r)   r*   Ú_testBadContext›   s   z$BadContextTestsMixin._testBadContextN)r$   r%   r&   rG   r\   r)   r)   r)   r*   rS   •   s    rS   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&   rG   rH   Ú	endpointsr)   r)   r)   r*   r]   «   s    
r]   c                   @   r7   )Ú
SSLCreatorz
    Create SSL endpoints.
    c                 C   rI   )zQ
        Create an SSL server endpoint on a TCP/IP-stack allocated port.
        r   NrJ   rK   r)   r)   r*   rM   ¹   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}
        rN   N)r	   rO   r   rP   r)   r)   r*   rQ   ¿   s   ÿzSSLCreator.clientNrR   r)   r)   r)   r*   r_   ´   s    r_   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 )NrN   iÒ  )Ú
connectSSLr   ©rL   r:   r)   r)   r*   rZ   ß   s   
ÿz2SSLClientTestsMixin.test_badContext.<locals>.useItN©r\   ©r/   rZ   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   Z
providedByr<   rD   ÚfinishedZerrbackr   r=   ÚcontextÚwrite)r/   rh   r)   r)   r*   r@   ð   s   z`SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.ShortProtocol.connectionMadec                 S   s   | j  d¡ | j  ¡  d S )Nó   y)r<   rj   ZloseConnection)r/   Ú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 r2   )rD   rh   Úcallback)r/   Úreasonrh   r)   r)   r*   ÚconnectionLost  s
   þz`SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.ShortProtocol.connectionLostN)r$   r%   r&   r@   rm   rp   r)   r)   r)   r*   ÚShortProtocolï   s    
rq   T)ZconsumeErrorsc                    s"   ˆ   | d d | d d g¡ d S )Nr   é   )Úextend)Úresults)ÚlostConnectionResultsr)   r*   Ú
cbFinished"  s   "zNSSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.cbFinishedr   rN   )Z	interfacec                    s   ˆ   ¡ S r2   )Ústop)Zign)rL   r)   r*   Ú<lambda>/  s    zLSSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLS.<locals>.<lambda>rr   N)r   rT   r   r   rh   r?   r1   ri   r   r4   Úmethodr   ZaddCallbackZ	listenTCPZ
addCleanupÚstopListeningZ
connectTCPÚgetHostÚhostrO   Z
disconnectZ
runReactorZtrapr   )r/   rq   ZserverFactoryZclientFactoryrh   rv   rO   Z	connectorr)   )ru   rL   r*   Ú&test_disconnectAfterWriteAfterStartTLSæ   s6   	!

ÿ
ÿ
z:SSLClientTestsMixin.test_disconnectAfterWriteAfterStartTLSN)r$   r%   r&   rG   r_   r^   rf   r}   r)   r)   r)   r*   r`   Ë   s
    r`   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   N)Ú	listenSSLr1   )r/   rL   rD   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 %dN©r{   rO   )r/   rO   rD   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)Nr‚   )r/   rO   r)   r)   r*   ÚgetExpectedConnectionLostLogMsgM  r�   z3TLSPortTestsBuilder.getExpectedConnectionLostLogMsgc                 C   ra   )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   rc   r)   r)   r*   rZ   Z  s   z2TLSPortTestsBuilder.test_badContext.<locals>.useItNrd   re   r)   r)   r*   rf   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
        N)rb   ZLISTENER_HOSTrO   r4   )r/   rL   ÚaddressrD   r)   r)   r*   ÚconnectToListener_  s   üz%TLSPortTestsBuilder.connectToListenerN)	r$   r%   r&   rG   r€   rƒ   r„   rf   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   r3   r)   r)   r*   ÚsetUpˆ  s   ÿzAbortSSLConnectionTests.setUpN)	r$   r%   r&   rG   r   r#   r_   r^   rˆ   r)   r)   r)   r*   r‡   ~  s
    r‡   )?rG   Útypingr   r   r   Zzope.interfacer   r   Ztwisted.internet.deferr   r   Ztwisted.internet.endpointsr	   r
   r   Ztwisted.internet.errorr   Ztwisted.internet.interfacesr   r   r   Ztwisted.internet.protocolr   r   r   Z&twisted.internet.test.connectionmixinsr   r   r   Z#twisted.internet.test.reactormixinsr   Ztwisted.internet.test.test_tcpr   r   r   Ztwisted.python.compatr   Ztwisted.python.filepathr   Ztwisted.python.runtimer   Ztwisted.trial.unittestr   ZOpenSSL.cryptor   ÚImportErrorZtwisted.internet.sslr   r    r!   r"   r+   r8   rH   rS   r]   r_   r`   r~   ÚglobalsÚupdateZmakeTestCaseClassesr‡   r)   r)   r)   r*   Ú<module>   sf   ÿ&	
û
júD
ÿ