§
    Étºfè\  ã                   ó&  — d Z ddlZddlmZ ddl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 dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZmZ ddlmZ ddl 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„ Z/ G d„ d¦  «        Z0 G d„ d¦  «        Z1 G d„ de1e0ej2        ¦  «        Z3 G d„ de1ej2        ¦  «        Z4 G d„ d e1ej2        ¦  «        Z5 eej6        ¦  «          G d!„ d"¦  «        Z7 G d#„ d$ej2        ¦  «        Z8dS )%z!
Tests for L{twisted.web._auth}.
é    N)Úimplementer)ÚverifyObject)ÚerrorÚportal)Ú	ANONYMOUSÚAllowAnonymousAccessÚ'InMemoryUsernamePasswordDatabaseDontUse)ÚIUsernamePassword)ÚIPv4Address)ÚConnectionDone)ÚEventLoggingObserver)ÚglobalLogPublisher)ÚFailure)Úunittest)ÚbasicÚdigest)ÚBasicCredentialFactory)ÚHTTPAuthSessionWrapperÚUnauthorizedResource)ÚICredentialFactory)Ú	IResourceÚResourceÚgetChildForRequest©ÚNOT_DONE_YET)ÚData)ÚDummyRequestc                 óN   — t          j        | ¦  «                             ¦   «         S ©N)Úbase64Ú	b64encodeÚstrip)Úss    ú]/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/web/test/test_httpauth.pyr!   r!   %   s   € ÝÔ˜AÑÔ×$Ò$Ñ&Ô&Ð&ó    c                   ó>   — e Zd ZdZd„ Zdd„Zd„ Zd„ Zd„ Zd	„ Z	d
„ Z
dS )Ú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}.
    c                 óž   — |                       ¦   «         | _        d| _        d| _        d| _        t          j        | j        ¦  «        | _        d S )Ns   foos   dreids   S3CuR1Ty)ÚmakeRequestÚrequestÚrealmÚusernameÚpasswordr   r   ÚcredentialFactory©Úselfs    r$   ÚsetUpzBasicAuthTestsMixin.setUp0   sE   € Ø×'Ò'Ñ)Ô)ˆŒØˆŒ
