U
    
W[5                     @   s  d Z ddlmZmZ ddlmZ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 dd	lmZmZmZmZ zdd
lmZ W n ek
r   dZY nX G dd deZG dd de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eZ"eej#G dd de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eZ)G d d! d!e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/dS ),z6
Tests for L{twisted.cred}, now with 30% more starch.
    )absolute_importdivision)implementer	Interface)hexlify	unhexlify)unittest)nativeStringnetworkString)
components)defer)checkerscredentialsportalerror)cryptNc                   @   s   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
td| _ d S NT)r   AssertionErrorr   r   r   r   login-   s    
zTestAvatar.loginc                 C   s
   d| _ d S r    )r   r"   r   r   r   logout2   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%   7   s   r%   c                   @   s   e Zd ZdS )IDerivedCredentialsNr   r   r   r   r   r   r   r&   B   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   J   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(   G   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   r1   r   r   r   r   r.   T   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.   Zrealmr   Portalr   Z'InMemoryUsernamePasswordDatabaseDontUseZcheckerZaddUserregisterCheckerr"   r   r   r   setUpn   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   ZexpectedZgotr   r   r   test_listCheckersv   s
    
zCredTests.test_listCheckersc                 C   s   |  | jtdd| t}|\}}}| |t | ||d||f  | |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.
        r3   r4   %s does not implement %sN)successResultOfr   r#   r   UsernamePasswordr   r9   
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||f  | |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.
        r3   r4   r<   N)r=   r   r#   r(   r   r9   r?   r@   rA   r   r   rB   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.
        r3   s   h3lloNZfailureResultOfr   r#   r   r>   r   r?   r9   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   jayr4   NrF   rI   r   r   r   test_failedLoginName   s    

  
zCredTests.test_failedLoginNameN)
r   r   r   r   r7   r;   rD   rE   rJ   rK   r   r   r   r   r2   i   s   r2   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   r7      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   rG   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   r_   rW   r`   rY   ra   KeyErrorrb   upperr9   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   r_   rW   r`   rY   r9   rb   re   rf   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   r>   .0r\   r]   r   r   r   
<listcomp>   s     z;OnDiskDatabaseTests.testRequestAvatarId.<locals>.<listcomp>c                    s   g | ]}t  jj|qS r   r   ZmaybeDeferredr`   requestAvatarIdrk   cr"   r   r   rl      s     c                 S   s   g | ]\}}|qS r   r   rj   r   r   r   rl      s     	r   r_   rW   r`   rY   r   gatherResultsaddCallbackr9   r   Zcredsdr   r"   r   testRequestAvatarId   s    z'OnDiskDatabaseTests.testRequestAvatarIdc                    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   UsernameHashedPasswordrj   r   r   r   rl      s   zBOnDiskDatabaseTests.testRequestAvatarId_hashed.<locals>.<listcomp>c                    s   g | ]}t  jj|qS r   rm   ro   r"   r   r   rl      s     c                 S   s   g | ]\}}|qS r   r   rj   r   r   r   rl      s     rq   rt   r   r"   r   testRequestAvatarId_hashed   s    z.OnDiskDatabaseTests.testRequestAvatarId_hashedN)
r   r   r   rY   r7   rc   rg   rh   rv   rx   r   r   r   r   rL      s   
	rL   c                   @   sZ   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d Z
