U
     T‚gò7  ã                   @   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k
r”   d
ZY nX 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)ÚcryptNZTwistedé   é   c                   @   s   e Zd ZdZdS )Ú	ITestablez2
    An interface for a theoretical protocol.
    N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú?/tmp/pip-unpacked-wheel-1_7di8ic/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
t‚d| _ d S ©NT)r   ÚAssertionError©r   r   r   r   Úlogin1   s    
zTestAvatar.loginc                 C   s
   d| _ d S r   )r   r!   r   r   r   Úlogout5   s    zTestAvatar.logoutN)r   r   r   r   r   r"   r#   r   r   r   r   r   '   s   r   c                   @   s   e Zd ZdZdS )ÚTestablez-
    A theoretical protocol for testing.
    Nr   r   r   r   r   r$   9   s   r$   c                   @   s   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   s    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   s    zTestRealm.__init__c                 G   sH   || j kr| j | }nt|ƒ}|| j |< | ¡  |d |d |ƒ|jfS )Nr   )r.   r   r"   r#   )r   ÚavatarIdZmindZ
interfacesZavatarr   r   r   ÚrequestAvatar\   s    

zTestRealm.requestAvatarN)r   r   r   r   r   r0   r   r   r   r   r-   S   s   r-   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)	r-   Úrealmr	   ÚPortalr   Z'InMemoryUsernamePasswordDatabaseDontUseÚcheckerZ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   ÚIUsernamePasswordZIUsernameHashedPasswordr	   Z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.
        r2   r3   ú does not implement N)ÚsuccessResultOfr	   r"   r   ÚUsernamePasswordr   r:   Ú
assertTrueÚ
providedByÚoriginalr   r   ©r   r"   Z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.
        r2   r3   r?   N)r@   r	   r"   r'   r   r:   rB   rC   rD   r   r   rE   r   r   r   Útest_derivedInterface“   s    ÿ
zCredTests.test_derivedInterfacec                 C   s<   |   | 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.
        r2   s   h3lloN©ZfailureResultOfr	   r"   r   rA   r   rB   r:   r   ÚUnauthorizedLoginÚtype©r   r"   r   r   r   Útest_failedLoginPassword§   s    
  ÿÿ
z"CredTests.test_failedLoginPasswordc                 C   s<   |   | j t dd¡| t¡¡}|  |¡ |  tj	|j
¡ dS )z’
        Calling C{login} with incorrect credentials (in this case no known
        user) causes L{error.UnauthorizedLogin} to be raised.
        s   jayr3   NrI   rL   r   r   r   Útest_failedLoginName´   s    
  ÿÿ
zCredTests.test_failedLoginNameN)
r   r   r   r   r8   r>   rG   rH   rM   rN   r   r   r   r   r1   f   s   
r1   c                   @   sF   e Zd Zdddg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   sL   |   ¡ | _t| jdƒ�,}| jD ]\}}| |d | d ¡ qW 5 Q R X d S )NÚwbó   :ó   
)ÚmktempÚdbfileÚopenÚusersÚwrite)r   ÚfÚuÚpr   r   r   r8   É   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   rJ   ÚgetUserr!   r   r   r   Útest_getUserNonexistentDatabaseÏ   s    z3OnDiskDatabaseTests.test_getUserNonexistentDatabasec                 C   sP   t  | j¡| _| jD ]6\}}|  t| jj| ¡ ¡ |  	| j |¡||f¡ qd S r(   )
r   rb   rZ   rc   r\   rd   ÚKeyErrorre   Úupperr:   ©r   r_   r`   r   r   r   ÚtestUserLookupØ   s    z"OnDiskDatabaseTests.testUserLookupc                 C   sB   t j| jdd�| _| jD ]$\}}|  | j | ¡ ¡||f¡ qd S )NF)ZcaseSensitive)r   rb   rZ   rc   r\   r:   re   rh   ri   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   s   g | ]\}}t  ||¡‘qS r   ©r   rA   ©Ú.0r_   r`   r   r   r   Ú
<listcomp>å   s     z;OnDiskDatabaseTests.testRequestAvatarId.<locals>.<listcomp>c                    s   g | ]}t  ˆ jj|¡‘qS r   ©r
   ZmaybeDeferredrc   ÚrequestAvatarId©rn   Úcr!   r   r   ro   ç   s     c                 S   s   g | ]\}}|‘qS r   r   rm   r   r   r   ro   é   s     )	r   rb   rZ   rc   r\   r
   ÚgatherResultsÚaddCallbackr:   ©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   rm   )r{   r   r   ro   ñ   s     zBOnDiskDatabaseTests.testRequestAvatarId_hashed.<locals>.<listcomp>c                    s   g | ]}t  ˆ jj|¡‘qS r   rp   rr   r!   r   r   ro   ó   s     c                 S   s   g | ]\}}|‘qS r   r   rm   r   r   r   ro   õ   s     )r   rb   rZ   rc   ÚgetDeprecatedModuleAttributeÚ_uhpVersionr\   r
   rt   ru   r:   rv   r   ©r{   r   r   ÚtestRequestAvatarId_hashedì   s      ÿÿz.OnDiskDatabaseTests.testRequestAvatarId_hashedN)