Ø ˆŒØ#ˆŒÝ!&Ô!=¸d¼jÑ!IÔ!IˆÔÐÐr%   ó   GETNc                 ó0   — t          | j        ›d�¦  «        ‚)zª
        Create a request object to be passed to
        L{basic.BasicCredentialFactory.decode} along with a response value.
        Override this in a subclass.
        z did not implement makeRequest)ÚNotImplementedErrorÚ	__class__)r0   ÚmethodÚclientAddresss      r$   r)   zBasicAuthTestsMixin.makeRequest7   s   € õ " T¤^Ð"UÐ"UÐ"UÑVÔVÐVr%   c                 ó`   — |                       t          t          | j        ¦  «        ¦  «         dS )zM
        L{BasicCredentialFactory} implements L{ICredentialFactory}.
        N©Ú
assertTruer   r   r.   r/   s    r$   Útest_interfacez"BasicAuthTestsMixin.test_interface?   ó*   € ð 	�Š�Õ%7¸Ô9OÑPÔPÑQÔQÐQÐQÐQr%   c                 ó¬  — t          d                     | j        d| j        g¦  «        ¦  «        }| j                             || j        ¦  «        }|                      t          j	        |¦  «        ¦  «         |                      | 
                    | j        ¦  «        ¦  «         |                      | 
                    | j        dz   ¦  «        ¦  «         dS )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.
        r%   ó   :s   wrongN)r!   Újoinr,   r-   r.   Údecoder*   r:   r
   Ú
providedByÚcheckPasswordÚassertFalse©r0   ÚresponseÚcredss      r$   Útest_usernamePasswordz)BasicAuthTestsMixin.test_usernamePasswordE   s±   € õ ˜SŸXšX t¤}°d¸D¼MÐ&JÑKÔKÑLÔLˆàÔ&×-Ò-¨h¸¼ÑEÔEˆØ�ŠÕ)Ô4°UÑ;Ô;Ñ<Ô<Ð<Ø�Š˜×+Ò+¨D¬MÑ:Ô:Ñ;Ô;Ð;Ø×Ò˜×,Ò,¨T¬]¸XÑ-EÑFÔFÑGÔGÐGÐGÐGr%   c                 óx  — t          d                     | j        d| j        g¦  «        ¦  «        }|                     d¦  «        }| j                             || j        ¦  «        }|                      t          t          |¦  «        ¦  «         |                      |                     | j        ¦  «        ¦  «         dS )zz
        L{basic.BasicCredentialFactory.decode} decodes a base64-encoded
        response with incorrect padding.
        r%   r>   ó   =N)r!   r?   r,   r-   r"   r.   r@   r*   r:   r   r
   rB   rD   s      r$   Útest_incorrectPaddingz)BasicAuthTestsMixin.test_incorrectPaddingR   s˜   € õ
 ˜SŸXšX t¤}°d¸D¼MÐ&JÑKÔKÑLÔLˆØ—>’> $Ñ'Ô'ˆàÔ&×-Ò-¨h¸¼ÑEÔEˆØ�Š�Õ%6¸Ñ>Ô>Ñ?Ô?Ð?Ø�Š˜×+Ò+¨D¬MÑ:Ô:Ñ;Ô;Ð;Ð;Ð;r%   c                 ó†   — d}|                       t          j        | j        j        ||                      ¦   «         ¦  «         dS )zˆ
        L{basic.BasicCredentialFactory.decode} raises L{LoginFailed} if passed
        a response which is not base64-encoded.
        ó   xN)ÚassertRaisesr   ÚLoginFailedr.   r@   r)   ©r0   rE   s     r$   Útest_invalidEncodingz(BasicAuthTestsMixin.test_invalidEncoding^   sL   € ð
 ˆØ×ÒÝÔØÔ"Ô)ØØ×ÒÑÔñ		
ô 	
ð 	
ð 	
ð 	
r%   c                 ó    — t          d¦  «        }|                      t          j        | j        j        ||                      ¦   «         ¦  «         dS )z•
        L{basic.BasicCredentialFactory.decode} raises L{LoginFailed} when
        passed a response which is not valid base64-encoded text.
        s   123abc+/N)r!   rM   r   rN   r.   r@   r)   rO   s     r$   Útest_invalidCredentialsz+BasicAuthTestsMixin.test_invalidCredentialsk   sT   € õ
 ˜[Ñ)Ô)ˆØ×ÒÝÔØÔ"Ô)ØØ×ÒÑÔñ		
ô 	
ð 	
ð 	
ð 	
r%   ©r2   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r1   r)   r;   rG   rJ   rP   rR   © r%   r$   r'   r'   )   s™   € € € € € ðð ðJð Jð JðWð Wð Wð WðRð Rð RðHð Hð Hð
<ð 
<ð 
<ð
ð 
ð 
ð
ð 
ð 
ð 
ð 
r%   r'   c                   ó   — e Zd Zdd„ZdS )ÚRequestMixinr2   Nc                 óf   — |€t          ddd¦  «        }t          d¦  «        }||_        ||_        |S )zo
        Create a L{DummyRequest} (change me to create a
        L{twisted.web.http.Request} instead).
        NÚTCPÚ	localhostiÒ  ó   /)r   r   r6   Úclient)r0   r6   r7   r*   s       r$   r)   zRequestMixin.makeRequestz   s;   € ð
 Ð Ý'¨¨{¸DÑAÔAˆMÝ˜tÑ$Ô$ˆØˆŒØ&ˆŒØˆr%   rS   )rT   rU   rV   r)   rX   r%   r$   rZ   rZ   y   s(   € € € € € ð
ð 
ð 
ð 
ð 
ð 
r%   rZ   c                   ó   — e Zd ZdZdS )ÚBasicAuthTestszK
    Basic authentication tests which use L{twisted.web.http.Request}.
    N)rT   rU   rV   rW   rX   r%   r$   ra   ra   ‡   s   € € € € € ðð ð ð r%   ra   c                   ó0   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚDigestAuthTestszL
    Digest authentication tests which use L{twisted.web.http.Request}.
    c                 óœ   — d| _         d| _        t          j        | j        | j         ¦  «        | _        |                      ¦   «         | _        dS )z>
        Create a DigestCredentialFactory for testing
        ó
   test realmó   md5N)r+   Ú	algorithmr   ÚDigestCredentialFactoryr.   r)   r*   r/   s    r$   r1   zDigestAuthTests.setUp’   sI   € ð #ˆŒ
ØˆŒÝ!'Ô!?ØŒN˜DœJñ"
ô "
ˆÔð ×'Ò'Ñ)Ô)ˆŒˆˆr%   c                 óD  ‡ ‡‡‡‡— dŠdŠdgŠt          ¦   «         Šˆˆˆˆˆ fd„}‰                      ‰ j        j        d|¦  «         ‰                      ‰t          d‰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.
        s   169.254.0.1r2   Fc                 ó–   •— ‰                      ‰| ¦  «         ‰                      ‰|¦  «         ‰                      ‰|¦  «         d‰d<   d S )NTr   )ÚassertEqual)Ú	_responseÚ_methodÚ_hostÚdoneÚhostr6   rE   r0   s      €€€€€r$   Úcheckz*DigestAuthTests.test_decode.<locals>.check¨   sR   ø€ Ø×Ò˜X yÑ1Ô1Ð1Ø×Ò˜V WÑ-Ô-Ð-Ø×Ò˜T 5Ñ)Ô)Ð)ØˆD�‰GˆGˆGr%   r@   r\   éQ   r   N)ÚobjectÚpatchr.   r   r)   r   r@   r:   )r0   rq   Úreqro   rp   r6   rE   s   `  @@@@r$   Útest_decodezDigestAuthTests.test_decode�   sÄ   øøøøø€ ð ˆØˆØˆwˆÝ‘8”8ˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	�
