
    Yf7                        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 	 dd	lmZ eZn# e$ r d
ZY nw xY w edddd          Z G d de          Z G d d          Z ee           G d dej                              Z ej        eee            G d de	j                  Z eee           G d d                      Z eej                    G d d                      Z! G d dej"                  Z# G d dej"                  Z$ G d dej"                  Z% G d  d!          Z& G d" d#          Z' G d$ d%e'          Z( G d& d'e'          Z) G d( d)e'e&ej"                  Z* G d* d+e(e&ej"                  Z+ G d, d-e)e&ej"                  Z, G 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__     M/var/www/html/env/lib/python3.11/site-packages/twisted/cred/test/test_cred.pyr   r      s          	Dr   r   c                   $    e Zd ZdZd Zd Zd ZdS )
TestAvatarz
    A test avatar.
    c                 0    || _         d| _        d| _        d S )NF)nameloggedIn	loggedOut)selfr    s     r   __init__zTestAvatar.__init__,   s    	r   c                 &    | j         rJ d| _         d S NT)r!   r#   s    r   loginzTestAvatar.login1   s    =   r   c                     d| _         d S r&   )r"   r'   s    r   logoutzTestAvatar.logout5   s    r   N)r   r   r   r   r$   r(   r*   r   r   r   r   r   '   sK           
      r   r   c                       e Zd ZdZdS )Testablez-
    A theoretical protocol for testing.
    Nr   r   r   r   r,   r,   9   s          	Dr   r,   c                       e Zd ZdS )IDerivedCredentialsNr   r   r   r   r   r   r.   r.   E   s        Dr   r.   c                       e Zd Zd Zd ZdS )DerivedCredentialsc                 "    || _         || _        d S N)usernamepassword)r#   r4   r5   s      r   r$   zDerivedCredentials.__init__K   s      r   c                     || j         k    S r3   )r5   r#   r5   s     r   checkPasswordz DerivedCredentials.checkPasswordO   s    4=((r   N)r   r   r   r$   r8   r   r   r   r1   r1   I   s2        ! ! !) ) ) ) )r   r1   c                       e Zd ZdZd Zd ZdS )	TestRealmz
    A basic test realm.
    c                     i | _         d S r3   )avatarsr'   s    r   r$   zTestRealm.__init__Y   s    r   c                     || j         v r| j         |         }nt          |          }|| j         |<   |                                 |d          |d         |          |j        fS )Nr   )r<   r   r(   r*   )r#   avatarIdmind
interfacesavatars        r   requestAvatarzTestRealm.requestAvatar\   sd    t|##\(+FF))F%+DL"1}z!}V44fmDDr   N)r   r   r   r   r$   rB   r   r   r   r:   r:   S   sA           E E E E Er   r:   c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )		CredTestsz^
    Tests for the meat of L{twisted.cred} -- realms, portals, avatars, and
    checkers.
    c                    t                      | _        t          j        | j                  | _        t	          j                    | _        | j                            dd           | j                            | j                   d S )N   bob   hello)	r:   realmr
   Portalr   'InMemoryUsernamePasswordDatabaseDontUsecheckeraddUserregisterCheckerr'   s    r   setUpzCredTests.setUpl   sf    [[
mDJ//GIIVX...##DL11111r   c                     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gots      r   test_listCheckerszCredTests.test_listCheckerss   sQ      1;3VWk3355fX&6&677777r   c                    |                      | j                            t          j        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.
        rF   rG    does not implement N)successResultOfr
   r(   r   UsernamePasswordr   rS   
assertTrue
providedByoriginalr!   r"   r#   r(   ifaceimplr*   s        r   test_basicLoginzCredTests.test_basicLogin}   s    
 $$K,VX>>i 
 

 $tV 		***((..40T0TU0T0TUUU 	.///DM33444/00000r   c                    |                      | 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.
        rF   rG   rY   N)rZ   r
   r(   r1   r   rS   r\   r]   r^   r!   r"   r_   s        r   test_derivedInterfacezCredTests.test_derivedInterface   s    
 $$K0BBD)TT
 
 $tV 		***((..40T0TU0T0TUUU 	.///DM33444/00000r   c                    |                      | j                            t          j        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.
        rF   s   h3lloNfailureResultOfr
   r(   r   r[   r   r\   rS   r	   UnauthorizedLogintyper#   r(   s     r   test_failedLoginPasswordz"CredTests.test_failedLoginPassword   w    
 $$K,VX>>i 
 

 	0%*=====r   c                    |                      | j                            t          j        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   jayrG   Nrf   rj   s     r   test_failedLoginNamezCredTests.test_failedLoginName   rl   r   N)
r   r   r   r   rN   rW   rb   rd   rk   rn   r   r   r   rD   rD   f   sx         
2 2 28 8 81 1 1,1 1 1(> > >> > > > >r   rD   c                   :    e Zd Zg dZd Zd Zd Zd Zd Zd Z	dS )	OnDiskDatabaseTests)   user1s   pass1)   user2s   pass2)   user3s   pass3c                     |                                  | _        t          | j        d          5 }| j        D ]#\  }}|                    |dz   |z   dz              $	 d d d            d S # 1 swxY w Y   d S )Nwb   :   
)mktempdbfileopenuserswrite)r#   fups       r   rN   zOnDiskDatabaseTests.setUp   s    kkmm$+t$$ 	.
 . .1D1u,----.	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   ,A))A-0A-c                     t          j        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	   rh   getUserr'   s    r   test_getUserNonexistentDatabasez3OnDiskDatabaseTests.test_getUserNonexistentDatabase   s<    
 )*JKK%147?FKKKKKr   c                 ,   t          j        | j                  | _        | j        D ]m\  }}|                     t          | j        j        |                                           | 	                    | j                            |          ||f           nd S r3   )