r   r   r   r\   r8   rf   rj   rk   ry   r   r   r   r   r   rO   Â   s   ý		rO   c                   @   sf   e Zd ZdddgZdd„ Zeeeedœdd„Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZedkrbdZdS )Ú!HashedPasswordOnDiskDatabaseTestsrP   rR   rT   c                 C   sŒ   |   ¡ }tj|| jd�| _t|dƒ�>}| jD ]0\}}| |d |  |||d d… ¡ d ¡ q,W 5 Q R X tƒ }t	 
|¡| _| j | j¡ d S )N©ÚhashrV   rW   r   rX   )rY   r   rb   r‚   rc   r[   r\   r]   r-   r	   r5   Úportr7   )r   rZ   r^   r_   r`   Úrr   r   r   r8      s    4z'HashedPasswordOnDiskDatabaseTests.setUp)r_   r`   ÚsÚreturnc                 C   s    t | d¡| d¡ƒ}| d¡S )NÚascii)r   ÚdecodeÚencode)r   r_   r`   r…   Z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   s   g | ]\}}t  ||¡‘qS r   rl   rm   r   r   r   ro     s     zIHashedPasswordOnDiskDatabaseTests.testGoodCredentials.<locals>.<listcomp>c                    s   g | ]}ˆ j  |¡‘qS r   )rc   rq   rr   r!   r   r   ro     s     c                 S   s   g | ]\}}|‘qS r   r   rm   r   r   r   ro     s     ©r\   r
   rt   ru   r:   ©r   Z	goodCredsrx   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   s   g | ]\}}t  ||¡‘qS r   rl   rm   r   r   r   ro     s     zOHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<listcomp>c                    s   g | ]}ˆ j  |d t¡‘qS r(   ©rƒ   r"   r   rr   r!   r   r   ro     s     c                 S   s   dd„ | D ƒS )Nc                 S   s   g | ]\}}}|j j‘qS r   )rD   r   )rn   ÚiÚaÚlr   r   r   ro     s     zaHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<lambda>.<locals>.<listcomp>r   ©Úxr   r   r   Ú<lambda>  ó    zMHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<lambda>c                 S   s   g | ]\}}|‘qS r   r   rm   r   r   r   ro     s     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 passwordrl   rm   r   r   r   ro     s    zHHashedPasswordOnDiskDatabaseTests.testBadCredentials.<locals>.<listcomp>c                    s   g | ]}ˆ j  |d t¡‘qS r(   r�   rr   r!   r   r   ro   #  s     T©ZconsumeErrors)r\   r
   ÚDeferredListru   Ú_assertFailuresr   rJ   )r   ZbadCredsrx   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 )Nrz   r{   c                    s,   g | ]$\}}ˆ |ˆ  d ||d d… ¡ƒ‘qS )Nr   r�   rm   r~   r   r   ro   ,  s    zKHashedPasswordOnDiskDatabaseTests.testHashedCredentials.<locals>.<listcomp>c                    s   g | ]}ˆ j  |d t¡‘qS r(   r�   rr   r!   r   r   ro   0  s     Tr–   )	r|   r}   r\   r
   r—   ru   r˜   r   ZUnhandledCredentials)r   ZhashedCredsrx   r   r~   r   ÚtestHashedCredentials(  s      ÿÿþz7HashedPasswordOnDiskDatabaseTests.testHashedCredentialsc                 G   s*   |D ] \}}|   |tj¡ |j|Ž  qd S r(   )r:   r
   ÚFAILUREZtrap)r   ZfailuresZexpectedFailuresÚflagZfailurer   r   r   r˜   6  s    z1HashedPasswordOnDiskDatabaseTests._assertFailuresNzcrypt module not available)r   r   r   r\   r8   Úbytesr‚   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ÚgetGoodCredentialsrq   r:   )r   ÚchkÚcredr/   r„   r   r   r   Útest_positiveN  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    ÚgetBadCredentialsrq   ZassertFailurer   rJ   )r   r¢   r£   rx   r   r   r   Útest_negativeY  s    
zCheckersMixin.test_negativeN)r   r   r   r   r
   ZinlineCallbacksr¤   r¦   r   r   r   r   rŸ   @  s
   

rŸ   c                   @   sL   e Zd ZejZdZeeedœdd„ƒZ	dddgZ
dd	„ Zd
d„ Zdd„ ZdS )ÚHashlessFilePasswordDBMixinN©r’   r†   c                 C   s   | S r(   r   r‘   r   r   r   ÚnetworkHashh  s    z'HashlessFilePasswordDBMixin.networkHash)rQ   ó	   password1)rS   s	   password2)rU   ó	   password3c                 c   s,   | j D ] \}}|  ||  |¡¡|fV  qd S r(   )Ú_validCredentialsÚ	credClassr©   ri   r   r   r   r¡   r  s    z.HashlessFilePasswordDBMixin.getGoodCredentialsc                 c   s&   dD ]\}}|   ||  |¡¡V  qd S )N))rQ   r«   )rS   rª   )s   bloofs   blarf)r­   r©   ri   r   r   r   r¥   v  s    z-HashlessFilePasswordDBMixin.getBadCredentialsc              
   #   sT  ˆ j pdd„ }ˆ j o‡ fdd„}dD �](}ˆ  ¡ }t|dƒ�0}ˆ jD ]"\}}| |d ||ƒ d ¡ qDW 5 Q R X tj|||d�V  ˆ  ¡ }t|dƒ�0}ˆ jD ]"\}}| ||ƒd	 | d ¡ qžW 5 Q R X tj|d
dd||d�V  ˆ  ¡ }t|dƒ�8}ˆ jD ]*\}}| d| ¡  d ||ƒ d ¡ qþW 5 Q R X tj|dddd||d�V  q$d S )Nc                 S   s   | S r(   r   r‘   r   r   r   r“     r”   z9HashlessFilePasswordDBMixin.getCheckers.<locals>.<lambda>c                    s
   ˆ   |¡S r(   )ÚdiskHash)r)   r*   Zstoredr!   r   r   r“   �  r”   )TFrV   rW   rX   )Úcacher‚   s    dingle dongle ó    é   r   s   zip,zap,s   ,zup,ó   ,r   é   F)r®   rY   r[   r¬   r]   r   rb   Útitle)r   r®   Z	hashCheckr¯   ÚfnZfObjr_   r`   r   r!   r   r    ~  s<    
