HEX
Server: Apache
System: Linux scp1.abinfocom.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: confeduphaar (1010)
PHP: 8.1.33
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //usr/lib/python3/dist-packages/twisted/web/test/__pycache__/test_httpauth.cpython-38.pyc
U


W[@^�@s�dZddlmZmZddlZddlmZddlmZddl	m
Z
ddlmZddl
mZdd	lmZdd
lmZmZddlmZddlmZmZdd
lmZddlmZddlmZmZmZddl m!Z!m"Z"ddl#m$Z$m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+ddl,m-Z-ddl.m/Z/ddl0m1Z1dd�Z2Gdd�d�Z3Gdd�d�Z4Gdd�de4e3e
j5�Z6Gd d!�d!e4e
j5�Z7Gd"d#�d#e4e
j5�Z8eej9�Gd$d%�d%e:�Z;Gd&d'�d'e
j5�Z<dS)(z!
Tests for L{twisted.web._auth}.
�)�division�absolute_importN)�implementer)�verifyObject)�unittest)�Failure)�ConnectionDone)�IPv4Address)�error�portal)�'InMemoryUsernamePasswordDatabaseDontUse)�	ANONYMOUS�AllowAnonymousAccess)�IUsernamePassword)�ICredentialFactory)�	IResource�Resource�getChildForRequest)�basic�digest)�HTTPAuthSessionWrapper�UnauthorizedResource)�BasicCredentialFactory��NOT_DONE_YET)�Data)�DummyRequest)�EventLoggingObserver)�globalLogPublishercCst�|���S�N)�base64�	b64encode�strip)�s�r$�@/usr/lib/python3/dist-packages/twisted/web/test/test_httpauth.pyr!(sr!c@sJeZdZdZdd�Zddd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)�BasicAuthTestsMixinz�
    L{TestCase} mixin class which defines a number of tests for
    L{basic.BasicCredentialFactory}.  Because this mixin defines C{setUp}, it
    must be inherited before L{TestCase}.
    cCs.|��|_d|_d|_d|_t�|j�|_dS)NsfoosdreidsS3CuR1Ty)�makeRequest�request�realm�username�passwordrr�credentialFactory��selfr$r$r%�setUp2s

zBasicAuthTestsMixin.setUp�GETNcCstd|jf��dS)z�
        Create a request object to be passed to
        L{basic.BasicCredentialFactory.decode} along with a response value.
        Override this in a subclass.
        z %r did not implement makeRequestN)�NotImplementedError�	__class__)r.�method�
clientAddressr$r$r%r':s�zBasicAuthTestsMixin.makeRequestcCs|�tt|j��dS)zM
        L{BasicCredentialFactory} implements L{ICredentialFactory}.
        N��
assertTruerrr,r-r$r$r%�test_interfaceDs
�z"BasicAuthTestsMixin.test_interfacecCsdtd�|jd|jg��}|j�||j�}|�t�	|��|�|�
|j��|�|�
|jd��dS)z�
        L{basic.BasicCredentialFactory.decode} turns a base64-encoded response
        into a L{UsernamePassword} object with a password which reflects the
        one which was encoded in the response.
        ��:swrongN)r!�joinr*r+r,�decoder(r6rZ
providedBy�
checkPasswordZassertFalse�r.�responseZcredsr$r$r%�test_usernamePasswordLs
z)BasicAuthTestsMixin.test_usernamePasswordcCsXtd�|jd|jg��}|�d�}|j�||j�}|�t	t
|��|�|�|j��dS)zz
        L{basic.BasicCredentialFactory.decode} decodes a base64-encoded
        response with incorrect padding.
        r8r9�=N)r!r:r*r+r"r,r;r(r6rrr<r=r$r$r%�test_incorrectPaddingZs

z)BasicAuthTestsMixin.test_incorrectPaddingcCs"d}|�tj|jj||���dS)z�
        L{basic.BasicCredentialFactory.decode} raises L{LoginFailed} if passed
        a response which is not base64-encoded.
        �xN)�assertRaisesr
