Ë
    ojò7  ã                   ó`  — d Z ddlmZmZ ddlmZmZ ddlmZ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 eZ edddd«      Z G d„ de«      Z G d„ d«      Z ee«       G d„ dej4                  «      «       Z ej8                  eee«        G d„ de	j:                  «      Z eee«       G d„ d«      «       Z eej@                  «       G d„ d«      «       Z! G d„ dejD                  «      Z# G d„ dejD                  «      Z$ G d„ dejD                  «      Z% G d „ d!«      Z& G d"„ d#«      Z' G d$„ d%e'«      Z( G d&„ d'e'«      Z) G d(„ d)e'e&ejD                  «      Z* G d*„ d+e(e&ejD                  «      Z+ G d,„ d-e)e&ejD                  «      Z, G d.„ d/ejD                  «      Z-y
# e$ r d
ZY �Œlw xY w)0z6
Tests for L{twisted.cred}, now with 30% more starch.
é    )ÚhexlifyÚ	unhexlify)Ú	InterfaceÚimplementer)ÚcheckersÚcredentialsÚerrorÚportal)Údefer)Ú
components)ÚVersion)Úunittest)ÚcryptNÚTwistedé   é   c                   ó   — e Zd ZdZy)Ú	ITestablez2
    An interface for a theoretical protocol.
    N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    ú=/usr/lib/python3/dist-packages/twisted/cred/test/test_cred.pyr   r      s   „ ñð 	r   r   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)Ú
TestAvatarz
    A test avatar.
    c                 ó.   — || _         d| _        d| _        y )NF)ÚnameÚloggedInÚ	loggedOut)Úselfr    s     r   Ú__init__zTestAvatar.__init__,   s   € ØˆŒ	ØˆŒØˆ�r   c                 ó.   — | j                   rJ ‚d| _         y ©NT)r!   ©r#   s    r   ÚloginzTestAvatar.login1   s   € Ø—=’=Ð Ð Øˆ�r   c                 ó   — d| _         y r&   )r"   r'   s    r   ÚlogoutzTestAvatar.logout5   s	   € Øˆ�r   N)r   r   r   r   r$   r(   r*   r   r   r   r   r   '   s   „ ñòò
ór   r   c                   ó   — e Zd ZdZy)ÚTestablez-
    A theoretical protocol for testing.
    Nr   r   r   r   r,   r,   9   s   „ ñð 	r   r,   c                   ó   — e Zd Zy)ÚIDerivedCredentialsN©r   r   r   r   r   r   r.   r.   E   s   „ Ør   r.   c                   ó   — e Zd Zd„ Zd„ Zy)ÚDerivedCredentialsc                 ó    — || _         || _        y ©N)ÚusernameÚpassword)r#   r4   r5   s      r   r$   zDerivedCredentials.__init__K   s   € Ø ˆŒØ ˆ�r   c                 ó    — || j                   k(  S r3   )r5   ©r#   r5   s     r   ÚcheckPasswordz DerivedCredentials.checkPasswordO   s   € Ø˜4Ÿ=™=Ñ(Ð(r   N)r   r   r   r$   r8   r   r   r   r1   r1   I   s   „ ò!ó)r   r1   c                   ó   — e Zd ZdZd„ Zd„ Zy)Ú	TestRealmz
    A basic test realm.
    c                 ó   — i | _         y r3   )Úavatarsr'   s    r   r$   zTestRealm.__init__Y   s	   € Øˆ�r   c                 óÈ   — || j                   v r| j                   |   }nt        |«      }|| j                   |<   |j                  «        |d    |d   |«      |j                  fS )Nr   )r<   r   r(   r*   )r#   ÚavatarIdÚmindÚ
interfacesÚavatars        r   ÚrequestAvatarzTestRealm.requestAvatar\   s]   € Ø�t—|‘|Ñ#Ø—\‘\ (Ñ+‰Fä Ó)ˆFØ%+ˆD�L‰L˜Ñ"Ø�‰ŒØ˜1‘˜}˜z¨!™}¨VÓ4°f·m±mÐDÐDr   N)r   r   r   r   r$   rB   r   r   r   r:   r:   S   s   „ ñòóEr   r:   c                   ó4   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	Ú	CredTestsz^
    Tests for the meat of L{twisted.cred} -- realms, portals, avatars, and
    checkers.
    c                 ó  — t        «       | _        t        j                  | j                  «      | _        t	        j
                  «       | _        | j                  j                  dd«       | j                  j                  | j                  «       y )Nó   bobó   hello)	r:   Úrealmr
   ÚPortalr   Ú'InMemoryUsernamePasswordDatabaseDontUseÚcheckerÚaddUserÚregisterCheckerr'   s    r   ÚsetUpzCredTests.setUpl   sY   € Ü“[ˆŒ
Ü—m‘m D§J¡JÓ/ˆŒÜ×GÑGÓIˆŒØ�‰×Ñ˜V XÔ.Ø�‰×#Ñ# D§L¡LÕ1r   c                 óÀ   — t         j                  t         j                  g}| j                  j	                  «       }| j                  t        |«      t        |«      «       y)zÀ
        The checkers in a portal can check only certain types of credentials.
        Since this portal has
        L{checkers.InMemoryUsernamePasswordDatabaseDontUse} registered, it
        N)r   ÚIUsernamePasswordÚIUsernameHashedPasswordr
   ÚlistCredentialsInterfacesÚassertEqualÚsorted)r#   ÚexpectedÚgots      r   Útest_listCheckerszCredTests.test_listCheckerss   sE   € ô  ×1Ñ1´;×3VÑ3VÐWˆØ�k‰k×3Ñ3Ó5ˆØ×Ñœ ›¤f¨XÓ&6Õ7r   c                 óþ  — | j                  | j                  j                  t        j                  dd«      | t
        «      «      }|\  }}}| j                  |t
        «       | j                  |j                  |«      |› d|› �«       | j                  |j                  j                  «       | j                  |j                  j                   «        |«        | j                  |j                  j                  «       y)zˆ
        Calling C{login} on a portal with correct credentials and an interface
        that the portal's realm supports works.
        rF   rG   ú does not implement N)ÚsuccessResultOfr
   r(   r   ÚUsernamePasswordr   rS   Ú
assertTrueÚ
providedByÚoriginalr!   r"   ©r#   r(   ÚifaceÚimplr*   s        r   Útest_basicLoginzCredTests.test_basicLogin}   sË   € ð
 ×$Ñ$Ø�K‰K×ÑÜ×,Ñ,¨V°XÓ>ÀÄióó
ˆð
 $Ñˆˆt�Vð 	×Ñ˜¤	Ô*Ø�‰˜×(Ñ(¨Ó.°4°&Ð8LÈUÈGÐ0TÔUð 	�‰˜Ÿ™×.Ñ.Ô/Ø�‰˜DŸM™M×3Ñ3Ð3Ô4ÙŒØ�‰˜Ÿ™×/Ñ/Õ0r   c                 óê  — | j                  | j                  j                  t        dd«      | t        «      «      }|\  }}}| j                  |t        «       | j                  |j                  |«      |› d|› �«       | j                  |j                  j                  «       | j                  |j                  j                   «        |«        | j                  |j                  j                  «       y)z~
        Logging in with correct derived credentials and an interface
        that the portal's realm supports works.
        rF   rG   rY   N)rZ   r
   r(   r1   r   rS   r\   r]   r^   r!   r"   r_   s        r   Útest_derivedInterfacezCredTests.test_derivedInterface“   sÃ   € ð
 ×$Ñ$Ø�K‰K×ÑÔ0°¸ÓBÀDÌ)ÓTó
ˆð $Ñˆˆt�Vð 	×Ñ˜¤	Ô*Ø�‰˜×(Ñ(¨Ó.°4°&Ð8LÈUÈGÐ0TÔUð 	�‰˜Ÿ™×.Ñ.Ô/Ø�‰˜DŸM™M×3Ñ3Ð3Ô4ÙŒØ�‰˜Ÿ™×/Ñ/Õ0r   c                 ó  — | j                  | j                  j                  t        j                  dd«      | t
        «      «      }| j                  |«       | j                  t        j                  |j                  «       y)z•
        Calling C{login} with incorrect credentials (in this case a wrong
        password) causes L{error.UnauthorizedLogin} to be raised.
        rF   s   h3lloN©ÚfailureResultOfr
   r(   r   r[   r   r\   rS   r	   ÚUnauthorizedLoginÚtype©r#   r(   s     r   Útest_failedLoginPasswordz"CredTests.test_failedLoginPassword§   ób   € ð
 ×$Ñ$Ø�K‰K×ÑÜ×,Ñ,¨V°XÓ>ÀÄióó
ˆð
 	�‰˜ÔØ×Ñœ×0Ñ0°%·*±*Õ=r   c                 ó  — | j                  | j                  j                  t        j                  dd«      | t
        «      «      }| j                  |«       | j                  t        j                  |j                  «       y)z’
        Calling C{login} with incorrect credentials (in this case no known
        user) causes L{error.UnauthorizedLogin} to be raised.
        s   jayrG   Nrf   rj   s     r   Útest_failedLoginNamezCredTests.test_failedLoginName´   rl   r   N)
r   r   r   r   rN   rW   rb   rd   rk   rn   r   r   r   rD   rD   f   s%   „ ñò
2ò8ò1ò,1ò(>ó>r   rD   c                   ó8   — e Zd Zg d¢Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	ÚOnDiskDatabaseTests©)ó   user1s   pass1)ó   user2s   pass2)ó   user3s   pass3c                 óâ   — | j                  «       | _        t        | j                  d«      5 }| j                  D ]  \  }}|j	                  |dz   |z   dz   «       Œ! 	 d d d «       y # 1 sw Y   y xY w)NÚwbó   :ó   
)ÚmktempÚdbfileÚopenÚusersÚwrite)r#   ÚfÚuÚps       r   rN   zOnDiskDatabaseTests.setUpÉ   sd   € Ø—k‘k“mˆŒÜ�$—+‘+˜tÓ$ð 	.¨ØŸ
™
ò .‘��1Ø—‘˜˜D™ 1™ uÑ,Õ-ñ.÷	.÷ 	.ñ 	.ús   ¬/A%Á%A.c                 ó¢   — t        j                  d«      | _        | j                  t        j
                  | j                  j                  d«       y)zg
        A missing db file will cause a permanent rejection of authorization
        attempts.
        ztest_thisbetternoteverexist.dbÚuserN)r   ÚFilePasswordDBÚdbÚassertRaisesr	   rh   ÚgetUserr'   s    r   Útest_getUserNonexistentDatabasez3OnDiskDatabaseTests.test_getUserNonexistentDatabaseÏ   s7   € ô
 ×)Ñ)Ð*JÓKˆŒà×Ñœ%×1Ñ1°4·7±7·?±?ÀFÕKr   c                 ó@  — t        j                  | j                  «      | _        | j                  D ]k  \  }}| j                  t        | j                  j                  |j                  «       «       | j                  | j                  j                  |«      ||f«       Œm y r3   )
r   rƒ   rz   r„   r|   r…   ÚKeyErrorr†   ÚupperrS   ©r#   r   r€   s      r   ÚtestUserLookupz"OnDiskDatabaseTests.testUserLookupØ   sp   € Ü×)Ñ)¨$¯+©+Ó6ˆŒØ—J‘Jò 	9‰DˆAˆqØ×Ñœh¨¯©¯©¸¿¹»ÔCØ×Ñ˜TŸW™WŸ_™_¨QÓ/°!°Q°Õ8ñ	9r   c                 óî   — t        j                  | j                  d¬«      | _        | j                  D ]@  \  }}| j                  | j                  j                  |j                  «       «      ||f«       ŒB y )NF)ÚcaseSensitive)r   rƒ   rz   r„   r|   rS   r†   rŠ   r‹   s      r   ÚtestCaseInSensitivityz)OnDiskDatabaseTests.testCaseInSensitivityÞ   sZ   € Ü×)Ñ)¨$¯+©+ÀUÔKˆŒØ—J‘Jò 	A‰DˆAˆqØ×Ñ˜TŸW™WŸ_™_¨Q¯W©W«YÓ7¸!¸Q¸Õ@ñ	Ar   c           	      óÜ  — t        j                  | j                  «      | _        | j                  D ��cg c]  \  }}t        j                  ||«      ‘Œ }}}t        j                  |D �cg c],  }t        j                  | j                  j                  |«      ‘Œ. c}«      }|j                  | j                  | j                  D ��cg c]  \  }}|‘Œ	 c}}«       |S c c}}w c c}w c c}}w r3   )r   rƒ   rz   r„   r|   r   r[   r   ÚgatherResultsÚmaybeDeferredÚrequestAvatarIdÚaddCallbackrS   )r#   r   r€   ÚcredsÚcÚds         r   ÚtestRequestAvatarIdz'OnDiskDatabaseTests.testRequestAvatarIdã   s¯   € Ü×)Ñ)¨$¯+©+Ó6ˆŒØ@DÇ
Á
×K¹¸¸1”×-Ñ-¨a°Õ3ÐKˆÑKÜ×ÑØFKÖLÀŒU× Ñ  §¡×!8Ñ!8¸!Õ<ÒLó
ˆð 	
�‰�d×&Ñ&°t·z±z×(B©t¨q°!ªÓ(BÔCØˆùó LùâLùã(Bs   ´ CÁ*1C#ÃC(c           	      óð  — t        j                  | j                  «      | _        | j	                  ddt
        «      }| j                  D ��cg c]  \  }} |||«      ‘Œ }}}t        j                  |D �cg c],  }t        j                  | j                  j                  |«      ‘Œ. c}«      }|j                  | j                  | j                  D ��cg c]  \  }}|‘Œ	 c}}«       |S c c}}w c c}w c c}}w )Nútwisted.cred.credentialsÚUsernameHashedPassword)r   rƒ   rz   r„   ÚgetDeprecatedModuleAttributeÚ_uhpVersionr|   r   r‘   r’   r“   r”   rS   )r#   r›   r   r€   r•   r–   r—   s          r   ÚtestRequestAvatarId_hashedz.OnDiskDatabaseTests.testRequestAvatarId_hashedì   sÅ   € Ü×)Ñ)¨$¯+©+Ó6ˆŒØ!%×!BÑ!BØ&Ð(@Ä+ó"
Ðð ;?¿*¹*×E±$°!°QÑ'¨¨1Õ-ÐEˆÑEÜ×ÑØFKÖLÀŒU× Ñ  §¡×!8Ñ!8¸!Õ<ÒLó
ˆð 	
�‰�d×&Ñ&°t·z±z×(B©t¨q°!ªÓ(BÔCØˆùó FùâLùã(Bs   ÁC'Á41C-ÃC2N)
r   r   r   r|   rN   r‡   rŒ   r�   r˜   rž   r   r   r   rp   rp   Â   s)   „ ò€Eò.òLò9òAò
ó
r   rp   c                   óZ   — e Zd Zg d¢Zd„ Zdedededefd„Zd„ Zd	„ Zd
„ Z	d„ Z
d„ Ze€dZyy)Ú!HashedPasswordOnDiskDatabaseTestsrq   c                 óÊ  — | j                  «       }t        j                  || j                  ¬«      | _        t        |d«      5 }| j                  D ]3  \  }}|j                  |dz   | j                  |||d d «      z   dz   «       Œ5 	 d d d «       t        «       }t        j                  |«      | _        | j                  j                  | j                  «       y # 1 sw Y   ŒSxY w)N)Úhashrv   rw   r   rx   )ry   r   rƒ   r¢   r„   r{   r|   r}   r:   r
   rI   ÚportrM   )r#   rz   r~   r   r€   Úrs         r   rN   z'HashedPasswordOnDiskDatabaseTests.setUp   s¿   € Ø—‘“ˆÜ×)Ñ)¨&°t·y±yÔAˆŒÜ�&˜$Óð 	C 1ØŸ
™
ò C‘��1Ø—‘˜˜D™ 4§9¡9¨Q°°1°R°a°5Ó#9Ñ9¸EÑAÕBñC÷	Cô ‹KˆÜ—M‘M !Ó$ˆŒ	Ø�	‰	×!Ñ! $§'¡'Õ*÷	Cð 	Cús   ÁACÃC"r   r€   ÚsÚreturnc                 óx   — t        |j                  d«      |j                  d«      «      }|j                  d«      S )NÚascii)r   ÚdecodeÚencode)r#   r   r€   r¥   Úhashed_passwords        r   r¢   z&HashedPasswordOnDiskDatabaseTests.hash  s1   € Ü §¡¨Ó 1°1·8±8¸GÓ3DÓEˆØ×%Ñ% gÓ.Ð.r   c           	      óv  — | j                   D ��cg c]  \  }}t        j                  ||«      ‘Œ }}}t        j                  |D �cg c]  }| j
                  j                  |«      ‘Œ c}«      }|j                  | j                  | j                   D ��cg c]  \  }}|‘Œ	 c}}«       |S c c}}w c c}w c c}}w r3   )	r|   r   r[   r   r‘   r„   r“   r”   rS   ©r#   r   r€   Ú	goodCredsr–   r—   s         r   ÚtestGoodCredentialsz5HashedPasswordOnDiskDatabaseTests.testGoodCredentials  sŒ   € ØDHÇJÁJ×O¹D¸A¸q”[×1Ñ1°!°QÕ7ÐOˆ	ÑOÜ×ÑÀYÖ OÀ §¡×!8Ñ!8¸Õ!;Ò OÓPˆØ	�‰�d×&Ñ&°t·z±z×(B©t¨q°!ªÓ(BÔCØˆùó PùÚ OùÛ(Bs   � B*Á"B0ÂB5c           
      ó¦  — | j                   D ��cg c]  \  }}t        j                  ||«      ‘Œ }}}t        j                  |D �cg c]#  }| j
                  j                  |d t        «      ‘Œ% c}«      }|j                  d„ «       |j                  | j                  | j                   D ��cg c]  \  }}|‘Œ	 c}}«       |S c c}}w c c}w c c}}w )Nc                 óh   — | D ���cg c]  \  }}}|j                   j                  ‘Œ c}}}S c c}}}w r3   )r^   r    )ÚxÚiÚaÚls       r   ú<lambda>zMHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<lambda>  s%   € À× BÐ B±W°Q¸¸1 §¡§£Ô B€ ùÔ Bs   ‡!-)
r|   r   r[   r   r‘   r£   r(   r   r”   rS   r­   s         r   ÚtestGoodCredentials_loginz;HashedPasswordOnDiskDatabaseTests.testGoodCredentials_login  s£   € ØDHÇJÁJ×O¹D¸A¸q”[×1Ñ1°!°QÕ7ÐOˆ	ÑOÜ×ÑØ:CÖD°QˆT�Y‰Y�_‰_˜Q ¤iÕ0ÒDó
ˆð 	
�‰ÑBÔCØ	�‰�d×&Ñ&°t·z±z×(B©t¨q°!ªÓ(BÔCØˆùó PùâDùó )Cs   � CÁ(CÂ,Cc           
      ó\  — | j                   D ��cg c]  \  }}t        j                  |d«      ‘Œ }}}t        j                  |D �cg c]#  }| j
                  j                  |d t        «      ‘Œ% c}d¬«      }|j                  | j                  t        j                  «       |S c c}}w c c}w )Ns   wrong passwordT©ÚconsumeErrors)r|   r   r[   r   ÚDeferredListr£   r(   r   r”   Ú_assertFailuresr	   rh   )r#   r   r€   ÚbadCredsr–   r—   s         r   ÚtestBadCredentialsz4HashedPasswordOnDiskDatabaseTests.testBadCredentials  s’   € àKOÏ:É:÷
ÙCGÀ1ÀaŒK×(Ñ(¨Ð,=Õ>ð
ˆñ 
ô ×ÑØ:BÖC°QˆT�Y‰Y�_‰_˜Q ¤iÕ0ÒCÐSWô
ˆð 	
�‰�d×*Ñ*¬E×,CÑ,CÔDØˆùó
ùò Ds   � B#Á(B)c                 ó˜  — | j                  ddt        «      }| j                  D ��cg c]"  \  }} ||| j                  d ||d d «      «      ‘Œ$ }}}t	        j
                  |D �cg c]#  }| j                  j                  |d t        «      ‘Œ% c}d¬«      }|j                  | j                  t        j                  «       |S c c}}w c c}w )Nrš   r›   r   Tr¹   )rœ   r�   r|   r¢   r   r»   r£   r(   r   r”   r¼   r	   ÚUnhandledCredentials)r#   r›   r   r€   ÚhashedCredsr–   r—   s          r   ÚtestHashedCredentialsz7HashedPasswordOnDiskDatabaseTests.testHashedCredentials(  s¼   € Ø!%×!BÑ!BØ&Ð(@Ä+ó"
Ðð NRÏZÉZ÷
ÙEIÀQÈÑ" 1 d§i¡i°°a¸¸2¸A¸Ó&?Õ@ð
ˆñ 
ô ×ÑØ:EÖF°QˆT�Y‰Y�_‰_˜Q ¤iÕ0ÒFØô
ˆð 	
�‰�d×*Ñ*¬E×,FÑ,FÔGØˆùó
ùò Gs   §'CÁ$(Cc                 óv   — |D ]4  \  }}| j                  |t        j                  «        |j                  |Ž  Œ6 y r3   )rS   r   ÚFAILUREÚtrap)r#   ÚfailuresÚexpectedFailuresÚflagÚfailures        r   r¼   z1HashedPasswordOnDiskDatabaseTests._assertFailures6  s=   € Ø%ò 	,‰MˆD�'Ø×Ñ˜T¤5§=¡=Ô1ØˆG�L‰LÐ*Ò+ð	,ð r   Nzcrypt module not available)r   r   r   r|   rN   Úbytesr¢   r¯   r·   r¾   rÂ   r¼   r   Úskipr   r   r   r    r    ù   sY   „ ò€Eò	+ð/�eð / ð /¨%ð /°Eó /òòòòòð €}Ø+‰ð r   r    c                   óX   — e Zd ZdZej
                  d„ «       Zej
                  d„ «       Zy)ÚCheckersMixinaË  
    L{unittest.TestCase} mixin for testing that some checkers accept
    and deny specified credentials.

    Subclasses must provide
      - C{getCheckers} which returns a sequence of
        L{checkers.ICredentialChecker}
      - C{getGoodCredentials} which returns a list of 2-tuples of
        credential to check and avaterId to expect.
      - C{getBadCredentials} which returns a list of credentials
        which are expected to be unauthorized.
    c              #   ó°   K  — | j                  «       D ]?  }| j                  «       D ]*  \  }}|j                  |«      –—}| j                  ||«       Œ, ŒA y­w)zt
        The given credentials are accepted by all the checkers, and give
        the expected C{avatarID}s
        N)ÚgetCheckersÚgetGoodCredentialsr“   rS   )r#   ÚchkÚcredr>   r¤   s        r   Útest_positivezCheckersMixin.test_positiveN  s_   è ø€ ð ×#Ñ#Ó%ò 	.ˆCØ"&×"9Ñ"9Ó";ò .‘��hØ×-Ñ-¨dÓ3Ñ3�Ø× Ñ   HÕ-ñ.ñ	.ùs   ‚AAc              #   óÆ   K  — | j                  «       D ]J  }| j                  «       D ]5  }|j                  |«      }| j                  |t        j
                  «      –— Œ7 ŒL y­w)zI
        The given credentials are rejected by all the checkers.
        N)rÏ   ÚgetBadCredentialsr“   ÚassertFailurer	   rh   )r#   rÑ   rÒ   r—   s       r   Útest_negativezCheckersMixin.test_negativeY  se   è ø€ ð
 ×#Ñ#Ó%ò 	EˆCØ×.Ñ.Ó0ò E�Ø×'Ñ'¨Ó-�Ø×(Ñ(¨¬E×,CÑ,CÓDÓDñEñ	Eùs   ‚AA!N)r   r   r   r   r   ÚinlineCallbacksrÓ   r×   r   r   r   rÍ   rÍ   @  s=   „ ñð ×Ññ.ó ð.ð ×ÑñEó ñEr   rÍ   c                   ó\   — e Zd Zej                  ZdZededefd„«       Z	g d¢Z
d„ Zd„ Zd„ Zy)	ÚHashlessFilePasswordDBMixinNr²   r¦   c                 ó   — | S r3   r   ©r²   s    r   ÚnetworkHashz'HashlessFilePasswordDBMixin.networkHashh  s   € àˆr   ))rr   ó	   password1)rs   s	   password2)rt   ó	   password3c              #   ó~   K  — | j                   D ]*  \  }}| j                  || j                  |«      «      |f–— Œ, y ­wr3   )Ú_validCredentialsÚ	credClassrÝ   r‹   s      r   rÐ   z.HashlessFilePasswordDBMixin.getGoodCredentialsr  s@   è ø€ Ø×*Ñ*ò 	<‰DˆAˆqØ—.‘.  D×$4Ñ$4°QÓ$7Ó8¸!Ð;Ó;ñ	<ùs   ‚;=c              #   óf   K  — dD ](  \  }}| j                  || j                  |«      «      –— Œ* y ­w)N))rr   rß   )rs   rÞ   )s   bloofs   blarf)râ   rÝ   r‹   s      r   rÕ   z-HashlessFilePasswordDBMixin.getBadCredentialsv  s9   è ø€ ð
ò 	9‰DˆAˆqð
 —.‘.  D×$4Ñ$4°QÓ$7Ó8Ó8ñ	9ùs   ‚/1c           
   #   óš  ‡ K  — ‰ j                   xs d„ }‰ j                   xr ˆ fd„}dD �]w  }‰ j                  «       }t        |d«      5 }‰ j                  D ]%  \  }}|j	                  |dz    ||«      z   dz   «       Œ' 	 d d d «       t        j                  |||¬«      –— ‰ j                  «       }t        |d«      5 }‰ j                  D ]%  \  }}|j	                   ||«      dz   |z   dz   «       Œ' 	 d d d «       t        j                  |d	d
d||¬«      –— ‰ j                  «       }t        |d«      5 }‰ j                  D ]6  \  }}|j	                  d|j                  «       z   dz    ||«      z   dz   «       Œ8 	 d d d «       t        j                  |dddd||¬«      –— �Œz y # 1 sw Y   �Œ(xY w# 1 sw Y   ŒÀxY w# 1 sw Y   ŒDxY w­w)Nc                 ó   — | S r3   r   rÜ   s    r   r¶   z9HashlessFilePasswordDBMixin.getCheckers.<locals>.<lambda>  s   € ¨q€ r   c                 ó&   •— ‰j                  |«      S r3   )ÚdiskHash)r4   r5   Ústoredr#   s      €r   r¶   z9HashlessFilePasswordDBMixin.getCheckers.<locals>.<lambda>�  s   ø€ ¨t¯}©}¸XÓ/F€ r   )TFrv   rw   rx   )Úcacher¢   s    dingle dongle ó    é   r   s   zip,zap,s   ,zup,ó   ,r   é   F)rç   ry   r{   rá   r}   r   rƒ   Útitle)r#   rç   Ú	hashCheckré   ÚfnÚfObjr   r€   s   `       r   rÏ   z'HashlessFilePasswordDBMixin.getCheckers~  sÎ  øè ø€ Ø—=‘=Ò1¡[ˆØ—M‘Mò 
ÛFð 	ð !ó 	ˆEØ—‘“ˆBÜ�b˜$“ð ? 4Ø ×2Ñ2ò ?‘D�A�qØ—J‘J˜q 4™x©(°1«+Ñ5¸Ñ=Õ>ñ?÷?ô ×)Ñ)¨"°EÀ	ÔJÒJà—‘“ˆBÜ�b˜$“ð M 4Ø ×2Ñ2ò M‘D�A�qØ—J‘J™x¨›{Ð-?Ñ?À!ÑCÀeÑKÕLñM÷Mô ×)Ñ)¨"¨d°A°qÀÈIÔVÒVà—‘“ˆBÜ�b˜$“ð  4Ø ×2Ñ2ò ‘D�A�qØ—J‘JØ# a§g¡g£iÑ/°(Ñ:¹XÀa»[ÑHÈ5ÑPõñ÷ô
 ×)Ñ)Ø�D˜!˜Q ¨U¸ôô ñ'	÷?ñ ?ú÷Mð Mú÷ð üsP   ƒAGÁ