ÿ
&&ÿ      ÿz'HashlessFilePasswordDBMixin.getCheckers)r   r   r   r   rA   r­   r®   Ústaticmethodr�   r©   r¬   r¡   r¥   r    r   r   r   r   r§   d  s   ýr§   c                   @   s   e Zd Zedd„ ƒZdS )Ú LocallyHashedFilePasswordDBMixinc                 C   s   t | ƒS r(   ©r   r‘   r   r   r   r®   �  s    z)LocallyHashedFilePasswordDBMixin.diskHashN)r   r   r   r¶   r®   r   r   r   r   r·   œ  s   r·   c                   @   s2   e Zd Zeeedœdd„ƒZG dd„ dejƒZdS )Ú NetworkHashedFilePasswordDBMixinr¨   c                 C   s   t | ƒS r(   r¸   r‘   r   r   r   r©   £  s    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   rA   r­   r   r   r   r   r¹   ¢  s   r¹   c                   @   s   e Zd ZdS )Ú"HashlessFilePasswordDBCheckerTestsNr&   r   r   r   r   rº   ¬  s   rº   c                   @   s   e Zd ZdS )Ú'LocallyHashedFilePasswordDBCheckerTestsNr&   r   r   r   r   r»   ²  s   r»   c                   @   s   e Zd ZdS )Ú'NetworkHashedFilePasswordDBCheckerTestsNr&   r   r   r   r   r¼   ¸  s   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.
        rz   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   Zzope.interfacer   r   Ztwisted.credr   r   r   r	   Ztwisted.internetr
   Ztwisted.pythonr   Ztwisted.python.versionsr   Ztwisted.trialr   r   Z_cryptÚImportErrorr}   r   r   ZAdapterr$   ZregisterAdapterr9   r%   r'   ZIRealmr-   ZTestCaser1   rO   r€   rŸ   r§   r·   r¹   rº   r»   r¼   r½   r   r   r   r   Ú<module>   s\   
	\7G$8

  ÿ
  ÿ
  ÿ