Š
�4Ô)Ô0°(¸EÑBÔBÐBØ×Ò˜v¥{°5¸$ÀÑ'CÔ'CÑDÔDˆØÔ×%Ò% h°Ñ4Ô4Ð4Ø�Š˜˜QœÑ Ô Ð Ð Ð r%   c                 ó`   — |                       t          t          | j        ¦  «        ¦  «         dS )zN
        L{DigestCredentialFactory} implements L{ICredentialFactory}.
        Nr9   r/   s    r$   r;   zDigestAuthTests.test_interface³   r<   r%   c                 óž  — | j                              | j        ¦  «        }|                      |d         d¦  «         |                      |d         d¦  «         |                      |d         d¦  «         |                      d|¦  «         |                      d|¦  «         |                     ¦   «         D ]}|                      d	|¦  «         Œ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+   re   rg   rf   ÚnonceÚopaqueó   
N)r.   ÚgetChallenger*   rk   ÚassertInÚvaluesÚassertNotIn)r0   Ú	challengeÚvs      r$   Útest_getChallengez!DigestAuthTests.test_getChallenge¹   sÓ   € ð Ô*×7Ò7¸¼ÑEÔEˆ	Ø×Ò˜ 5Ô)¨7Ñ3Ô3Ð3Ø×Ò˜ 7Ô+¨]Ñ;Ô;Ð;Ø×Ò˜ ;Ô/°Ñ8Ô8Ð8Ø�Š�g˜yÑ)Ô)Ð)Ø�Š�h 	Ñ*Ô*Ð*Ø×!Ò!Ñ#Ô#ð 	'ð 	'ˆAØ×Ò˜U AÑ&Ô&Ð&Ð&ð	'ð 	'r%   c                 óf  — |                       dd¦  «        }| j                             |¦  «        }|                      |d         d¦  «         |                      |d         d¦  «         |                      |d         d¦  «         |                      d	|¦  «         |                      d
|¦  «         dS )z 
        L{DigestCredentialFactory.getChallenge} can issue a challenge even if
        the L{Request} it is passed returns L{None} from C{getClientIP}.
        r2   Nry   rz   r+   re   rg   rf   r{   r|   )r)   r.   r~   rk   r   )r0   r*   r‚   s      r$   Ú test_getChallengeWithoutClientIPz0DigestAuthTests.test_getChallengeWithoutClientIPÊ   s®   € ð
 ×"Ò" 6¨4Ñ0Ô0ˆØÔ*×7Ò7¸Ñ@Ô@ˆ	Ø×Ò˜ 5Ô)¨7Ñ3Ô3Ð3Ø×Ò˜ 7Ô+¨]Ñ;Ô;Ð;Ø×Ò˜ ;Ô/°Ñ8Ô8Ð8Ø�Š�g˜yÑ)Ô)Ð)Ø�Š�h 	Ñ*Ô*Ð*Ð*Ð*r%   N)	rT   rU   rV   rW   r1   rv   r;   r„   r†   rX   r%   r$   rc   rc   �   sl   € € € € € ðð ð	*ð 	*ð 	*ð!ð !ð !ð,Rð Rð Rð'ð 'ð 'ð"+ð +ð +ð +ð +r%   rc   c                   ó6   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚUnauthorizedResourceTestsz,
    Tests for L{UnauthorizedResource}.
    c                 óÌ   — t          g ¦  «        }|                      |                     dd¦  «        |¦  «         |                      |                     dd¦  «        |¦  «         dS )zF
        An L{UnauthorizedResource} is every child of itself.
        ÚfooNÚbar)r   ÚassertIdenticalÚgetChildWithDefault)r0   Úresources     r$   Útest_getChildWithDefaultz2UnauthorizedResourceTests.test_getChildWithDefaultÝ   sc   € õ (¨Ñ+Ô+ˆØ×Ò˜X×9Ò9¸%ÀÑFÔFÈÑQÔQÐQØ×Ò˜X×9Ò9¸%ÀÑFÔFÈÑQÔQÐQÐQÐQr%   c                 óþ   — t          t          d¦  «        g¦  «        }|                     |¦  «         |                      |j        d¦  «         |                      |j                             d¦  «        dg¦  «         dS )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-authenticates   basic realm="example.com"N)r   r   Úrenderrk   ÚresponseCodeÚresponseHeadersÚgetRawHeaders)r0   r*   rŽ   s      r$   Ú_unauthorizedRenderTestz1UnauthorizedResourceTests._unauthorizedRenderTestå   s…   € õ (Õ)?ÀÑ)NÔ)NÐ(OÑPÔPˆØ�Š�xÑ Ô Ð Ø×Ò˜Ô-¨sÑ3Ô3Ð3Ø×ÒØÔ#×1Ò1Ð2EÑFÔFØ)Ð*ñ	
ô 	
ð 	
ð 	
ð 	
r%   c                 ó´   — |                       ¦   «         }|                      |¦  «         |                      dd                     |j        ¦  «        ¦  «         dS )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   Unauthorizedr%   N©r)   r˜   rk   r?   Úwritten©r0   r*   s     r$   Útest_renderz%UnauthorizedResourceTests.test_renderó   sS   € ð ×"Ò"Ñ$Ô$ˆØ×$Ò$ WÑ-Ô-Ð-Ø×Ò˜¨#¯(ª(°7´?Ñ*CÔ*CÑDÔDÐDÐDÐDr%   c                 ó¸   — |                       d¬¦  «        }|                      |¦  «         |                      dd                     |j        ¦  «        ¦  «         dS )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.
        s   HEAD)r6   r%   Nrš   rœ   s     r$   Útest_renderHEADz)UnauthorizedResourceTests.test_renderHEADý   sX   € ð ×"Ò"¨'Ð"Ñ2Ô2ˆØ×$Ò$ WÑ-Ô-Ð-Ø×Ò˜˜cŸhšh w¤Ñ7Ô7Ñ8Ô8Ð8Ð8Ð8r%   c                 óð   — t          t          d¦  «        g¦  «        }|                      ¦   «         }|                     |¦  «         |                      |j                             d¦  «        dg¦  «         dS )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\"foor“   s   basic realm="example\\\"foo"N)r   r   r)   r”   rk   r–   r—   )r0   rŽ   r*   s      r$   Útest_renderQuotesRealmz0UnauthorizedResourceTests.test_renderQuotesRealm  s}   € õ (Õ)?ÀÑ)PÔ)PÐ(QÑRÔRˆØ×"Ò"Ñ$Ô$ˆØ�Š�xÑ Ô Ð Ø×ÒØÔ#×1Ò1Ð2EÑFÔFØ/Ð0ñ	
ô 	
ð 	
ð 	
ð 	
r%   c                 ó6  — t          t          j        dd¦  «        g¦  «        }|                      ¦   «         }|                     |¦  «         |j                             d¦  «        d         }|                      d|¦  «         |                      d|¦  «         dS )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.
        rf   s   example\"foor“   r   s   realm="example\\\"foo"s   hm="md5N)r   r   rh   r)   r”   r–   r—   r   )r0   rŽ   r*   Ú
authHeaders       r$   Útest_renderQuotesDigestz1UnauthorizedResourceTests.test_renderQuotesDigest  s˜   € õ (ÝÔ+¨FÐ4DÑEÔEÐFñ
ô 
ˆð ×"Ò"Ñ$Ô$ˆØ�Š�xÑ Ô Ð ØÔ,×:Ò:Ð;NÑOÔOÐPQÔRˆ
Ø�ŠÐ2°JÑ?Ô?Ð?Ø�Š�j *Ñ-Ô-Ð-Ð-Ð-r%   N)
rT   rU   rV   rW   r�   r˜   r�   rŸ   r¡   r¤   rX   r%   r$   rˆ   rˆ   Ø   s~   € € € € € ðð ðRð Rð Rð
ð 
ð 
ðEð Eð Eð9ð 9ð 9ð
ð 
ð 
ð.ð .ð .ð .ð .r%   rˆ   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )Ú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.
    c                 ó0   — d| _         d| _        || _        d S )Nr   )Ú	loggedOutÚloggedInÚavatarFactory)r0   rª   s     r$   Ú__init__zRealm.__init__5  s   € ØˆŒØˆŒØ*ˆÔÐÐr%   c                 ó”   — t           |v r2| xj        dz  c_        t           |                      |¦  «        | j        fS t	          ¦   «         ‚©Né   )r   r©   rª   Úlogoutr4   )r0   ÚavatarIdÚmindÚ
interfacess       r$   ÚrequestAvatarzRealm.requestAvatar:  sF   € Ý˜
Ð"Ð"ØˆMŒM˜QÑˆMŒMÝ˜d×0Ò0°Ñ:Ô:¸D¼KÐGÐGÝ!Ñ#Ô#Ð#r%   c                 ó&   — | xj         dz  c_         d S r­   )r¨   r/   s    r$   r¯   zRealm.logout@  s   € ØˆŒ˜!ÑˆŒˆˆr%   N)rT   rU   rV   rW   r«   r³   r¯   rX   r%   r$   r¦   r¦   (  sK   € € € € € ð
ð 
ð+ð +ð +ð
$ð $ð $ðð ð ð ð r%   r¦   c                   ó‚   — e Zd ZdZeZd„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚHTTPAuthHeaderTestsz.
    Tests for L{HTTPAuthSessionWrapper}.
    c                 óN  — d| _         d| _        d| _        d| _        d| _        t          ¦   «         | _        | j                             | j         | j        ¦  «         t          | j        d¦  «        | _	        | j	         
                    | j        t          | j        d¦  «        ¦  «         | j         | j	        i| _        t          | j        j        ¦  «        | _        t          j        | j        | j        g¦  «        | _        g | _        t%          | j        | j        ¦  «        | _        dS )z\
        Create a realm, portal, and L{HTTPAuthSessionWrapper} to use in the tests.
        s   foo bars   bar bazs&   contents of the avatar resource itselfs	   foo-childs'   contents of the foo child of the avatarú
text/plainN)r,   r-   ÚavatarContentÚ	childNameÚchildContentr	   ÚcheckerÚaddUserr   ÚavatarÚputChildÚavatarsr¦   Úgetr+   r   ÚPortalÚcredentialFactoriesr   Úwrapperr/   s    r$   r1   zHTTPAuthHeaderTests.setUpK  sì   € ð #ˆŒØ"ˆŒØFˆÔØ%ˆŒØFˆÔÝ>Ñ@Ô@ˆŒØŒ×Ò˜Tœ]¨D¬MÑ:Ô:Ð:Ý˜4Ô-¨|Ñ<Ô<ˆŒØŒ×Ò˜Tœ^­T°$Ô2CÀ\Ñ-RÔ-RÑSÔSÐSØœ t¤{Ð3ˆŒÝ˜4œ<Ô+Ñ,Ô,ˆŒ
Ý”m D¤J°´°Ñ?Ô?ˆŒØ#%ˆÔ Ý-¨d¬k¸4Ô;SÑTÔTˆŒˆˆr%   c                 ó¦   — t          | j        dz   | j        z   ¦  «        }|j                             dd|z   ¦  «         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}.
        r>   ó   authorizationó   Basic )r!   r,   r-   ÚrequestHeadersÚaddRawHeaderr   rÄ   )r0   r*   Úauthorizations      r$   Ú_authorizedBasicLoginz)HTTPAuthHeaderTests._authorizedBasicLogin^  sP   € õ " $¤-°$Ñ"6¸¼Ñ"FÑGÔGˆØÔ×+Ò+Ð,<¸iÈ-Ñ>WÑXÔXÐXÝ! $¤,°Ñ8Ô8Ð8r%   c                 óò   ‡ ‡— ‰                       ‰ j        g¦  «        Št          ‰ j        ‰¦  «        }‰                     ¦   «         }ˆˆ fd„}|                     |¦  «         ‰                     |¦  «         |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.
        c                 ó>   •— ‰                      ‰j        d¦  «         d S ©Nr’   ©rk   r•   ©Úresultr*   r0   s    €€r$   Ú
cbFinishedz@HTTPAuthHeaderTests.test_getChildWithDefault.<locals>.cbFinishedr  ó"   ø€ Ø×Ò˜WÔ1°3Ñ7Ô7Ð7Ð7Ð7r%   )r)   rº   r   rÄ   ÚnotifyFinishÚaddCallbackr”   ©r0   ÚchildÚdrÒ   r*   s   `   @r$   r�   z,HTTPAuthHeaderTests.test_getChildWithDefaulth  s‰   øø€ ð ×"Ò" D¤NÐ#3Ñ4Ô4ˆÝ" 4¤<°Ñ9Ô9ˆØ× Ò Ñ"Ô"ˆð	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	
�Š�jÑ!Ô!Ð!Ø�Š�uÑÔÐØˆr%   c                 óv  ‡ ‡— ‰ j                              t          d¦  «        ¦  «         ‰                      ‰ j        g¦  «        Š‰j                             d|¦  «         t          ‰ j        ‰¦  «        }‰ 	                    ¦   «         }ˆˆ fd„}| 
                    |¦  «         ‰                     |¦  «         |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.
        r‘   rÆ   c                 ó>   •— ‰                      ‰j        d¦  «         d S rÎ   rÏ   rÐ   s    €€r$   rÒ   zAHTTPAuthHeaderTests._invalidAuthorizationTest.<locals>.cbFinished†  rÓ   r%   )rÃ   Úappendr   r)   rº   rÈ   rÉ   r   rÄ   rÔ   rÕ   r”   )r0   rE   r×   rØ   rÒ   r*   s   `    @r$   Ú_invalidAuthorizationTestz-HTTPAuthHeaderTests._invalidAuthorizationTesty  sÃ   øø€ ð 	Ô ×'Ò'Õ(>¸}Ñ(MÔ(MÑNÔNÐNØ×"Ò" D¤NÐ#3Ñ4Ô4ˆØÔ×+Ò+Ð,<¸hÑGÔGÐGÝ" 4¤<°Ñ9Ô9ˆØ× Ò Ñ"Ô"ˆð	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	
�Š�jÑ!Ô!Ð!Ø�Š�uÑÔÐØˆr%   c                 óL   — |                       dt          d¦  «        z   ¦  «        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Ç   s   foo:bar)rÜ   r!   r/   s    r$   Ú(test_getChildWithDefaultUnauthorizedUserz<HTTPAuthHeaderTests.test_getChildWithDefaultUnauthorizedUser�  s%   € ð ×-Ò-¨i½)ÀJÑ:OÔ:OÑ.OÑPÔPÐPr%   c                 ó\   — |                       dt          | j        dz   ¦  «        z   ¦  «        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/   s    r$   Ú,test_getChildWithDefaultUnauthorizedPasswordz@HTTPAuthHeaderTests.test_getChildWithDefaultUnauthorizedPassword•  s3   € ð ×-Ò-Ø�	 $¤-°'Ñ"9Ñ:Ô:Ñ:ñ
ô 
ð 	
r%   c                 ó,   — |                       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.
        s   Quux foo bar baz)rÜ   r/   s    r$   Ú*test_getChildWithDefaultUnrecognizedSchemez>HTTPAuthHeaderTests.test_getChildWithDefaultUnrecognizedScheme   s   € ð ×-Ò-Ð.AÑBÔBÐBr%   c                 ó@  ‡ ‡— ‰ j                              t          d¦  «        ¦  «         ‰                      ‰ j        g¦  «        Š‰                      ‰¦  «        }‰                     ¦   «         }ˆˆ fd„}|                     |¦  «         ‰                     |¦  «         |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.
        r‘   c                 óJ   •— ‰                      ‰j        ‰j        g¦  «         d S r   )rk   r›   r»   ©Úignoredr*   r0   s    €€r$   rÒ   zJHTTPAuthHeaderTests.test_getChildWithDefaultAuthorized.<locals>.cbFinished´  s'   ø€ Ø×Ò˜Wœ_¨tÔ/@Ð.AÑBÔBÐBÐBÐBr%   )	rÃ   rÛ   r   r)   rº   rË   rÔ   rÕ   r”   rÖ   s   `   @r$   Ú"test_getChildWithDefaultAuthorizedz6HTTPAuthHeaderTests.test_getChildWithDefaultAuthorized¨  s±   øø€ ð 	Ô ×'Ò'Õ(>¸}Ñ(MÔ(MÑNÔNÐNØ×"Ò" D¤NÐ#3Ñ4Ô4ˆØ×*Ò*¨7Ñ3Ô3ˆØ× Ò Ñ"Ô"ˆð	Cð 	Cð 	Cð 	Cð 	Cð 	Cð 	