edkrVdZdS )!HashedPasswordOnDiskDatabaseTestsrM   rO   rQ   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)hashrS   rT      rU   )rV   r   r_   rz   r`   rX   rY   rZ   r.   r   r5   portr6   )r   rW   r[   r\   r]   rr   r   r   r7     s    4z'HashedPasswordOnDiskDatabaseTests.setUpc                 C   s   t tt|t|S r)   )r
   r   r	   )r   r\   r]   sr   r   r   rz     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   ri   rj   r   r   r   rl     s     zIHashedPasswordOnDiskDatabaseTests.testGoodCredentials.<locals>.<listcomp>c                    s   g | ]} j |qS r   )r`   rn   ro   r"   r   r   rl     s   c                 S   s   g | ]\}}|qS r   r   rj   r   r   r   rl     s     rY   r   rr   rs   r9   r   Z	goodCredsru   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   ri   rj   r   r   r   rl     s     zOHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<listcomp>c                    s   g | ]} j |d tqS r)   r|   r#   r   ro   r"   r   r   rl     s   c                 S   s   dd | D S )Nc                 S   s   g | ]\}}}|j jqS r   )rA   r   )rk   ialr   r   r   rl     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   rj   r   r   r   rl      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 )zwrong passwordri   rj   r   r   r   rl   %  s   zHHashedPasswordOnDiskDatabaseTests.testBadCredentials.<locals>.<listcomp>c                    s   g | ]} j |d tqS r)   r   ro   r"   r   r   rl   '  s   TZconsumeErrors)rY   r   DeferredListrs   _assertFailuresr   rG   )r   ZbadCredsru   r   r"   r   testBadCredentials$  s    z4HashedPasswordOnDiskDatabaseTests.testBadCredentialsc                    sD    fdd j D }tj fdd|D dd}| jtj |S )Nc                    s.   g | ]&\}}t | d ||d d qS )Nr{   )r   rw   rz   rj   r"   r   r   rl   .  s
    zKHashedPasswordOnDiskDatabaseTests.testHashedCredentials.<locals>.<listcomp>c                    s   g | ]} j |d tqS r)   r   ro   r"   r   r   rl   0  s   Tr   )rY   r   r   rs   r   r   ZUnhandledCredentials)r   ZhashedCredsru   r   r"   r   testHashedCredentials-  s    
z7HashedPasswordOnDiskDatabaseTests.testHashedCredentialsc                 G   s*   |D ] \}}|  |tj |j|  qd S r)   )r9   r   FAILUREZtrap)r   ZfailuresZexpectedFailuresflagZfailurer   r   r   r   6  s    z1HashedPasswordOnDiskDatabaseTests._assertFailuresNzcrypt module not available)r   r   r   rY   r7   rz   r   r   r   r   r   r   skipr   r   r   r   ry      s   			ry   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getGoodCredentialsrn   r9   )r   chkcredr0   r}   r   r   r   test_positiveO  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   getBadCredentialsrn   ZassertFailurer   rG   )r   r   r   ru   r   r   r   test_negative[  s    
zCheckersMixin.test_negativeN)r   r   r   r   r   ZinlineCallbacksr   r   r   r   r   r   r   A  s
   
r   c                   @   sD   e Zd ZejZdZedd ZdddgZ	dd Z
d	d
 Zdd ZdS )HashlessFilePasswordDBMixinNc                 C   s   | S r)   r   r   r   r   r   r   j  r   z$HashlessFilePasswordDBMixin.<lambda>)rN   	   password1)rP   s	   password2)rR   	   password3c                 c   s,   | j D ] \}}| || ||fV  qd S r)   )_validCredentials	credClassnetworkHashrf   r   r   r   r   r  s    z.HashlessFilePasswordDBMixin.getGoodCredentialsc                 c   s&   dD ]\}}|  || |V  qd S )N))rN   r   )rP   r   )s   bloofs   blarf)r   r   rf   r   r   r   r   w  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  qW 5 Q R X tj|d
dd||dV    }t|d8} jD ]*\}}|d|  d || d  qW 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     s    )TFrS   rT   rU   )cacherz   s    dingle dongle        r   s   zip,zap,s   ,zup,   ,r{      F)r   rV   rX   r   rZ   r   r_   title)r   r   Z	hashCheckr   fnZfObjr\   r]   r   r"   r   r   ~  s8    
&&  z'HashlessFilePasswordDBMixin.getCheckers)r   r   r   r   r>   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   g  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     r   z)LocallyHashedFilePasswordDBMixin.<lambda>N)r   r   r   r   r   r   r   r   r   r     s   r   c                   @   s*   e Zd Zedd ZG dd dejZdS ) NetworkHashedFilePasswordDBMixinc                 C   s   t | S r)   r   r   r   r   r   r     r   z)NetworkHashedFilePasswordDBMixin.<lambda>c                   @   s   e Zd Zdd ZdS )z*NetworkHashedFilePasswordDBMixin.credClassc                 C   s   t | j|kS r)   )r   Zhashedr,   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   rw   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   )0r   Z
__future__r   r   Zzope.interfacer   r   Zbinasciir   r   Ztwisted.trialr   Ztwisted.python.compatr	   r
   Ztwisted.pythonr   Ztwisted.internetr   Ztwisted.credr   r   r   r   r   ImportErrorr   objectr   ZAdapterr%   ZregisterAdapterr8   r&   r(   ZIRealmr.   ZTestCaser2   rL   ry   r   r   r   r   r   r   r   r   r   r   r   <module>   sR   
Z9E&4	 