5F&Â >GÂ>5F3Ã4AGÄ5AF?Å<*GÆ&F0	Æ+GÆ3F<	Æ8GÆ?G	ÇG)r   r   r   r   r[   râ   rç   ÚstaticmethodrÊ   rÝ   rá   rÐ   rÕ   rÏ   r   r   r   rÚ   rÚ   d  sI   „ Ø×,Ñ,€IØ€Hàð�uð  ò ó ðòÐò<ò9ór   rÚ   c                   ó   — e Zd Zed„ «       Zy)Ú LocallyHashedFilePasswordDBMixinc                 ó   — t        | «      S r3   ©r   rÜ   s    r   rç   z)LocallyHashedFilePasswordDBMixin.diskHash�  ó   € ä�q‹zÐr   N)r   r   r   rò   rç   r   r   r   rô   rô   œ  s   „ Øñó ñr   rô   c                   óP   — e Zd Zededefd„«       Z G d„ dej                  «      Zy)Ú NetworkHashedFilePasswordDBMixinr²   r¦   c                 ó   — t        | «      S r3   rö   rÜ   s    r   rÝ   z,NetworkHashedFilePasswordDBMixin.networkHash£  r÷   r   c                   ó   — e Zd Zd„ Zy)ú*NetworkHashedFilePasswordDBMixin.credClassc                 ó2   — t        | j                  «      |k(  S r3   )r   r5   r7   s     r   r8   z8NetworkHashedFilePasswordDBMixin.credClass.checkPassword¨  s   € Ü˜TŸ]™]Ó+¨xÑ7Ð7r   N)r   r   r   r8   r   r   r   râ   rü   §  s   „ ó	8r   râ   N)	r   r   r   rò   rÊ   rÝ   r   r[   râ   r   r   r   rù   rù   ¢  s4   „ Øð�uð  ò ó ðô8�K×0Ñ0õ 8r   rù   c                   ó   — e Zd Zy)Ú"HashlessFilePasswordDBCheckerTestsNr/   r   r   r   rÿ   rÿ   ¬  ó   „ ð 	r   rÿ   c                   ó   — e Zd Zy)Ú'LocallyHashedFilePasswordDBCheckerTestsNr/   r   r   r   r  r  ²  r   r   r  c                   ó   — e Zd Zy)Ú'NetworkHashedFilePasswordDBCheckerTestsNr/   r   r   r   r  r  ¸  r   r   r  c                   ó   — e Zd ZdZd„ Zy)ÚUsernameHashedPasswordTestszo
    UsernameHashedPassword is a deprecated class that is functionally
    equivalent to UsernamePassword.
    c                 ó4   — | j                  ddt        d«       y)zB
        Tests that UsernameHashedPassword is deprecated.
        rš   r›   z6Use twisted.cred.credentials.UsernamePassword instead.N)rœ   r�   r'   s    r   Útest_deprecationz,UsernameHashedPasswordTests.test_deprecationÄ  s   € ð 	×)Ñ)Ø&Ø$ÜØDõ		