�LoginFailedr,r;r'�r.r>r$r$r%�test_invalidEncodinggs�z(BasicAuthTestsMixin.test_invalidEncodingcCs&td�}|�tj|jj||���dS)z�
        L{basic.BasicCredentialFactory.decode} raises L{LoginFailed} when
        passed a response which is not valid base64-encoded text.
        s123abc+/N)r!rCr
rDr,r;r'rEr$r$r%�test_invalidCredentialsrs�z+BasicAuthTestsMixin.test_invalidCredentials)r0N)�__name__�
__module__�__qualname__�__doc__r/r'r7r?rArFrGr$r$r$r%r&,s


r&c@seZdZddd�ZdS)�RequestMixinr0NcCs,|dkrtddd�}td�}||_||_|S)zo
        Create a L{DummyRequest} (change me to create a
        L{twisted.web.http.Request} instead).
        N�TCPZ	localhosti��/)r	rr3�client)r.r3r4r(r$r$r%r'szRequestMixin.makeRequest)r0N)rHrIrJr'r$r$r$r%rL~srLc@seZdZdZdS)�BasicAuthTestszK
    Basic authentication tests which use L{twisted.web.http.Request}.
    N)rHrIrJrKr$r$r$r%rP�srPc@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�DigestAuthTestszL
    Digest authentication tests which use L{twisted.web.http.Request}.
    cCs,d|_d|_t�|j|j�|_|��|_dS)z>
        Create a DigestCredentialFactory for testing
        �
test realm�md5N)r)�	algorithmr�DigestCredentialFactoryr,r'r(r-r$r$r%r/�s�zDigestAuthTests.setUpcsnd�d�dg�t�������fdd�}���jjd|����td�d��}�j��|����d	�d
S)z�
        L{digest.DigestCredentialFactory.decode} calls the C{decode} method on
        L{twisted.cred.digest.DigestCredentialFactory} with the HTTP method and
        host of the request.
        s169.254.0.1r0Fcs0���|����|����|�d�d<dS)NTr)�assertEqual)Z	_response�_methodZ_host�ZdoneZhostr3r>r.r$r%�check�sz*DigestAuthTests.test_decode.<locals>.checkr;rM�QrN)�objectZpatchr,rr'r	r;r6)r.rYZreqr$rXr%�test_decode�szDigestAuthTests.test_decodecCs|�tt|j��dS)zN
        L{DigestCredentialFactory} implements L{ICredentialFactory}.
        Nr5r-r$r$r%r7�s
�zDigestAuthTests.test_interfacecCst|j�|j�}|�|dd�|�|dd�|�|dd�|�d|�|�d|�|��D]}|�d	|�q^d
S)ah
        The challenge issued by L{DigestCredentialFactory.getChallenge} must
        include C{'qop'}, C{'realm'}, C{'algorithm'}, C{'nonce'}, and
        C{'opaque'} keys.  The values for the C{'realm'} and C{'algorithm'}
        keys must match the values supplied to the factory's initializer.
        None of the values may have newlines in them.
        �qop�authr)rRrTrS�nonce�opaque�
