o
    ¯b9  ã                   @   sø  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 zdd	lmZ W n eyI   d
ZY nw eZeddddƒZG dd„ deƒZG dd„ dƒZeeƒG dd„ dejƒƒZe eee¡ G dd„ de	jƒZeeeƒG dd„ dƒƒZeej ƒG dd„ dƒƒZ!G dd„ dej"ƒZ#G dd„ dej"ƒZ$G dd„ dej"ƒZ%G d d!„ d!ƒZ&G d"d#„ d#ƒZ'G d$d%„ d%e'ƒZ(G d&d'„ d'e'ƒZ)G d(d)„ d)e'e&ej"ƒZ*G d*d+„ d+e(e&ej"ƒZ+G d,d-„ d-e)e&ej"ƒZ,G d.d/„ d/ej"ƒZ-d
S )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dS )Ú	ITestablez2
    An interface for a theoretical protocol.
    N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú=/usr/lib/python3/dist-packages/twisted/cred/test/test_cred.pyr      s    r   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú
TestAvatarz
    A test avatar.
    c                 C   s   || _ d| _d| _d S )NF)ÚnameÚloggedInÚ	loggedOut)Úselfr   r   r   r   Ú__init__,   s   
zTestAvatar.__init__c                 C   s   | j rJ ‚d| _ d S ©NT)r   ©r   r   r   r   Úlogin1   s   

zTestAvatar.loginc                 C   s
   d| _ d S r!   )r   r"   r   r   r   Úlogout5   ó   
zTestAvatar.logoutN)r   r   r   r   r    r#   r$   r   r   r   r   r   '   s
    r   c                   @   r   )ÚTestablez-
    A theoretical protocol for testing.
    Nr   r   r   r   r   r&   9   s    r&   c                   @   ó   e Zd ZdS )ÚIDerivedCredentialsN©r   r   r   r   r   r   r   r(   E   s    r(   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚDerivedCredentialsc                 C   s   || _ || _d S ©N)ÚusernameÚpassword)r   r,   r-   r   r   r   r    K   s   
zDerivedCredentials.__init__c                 C   s
   || j kS r+   )r-   ©r   r-   r   r   r   ÚcheckPasswordO   r%   z DerivedCredentials.checkPasswordN)r   r   r   r    r/   r   r   r   r   r*   I   s    r*   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú	TestRealmz
    A basic test realm.
    c                 C   s
   i | _ d S r+   )Úavatarsr"   r   r   r   r    Y   r%   zTestRealm.__init__c                 G   sH   || j v r| j | }n	t|ƒ}|| j |< | ¡  |d |d |ƒ|jfS )Nr   )r1   r   r#   r$   )r   ÚavatarIdÚmindÚ
interfacesÚavatarr   r   r   ÚrequestAvatar\   s   

zTestRealm.requestAvatarN)r   r   r   r   r    r6   r   r   r   r   r0   S   s    r0   c                   @   s@   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S )Ú	CredTestsz^
    Tests for the meat of L{twisted.cred} -- realms, portals, avatars, and
    checkers.
    c                 C   s@   t ƒ | _t | j¡| _t ¡ | _| j dd¡ | j | j¡ d S )Nó   bobó   hello)	r0   Úrealmr	   ÚPortalr   Ú'InMemoryUsernamePasswordDatabaseDontUseÚcheckerÚaddUserÚregisterCheckerr"   r   r   r   ÚsetUpl   s
   
zCredTests.setUpc                 C   s.   t jt jg}| j ¡ }|  t|ƒt|ƒ¡ dS )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Úgotr   r   r   Útest_listCheckerss   s   
zCredTests.test_listCheckersc                 C   s†   |   | j t dd¡| t¡¡}|\}}}|  |t¡ |  | |¡|› d|› �¡ |  |j	j
¡ |  |j	j ¡ |ƒ  |  |j	j¡ dS )zˆ
        Calling C{login} on a portal with correct credentials and an interface
        that the portal's realm supports works.
        r8   r9   ú does not implement N)ÚsuccessResultOfr	   r#   r   ÚUsernamePasswordr   rD   Ú
