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  qW d    n1 sw   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

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