�Š�jÑ!Ô!Ð!Ø�Š�uÑÔÐØˆr%   c                 ó4  ‡ ‡— ‰ j                              t          d¦  «        ¦  «         ‰                      g ¦  «        Š‰                      ‰¦  «        }‰                     ¦   «         }ˆˆ fd„}|                     |¦  «         ‰                     |¦  «         |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.
        r‘   c                 óJ   •— ‰                      ‰j        ‰j        g¦  «         d S r   )rk   r›   r¹   rå   s    €€r$   rÒ   z=HTTPAuthHeaderTests.test_renderAuthorized.<locals>.cbFinishedÈ  s'   ø€ Ø×Ò˜Wœ_¨tÔ/AÐ.BÑCÔCÐCÐCÐCr%   )rÃ   rÛ   r   r)   rË   rÔ   rÕ   r”   rÖ   s   `   @r$   Útest_renderAuthorizedz)HTTPAuthHeaderTests.test_renderAuthorized»  s¬   øø€ ð 	Ô ×'Ò'Õ(>¸}Ñ(MÔ(MÑNÔNÐNà×"Ò" 2Ñ&Ô&ˆØ×*Ò*¨7Ñ3Ô3ˆØ× Ò Ñ"Ô"ˆð	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	
�Š�jÑ!Ô!Ð!Ø�Š�uÑÔÐØˆr%   c                 óŒ  ‡ ‡‡— t          t          ¦  «         G d„ d¦  «        ¦   «         } |¦   «         Š‰ j                             ‰¦  «         ‰                      ‰ j        g¦  «        Št          ‰ j        ‰¦  «        }‰                     ¦   «         }ˆˆˆ fd„}| 	                    |¦  «         ‰ 
                    |¦  «         |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                   ó   — e Zd ZdZd„ Zd„ ZdS )úUHTTPAuthHeaderTests.test_getChallengeCalledWithRequest.<locals>.DumbCredentialFactorys   dumbc                 ó   — g | _         d S r   )Úrequestsr/   s    r$   r«   z^HTTPAuthHeaderTests.test_getChallengeCalledWithRequest.<locals>.DumbCredentialFactory.__init__Ú  s   € Ø "�”��r%   c                 ó:   — | j                              |¦  «         i S r   )rï   rÛ   rœ   s     r$   r~   zbHTTPAuthHeaderTests.test_getChallengeCalledWithRequest.<locals>.DumbCredentialFactory.getChallengeÝ  s   € Ø”×$Ò$ WÑ-Ô-Ð-Ø�	r%   N)rT   rU   rV   Úschemer«   r~   rX   r%   r$   ÚDumbCredentialFactoryrí   Ö  s7   € € € € € àˆFð#ð #ð #ðð ð ð ð r%   rò   c                 ó@   •— ‰                      ‰j        ‰g¦  «         d S r   )rk   rï   )ræ   Úfactoryr*   r0   s    €€€r$   rÒ   zJHTTPAuthHeaderTests.test_getChallengeCalledWithRequest.<locals>.cbFinishedç  s$   ø€ Ø×Ò˜WÔ-°¨yÑ9Ô9Ð9Ð9Ð9r%   )r   r   rÃ   rÛ   r)   rº   r   rÄ   rÔ   rÕ   r”   )r0   rò   r×   rØ   rÒ   rô   r*   s   `    @@r$   Ú"test_getChallengeCalledWithRequestz6HTTPAuthHeaderTests.test_getChallengeCalledWithRequestÏ  sò   øøø€ õ 