assertTrueÚ
providedByÚoriginalr   r   ©r   r#   ÚifaceÚimplr$   r   r   r   Útest_basicLogin}   s   ÿÿ
zCredTests.test_basicLoginc                 C   s„   |   | j tddƒ| t¡¡}|\}}}|  |t¡ |  | |¡|› d|› �¡ |  |jj	¡ |  |jj
 ¡ |ƒ  |  |jj
¡ dS )z~
        Logging in with correct derived credentials and an interface
        that the portal's realm supports works.
        r8   r9   rI   N)rJ   r	   r#   r*   r   rD   rL   rM   rN   r   r   rO   r   r   r   Útest_derivedInterface“   s   ÿ
zCredTests.test_derivedInterfacec                 C   ó<   |   | j t dd¡| t¡¡}|  |¡ |  tj	|j
¡ dS )z•
        Calling C{login} with incorrect credentials (in this case a wrong
        password) causes L{error.UnauthorizedLogin} to be raised.
        r8   s   h3lloN©ÚfailureResultOfr	   r#   r   rK   r   rL   rD   r   ÚUnauthorizedLoginÚtype©r   r#   r   r   r   Útest_failedLoginPassword§   ó   ÿÿ
z"CredTests.test_failedLoginPasswordc                 C   rT   )z’
        Calling C{login} with incorrect credentials (in this case no known
        user) causes L{error.UnauthorizedLogin} to be raised.
        s   jayr9   NrU   rY   r   r   r   Útest_failedLoginName´   r[   zCredTests.test_failedLoginNameN)
r   r   r   r   r@   rH   rR   rS   rZ   r\   r   r   r   r   r7   f   s    
r7   c                   @   sD   e Zd Zg d¢Zdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚOnDiskDatabaseTests©)ó   user1s   pass1)ó   user2s   pass2)ó   user3s   pass3c                 C   sb   |   ¡ | _t| jdƒ�}| jD ]\}}| |d | d ¡ qW d   ƒ d S 1 s*w   Y  d S )NÚwbó   :ó   
)ÚmktempÚdbfileÚopenÚusersÚwrite)r   ÚfÚuÚpr   r   r   r@   É   s   
ÿ"ÿzOnDiskDatabaseTests.setUpc                 C   s$   t  d¡| _|  tj| jjd¡ dS )zg
        A missing db file will cause a permanent rejection of authorization
        attempts.
        ztest_thisbetternoteverexist.dbÚuserN)r   ÚFilePasswordDBÚdbÚassertRaisesr   rW   ÚgetUserr"   r   r   r   Útest_getUserNonexistentDatabaseÏ   s   z3OnDiskDatabaseTests.test_getUserNonexistentDatabasec                 C   sP   t  | j¡| _| jD ]\}}|  t| jj| ¡ ¡ |  	| j |¡||f¡ q
d S r+   )
r   rn   rf   ro   rh   rp   ÚKeyErrorrq   ÚupperrD   ©r   rk   rl   r   r   r   ÚtestUserLookupØ   s
   þz"OnDiskDatabaseTests.testUserLookupc                 C   sB   t j| jdd�| _| jD ]\}}|  | j | ¡ ¡||f¡ qd S )NF)ÚcaseSensitive)r   rn   rf   ro   rh   rD   rq   rt   ru   r   r   r   ÚtestCaseInSensitivityÞ   s   ÿz)OnDiskDatabaseTests.testCaseInSensitivityc                    sT   t  ˆ j¡ˆ _dd„ ˆ jD ƒ}t ‡ fdd„|D ƒ¡}| ˆ jdd„ ˆ jD ƒ¡ |S )Nc                 S   ó   g | ]
\}}t  ||¡‘qS r   ©r   rK   ©Ú.0rk   rl   r   r   r   Ú
<listcomp>å   ó    z;OnDiskDatabaseTests.testRequestAvatarId.<locals>.<listcomp>c                    ó   g | ]
}t  ˆ jj|¡‘qS r   ©r
   ÚmaybeDeferredro   ÚrequestAvatarId©r|   Úcr"   r   r   r}   ç   r~   c                 S   ó   g | ]\}}|‘qS r   r   r{   r   r   r   r}   é   ó    )	r   rn   rf   ro   rh   r
   ÚgatherResultsÚaddCallbackrD   ©r   ÚcredsÚdr   r"   r   ÚtestRequestAvatarIdã   s   ÿz'OnDiskDatabaseTests.testRequestAvatarIdc                    sf   t  ˆj¡ˆ_ˆ ddt¡‰ ‡ fdd„ˆjD ƒ}t ‡fdd„|D ƒ¡}| 	ˆj