N)r,�getChallenger(rV�assertIn�valuesZassertNotIn)r.�	challenge�vr$r$r%�test_getChallenge�sz!DigestAuthTests.test_getChallengecCsd|�dd�}|j�|�}|�|dd�|�|dd�|�|dd�|�d	|�|�d
|�dS)z�
        L{DigestCredentialFactory.getChallenge} can issue a challenge even if
        the L{Request} it is passed returns L{None} from C{getClientIP}.
        r0Nr]r^r)rRrTrSr_r`)r'r,rbrVrc)r.r(rer$r$r%� test_getChallengeWithoutClientIP�sz0DigestAuthTests.test_getChallengeWithoutClientIPN)	rHrIrJrKr/r\r7rgrhr$r$r$r%rQ�srQc@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)�UnauthorizedResourceTestsz,
    Tests for L{UnauthorizedResource}.
    cCs4tg�}|�|�dd�|�|�|�dd�|�dS)zF
        An L{UnauthorizedResource} is every child of itself.
        ZfooNZbar)rZassertIdenticalZgetChildWithDefault)r.�resourcer$r$r%�test_getChildWithDefault�s
�
�z2UnauthorizedResourceTests.test_getChildWithDefaultcCs@ttd�g�}|�|�|�|jd�|�|j�d�dg�dS)z�
        Render L{UnauthorizedResource} for the given request object and verify
        that the response code is I{Unauthorized} and that a I{WWW-Authenticate}
        header is set in the response containing a challenge.
        �example.com��www-authenticatesbasic realm="example.com"N)rr�renderrV�responseCode�responseHeaders�
getRawHeaders)r.r(rjr$r$r%�_unauthorizedRenderTest�s�

�z1UnauthorizedResourceTests._unauthorizedRenderTestcCs*|��}|�|�|�dd�|j��dS)z�
        L{UnauthorizedResource} renders with a 401 response code and a
        I{WWW-Authenticate} header and puts a simple unauthorized message
        into the response body.
        sUnauthorizedr8N�r'rsrVr:�written�r.r(r$r$r%�test_renders
z%UnauthorizedResourceTests.test_rendercCs.|jdd�}|�|�|�dd�|j��dS)z�
        The rendering behavior of L{UnauthorizedResource} for a I{HEAD} request
        is like its handling of a I{GET} request, but no response body is
        written.
        sHEAD)r3r8Nrtrvr$r$r%�test_renderHEADs
z)UnauthorizedResourceTests.test_renderHEADcCs:ttd�g�}|��}|�|�|�|j�d�dg�dS)z�
        The realm value included in the I{WWW-Authenticate} header set in
        the response when L{UnauthorizedResounrce} is rendered has quotes
        and backslashes escaped.
        zexample\"foornsbasic realm="example\\\"foo"N)rrr'rorVrqrr)r.rjr(r$r$r%�test_renderQuotesRealms�

�z0UnauthorizedResourceTests.test_renderQuotesRealmcCsPtt�dd�g�}|��}|�|�|j�d�d}|�d|�|�d|�dS)z�
        The digest value included in the I{WWW-Authenticate} header
        set in the response when L{UnauthorizedResource} is rendered
        has quotes and backslashes escaped.
        rSsexample\"foornrsrealm="example\\\"foo"shm="md5N)rrrUr'rorqrrrc)r.rjr(Z
authHeaderr$r$r%�test_renderQuotesDigest&s
�
��z1UnauthorizedResourceTests.test_renderQuotesDigestN)
rHrIrJrKrkrsrwrxryrzr$r$r$r%ri�sric@s(eZdZdZdd�Zdd�Zdd�ZdS)	�RealmaJ
    A simple L{IRealm} implementation which gives out L{WebAvatar} for any
    avatarId.

    @type loggedIn: C{int}
    @ivar loggedIn: The number of times C{requestAvatar} has been invoked for
        L{IResource}.

    @type loggedOut: C{int}
    @ivar loggedOut: The number of times the logout callback has been invoked.
    cCsd|_d|_||_dS)Nr)�	loggedOut�loggedIn�
avatarFactory)r.r~r$r$r%�__init__FszRealm.__init__cGs2t|kr(|jd7_t|�|�|jfSt��dS�N�)rr}r~�logoutr1)r.ZavatarIdZmindZ
interfacesr$r$r%�
requestAvatarLszRealm.requestAvatarcCs|jd7_dSr�)r|r-r$r$r%r�SszRealm.logoutN)rHrIrJrKrr�r�r$r$r$r%r{9sr{c@s�eZdZdZeZdd�Zdd�Zdd�Zdd	�Z	d
d�Z
dd
�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&S)'�HTTPAuthHeaderTestsz.
    Tests for L{HTTPAuthSessionWrapper}.
    cCs�d|_d|_d|_d|_d|_t�|_|j�|j|j�t|jd�|_	|j	�
|jt|jd��|j|j	i|_t|jj
�|_t�|j|jg�|_g|_t|j|j�|_dS)z\
        Create a realm, portal, and L{HTTPAuthSessionWrapper} to use in the tests.
        sfoo barsbar bazs&contents of the avatar resource itselfs	foo-childs'contents of the foo child of the avatar�
text/plainN)r*r+�
avatarContent�	childName�childContentrZcheckerZaddUserr�avatar�putChild�avatarsr{�getr)rZPortal�credentialFactoriesr�wrapperr-r$r$r%r/^s(
��zHTTPAuthHeaderTests.setUpcCs2t|jd|j�}|j�dd|�t|j|�S)z�
        Add an I{basic authorization} header to the given request and then
        dispatch it, starting from C{self.wrapper} and returning the resulting
        L{IResource}.
        r9�
authorization�Basic )r!r*r+�requestHeaders�addRawHeaderrr�)r.r(Z
authorizationr$r$r%�_authorizedBasicLogints
�z)HTTPAuthHeaderTests._authorizedBasicLogincsH���jg��t�j��}���}��fdd�}|�|���|�|S)z�
        Resource traversal which encounters an L{HTTPAuthSessionWrapper}
        results in an L{UnauthorizedResource} instance when the request does
        not have the required I{Authorization} headers.
        cs���jd�dS�Nrm�rVrp��result�r(r.r$r%�
cbFinished�sz@HTTPAuthHeaderTests.test_getChildWithDefault.<locals>.cbFinished)r'r�rr��notifyFinish�addCallbackro�r.�child�dr�r$r�r%rk�s

z,HTTPAuthHeaderTests.test_getChildWithDefaultcsf�j�td�����jg���j�d|�t�j��}��	�}��fdd�}|�
|���|�|S)a(
        Create a request with the given value as the value of an
        I{Authorization} header and perform resource traversal with it,
        starting at C{self.wrapper}.  Assert that the result is a 401 response
        code.  Return a L{Deferred} which fires when this is all done.
        rlr�cs���jd�dSr�r�r�r�r$r%r��szAHTTPAuthHeaderTests._invalidAuthorizationTest.<locals>.cbFinished)r��appendrr'r�r�r�rr�r�r�ro)r.r>r�r�r�r$r�r%�_invalidAuthorizationTest�s

z-HTTPAuthHeaderTests._invalidAuthorizationTestcCs|�dtd��S)z�
        Resource traversal which enouncters an L{HTTPAuthSessionWrapper}
        results in an L{UnauthorizedResource} when the request has an
        I{Authorization} header with a user which does not exist.
        r�sfoo:bar)r�r!r-r$r$r%�(test_getChildWithDefaultUnauthorizedUser�s
�z<HTTPAuthHeaderTests.test_getChildWithDefaultUnauthorizedUsercCs|�dt|jd��S)z�
        Resource traversal which enouncters an L{HTTPAuthSessionWrapper}
        results in an L{UnauthorizedResource} when the request has an
        I{Authorization} header with a user which exists and the wrong
        password.
        r�s:bar)r�r!r*r-r$r$r%�,test_getChildWithDefaultUnauthorizedPassword�s�z@HTTPAuthHeaderTests.test_getChildWithDefaultUnauthorizedPasswordcCs
|�d�S)z�
        Resource traversal which enouncters an L{HTTPAuthSessionWrapper}
        results in an L{UnauthorizedResource} when the request has an
        I{Authorization} header with an unrecognized scheme.
        sQuux foo bar baz)r�r-r$r$r%�*test_getChildWithDefaultUnrecognizedScheme�sz>HTTPAuthHeaderTests.test_getChildWithDefaultUnrecognizedSchemecsV�j�td�����jg������}���}��fdd�}|�|���|�|S)z�
        Resource traversal which encounters an L{HTTPAuthSessionWrapper}
        results in an L{IResource} which renders the L{IResource} avatar
        retrieved from the portal when the request has a valid I{Authorization}
        header.
        rlcs���j�jg�dSr)rVrur��Zignoredr�r$r%r��szJHTTPAuthHeaderTests.test_getChildWithDefaultAuthorized.<locals>.cbFinished)	r�r�rr'r�r�r�r�ror�r$r�r%�"test_getChildWithDefaultAuthorized�s


z6HTTPAuthHeaderTests.test_getChildWithDefaultAuthorizedcsR�j�td����g������}���}��fdd�}|�|���|�|S)a
        Resource traversal which terminates at an L{HTTPAuthSessionWrapper}
        and includes correct authentication headers results in the
        L{IResource} avatar (not one of its children) retrieved from the
        portal being rendered.
        rlcs���j�jg�dSr)rVrur�r�r�r$r%r��sz=HTTPAuthHeaderTests.test_renderAuthorized.<locals>.cbFinished)r�r�rr'r�r�r�ror�r$r�r%�test_renderAuthorized�s



z)HTTPAuthHeaderTests.test_renderAuthorizedcsttt�Gdd�dt��}|���j������jg��t�j��}��	�}���fdd�}|�
|���|�|S)z�
        When L{HTTPAuthSessionWrapper} finds an L{ICredentialFactory} to issue
        a challenge, it calls the C{getChallenge} method with the request as an
        argument.
        c@s eZdZdZdd�Zdd�ZdS)zUHTTPAuthHeaderTests.test_getChallengeCalledWithRequest.<locals>.DumbCredentialFactorysdumbcSs
g|_dSr)�requestsr-r$r$r%r�sz^HTTPAuthHeaderTests.test_getChallengeCalledWithRequest.<locals>.DumbCredentialFactory.__init__cSs|j�|�iSr)r�r�rvr$r$r%rb�szbHTTPAuthHeaderTests.test_getChallengeCalledWithRequest.<locals>.DumbCredentialFactory.getChallengeN)rHrIrJ�schemerrbr$r$r$r%�DumbCredentialFactory�sr�cs���j�g�dSr)rVr�r���factoryr(r.r$r%r��szJHTTPAuthHeaderTests.test_getChallengeCalledWithRequest.<locals>.cbFinished)rrr[r�r�r'r�rr�r�r�ro)r.r�r�r�r�r$r�r%�"test_getChallengeCalledWithRequest�s


z6HTTPAuthHeaderTests.test_getChallengeCalledWithRequestcCsh|j�td��Gdd�dt�}|j�|j|��|�|jg�}|�|�}|�	|�|�
|jjd�|S)a
        Issue a request for an authentication-protected resource using valid
        credentials and then return the C{DummyRequest} instance which was
        used.

        This is a helper for tests about the behavior of the logout
        callback.
        rlc@seZdZdd�ZdS)z7HTTPAuthHeaderTests._logoutTest.<locals>.SlowerResourcecSstSrrrvr$r$r%rosz>HTTPAuthHeaderTests._logoutTest.<locals>.SlowerResource.renderN)rHrIrJror$r$r$r%�SlowerResourcesr�r)
r�r�rrr�r�r�r'r�rorVr)r|)r.r�r(r�r$r$r%�_logoutTests	

zHTTPAuthHeaderTests._logoutTestcCs$|��}|��|�|jjd�dS)zX
        The realm's logout callback is invoked after the resource is rendered.
        r�N)r�ZfinishrVr)r|rvr$r$r%�test_logoutszHTTPAuthHeaderTests.test_logoutcCs.|��}|�ttd���|�|jjd�dS)z�
        The realm's logout callback is also invoked if there is an error
        generating the response (for example, if the client disconnects
        early).
        zSimulated disconnectr�N)r�ZprocessingFailedrrrVr)r|rvr$r$r%�test_logoutOnError#s

�z&HTTPAuthHeaderTests.test_logoutOnErrorcCsH|j�td��|�|jg�}|j�dd�t|j|�}|�	|t
�dS)z�
        Resource traversal which enouncters an L{HTTPAuthSessionWrapper}
        results in an L{UnauthorizedResource} when the request has a I{Basic
        Authorization} header which cannot be decoded using base64.
        rlr�sBasic decode should failN)r�r�rr'r�r�r�rr��assertIsInstancer)r.r(r�r$r$r%�test_decodeRaises/s
z%HTTPAuthHeaderTests.test_decodeRaisescCsHd}|�|j�|�d�td�}|j�|�|�|j�|�|df�dS)z�
        L{HTTPAuthSessionWrapper._selectParseHeader} returns a two-tuple giving
        the L{ICredentialFactory} to use to parse the header and a string
        containing the portion of the header which remains to be parsed.
        sBasic abcdef123456)NNrlsabcdef123456N)rVr�Z_selectParseHeaderrr�r�)r.ZbasicAuthorizationr�r$r$r%�test_selectParseResponse<s
�
�z,HTTPAuthHeaderTests.test_selectParseResponsecs�t�|t�}Gdd�dt��G�fdd�dt�}|j�|��|�|jg�}|j	�
dd�t|j|�}|�
|�|�|jd�|�dt|��|�|d	d
j��|�t|����d�dS)z�
        Any unexpected exception raised by the credential factory's C{decode}
        method results in a 500 response code and causes the exception to be
        logged.
        c@seZdZdS)zKHTTPAuthHeaderTests.test_unexpectedDecodeError.<locals>.UnexpectedExceptionN�rHrIrJr$r$r$r%�UnexpectedExceptionWsr�cs$eZdZdZdd�Z�fdd�ZdS)zBHTTPAuthHeaderTests.test_unexpectedDecodeError.<locals>.BadFactorysbadcSsiSrr$)r.rOr$r$r%rb]szOHTTPAuthHeaderTests.test_unexpectedDecodeError.<locals>.BadFactory.getChallengecs
���dSrr$)r.r>r(�r�r$r%r;`szIHTTPAuthHeaderTests.test_unexpectedDecodeError.<locals>.BadFactory.decodeN)rHrIrJr�rbr;r$r�r$r%�
BadFactoryZsr�r�sBad abc��r�r�log_failureN)r�createWithCleanupr�	Exceptionr[r�r�r'r�r�r�rr�rorVrp�assertEquals�lenr��value�flushLoggedErrors)r.�logObserverr�r(r�r$r�r%�test_unexpectedDecodeErrorMs$�	
�z.HTTPAuthHeaderTests.test_unexpectedDecodeErrorcs�t�|t�}Gdd�dt��G�fdd�dt�}|j�|��|j�t	d��|�
|jg�}|�|�}|�
|�|�|jd�|�dt|��|�|dd	j��|�t|����d�d
S)z�
        Any unexpected failure from L{Portal.login} results in a 500 response
        code and causes the failure to be logged.
        c@seZdZdS)zJHTTPAuthHeaderTests.test_unexpectedLoginError.<locals>.UnexpectedExceptionNr�r$r$r$r%r�zsr�cseZdZefZ�fdd�ZdS)zDHTTPAuthHeaderTests.test_unexpectedLoginError.<locals>.BrokenCheckercs
