o
    ¯bÙ  ã                   @   sX   d Z ddlZeeddƒƒeeejdƒƒ ZeeddƒƒZG dd„ dƒZG dd	„ d	ƒZ	dS )
zF
Helpers for URI and method injection tests.

@see: U{CVE-2019-12387}
é    Né€   Úasciié   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚMethodInjectionTestsMixina9  
    A mixin that runs HTTP method injection tests.  Define
    L{MethodInjectionTestsMixin.attemptRequestWithMaliciousMethod} in
    a L{twisted.trial.unittest.SynchronousTestCase} subclass to test
    how HTTP client code behaves when presented with malicious HTTP
    methods.

    @see: U{CVE-2019-12387}
    c                 C   ó   t ƒ ‚)z÷
        Attempt to send a request with the given method.  This should
        synchronously raise a L{ValueError} if either is invalid.

        @param method: the method (e.g. C{GET })

        @param uri: the URI

        @type method:
        ©ÚNotImplementedError©ÚselfÚmethod© r   úC/usr/lib/python3/dist-packages/twisted/web/test/injectionhelpers.pyÚ!attemptRequestWithMaliciousMethod   s   z;MethodInjectionTestsMixin.attemptRequestWithMaliciousMethodc                 C   óN   |   t¡�}d}|  |¡ W d  ƒ n1 sw   Y  |  t|jƒd¡ dS )zƒ
        Issuing a request with a method that contains a carriage
        return and line feed fails with a L{ValueError}.
        s   GET
X-Injected-Header: valueNú^Invalid method)ÚassertRaisesÚ
ValueErrorr   ÚassertRegexÚstrÚ	exception)r
   Úcmr   r   r   r   Útest_methodWithCLRFRejected(   ó
   þz5MethodInjectionTestsMixin.test_methodWithCLRFRejectedc              	   C   ód   t D ]-}dt|gƒf }|  t¡�}|  |¡ W d  ƒ n1 s!w   Y  |  t|jƒd¡ qdS )z€
        Issuing a request with a method that contains unprintable
        ASCII characters fails with a L{ValueError}.
        ó   GET%sNr   )ÚUNPRINTABLE_ASCIIÚ	bytearrayr   r   r   r   r   r   ©r
   Úcr   r   r   r   r   Ú'test_methodWithUnprintableASCIIRejected2   ó   ÿüzAMethodInjectionTestsMixin.test_methodWithUnprintableASCIIRejectedc              	   C   r   )zx
        Issuing a request with a method that contains non-ASCII
        characters fails with a L{ValueError}.
        r   Nr   )ÚNONASCIIr   r   r   r   r   r   r   r   r   r   r   Útest_methodWithNonASCIIRejected=   r    z9MethodInjectionTestsMixin.test_methodWithNonASCIIRejectedN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r"   r   r   r   r   r      s    

r   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚURIInjectionTestsMixina  
    A mixin that runs HTTP URI injection tests.  Define
    L{MethodInjectionTestsMixin.attemptRequestWithMaliciousURI} in a
    L{twisted.trial.unittest.SynchronousTestCase} subclass to test how
    HTTP client code behaves when presented with malicious HTTP
    URIs.
    c                 C   r   )zÃ
        Attempt to send a request with the given URI.  This should
        synchronously raise a L{ValueError} if either is invalid.

        @param uri: the URI.

        @type method:
        r   r	   r   r   r   ÚattemptRequestWithMaliciousURIR   s   	z5URIInjectionTestsMixin.attemptRequestWithMaliciousURIc                 C   r   )z†
        Issuing a request with a URI whose host contains a carriage
        return and line feed fails with a L{ValueError}.
        s   http://twisted
.invalid/pathNú^Invalid URI©r   r   r(   r   r   r   ©r
   r   Úurir   r   r   Útest_hostWithCRLFRejected]   r   z0URIInjectionTestsMixin.test_hostWithCRLFRejectedc              	   C   r   )zƒ
        Issuing a request with a URI whose host contains unprintable
        ASCII characters fails with a L{ValueError}.
        ó   http://twisted%s.invalid/OKNr)   ©r   r   r   r   r(   r   r   r   ©r
   r   r,   r   r   r   r   Ú)test_hostWithWithUnprintableASCIIRejectedg   r    z@URIInjectionTestsMixin.test_hostWithWithUnprintableASCIIRejectedc              	   C   r   )z{
        Issuing a request with a URI whose host contains non-ASCII
        characters fails with a L{ValueError}.
        r.   Nr)   ©r!   r   r   r   r(   r   r   r   r0   r   r   r   Útest_hostWithNonASCIIRejectedr   r    z4URIInjectionTestsMixin.test_hostWithNonASCIIRejectedc                 C   r   )z†
        Issuing a request with a URI whose path contains a carriage
        return and line feed fails with a L{ValueError}.
        s   http://twisted.invalid/
pathNr)   r*   r+   r   r   r   Útest_pathWithCRLFRejected}   r   z0URIInjectionTestsMixin.test_pathWithCRLFRejectedc              	   C   r   )zƒ
        Issuing a request with a URI whose path contains unprintable
        ASCII characters fails with a L{ValueError}.
        ó   http://twisted.invalid/OK%sNr)   r/   r0   r   r   r   Ú)test_pathWithWithUnprintableASCIIRejected‡   r    z@URIInjectionTestsMixin.test_pathWithWithUnprintableASCIIRejectedc              	   C   r   )z{
        Issuing a request with a URI whose path contains non-ASCII
        characters fails with a L{ValueError}.
        r5   Nr)   r2   r0   r   r   r   Útest_pathWithNonASCIIRejected’   r    z4URIInjectionTestsMixin.test_pathWithNonASCIIRejectedN)r#   r$   r%   r&   r(   r-   r1   r3   r4   r6   r7   r   r   r   r   r'   I   s    

r'   )
r&   ÚstringÚ	frozensetÚranger   Ú	printabler   r!   r   r'   r   r   r   r   Ú<module>   s    
ÿ9