r   r   rz   r   r|   r   KeyErrorr   upperrS   r#   r   r   s      r   testUserLookupz"OnDiskDatabaseTests.testUserLookup   s    )$+66J 	9 	9DAqhCCCTW__Q//!Q8888	9 	9r   c                     t          j        | j        d          | _        | j        D ]G\  }}|                     | j                            |                                          ||f           Hd S )NF)caseSensitive)r   r   rz   r   r|   rS   r   r   r   s      r   testCaseInSensitivityz)OnDiskDatabaseTests.testCaseInSensitivity   sq    )$+UKKKJ 	A 	ADAqTW__QWWYY77!Q@@@@	A 	Ar   c                      t          j         j                   _        d  j        D             }t          j         fd|D                       }|                     j        d  j        D                        |S )Nc                 >    g | ]\  }}t          j        ||          S r   r   r[   .0r   r   s      r   
<listcomp>z;OnDiskDatabaseTests.testRequestAvatarId.<locals>.<listcomp>   s)    KKK1-a33KKKr   c                 N    g | ]!}t          j        j        j        |          "S r   r   maybeDeferredr   requestAvatarIdr   cr#   s     r   r   z;OnDiskDatabaseTests.testRequestAvatarId.<locals>.<listcomp>   +    LLLU !8!<<LLLr   c                     g | ]\  }}|S r   r   r   s      r   r   z;OnDiskDatabaseTests.testRequestAvatarId.<locals>.<listcomp>       (B(B(Btq!(B(B(Br   )	r   r   rz   r   r|   r   gatherResultsaddCallbackrS   )r#   credsds   `  r   testRequestAvatarIdz'OnDiskDatabaseTests.testRequestAvatarId   s    )$+66KK
KKKLLLLeLLL
 
 	
d&(B(Btz(B(B(BCCCr   c                 8    t          j         j                   _                             ddt
                    fd j        D             }t          j         fd|D                       }|	                     j
        d  j        D                        |S )Ntwisted.cred.credentialsUsernameHashedPasswordc                 .    g | ]\  }} ||          S r   r   )r   r   r   r   s      r   r   zBOnDiskDatabaseTests.testRequestAvatarId_hashed.<locals>.<listcomp>   s+    EEE$!Q''1--EEEr   c                 N    g | ]!}t          j        j        j        |          "S r   r   r   s     r   r   zBOnDiskDatabaseTests.testRequestAvatarId_hashed.<locals>.<listcomp>   r   r   c                     g | ]\  }}|S r   r   r   s      r   r   zBOnDiskDatabaseTests.testRequestAvatarId_hashed.<locals>.<listcomp>   r   r   )r   r   rz   r   getDeprecatedModuleAttribute_uhpVersionr|   r   r   r   rS   )r#   r   r   r   s   `  @r   testRequestAvatarId_hashedz.OnDiskDatabaseTests.testRequestAvatarId_hashed   s    )$+66!%!B!B&(@+"
 "
 FEEE$*EEELLLLeLLL
 
 	
