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