r   N)r   r   r   r   r  r   r   r   r  r  ¾  s   „ ñó
	
r   r  ).r   Úbinasciir   r   Úzope.interfacer   r   Útwisted.credr   r   r	   r
   Útwisted.internetr   Útwisted.pythonr   Útwisted.python.versionsr   Útwisted.trialr   r   Ú_cryptÚImportErrorr�   r   r   ÚAdapterr,   ÚregisterAdapterrP   r.   r1   ÚIRealmr:   ÚTestCaserD   rp   r    rÍ   rÚ   rô   rù   rÿ   r  r  r  r   r   r   ú<module>r     sÌ  ðñ÷
 (ç 1ç =Ó =Ý "Ý %Ý +Ý "ðÝ%ð €Eñ �i  Q¨Ó*€ô	�	ô 	÷ñ ñ$ ˆYÓô	ˆz×!Ñ!ó 	ó ð	ð €
× Ñ ˜8 Z°Ô ;ô	˜+×7Ñ7ô 	ñ Ð  )Ó,÷)ð )ó -ð)ñ ˆV�]‰]Ó÷Eð Eó ðEô$Y>�×!Ñ!ô Y>ôx4˜(×+Ñ+ô 4ônD,¨×(9Ñ(9ô D,÷N!Eñ !E÷H5ñ 5ôpÐ'Bô ô8Ð'Bô 8ô	Ø °×0AÑ0Aô	ô	Ø$ m°X×5FÑ5Fô	ô	Ø$ m°X×5FÑ5Fô	ô
 (×"3Ñ"3õ 
øðS ò ØƒEðús   ¸F" Æ"F-Æ,F-