Õ'Ñ	(Ô	(ð	ð 	ð 	ð 	ð 	ñ 	ô 	ñ 
)Ô	(ð	ð (Ð'Ñ)Ô)ˆØÔ ×'Ò'¨Ñ0Ô0Ð0Ø×"Ò" D¤NÐ#3Ñ4Ô4ˆÝ" 4¤<°Ñ9Ô9ˆØ× Ò Ñ"Ô"ˆð	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	
�Š�jÑ!Ô!Ð!Ø�Š�uÑÔÐØˆr%   c                 ó”  — | j                              t          d¦  «        ¦  «          G d„ dt          ¦  «        }| j                             | j         |¦   «         ¦  «         |                      | j        g¦  «        }|                      |¦  «        }| 	                    |¦  «         |  
                    | j        j        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.
        r‘   c                   ó   — e Zd Zd„ ZdS )ú7HTTPAuthHeaderTests._logoutTest.<locals>.SlowerResourcec                 ó   — t           S r   r   rœ   s     r$   r”   z>HTTPAuthHeaderTests._logoutTest.<locals>.SlowerResource.renderú  s   € Ý#Ð#r%   N)rT   rU   rV   r”   rX   r%   r$   ÚSlowerResourcerø   ù  s#   € € € € € ð$ð $ð $ð $ð $r%   rú   r   )rÃ   rÛ   r   r   r¾   r¿   rº   r)   rË   r”   rk   r+   r¨   )r0   rú   r*   r×   s       r$   Ú_logoutTestzHTTPAuthHeaderTests._logoutTestî  sÏ   € ð 	Ô ×'Ò'Õ(>¸}Ñ(MÔ(MÑNÔNÐNð	$ð 	$ð 	$ð 	$ð 	$�Xñ 	$ô 	$ð 	$ð 	Œ×Ò˜Tœ^¨^¨^Ñ-=Ô-=Ñ>Ô>Ð>Ø×"Ò" D¤NÐ#3Ñ4Ô4ˆØ×*Ò*¨7Ñ3Ô3ˆØ�Š�uÑÔÐØ×Ò˜œÔ-¨qÑ1Ô1Ð1Øˆr%   c                 ó–   — |                       ¦   «         }|                     ¦   «          |                      | j        j        d¦  «         dS )zX
        The realm's logout callback is invoked after the resource is rendered.
        r®   N)rû   Úfinishrk   r+   r¨   rœ   s     r$   Útest_logoutzHTTPAuthHeaderTests.test_logout  sF   € ð ×"Ò"Ñ$Ô$ˆØ�ŠÑÔÐØ×Ò˜œÔ-¨qÑ1Ô1Ð1Ð1Ð1r%   c                 óÌ   — |                       ¦   «         }|                     t          t          d¦  «        ¦  «        ¦  «         |                      | j        j        d¦  «         dS )zª
        The realm's logout callback is also invoked if there is an error
        generating the response (for example, if the client disconnects
        early).
        zSimulated disconnectr®   N)rû   ÚprocessingFailedr   r   rk   r+   r¨   rœ   s     r$   Útest_logoutOnErrorz&HTTPAuthHeaderTests.test_logoutOnError  s[   € ð ×"Ò"Ñ$Ô$ˆØ× Ò ¥­Ð8NÑ)OÔ)OÑ!PÔ!PÑQÔQÐQØ×Ò˜œÔ-¨qÑ1Ô1Ð1Ð1Ð1r%   c                 ó   — | j                              t          d¦  «        ¦  «         |                      | j        g¦  «        }|j                             dd¦  «         t          | j        |¦  «        }|  	                    |t          ¦  «         dS )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.
        r‘   rÆ   s   Basic decode should failN)rÃ   rÛ   r   r)   rº   rÈ   rÉ   r   rÄ   ÚassertIsInstancer   )r0   r*   r×   s      r$   Útest_decodeRaisesz%HTTPAuthHeaderTests.test_decodeRaises  s�   € ð 	Ô ×'Ò'Õ(>¸}Ñ(MÔ(MÑNÔNÐNØ×"Ò" D¤NÐ#3Ñ4Ô4ˆØÔ×+Ò+ØÐ9ñ	
ô 	
ð 	
õ # 4¤<°Ñ9Ô9ˆØ×Ò˜eÕ%9Ñ:Ô:Ð:Ð:Ð:r%   c                 ó  — d}|                       | j                             |¦  «        d¦  «         t          d¦  «        }| j                             |¦  «         |                       | j                             |¦  «        |df¦  «         dS )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.
        s   Basic abcdef123456)NNr‘   s   abcdef123456N)rk   rÄ   Ú_selectParseHeaderr   rÃ   rÛ   )r0   ÚbasicAuthorizationrô   s      r$   Útest_selectParseResponsez,HTTPAuthHeaderTests.test_selectParseResponse$  sœ   € ð 3ÐØ×ÒØŒL×+Ò+Ð,>Ñ?Ô?Àñ	