���dSrr$)r.Zcredentialsr�r$r%�requestAvatarId�szTHTTPAuthHeaderTests.test_unexpectedLoginError.<locals>.BrokenChecker.requestAvatarIdN)rHrIrJrZcredentialInterfacesr�r$r�r$r%�
BrokenChecker}sr�rlr�r�rr�N)rr�rr�r[r�registerCheckerr�r�rr'r�r�rorVrpr�r�r�r�r�)r.r�r�r(r�r$r�r%�test_unexpectedLoginErrorqs$�

�z-HTTPAuthHeaderTests.test_unexpectedLoginErrorcs�d�t��jt<�jt��jt�d���j�t���j	�
td�����jg��t
�j��}���}���fdd�}|�|���|�|S)zl
        Anonymous requests are allowed if a L{Portal} has an anonymous checker
        registered.
        s*contents of the unprotected child resourcer�rlcs���j�g�dSr)rVrur��r(r.ZunprotectedContentsr$r%r��sz<HTTPAuthHeaderTests.test_anonymousAccess.<locals>.cbFinished)rr�r
r�r�rrr�rr�r�rr'rr�r�r�ror�r$r�r%�test_anonymousAccess�s
�

z(HTTPAuthHeaderTests.test_anonymousAccessN)rHrIrJrKrr'r/r�rkr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r$r$r$r%r�Xs(
		
$ r�)=rKZ
__future__rrr Zzope.interfacerZzope.interface.verifyrZ
twisted.trialrZtwisted.python.failurerZtwisted.internet.errorrZtwisted.internet.addressr	Ztwisted.credr
rZtwisted.cred.checkersrr
rZtwisted.cred.credentialsrZtwisted.web.iwebrZtwisted.web.resourcerrrZtwisted.web._authrrZtwisted.web._auth.wrapperrrZtwisted.web._auth.basicrZtwisted.web.serverrZtwisted.web.staticrZtwisted.web.test.test_webrZtwisted.test.proto_helpersrZtwisted.loggerrr!r&rLZTestCaserPrQriZIRealmr[r{r�r$r$r$r%�<module>s>ROU