U
    �AcjÙ  ã                   @   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   s
   t ƒ ‚dS )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:
        N©ÚNotImplementedError©ÚselfÚmethod© r   úE/tmp/pip-unpacked-wheel-nrvc_22y/twisted/web/test/injectionhelpers.pyÚ!attemptRequestWithMaliciousMethod   s    z;MethodInjectionTestsMixin.attemptRequestWithMaliciousMethodc              	   C   s:   |   t¡�}d}|  |¡ W 5 Q R X |  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: valueú^Invalid methodN)ÚassertRaisesÚ
ValueErrorr   ÚassertRegexÚstrÚ	exception)r	   Úcmr
   r   r   r   Útest_methodWithCLRFRejected(   s    z5MethodInjectionTestsMixin.test_methodWithCLRFRejectedc              
   C   sP   t D ]F}dt|gƒf }|  t¡�}|  |¡ W 5 Q R X |  t|jƒd¡ qdS )z€
        Issuing a request with a method that contains unprintable
        ASCII characters fails with a L{ValueError}.
        ó   GET%sr   N)ÚUNPRINTABLE_ASCIIÚ	bytearrayr   r   r   r   r   r   ©r	   Úcr
   r   r   r   r   Ú'test_methodWithUnprintableASCIIRejected2   s
    zAMethodInjectionTestsMixin.test_methodWithUnprintableASCIIRejectedc              
   C   sP   t D ]F}dt|gƒf }|  t¡�}|  |¡ W 5 Q R X |  t|jƒd¡ qdS )zx
        Issuing a request with a method that contains non-ASCII
        characters fails with a L{ValueError}.
        r   r   N)ÚNONASCIIr   r   r   r   r   r   r   r   r   r   r   Útest_methodWithNonASCIIRejected=   s
    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   s
   t ƒ ‚dS )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:
        Nr   r   r   r   r   ÚattemptRequestWithMaliciousURIR   s    	z5URIInjectionTestsMixin.attemptRequestWithMaliciousURIc              	   C   s:   |   t¡�}d}|  |¡ W 5 Q R X |  t|jƒd¡ dS )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/pathú^Invalid URIN©r   r   r#   r   r   r   ©r	   r   Úurir   r   r   Útest_hostWithCRLFRejected]   s    z0URIInjectionTestsMixin.test_hostWithCRLFRejectedc              
   C   sP   t D ]F}dt|gƒf }|  t¡�}|  |¡ W 5 Q R X |  t|jƒd¡ qdS )zƒ
        Issuing a request with a URI whose host contains unprintable
        ASCII characters fails with a L{ValueError}.
        ó   http://twisted%s.invalid/OKr$   N©r   r   r   r   r#   r   r   r   ©r	   r   r'   r   r   r   r   Ú)test_hostWithWithUnprintableASCIIRejectedg   s
    z@URIInjectionTestsMixin.test_hostWithWithUnprintableASCIIRejectedc              
   C   sP   t D ]F}dt|gƒf }|  t¡�}|  |¡ W 5 Q R X |  t|jƒd¡ qdS )z{
        Issuing a request with a URI whose host contains non-ASCII
        characters fails with a L{ValueError}.
        r)   r$   N©r   r   r   r   r#   r   r   r   r+   r   r   r   Útest_hostWithNonASCIIRejectedr   s
    z4URIInjectionTestsMixin.test_hostWithNonASCIIRejectedc              	   C   s:   |   t¡�}d}|  |¡ W 5 Q R X |  t|jƒd¡ dS )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/
pathr$   Nr%   r&   r   r   r   Útest_pathWithCRLFRejected}   s    z0URIInjectionTestsMixin.test_pathWithCRLFRejectedc              
   C   sP   t D ]F}dt|gƒf }|  t¡�}|  |¡ W 5 Q R X |  t|jƒd¡ qdS )zƒ
        Issuing a request with a URI whose path contains unprintable
        ASCII characters fails with a L{ValueError}.
        ó   http://twisted.invalid/OK%sr$   Nr*   r+   r   r   r   Ú)test_pathWithWithUnprintableASCIIRejected‡   s
    z@URIInjectionTestsMixin.test_pathWithWithUnprintableASCIIRejectedc              
   C   sP   t D ]F}dt|gƒf }|  t¡�}|  |¡ W 5 Q R X |  t|jƒd¡ qdS )z{
        Issuing a request with a URI whose path contains non-ASCII
        characters fails with a L{ValueError}.
        r0   r$   Nr-   r+   r   r   r   Útest_pathWithNonASCIIRejected’   s
    z4URIInjectionTestsMixin.test_pathWithNonASCIIRejectedN)r   r   r    r!   r#   r(   r,   r.   r/   r1   r2   r   r   r   r   r"   I   s   

r"   )
r!   ÚstringÚ	frozensetÚranger   Ú	printabler   r   r   r"   r   r   r   r   Ú<module>   s   
ÿ9