d&(B(Btz(B(B(BCCCr   N)
r   r   r   r|   rN   r   r   r   r   r   r   r   r   rp   rp      s          E. . .L L L9 9 9A A A
  
 
 
 
 
r   rp   c                   ^    e Zd Zg dZd ZdedededefdZd Zd	 Zd
 Z	d Z
d ZedZdS dS )!HashedPasswordOnDiskDatabaseTestsrq   c                    |                                  }t          j        || j                  | _        t          |d          5 }| j        D ]@\  }}|                    |dz   |                     |||d d                   z   dz              A	 d d d            n# 1 swxY w Y   t                      }t          j
        |          | _        | j                            | j                   d S )Nhashrv   rw   r   rx   )ry   r   r   r   r   r{   r|   r}   r:   r
   rI   portrM   )r#   rz   r~   r   r   rs         r   rN   z'HashedPasswordOnDiskDatabaseTests.setUp   s,   )&tyAAA&$ 	C1
 C C1D499Q1RaR5#9#99EABBBBC	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C KKM!$$		!!$'*****s   A	BB"Br   r   sreturnc                     t          |                    d          |                    d                    }|                    d          S )Nascii)r   decodeencode)r#   r   r   r   hashed_passwords        r   r   z&HashedPasswordOnDiskDatabaseTests.hash  s=     1 1188G3D3DEE%%g...r   c                      d  j         D             }t          j         fd|D                       }|                     j        d  j         D                        |S )Nc                 >    g | ]\  }}t          j        ||          S r   r   r   s      r   r   zIHashedPasswordOnDiskDatabaseTests.testGoodCredentials.<locals>.<listcomp>  )    OOODAq[1!Q77OOOr   c                 D    g | ]}j                             |          S r   )r   r   r   s     r   r   zIHashedPasswordOnDiskDatabaseTests.testGoodCredentials.<locals>.<listcomp>  s)     O O O!8!8!;!; O O Or   c                     g | ]\  }}|S r   r   r   s      r   r   zIHashedPasswordOnDiskDatabaseTests.testGoodCredentials.<locals>.<listcomp>  r   r   r|   r   r   r   rS   r#   	goodCredsr   s   `  r   testGoodCredentialsz5HashedPasswordOnDiskDatabaseTests.testGoodCredentials  sj    OODJOOO	 O O O OY O O OPP	d&(B(Btz(B(B(BCCCr   c                      d  j         D             }t          j         fd|D                       }|                    d            |                     j        d  j         D                        |S )Nc                 >    g | ]\  }}t          j        ||          S r   r   r   s      r   r   zOHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<listcomp>  r   r   c                 R    g | ]#}j                             |d t                    $S r3   r   r(   r   r   s     r   r   zOHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<listcomp>  s+    DDDQTY__Qi00DDDr   c                     d | D             S )Nc                 .    g | ]\  }}}|j         j        S r   )r^   r    )r   ials       r   r   zaHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<lambda>.<locals>.<listcomp>  s"     B B BWQ1 B B Br   r   xs    r   <lambda>zMHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<lambda>  s     B B B B B r   c                     g | ]\  }}|S r   r   r   s      r   r   zOHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<listcomp>  r   r   r   r   s   `  r   testGoodCredentials_loginz;HashedPasswordOnDiskDatabaseTests.testGoodCredentials_login  s    OODJOOO	DDDD)DDD
 
 	
BBCCC	d&(B(Btz(B(B(BCCCr   c                      d  j         D             }t          j         fd|D             d          }|                     j        t
          j                   |S )Nc                 >    g | ]\  }}t          j        |d           S )s   wrong passwordr   r   s      r   r   zHHashedPasswordOnDiskDatabaseTests.testBadCredentials.<locals>.<listcomp>  s7     
 
 
CG1aK(,=>>
 
 
r   c                 R    g | ]#}j                             |d t                    $S r3   r   r   s     r   r   zHHashedPasswordOnDiskDatabaseTests.testBadCredentials.<locals>.<listcomp>#  s+    CCCQTY__Qi00CCCr   TconsumeErrors)r|   r   DeferredListr   _assertFailuresr	   rh   )r#   badCredsr   s   `  r   testBadCredentialsz4HashedPasswordOnDiskDatabaseTests.testBadCredentials  sw    
 