ô 	
ð 	
õ )¨Ñ7Ô7ˆØÔ ×'Ò'¨Ñ0Ô0Ð0Ø×ÒØŒL×+Ò+Ð,>Ñ?Ô?Ø�oÐ&ñ	
ô 	
ð 	
ð 	
ð 	
r%   c                 óº  ‡— t          j        | t          ¦  «        } G d„ dt          ¦  «        Š G ˆfd„d¦  «        }| j                              |¦   «         ¦  «         |                      | j        g¦  «        }|j         	                    dd¦  «         t          | j        |¦  «        }|                     |¦  «         |                      |j        d¦  «         |                      dt!          |¦  «        ¦  «         |                      |d	         d
         j        ‰¦  «         |                      t!          |                      ‰¦  «        ¦  «        d¦  «         dS )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                   ó   — e Zd ZdS )úKHTTPAuthHeaderTests.test_unexpectedDecodeError.<locals>.UnexpectedExceptionN©rT   rU   rV   rX   r%   r$   ÚUnexpectedExceptionr  =  ó   € € € € € ØˆDr%   r  c                   ó$   •— e Zd ZdZd„ Zˆ fd„ZdS )úBHTTPAuthHeaderTests.test_unexpectedDecodeError.<locals>.BadFactorys   badc                 ó   — i S r   rX   )r0   r_   s     r$   r~   zOHTTPAuthHeaderTests.test_unexpectedDecodeError.<locals>.BadFactory.getChallengeC  s   € Ø�	r%   c                 ó   •—  ‰¦   «         ‚r   rX   )r0   rE   r*   r  s      €r$   r@   zIHTTPAuthHeaderTests.test_unexpectedDecodeError.<locals>.BadFactory.decodeF  ó   ø€ Ø)Ð)Ñ+Ô+Ð+r%   N)rT   rU   rV   rñ   r~   r@   ©r  s   €r$   Ú