dd„ ˆjD ƒ¡ |S )Nútwisted.cred.credentialsÚUsernameHashedPasswordc                    s   g | ]	\}}ˆ ||ƒ‘qS r   r   r{   )rŽ   r   r   r}   ñ   ó    zBOnDiskDatabaseTests.testRequestAvatarId_hashed.<locals>.<listcomp>c                    r   r   r€   rƒ   r"   r   r   r}   ó   r~   c                 S   r…   r   r   r{   r   r   r   r}   õ   r†   )r   rn   rf   ro   ÚgetDeprecatedModuleAttributeÚ_uhpVersionrh   r
   r‡   rˆ   rD   r‰   r   ©rŽ   r   r   ÚtestRequestAvatarId_hashedì   s   ÿÿz.OnDiskDatabaseTests.testRequestAvatarId_hashedN)
r   r   r   rh   r@   rr   rv   rx   rŒ   r“   r   r   r   r   r]   Â   s    		r]   c                   @   sn   e Zd Zg d¢Zdd„ Zdedededefdd	„Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zedu r5dZdS dS )Ú!HashedPasswordOnDiskDatabaseTestsr^   c                 C   s    |   ¡ }tj|| jd�| _t|dƒ�$}| jD ]\}}| |d |  |||d d… ¡ d ¡ qW d   ƒ n1 s9w   Y  tƒ }t	 
|¡| _| j | j¡ d S )N©Úhashrb   rc   r   rd   )re   r   rn   r–   ro   rg   rh   ri   r0   r	   r;   Úportr?   )r   rf   rj   rk   rl   Úrr   r   r   r@      s   *ÿÿz'HashedPasswordOnDiskDatabaseTests.setUprk   rl   ÚsÚreturnc                 C   s.   t | d¡| d¡ƒ}t|tƒr|S | d¡S )NÚascii)r   ÚdecodeÚ
isinstanceÚbytesÚencode)r   rk   rl   r™   Úhashed_passwordr   r   r   r–     s   