KO:
 
 
 CCCC(CCCSW
 
 
 	
d*E,CDDDr   c                                            ddt                     fd j        D             }t          j         fd|D             d          }|                     j        t          j                   |S )Nr   r   c                 h    g | ].\  }} |                     d ||d d                             /S )Nr   r   )r   r   r   r   r#   s      r   r   zKHashedPasswordOnDiskDatabaseTests.testHashedCredentials.<locals>.<listcomp>,  sP     
 
 
EIQ""1diia2A2&?&?@@
 
 
r   c                 R    g | ]#}j                             |d t                    $S r3   r   r   s     r   r   zKHashedPasswordOnDiskDatabaseTests.testHashedCredentials.<locals>.<listcomp>0  s+    FFFQTY__Qi00FFFr   Tr   )	r   r   r|   r   r   r   r   r	   UnhandledCredentials)r#   hashedCredsr   r   s   `  @r   testHashedCredentialsz7HashedPasswordOnDiskDatabaseTests.testHashedCredentials(  s    !%!B!B&(@+"
 "

 
 
 
 
MQZ
 
 
 FFFF+FFF
 
 
 	
d*E,FGGGr   c                 j    |D ]/\  }}|                      |t          j                    |j        |  0d S r3   )rS   r   FAILUREtrap)r#   failuresexpectedFailuresflagfailures        r   r   z1HashedPasswordOnDiskDatabaseTests._assertFailures6  sE    % 	, 	,MD'T5=111GL*+++tr   Nzcrypt module not available)r   r   r   r|   rN   bytesr   r   r   r   r   r   r   skipr   r   r   r   r      s          E	+ 	+ 	+/e / /% /E / / / /           }+ }r   r   c                   R    e Zd ZdZej        d             Zej        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              #      K   |                                  D ]I}|                                 D ]2\  }}|                    |          V }|                     ||           3JdS )zt
        The given credentials are accepted by all the checkers, and give
        the expected C{avatarID}s
        N)getCheckersgetGoodCredentialsr   rS   )r#   chkcredr>   r   s        r   test_positivezCheckersMixin.test_positiveN  s       ##%% 	. 	.C"&"9"9";"; . .h--d3333  H----.	. 	.r   c              #      K   |                                  D ]P}|                                 D ]9}|                    |          }|                     |t          j                  V  :QdS )zI
        The given credentials are rejected by all the checkers.
        N)r   getBadCredentialsr   assertFailurer	   rh   )r#   r   r   r   s       r   test_negativezCheckersMixin.test_negativeY  s      
 ##%% 	E 	EC..00 E E''--((E,CDDDDDDE	E 	Er   N)r   r   r   r   r   inlineCallbacksr   r   r   r   r   r   r   @  sa          . . . E E E E Er   r   c                   Z    e Zd Zej        ZdZededefd            Z	g dZ
d Zd Zd ZdS )	HashlessFilePasswordDBMixinNr   r   c                     | S r3   r   r   s    r   networkHashz'HashlessFilePasswordDBMixin.networkHashh  s    r   ))rr   	   password1)rs   s	   password2)rt   	   password3c              #   ~   K   | j         D ]2\  }}|                     ||                     |                    |fV  3d S r3   )_validCredentials	credClassr   r   s      r   r   z.HashlessFilePasswordDBMixin.getGoodCredentialsr  sV      * 	< 	<DAq..D$4$4Q$7$788!;;;;;	< 	<r   c              #   p   K   dD ]0\  }}|                      ||                     |                    V  1d S )N))rr   r   )rs   r   )s   bloofs   blarf)r   r   r   s      r   r   z-HashlessFilePasswordDBMixin.getBadCredentialsv  sR      
 	9 	9DAq
 ..D$4$4Q$7$7888888	9 	9r   c           
   #      K    j         pd } j         o fd}dD ]}                                 }t          |d          5 } j        D ],\  }}|                    |dz    ||          z   dz              -	 d d d            n# 1 swxY w Y   t          j        |||          V                                   }t          |d          5 } j        D ],\  }}|                     ||          dz   |z   dz              -	 d d d            n# 1 swxY w Y   t          j        |d	d
