
    Vh7                     `   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 edddd      Z G d de      Z G d d      Z ee       G d dej4                               Z ej8                  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jD                        Z# G d dejD                        Z$ G d dejD                        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jD                        Z* G d* d+e(e&ejD                        Z+ G d, d-e)e&ejD                        Z, G d. d/ejD                        Z-y
# e$ r d
ZY lw xY w)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y)	ITestablez2
    An interface for a theoretical protocol.
    N__name__
__module____qualname____doc__     K/home/dcms/DCMS/lib/python3.12/site-packages/twisted/cred/test/test_cred.pyr   r      s     	r   r   c                   "    e Zd ZdZd Zd Zd Zy)
TestAvatarz
    A test avatar.
    c                 .    || _         d| _        d| _        y )NF)nameloggedIn	loggedOut)selfr    s     r   __init__zTestAvatar.__init__,   s    	r   c                 .    | j                   rJ d| _         y NT)r!   r#   s    r   loginzTestAvatar.login1   s    ==  r   c                     d| _         y r&   )r"   r'   s    r   logoutzTestAvatar.logout5   s	    r   N)r   r   r   r   r$   r(   r*   r   r   r   r   r   '   s    
r   r   c                       e Zd ZdZy)Testablez-
    A theoretical protocol for testing.
    Nr   r   r   r   r,   r,   9   s     	r   r,   c                       e Zd Zy)IDerivedCredentialsNr   r   r   r   r   r   r.   r.   E   s    r   r.   c                       e Zd Zd Zd Zy)DerivedCredentialsc                      || _         || _        y 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   s    !)r   r1   c                       e Zd ZdZd Zd Zy)	TestRealmz
    A basic test realm.
    c                     i | _         y r3   )avatarsr'   s    r   r$   zTestRealm.__init__Y   s	    r   c                     || j                   v r| j                   |   }nt        |      }|| j                   |<   |j                          |d    |d   |      |j                  fS )Nr   )r<   r   r(   r*   )r#   avatarIdmind
interfacesavatars        r   requestAvatarzTestRealm.requestAvatar\   s]    t||#\\(+F)F%+DLL"1}z!}V4fmmDDr   N)r   r   r   r   r$   rB   r   r   r   r:   r:   S   s    Er   r:   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)		CredTestsz^
    Tests for the meat of L{twisted.cred} -- realms, portals, avatars, and
    checkers.
    c                    t               | _        t        j                  | j                        | _        t	        j
                         | _        | j                  j                  dd       | j                  j                  | j                         y )N   bob   hello)	r:   realmr
   Portalr   'InMemoryUsernamePasswordDatabaseDontUsecheckeraddUserregisterCheckerr'   s    r   setUpzCredTests.setUpl   sY    [
mmDJJ/GGIVX.##DLL1r   c                     t         j                  t         j                  g}| j                  j	                         }| j                  t        |      t        |             y)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   sE      11;3V3VWkk335fX&67r   c                    | j                  | j                  j                  t        j                  dd      | t
                    }|\  }}}| j                  |t
               | j                  |j                  |      | d|        | j                  |j                  j                         | j                  |j                  j                           |        | j                  |j                  j                         y)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    
 $$KK,,VX>i

 $tV 		*((.4&8LUG0TU 	../DMM3334//0r   c                    | j                  | j                  j                  t        dd      | t                    }|\  }}}| j                  |t               | j                  |j                  |      | d|        | j                  |j                  j                         | j                  |j                  j                           |        | j                  |j                  j                         y)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    
 $$KK0BD)T
 $tV 		*((.4&8LUG0TU 	../DMM3334//0r   c                    | j                  | j                  j                  t        j                  dd      | t
                    }| j                  |       | j                  t        j                  |j                         y)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   b    
 $$KK,,VX>i

 	00%**=r   c                    | j                  | j                  j                  t        j                  dd      | t
                    }| j                  |       | j                  t        j                  |j                         y)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   s%    
281,1(>>r   rD   c                   8    e Zd Zg dZd Zd Zd Zd Zd Zd Z	y)	OnDiskDatabaseTests)   user1s   pass1)   user2s   pass2)   user3s   pass3c                     | j                         | _        t        | j                  d      5 }| j                  D ]  \  }}|j	                  |dz   |z   dz          ! 	 d d d        y # 1 sw Y   y xY w)Nwb   :   
)mktempdbfileopenuserswrite)r#   fups       r   rN   zOnDiskDatabaseTests.setUp   sd    kkm$++t$ 	.

 .1D1u,-.	. 	. 	.s   /A%%A.c                     t        j                  d      | _        | j                  t        j
                  | j                  j                  d       y)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   s7    
 ))*JK%11477??FKr   c                 @   t        j                  | j                        | _        | j                  D ]k  \  }}| j                  t        | j                  j                  |j                                | j                  | j                  j                  |      ||f       m y r3   )
r   r   rz   r   r|   r   KeyErrorr   upperrS   r#   r   r   s      r   testUserLookupz"OnDiskDatabaseTests.testUserLookup   sp    ))$++6JJ 	9DAqhCTWW__Q/!Q8	9r   c                     t        j                  | j                  d      | _        | j                  D ]@  \  }}| j                  | j                  j                  |j                               ||f       B y )NF)caseSensitive)r   r   rz   r   r|   rS   r   r   r   s      r   testCaseInSensitivityz)OnDiskDatabaseTests.testCaseInSensitivity   sZ    ))$++UKJJ 	ADAqTWW__QWWY7!Q@	Ar   c           	         t        j                  | j                        | _        | j                  D cg c]  \  }}t        j                  ||       }}}t        j                  |D cg c],  }t        j                  | j                  j                  |      . c}      }|j                  | j                  | j                  D cg c]  \  }}|	 c}}       |S c c}}w c c}w c c}}w r3   )r   r   rz   r   r|   r   r[   r   gatherResultsmaybeDeferredrequestAvatarIdaddCallbackrS   )r#   r   r   credscds         r   testRequestAvatarIdz'OnDiskDatabaseTests.testRequestAvatarId   s    ))$++6@D

K1--a3KKFKLU  !8!8!<L
 	
d&&tzz(Btq!(BC LL(Bs    C*1C#C(c           	         t        j                  | j                        | _        | j	                  ddt
              }| j                  D cg c]  \  }} |||       }}}t        j                  |D cg c],  }t        j                  | j                  j                  |      . c}      }|j                  | j                  | j                  D cg c]  \  }}|	 c}}       |S c c}}w c c}w c c}}w )Ntwisted.cred.credentialsUsernameHashedPassword)r   r   rz   r   getDeprecatedModuleAttribute_uhpVersionr|   r   r   r   r   r   rS   )r#   r   r   r   r   r   r   s          r   testRequestAvatarId_hashedz.OnDiskDatabaseTests.testRequestAvatarId_hashed   s    ))$++6!%!B!B&(@+"
 ;?**E$!Q'1-EEFKLU  !8!8!<L
 	
d&&tzz(Btq!(BC FL(Bs   C'41C-C2N)
r   r   r   r|   rN   r   r   r   r   r   r   r   r   rp   rp      s)    E.L9A

r   rp   c                   Z    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yy)!HashedPasswordOnDiskDatabaseTestsrq   c                    | j                         }t        j                  || j                        | _        t        |d      5 }| j                  D ]3  \  }}|j                  |dz   | j                  |||d d       z   dz          5 	 d d d        t               }t        j                  |      | _        | j                  j                  | j                         y # 1 sw Y   SxY w)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    ))&tyyA&$ 	C1

 C1D499Q1Ra5#99EABC	C KMM!$			!!$''*	C 	Cs   ACC"r   r   sreturnc                 x    t        |j                  d      |j                  d            }|j                  d      S )Nascii)r   decodeencode)r#   r   r   r   hashed_passwords        r   r   z&HashedPasswordOnDiskDatabaseTests.hash  s1     1188G3DE%%g..r   c           	      v   | j                   D cg c]  \  }}t        j                  ||       }}}t        j                  |D cg c]  }| j
                  j                  |       c}      }|j                  | j                  | j                   D cg c]  \  }}|	 c}}       |S c c}}w c c}w c c}}w r3   )	r|   r   r[   r   r   r   r   r   rS   r#   r   r   	goodCredsr   r   s         r   testGoodCredentialsz5HashedPasswordOnDiskDatabaseTests.testGoodCredentials  s    DHJJODAq[11!Q7O	OY O!8!8!; OP	d&&tzz(Btq!(BC P O(Bs    B*"B0B5c           
         | j                   D cg c]  \  }}t        j                  ||       }}}t        j                  |D cg c]#  }| j
                  j                  |d t              % c}      }|j                  d        |j                  | j                  | j                   D cg c]  \  }}|	 c}}       |S c c}}w c c}w c c}}w )Nc                 h    | D cg c]  \  }}}|j                   j                   c}}}S c c}}}w r3   )r^   r    )xials       r   <lambda>zMHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login.<locals>.<lambda>  s%     B BWQ1 B  Bs   !-)
r|   r   r[   r   r   r   r(   r   r   rS   r   s         r   testGoodCredentials_loginz;HashedPasswordOnDiskDatabaseTests.testGoodCredentials_login  s    DHJJODAq[11!Q7O	O:CDQTYY__Qi0D
 	
BC	d&&tzz(Btq!(BC PD )Cs    C(C,Cc           
      \   | j                   D cg c]  \  }}t        j                  |d       }}}t        j                  |D cg c]#  }| j
                  j                  |d t              % c}d      }|j                  | j                  t        j                         |S c c}}w c c}w )Ns   wrong passwordTconsumeErrors)r|   r   r[   r   DeferredListr   r(   r   r   _assertFailuresr	   rh   )r#   r   r   badCredsr   r   s         r   testBadCredentialsz4HashedPasswordOnDiskDatabaseTests.testBadCredentials  s    KO::
CG1aK((,=>
 
 :BCQTYY__Qi0CSW
 	
d**E,C,CD
 Ds    B#(B)c                    | j                  ddt              }| j                  D cg c]"  \  }} ||| j                  d ||d d             $ }}}t	        j
                  |D cg c]#  }| j                  j                  |d t              % c}d      }|j                  | j                  t        j                         |S c c}}w c c}w )Nr   r   r   Tr   )r   r   r|   r   r   r   r   r(   r   r   r   r	   UnhandledCredentials)r#   r   r   r   hashedCredsr   r   s          r   testHashedCredentialsz7HashedPasswordOnDiskDatabaseTests.testHashedCredentials(  s    !%!B!B&(@+"
 NRZZ
EIQ"1diia2A&?@
 
 :EFQTYY__Qi0F
 	
d**E,F,FG
 Gs   'C$(Cc                 v    |D ]4  \  }}| j                  |t        j                          |j                  |  6 y r3   )rS   r   FAILUREtrap)r#   failuresexpectedFailuresflagfailures        r   r   z1HashedPasswordOnDiskDatabaseTests._assertFailures6  s=    % 	,MD'T5==1GLL*+	, r   Nzcrypt module not available)r   r   r   r|   rN   bytesr   r   r   r   r   r   r   skipr   r   r   r   r      sY    E	+/e / /% /E / }+ r   r   c                   X    e Zd ZdZej
                  d        Zej
                  d        Zy)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   | j                         D ]?  }| j                         D ]*  \  }}|j                  |      }| j                  ||       , A yw)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  H-.	.s   AAc              #      K   | j                         D ]J  }| j                         D ]5  }|j                  |      }| j                  |t        j
                         7 L yw)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  se     
 ##% 	EC..0 E''-((E,C,CDDE	Es   AA!N)r   r   r   r   r   inlineCallbacksr   r   r   r   r   r   r   @  s=     . . E Er   r   c                   \    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y)	HashlessFilePasswordDBMixinNr   r   c                     | S r3   r   r   s    r   networkHashz'HashlessFilePasswordDBMixin.networkHashh  s    r   ))rr   	   password1)rs   s	   password2)rt   	   password3c              #   ~   K   | j                   D ]*  \  }}| j                  || j                  |            |f , y wr3   )_validCredentials	credClassr   r   s      r   r   z.HashlessFilePasswordDBMixin.getGoodCredentialsr  s@     ** 	<DAq..D$4$4Q$78!;;	<s   ;=c              #   f   K   dD ](  \  }}| j                  || j                  |             * y w)N))rr   r   )rs   r   )s   bloofs   blarf)r   r   r   s      r   r   z-HashlessFilePasswordDBMixin.getBadCredentialsv  s9     
 	9DAq
 ..D$4$4Q$788	9s   /1c           
   #      K    j                   xs d } j                   xr  fd}dD ]w  } j                         }t        |d      5 } j                  D ]%  \  }}|j	                  |dz    ||      z   dz          ' 	 d d d        t        j                  |||        j                         }t        |d      5 } j                  D ]%  \  }}|j	                   ||      dz   |z   dz          ' 	 d d d        t        j                  |d	d
d||        j                         }t        |d      5 } j                  D ]6  \  }}|j	                  d|j                         z   dz    ||      z   dz          8 	 d d d        t        j                  |dddd||       z y # 1 sw Y   (xY w# 1 sw Y   xY w# 1 sw Y   DxY ww)Nc                     | S r3   r   r   s    r   r   z9HashlessFilePasswordDBMixin.getCheckers.<locals>.<lambda>  s    q r   c                 &    j                  |      S r3   )diskHash)r4   r5   storedr#   s      r   r   z9HashlessFilePasswordDBMixin.getCheckers.<locals>.<lambda>  s    t}}X/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[MM 
F 	 ! 	EBb$ ?4 22 ?DAqJJq4x(1+5=>?? ))"E	JJBb$ M4 22 MDAqJJx{-??!CeKLMM ))"dAqIVVBb$ 4 22 DAqJJ#aggi/(:Xa[H5P
 ))D!QU '	? ?M M sP   AG
5F& >G>5F34AG5AF?<*G&F0	+G3F<	8G?G	G)r   r   r   r   r[   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r   d  sI    ,,IHu   <9r   r   c                       e Zd Zed        Zy) LocallyHashedFilePasswordDBMixinc                     t        |       S r3   r   r   s    r   r   z)LocallyHashedFilePasswordDBMixin.diskHash      qzr   N)r   r   r   r   r   r   r   r   r   r     s     r   r   c                   P    e Zd Zededefd       Z G d dej                        Zy) NetworkHashedFilePasswordDBMixinr   r   c                     t        |       S r3   r   r   s    r   r   z,NetworkHashedFilePasswordDBMixin.networkHash  r   r   c                       e Zd Zd Zy)*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    	8r   r   N)	r   r   r   r   r   r   r   r[   r   r   r   r   r   r     s4    u   8K00 8r   r   c                       e Zd Zy)"HashlessFilePasswordDBCheckerTestsNr/   r   r   r   r   r          	r   r   c                       e Zd Zy)'LocallyHashedFilePasswordDBCheckerTestsNr/   r   r   r   r  r    r   r   r  c                       e Zd Zy)'NetworkHashedFilePasswordDBCheckerTestsNr/   r   r   r   r  r    r   r   r  c                       e Zd ZdZd Zy)UsernameHashedPasswordTestszo
    UsernameHashedPassword is a deprecated class that is functionally
    equivalent to UsernamePassword.
    c                 4    | j                  ddt        d       y)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  s     	))&$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>r     s  
 ( 1 = = " % + "% E iQ*		 	 $ Y	z!! 	 	 
  8Z ;	+77 	  ),) ) -) V]]E E E$Y>!! Y>x4(++ 4nD,(9(9 D,N!E !EH5 5p'B 8'B 8	0A0A		$mX5F5F		$mX5F5F	
("3"3 
S  Es   F" "F-,F-