BadFactoryr  @  sB   ø€ € € € € ØˆFðð ð ð,ð ,ð ,ð ,ð ,ð ,ð ,r%   r  rÆ   s   Bad abcéô  r®   r   Úlog_failureN)r   ÚcreateWithCleanupr   Ú	ExceptionrÃ   rÛ   r)   rº   rÈ   rÉ   r   rÄ   r”   rk   r•   ÚassertEqualsÚlenr  ÚvalueÚflushLoggedErrors)r0   ÚlogObserverr  r*   r×   r  s        @r$   Útest_unexpectedDecodeErrorz.HTTPAuthHeaderTests.test_unexpectedDecodeError5  su  ø€ õ +Ô<¸TÕCUÑVÔVˆð	ð 	ð 	ð 	ð 	¥)ñ 	ô 	ð 	ð	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	Ô ×'Ò'¨
¨
©¬Ñ5Ô5Ð5Ø×"Ò" D¤NÐ#3Ñ4Ô4ˆØÔ×+Ò+Ð,<¸jÑIÔIÐIÝ" 4¤<°Ñ9Ô9ˆØ�Š�uÑÔÐØ×Ò˜Ô-¨sÑ3Ô3Ð3Ø×Ò˜!�S Ñ-Ô-Ñ.Ô.Ð.Ø×Ò˜k¨!œn¨]Ô;ÔAÐCVÑWÔWÐWØ×Ò�˜T×3Ò3Ð4GÑHÔHÑIÔIÈ1ÑMÔMÐMÐMÐMr%   c                 óÒ  ‡— t          j        | t          ¦  «        } G d„ dt          ¦  «        Š G ˆfd„d¦  «        }| j                              |¦   «         ¦  «         | j                             t          d¦  «        ¦  «         |  	                    | j
        g¦  «        }|                      |¦  «        }|                     |¦  «         |                      |j        d¦  «         |                      dt!          |¦  «        ¦  «         |                      |d         d	         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                   ó   — e Zd ZdS )úJHTTPAuthHeaderTests.test_unexpectedLoginError.<locals>.UnexpectedExceptionNr  rX   r%   r$   r  r"  Z  r  r%   r  c                   ó    •— e Zd ZefZˆ fd„ZdS )úDHTTPAuthHeaderTests.test_unexpectedLoginError.<locals>.BrokenCheckerc                 ó   •—  ‰¦   «         ‚r   rX   )r0   Úcredentialsr  s     €r$   ÚrequestAvatarIdzTHTTPAuthHeaderTests.test_unexpectedLoginError.<locals>.BrokenChecker.requestAvatarId`  r  r%   N)rT   rU   rV   r
   ÚcredentialInterfacesr'  r  s   €r$   ÚBrokenCheckerr$  ]  s7   ø€ € € € € Ø$5Ð#7Ð ð,ð ,ð ,ð ,ð ,ð ,ð ,r%   r)  r‘   r  r®   r   r  N)r   r  r   r  r   ÚregisterCheckerrÃ   rÛ   r   r)   rº   rË   r”   rk   r•   r  r  r  r  r  )r0   r  r)  r*   r×   r  s        @r$   Útest_unexpectedLoginErrorz-HTTPAuthHeaderTests.test_unexpectedLoginErrorS  s|  ø€ õ
 +Ô<¸TÕCUÑVÔVˆð	ð 	ð 	ð 	ð 	¥)ñ 	ô 	ð 	ð	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	Œ×#Ò# M M¡O¤OÑ4Ô4Ð4ØÔ ×'Ò'Õ(>¸}Ñ(MÔ(MÑNÔNÐNØ×"Ò" D¤NÐ#3Ñ4Ô4ˆØ×*Ò*¨7Ñ3Ô3ˆØ�Š�uÑÔÐØ×Ò˜Ô-¨sÑ3Ô3Ð3Ø×Ò˜!�S Ñ-Ô-Ñ.Ô.Ð.Ø×Ò˜k¨!œn¨]Ô;ÔAÐCVÑWÔWÐWØ×Ò�˜T×3Ò3Ð4GÑHÔHÑIÔIÈ1ÑMÔMÐMÐMÐMr%   c                 ó<  ‡ ‡‡— dŠt          ¦   «         ‰ j        t          <   ‰ j        t                                        ‰ j        t          ‰d¦  «        ¦  «         ‰ j                             t          ¦   «         ¦  «         ‰ j	         
                    t          d¦  «        ¦  «         ‰                      ‰ j        g¦  «        Št          ‰ j        ‰¦  «        }‰                     ¦   «         }ˆˆ ˆfd„}|                     |¦  «         ‰                     |¦  «         |S )zl
        Anonymous requests are allowed if a L{Portal} has an anonymous checker
        registered.
        s*   contents of the unprotected child resourcer¸   r‘   c                 ó@   •— ‰                      ‰j        ‰g¦  «         d S r   )rk   r›   )ræ   r*   r0   ÚunprotectedContentss    €€€r$   rÒ   z<HTTPAuthHeaderTests.test_anonymousAccess.<locals>.cbFinished  s%   ø€ Ø×Ò˜Wœ_Ð/BÐ.CÑDÔDÐDÐDÐDr%   )r   rÀ   r   r¿   rº   r   r   r*  r   rÃ   rÛ   r   r)   r   rÄ   rÔ   rÕ   r”   )r0   r×   rØ   rÒ   r*   r.  s   `   @@r$   Útest_anonymousAccessz(HTTPAuthHeaderTests.test_anonymousAccessm  s  øøø€ ð
 LÐå"*¡*¤*ˆŒ•YÑØŒ•YÔ×(Ò(ØŒN�DÐ!4°lÑCÔCñ	
ô 	
ð 	
ð 	Œ×#Ò#Õ$8Ñ$:Ô$:Ñ;Ô;Ð;àÔ ×'Ò'Õ(>¸}Ñ(MÔ(MÑNÔNÐNØ×"Ò" D¤NÐ#3Ñ4Ô4ˆÝ" 4¤<°Ñ9Ô9ˆØ× Ò Ñ"Ô"ˆð	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	
�Š�jÑ!Ô!Ð!Ø�Š�uÑÔÐØˆr%   N)rT   rU   rV   rW   r   r)   r1   rË   r�   rÜ   rÞ   rà   râ   rç   rê   rõ   rû   rþ   r  r  r  r  r+  r/  rX   r%   r$   r¶   r¶   D  sB  € € € € € ðð ð €KðUð Uð Uð&9ð 9ð 9ðð ð ð"ð ð ð(Qð Qð Qð	
ð 	
ð 	
ðCð Cð Cðð ð ð&ð ð ð(ð ð ð>ð ð ð,2ð 2ð 2ð2ð 2ð 2ð;ð ;ð ;ð
ð 
ð 
ð"Nð Nð Nð<Nð Nð Nð4ð ð ð ð r%   r¶   )9rW   r    Úzope.interfacer   Úzope.interface.verifyr   Útwisted.credr   r   Útwisted.cred.checkersr   r   r	   Útwisted.cred.credentialsr
   Útwisted.internet.addressr   Útwisted.internet.errorr   Útwisted.internet.testingr   Útwisted.loggerr   Útwisted.python.failurer   Útwisted.trialr   Útwisted.web._authr   r   Útwisted.web._auth.basicr   Útwisted.web._auth.wrapperr   r   Útwisted.web.iwebr   Útwisted.web.resourcer   r   r   Útwisted.web.serverr   Útwisted.web.staticr   Útwisted.web.test.test_webr   r!   r'   rZ   ÚTestCasera   rc   rˆ   ÚIRealmr¦   r¶   rX   r%   r$   ú<module>rE     s7  ððð ð
 €€€à &Ð &Ð &Ð &Ð &Ð &Ø .Ð .Ð .Ð .Ð .Ð .à &Ð &Ð &Ð &Ð &Ð &Ð &Ð &ðð ð ð ð ð ð ð ð ð ð
 7Ð 6Ð 6Ð 6Ð 6Ð 6Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø -Ð -Ð -Ð -Ð -Ð -Ø *Ð *Ð *Ð *Ð *Ð *Ø "Ð "Ð "Ð "Ð "Ð "Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø :Ð :Ð :Ð :Ð :Ð :Ø RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ /Ð /Ð /Ð /Ð /Ð /Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ +Ð +Ð +Ð +Ð +Ð +Ø #Ð #Ð #Ð #Ð #Ð #Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ð'ð 'ð 'ðM
ð M
ð M
ð M
ð M
ñ M
ô M
ð M
ð`ð ð ð ð ñ ô ð ðð ð ð ð �\Ð#6¸Ô8Iñ ô ð ðH+ð H+ð H+ð H+ð H+�l HÔ$5ñ H+ô H+ð H+ðVJ.ð J.ð J.ð J.ð J. ¨hÔ.?ñ J.ô J.ð J.ðZ €ˆFŒMÑ Ô Ð ðð ð ð ð ñ ô ð ð8@ð @ð @ð @ð @˜(Ô+ñ @ô @ð @ð @ð @r%   