z&HashedPasswordOnDiskDatabaseTests.hashc                    sF   dd„ ˆ j D ƒ}t ‡ fdd„|D ƒ¡}| ˆ jdd„ ˆ j D ƒ¡ |S )Nc                 S   ry   r   rz   r{   r   r   r   r}     r~   zIHashedPasswordOnDiskDatabaseTests.testGoodCredentials.<locals>.<listcomp>c                    s   g | ]}ˆ j  |¡‘qS r   )ro   r‚   rƒ   r"   r   r   r}     s    c                 S   r…   r   r   r{   r   r   r   r}     r†   ©rh   r
   r‡   rˆ   rD   ©r   Ú	goodCredsr‹   r   r"   r   ÚtestGoodCredentials  s   z5HashedPasswordOnDiskDatabaseTests.testGoodCredentialsc                    sT   dd„ ˆ j D ƒ}t ‡ fdd„|D ƒ¡}| dd„ ¡ | ˆ jdd„ ˆ j D ƒ¡ |S )Nc                 S   ry   r   rz   r{   r   r   r   r}     r~   zOHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<listcomp>c                    ó   g | ]
}ˆ j  |d t¡‘qS r+   ©r—   r#   r   rƒ   r"   r   r   r}     r~   c                 S   s   dd„ | D ƒS )Nc                 S   s   g | ]	\}}}|j j‘qS r   )rN   r   )r|   ÚiÚaÚlr   r   r   r}     r�   zaHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<lambda>.<locals>.<listcomp>r   ©Úxr   r   r   Ú<lambda>  s    zMHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<lambda>c                 S   r…   r   r   r{   r   r   r   r}      r†   r¡   r¢   r   r"   r   ÚtestGoodCredentials_login  s   ÿz;HashedPasswordOnDiskDatabaseTests.testGoodCredentials_loginc                    s@   dd„ ˆ j D ƒ}tj‡ fdd„|D ƒdd�}| ˆ jtj¡ |S )Nc                 S   s   g | ]
\}}t  |d ¡‘qS )s   wrong passwordrz   r{   r   r   r   r}   $  s    ÿzHHashedPasswordOnDiskDatabaseTests.testBadCredentials.<locals>.<listcomp>c                    r¥   r+   r¦   rƒ   r"   r   r   r}   (  r~   T©ÚconsumeErrors)rh   r
   ÚDeferredListrˆ   Ú_assertFailuresr   rW   )r   ÚbadCredsr‹   r   r"   r   ÚtestBadCredentials#  s   ÿÿz4HashedPasswordOnDiskDatabaseTests.testBadCredentialsc                    sT   ˆ  ddt¡‰ ‡ ‡fdd„ˆjD ƒ}tj‡fdd„|D ƒdd�}| ˆjtj¡ |S )Nr�   rŽ   c                    s,   g | ]\}}ˆ |ˆ  d ||d d… ¡ƒ‘qS )Nr   r•   r{   r’   r   r   r}   1  s     ÿzKHashedPasswordOnDiskDatabaseTests.testHashedCredentials.<locals>.<listcomp>c                    r¥   r+   r¦   rƒ   r"   r   r   r}   5  r~   Tr®   )	r�   r‘   rh   r
   r°   rˆ   r±   r   ÚUnhandledCredentials)r   ÚhashedCredsr‹   r   r’   r   ÚtestHashedCredentials-  s   ÿÿþz7HashedPasswordOnDiskDatabaseTests.testHashedCredentialsc                 G   s*   |D ]\}}|   |tj¡ |j|Ž  qd S r+   )rD   r
   ÚFAILUREÚtrap)r   ÚfailuresÚexpectedFailuresÚflagÚfailurer   r   r   r±   ;  s   z1HashedPasswordOnDiskDatabaseTests._assertFailuresNzcrypt module not available)r   r   r   rh   r@   rž   r–   r¤   r­   r³   r¶   r±   r   Úskipr   r   r   r   r”   ù   s    		
ÿr”   c                   @   s,   e Zd ZdZejdd„ ƒZejdd„ ƒZdS )Ú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                 c   s>   � |   ¡ D ]}|  ¡ D ]\}}| |¡V }|  ||¡ qqdS )zt
        The given credentials are accepted by all the checkers, and give
        the expected C{avatarID}s
        N)ÚgetCheckersÚgetGoodCredentialsr‚   rD   )r   ÚchkÚcredr2   r˜   r   r   r   Útest_positiveS  s   €þÿzCheckersMixin.test_positivec                 c   s<   � |   ¡ D ]}|  ¡ D ]}| |¡}|  |tj¡V  qqdS )zI
        The given credentials are rejected by all the checkers.
        N)r¿   ÚgetBadCredentialsr‚   ÚassertFailurer   rW   )r   rÁ   rÂ   r‹   r   r   r   Útest_negative^  s   €
þÿzCheckersMixin.test_negativeN)r   r   r   r   r
   ÚinlineCallbacksrÃ   rÆ   r   r   r   r   r¾   E  s    

r¾   c                   @   sL   e Zd ZejZdZededefdd„ƒZ	g d¢Z
dd„ Zd	d
„ Zdd„ ZdS )ÚHashlessFilePasswordDBMixinNr«   rš   c                 C   ó   | S r+   r   rª   r   r   r   ÚnetworkHashm  s   z'HashlessFilePasswordDBMixin.networkHash))r_   ó	   password1)r`   s	   password2)ra   ó	   password3c                 c   s.   � | j D ]\}}|  ||  |¡¡|fV  qd S r+   )Ú_validCredentialsÚ	credClassrÊ   ru   r   r   r   rÀ   w  s   €ÿz.HashlessFilePasswordDBMixin.getGoodCredentialsc                 c   s(   � dD ]\}}|   ||  |¡¡V  qd S )N))r_   rÌ   )r`   rË   )s   bloofs   blarf)rÎ   rÊ   ru   r   r   r   rÄ   {  s   €ûz-HashlessFilePasswordDBMixin.getBadCredentialsc              
   #   s�  � ˆ j pdd„ }ˆ j o‡ fdd„}dD ]²}ˆ  ¡ }t|dƒ�}ˆ jD ]\}}| |d ||ƒ d ¡ q"W d   ƒ n1 s>w   Y  tj|||d�V  ˆ  ¡ }t|dƒ�}ˆ jD ]\}}| ||ƒd	 | d ¡ qYW d   ƒ n1 suw   Y  tj|d
