o
    Òó·iò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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)ÚcryptNZTwistedé   é   c                   @   ó   e Zd ZdZdS )Ú	ITestablez2
    An interface for a theoretical protocol.
    N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úaC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-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   )r0   r   r"   r#   )r   ÚavatarIdZmindZ
interfacesZavatarr   r   r   ÚrequestAvatar\   s   

zTestRealm.requestAvatarN)r   r   r   r   r   r2   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.
        r4   r5   ú 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.
        r4   r5   rA   N)rB   r	   r"   r)   r   r<   rD   rE   rF   r   r   rG   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.
        r4   s   h3lloN©ZfailureResultOfr	   r"   r   rC   r   rD   r<   r   ÚUnauthorizedLoginÚtype©r   r"   r   r   r   Útest_failedLoginPassword§   ó   ÿÿ
z"CredTests.test_failedLoginPasswordc                 C   rK   )z’
        Calling C{login} with incorrect credentials (in this case no known
        user) causes L{error.UnauthorizedLogin} to be raised.
        s   jayr5   NrL   rO   r   r   r   Útest_failedLoginName´   rQ   zCredTests.test_failedLoginNameN)
r   r   r   r   r:   r@   rI   rJ   rP   rR   r   r   r   r   r3   f   s    
r3   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   rM   Ú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   rd   r\   re   r^   rf   ÚKeyErrorrg   Úupperr<   ©r   ra   rb   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   rd   r\   re   r^   r<   rg   rj   rk   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   rC   ©Ú.0ra   rb   r   r   r   Ú
<listcomp>å   ó    z;OnDiskDatabaseTests.testRequestAvatarId.<locals>.<listcomp>c                    ó   g | ]
}t  ˆ jj|¡‘qS r   ©r
   ZmaybeDeferredre   ÚrequestAvatarId©rq   Úcr!   r   r   rr   ç   rs   c                 S   ó   g | ]\}}|‘qS r   r   rp   r   r   r   rr   é   ó    )	r   rd   r\   re   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   rp   )r‚   r   r   rr   ñ   ó    zBOnDiskDatabaseTests.testRequestAvatarId_hashed.<locals>.<listcomp>c                    rt   r   ru   rw   r!   r   r   rr   ó   rs   c                 S   ry   r   r   rp   r   r   r   rr   õ   rz   )r   rd   r\   re   ÚgetDeprecatedModuleAttributeÚ_uhpVersionr^   r
   r{   r|   r<   r}   r   ©r‚   r   r   ÚtestRequestAvatarId_hashedì   s   ÿÿz.OnDiskDatabaseTests.testRequestAvatarId_hashedN)
r   r   r   r^   r:   rh   rl   rm   r€   r‡   r   r   r   r   rS   Â   s    		rS   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 )Ú!HashedPasswordOnDiskDatabaseTestsrT   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©ÚhashrX   rY   r   rZ   )r[   r   rd   rŠ   re   r]   r^   r_   r/   r	   r7   Úportr9   )r   r\   r`   ra   rb   Úrr   r   r   r:      s   *ÿÿz'HashedPasswordOnDiskDatabaseTests.setUpra   rb   ÚsÚreturnc                 C   s    t | d¡| d¡ƒ}| d¡S )NÚascii)r   ÚdecodeÚencode)r   ra   rb   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   rn   r   ro   rp   r   r   r   rr     rs   zIHashedPasswordOnDiskDatabaseTests.testGoodCredentials.<locals>.<listcomp>c                    s   g | ]}ˆ j  |¡‘qS r   )re   rv   rw   r!   r   r   rr     s    c                 S   ry   r   r   rp   r   r   r   rr     rz   ©r^   r
   r{   r|   r<   ©r   Z	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   rn   r   ro   rp   r   r   r   rr     rs   zOHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<listcomp>c                    ó   g | ]
}ˆ j  |d t¡‘qS r*   ©r‹   r"   r   rw   r!   r   r   rr     rs   c                 S   s   dd„ | D ƒS )Nc                 S   s   g | ]	\}}}|j j‘qS r   )rF   r   )rq   ÚiÚaÚlr   r   r   rr     rƒ   zaHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<lambda>.<locals>.<listcomp>r   ©Úxr   r   r   Ú<lambda>  s    zMHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<lambda>c                 S   ry   r   r   rp   r   r   r   rr     rz   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 passwordro   rp   r   r   r   rr     s    ÿzHHashedPasswordOnDiskDatabaseTests.testBadCredentials.<locals>.<listcomp>c                    r•   r*   r–   rw   r!   r   r   rr   #  rs   T©ZconsumeErrors)r^   r
   ÚDeferredListr|   Ú_assertFailuresr   rM   )r   Z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‰   rp   r†   r   r   rr   ,  s     ÿzKHashedPasswordOnDiskDatabaseTests.testHashedCredentials.<locals>.<listcomp>c                    r•   r*   r–   rw   r!   r   r   rr   0  rs   Trž   )	r„   r…   r^   r
   rŸ   r|   r    r   ZUnhandledCredentials)r   ZhashedCredsr   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^   r:   Ú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ÚgetGoodCredentialsrv   r<   )r   ÚchkÚcredr1   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¨   ÚgetBadCredentialsrv   ZassertFailurer   rM   )r   rª   r«   r   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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   ÚnetworkHashh  s   z'HashlessFilePasswordDBMixin.networkHash))rU   ó	   password1)rV   s	   password2)rW   ó	   password3c                 c   s.   � | j D ]\}}|  ||  |¡¡|fV  qd S r*   )Ú_validCredentialsÚ	credClassr±   rk   r   r   r   r©   r  s   €ÿz.HashlessFilePasswordDBMixin.getGoodCredentialsc                 c   s(   � dD ]\}}|   ||  |¡¡V  qd S )N))rU   r³   )rV   r²   )s   bloofs   blarf)rµ   r±   rk   r   r   r   r­   v  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,   Zstoredr!   r   r   rœ   �  s   
 )TFrX   rY   rZ   )ÚcacherŠ   s    dingle dongle ó    é   r   s   zip,zap,s   ,zup,ó   ,r   é   F)r¶   r[   r]   r´   r_   r   rd   Útitle)r   r¶   Z	hashCheckr·   ÚfnZfObjra   rb   r   r!   r   r¨   ~  s@   €
ÿÿÿÿÿÿÿÿ
ÿíz'HashlessFilePasswordDBMixin.getCheckers)r   r   r   r   rC   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   ó   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   rC   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   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registerAdapterr;   r'   r)   ZIRealmr/   ZTestCaser3   rS   rˆ   r§   r¯   r¿   rÃ   rÄ   rÆ   rÇ   rÈ   r   r   r   r   Ú<module>   sT   ÿ	\7G$8

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