d||          V                                   }t          |d          5 } j        D ]A\  }}|                    d|                                z   dz    ||          z   dz              B	 d d d            n# 1 swxY w Y   t          j        |dddd||          V  d S )Nc                     | S r3   r   r   s    r   r   z9HashlessFilePasswordDBMixin.getCheckers.<locals>.<lambda>  s    q r   c                 .                         |          S r3   )diskHash)r4   r5   storedr#   s      r   r   z9HashlessFilePasswordDBMixin.getCheckers.<locals>.<lambda>  s    t}}X/F/F r   )TFrv   rw   rx   )cacher   s    dingle dongle        r   s   zip,zap,s   ,zup,   ,r      F)r  ry   r{   r   r}   r   r   title)r#   r  	hashCheckr  fnfObjr   r   s   `       r   r   z'HashlessFilePasswordDBMixin.getCheckers~  s     =1[[M 
FFFF 	 ! 	 	EBb$ ?4 2 ? ?DAqJJq4x((1++5=>>>>?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )"E	JJJJJJBb$ M4 2 M MDAqJJxx{{-??!CeKLLLLMM M M M M M M M M M M M M M M )"dAqIVVVVVVBb$ 4 2  DAqJJ#aggii/(:XXa[[H5P                 
 )D!QU      '	 	s7   5BB		B		5DD	D	A
F11F5	8F5	)r   r   r   r   r[   r   r  staticmethodr   r   r   r   r   r   r   r   r   r   r   d  s        ,IHu     \  < < <9 9 9    r   r   c                   $    e Zd Zed             ZdS ) LocallyHashedFilePasswordDBMixinc                      t          |           S r3   r   r   s    r   r  z)LocallyHashedFilePasswordDBMixin.diskHash      qzzr   N)r   r   r   r  r  r   r   r   r  r    s-          \  r   r  c                   T    e Zd Zededefd            Z G d dej                  ZdS ) NetworkHashedFilePasswordDBMixinr   r   c                      t          |           S r3   r  r   s    r   r   z,NetworkHashedFilePasswordDBMixin.networkHash  r  r   c                       e Zd Zd ZdS )*NetworkHashedFilePasswordDBMixin.credClassc                 2    t          | j                  |k    S r3   )r   r5   r7   s     r   r8   z8NetworkHashedFilePasswordDBMixin.credClass.checkPassword  s    T]++x77r   N)r   r   r   r8   r   r   r   r   r    s#        	8 	8 	8 	8 	8r   r   N)	r   r   r   r  r   r   r   r[   r   r   r   r   r  r    sm        u     \8 8 8 8 8K0 8 8 8 8 8r   r  c                       e Zd ZdS )"HashlessFilePasswordDBCheckerTestsNr/   r   r   r   r  r             	Dr   r  c                       e Zd ZdS )'LocallyHashedFilePasswordDBCheckerTestsNr/   r   r   r   r  r    r  r   r  c                       e Zd ZdS )'NetworkHashedFilePasswordDBCheckerTestsNr/   r   r   r   r!  r!    r  r   r!  c                       e Zd ZdZd ZdS )UsernameHashedPasswordTestszo
    UsernameHashedPassword is a deprecated class that is functionally
    equivalent to UsernamePassword.
    c                 @    |                      ddt          d           dS )zB
        Tests that UsernameHashedPassword is deprecated.
        r   r   z6Use twisted.cred.credentials.UsernamePassword instead.N)r   r   r'   s    r   test_deprecationz,UsernameHashedPasswordTests.test_deprecation  s2     	))&$D		
 	
 	
 	
 	
r   N)r   r   r   r   r%  r   r   r   r#  r#    s-         
	
 	
 	
 	
 	
r   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,   registerAdapterrP   r.   r1   IRealmr:   TestCaserD   rp   r   r   r   r  r  r  r  r!  r#  r   r   r   <module>r3     s   
 ( ' ' ' ' ' ' ' 1 1 1 1 1 1 1 1 = = = = = = = = = = = = " " " " " " % % % % % % + + + + + + " " " " " "%%%%%% EE    EEE giQ**	 	 	 	 		 	 	 	       $ Y	 	 	 	 	z! 	 	 	 
 8Z ; ; ;	 	 	 	 	+7 	 	 	  ),,) ) ) ) ) ) ) -,) V]E E E E E E E E$Y> Y> Y> Y> Y>! Y> Y> Y>x4 4 4 4 4(+ 4 4 4nD, D, D, D, D,(9 D, D, D,N!E !E !E !E !E !E !E !EH5 5 5 5 5 5 5 5p    'B   8 8 8 8 8'B 8 8 8	 	 	 	 	0A	 	 		 	 	 	 	$mX5F	 	 		 	 	 	 	$mX5F	 	 	
 
 
 
 
("3 
 
 
 
 
s   A A
A