dd||d�V  ˆ  ¡ }t|dƒ�!}ˆ jD ]\}}| d| ¡  d ||ƒ d ¡ q“W d   ƒ n1 s³w   Y  tj|dddd||d�V  qd S )Nc                 S   rÉ   r+   r   rª   r   r   r   r¬   „  s    z9HashlessFilePasswordDBMixin.getCheckers.<locals>.<lambda>c                    s
   ˆ   |¡S r+   )ÚdiskHash)r,   r-   Ústoredr"   r   r   r¬   †  s   
 )TFrb   rc   rd   )Úcacher–   s    dingle dongle ó    é   r   s   zip,zap,s   ,zup,ó   ,r   é   F)rÏ   re   rg   rÍ   ri   r   rn   Útitle)r   rÏ   Ú	hashCheckrÑ   ÚfnÚfObjrk   rl   r   r"   r   r¿   ƒ  s@   €
ÿÿÿÿÿÿÿÿ
ÿíz'HashlessFilePasswordDBMixin.getCheckers)r   r   r   r   rK   rÎ   rÏ   Ústaticmethodrž   rÊ   rÍ   rÀ   rÄ   r¿   r   r   r   r   rÈ   i  s    rÈ   c                   @   s   e Zd Zedd„ ƒZdS )Ú LocallyHashedFilePasswordDBMixinc                 C   ó   t | ƒS r+   ©r   rª   r   r   r   rÏ   ¢  ó   z)LocallyHashedFilePasswordDBMixin.diskHashN)r   r   r   rÚ   rÏ   r   r   r   r   rÛ   ¡  s    rÛ   c                   @   s4   e Zd Zededefdd„ƒZG dd„ dejƒZdS )Ú NetworkHashedFilePasswordDBMixinr«   rš   c                 C   rÜ   r+   rÝ   rª   r   r   r   rÊ   ¨  rÞ   z,NetworkHashedFilePasswordDBMixin.networkHashc                   @   s   e Zd Zdd„ ZdS )z*NetworkHashedFilePasswordDBMixin.credClassc                 C   s   t | jƒ|kS r+   )r   r-   r.   r   r   r   r/   ­  s   z8NetworkHashedFilePasswordDBMixin.credClass.checkPasswordN)r   r   r   r/   r   r   r   r   rÎ   ¬  s    rÎ   N)	r   r   r   rÚ   rž   rÊ   r   rK   rÎ   r   r   r   r   rß   §  s    rß   c                   @   r'   )Ú"HashlessFilePasswordDBCheckerTestsNr)   r   r   r   r   rà   ±  ó    rà   c                   @   r'   )Ú'LocallyHashedFilePasswordDBCheckerTestsNr)   r   r   r   r   râ   ·  rá   râ   c                   @   r'   )Ú'NetworkHashedFilePasswordDBCheckerTestsNr)   r   r   r   r   rã   ½  rá   rã   c                   @   s   e Zd ZdZdd„ ZdS )ÚUsernameHashedPasswordTestszo
    UsernameHashedPassword is a deprecated class that is functionally
    equivalent to UsernamePassword.
    c                 C   s   |   ddtd¡ dS )zB
        Tests that UsernameHashedPassword is deprecated.
        r�   rŽ   z6Use twisted.cred.credentials.UsernamePassword instead.N)r�   r‘   r"   r   r   r   Útest_deprecationÉ  s   üz,UsernameHashedPasswordTests.test_deprecationN)r   r   r   r   rå   r   r   r   r   rä   Ã  s    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&   ÚregisterAdapterrA   r(   r*   ÚIRealmr0   ÚTestCaser7   r]   r”   r¾   rÈ   rÛ   rß   rà   râ   rã   rä   r   r   r   r   Ú<module>   sT   ÿ	\7L$8

ÿ
ÿ
ÿ