Ϫf7`dZddlmZmZddlmZmZddlmZm Z m Z m Z ddl m Z ddlmZddlmZddlmZ dd lmZeZed d d dZGddeZGddZeeGddej4Zej8eeeGdde j:ZeeeGddZee j@GddZ!GddejDZ#GddejDZ$GddejDZ%Gd d!Z&Gd"d#Z'Gd$d%e'Z(Gd&d'e'Z)Gd(d)e'e&ejDZ*Gd*d+e(e&ejDZ+Gd,d-e)e&ejDZ,Gd.d/ejDZ-y #e$rd ZYlwxYw)0z6 Tests for L{twisted.cred}, now with 30% more starch. )hexlify unhexlify) Interface implementer)checkers credentialserrorportal)defer) components)Version)unittest)cryptNTwistedceZdZdZy) ITestablez2 An interface for a theoretical protocol. N__name__ __module__ __qualname____doc__=/usr/lib/python3/dist-packages/twisted/cred/test/test_cred.pyrrs  rrc"eZdZdZdZdZdZy) TestAvatarz A test avatar. c.||_d|_d|_y)NF)nameloggedIn loggedOut)selfr s r__init__zTestAvatar.__init__,s  rc.|jrJd|_yNT)r!r#s rloginzTestAvatar.login1s==   rcd|_yr&)r"r's rlogoutzTestAvatar.logout5s rN)rrrrr$r(r*rrrrr's rrceZdZdZy)Testablez- A theoretical protocol for testing. Nrrrrr,r,9s  rr,c eZdZy)IDerivedCredentialsNrrrrrrr.r.Esrr.ceZdZdZdZy)DerivedCredentialsc ||_||_yN)usernamepassword)r#r4r5s rr$zDerivedCredentials.__init__Ks    rc ||jk(Sr3)r5r#r5s r checkPasswordz DerivedCredentials.checkPasswordOs4==((rN)rrrr$r8rrrr1r1Is !)rr1ceZdZdZdZdZy) TestRealmz A basic test realm. ci|_yr3)avatarsr's rr$zTestRealm.__init__Ys  rc||jvr|j|}nt|}||j|<|j|d|d||jfS)Nr)r<rr(r*)r#avatarIdmind interfacesavatars r requestAvatarzTestRealm.requestAvatar\s] t|| #\\(+F)F%+DLL " 1 }z!}V4fmmDDrN)rrrrr$rBrrrr:r:SsErr:c4eZdZdZdZdZdZdZdZdZ y) CredTestsz^ Tests for the meat of L{twisted.cred} -- realms, portals, avatars, and checkers. ct|_tj|j|_t j |_|j jdd|jj|j y)Nbobhello) r:realmr Portalr'InMemoryUsernamePasswordDatabaseDontUsecheckeraddUserregisterCheckerr's rsetUpzCredTests.setUplsY[ mmDJJ/ GGI  VX. ##DLL1rctjtjg}|jj }|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)rIUsernamePasswordIUsernameHashedPasswordr listCredentialsInterfaces assertEqualsorted)r#expectedgots rtest_listCheckerszCredTests.test_listCheckersssE  11;3V3VWkk335 fX&67rc|j|jjtjdd|t }|\}}}|j |t |j|j||d||j|jj|j|jj ||j|jjy)z Calling C{login} on a portal with correct credentials and an interface that the portal's realm supports works. rFrG does not implement N) successResultOfr r(rUsernamePasswordrrS assertTrue providedByoriginalr!r"r#r(ifaceimplr*s rtest_basicLoginzCredTests.test_basicLogin}s $$ KK  ,,VX>i   $tV  * ((.4&8LUG0TU  ../ DMM3334  //0rc|j|jjtdd|t}|\}}}|j |t|j |j||d||j |jj|j |jj ||j |jjy)z~ Logging in with correct derived credentials and an interface that the portal's realm supports works. rFrGrYN) rZr r(r1rrSr\r]r^r!r"r_s rtest_derivedInterfacezCredTests.test_derivedInterfaces $$ KK  0BD) T $tV  * ((.4&8LUG0TU  ../ DMM3334  //0rc|j|jjtjdd|t }|j ||jtj|jy)z Calling C{login} with incorrect credentials (in this case a wrong password) causes L{error.UnauthorizedLogin} to be raised. rFsh3lloN failureResultOfr r(rr[rr\rSr UnauthorizedLogintyper#r(s rtest_failedLoginPasswordz"CredTests.test_failedLoginPasswordb $$ KK  ,,VX>i    00%**=rc|j|jjtjdd|t }|j ||jtj|jy)z Calling C{login} with incorrect credentials (in this case no known user) causes L{error.UnauthorizedLogin} to be raised. sjayrGNrfrjs rtest_failedLoginNamezCredTests.test_failedLoginNamerlrN) rrrrrNrWrbrdrkrnrrrrDrDfs% 281,1( > >rrDc8eZdZgdZdZdZdZdZdZdZ y) OnDiskDatabaseTests)user1spass1)user2spass2)user3spass3c|j|_t|jd5}|jD]\}}|j |dz|zdz! dddy#1swYyxYw)Nwb: )mktempdbfileopenuserswrite)r#fups rrNzOnDiskDatabaseTests.setUpsdkkm $++t $ .  .1D1 u,- . . . .s /A%%A.ctjd|_|jtj |jj dy)zg A missing db file will cause a permanent rejection of authorization attempts. ztest_thisbetternoteverexist.dbuserN)rFilePasswordDBdb assertRaisesr rhgetUserr's rtest_getUserNonexistentDatabasez3OnDiskDatabaseTests.test_getUserNonexistentDatabases7 ))*JK %11477??FKrc@tj|j|_|jD]k\}}|j t |jj|j|j|jj|||fmyr3) rrrzrr|rKeyErrorrupperrSr#rrs rtestUserLookupz"OnDiskDatabaseTests.testUserLookupsp))$++6JJ 9DAq   h C   TWW__Q/!Q 8 9rctj|jd|_|jD]@\}}|j |jj |j||fBy)NF) caseSensitive)rrrzrr|rSrrrs rtestCaseInSensitivityz)OnDiskDatabaseTests.testCaseInSensitivitysZ))$++UKJJ ADAq   TWW__QWWY7!Q @ Arc tj|j|_|jDcgc]\}}t j ||}}}tj|Dcgc],}tj|jj|.c}}|j|j|jDcgc]\}}| c}}|Scc}}wcc}wcc}}wr3) rrrzrr|rr[r gatherResults maybeDeferredrequestAvatarId addCallbackrS)r#rrcredscds rtestRequestAvatarIdz'OnDiskDatabaseTests.testRequestAvatarIds))$++6@D K1--a3KK   FK LU !8!8! < L  d&&tzz(Btq!(BC L L(Bs C*1C# C( c tj|j|_|j ddt }|j Dcgc]\}}|||}}}tj|Dcgc],}tj|jj|.c}}|j|j|j Dcgc]\}}| c}}|Scc}}wcc}wcc}}w)Ntwisted.cred.credentialsUsernameHashedPassword) rrrzrgetDeprecatedModuleAttribute _uhpVersionr|r rrrrrS)r#rrrrrrs rtestRequestAvatarId_hashedz.OnDiskDatabaseTests.testRequestAvatarId_hasheds))$++6!%!B!B &(@+" ;?**E$!Q'1-EE   FK LU !8!8! < L  d&&tzz(Btq!(BC F L(Bs C'41C- C2 N) rrrr|rNrrrrrrrrrprps) E . L9 A  rrpcZeZdZgdZdZdedededefdZdZd Zd Z d Z d Z e dZ y y )!HashedPasswordOnDiskDatabaseTestsrqc |j}tj||j|_t |d5}|j D]3\}}|j|dz|j|||ddzdz5 dddt}tj||_ |jj|jy#1swYSxYw)N)hashrvrwrrx) ryrrrrr{r|r}r:r rIportrM)r#rzr~rrrs rrNz'HashedPasswordOnDiskDatabaseTests.setUps))&tyyA &$  C1  C1D499Q1Ra5#99EAB C C KMM!$  !!$''*  C Cs ACC"rrsreturncxt|jd|jd}|jdS)Nascii)rdecodeencode)r#rrrhashed_passwords rrz&HashedPasswordOnDiskDatabaseTests.hash s1 1188G3DE%%g..rc v|jDcgc]\}}tj||}}}tj|Dcgc]}|j j |c}}|j|j|jDcgc]\}}| c}}|Scc}}wcc}wcc}}wr3) r|rr[r rrrrrSr#rr goodCredsrrs rtestGoodCredentialsz5HashedPasswordOnDiskDatabaseTests.testGoodCredentialssDHJJODAq[11!Q7O O   Y O!8!8!; O P d&&tzz(Btq!(BCP O(Bs B*"B0 B5 c |jDcgc]\}}tj||}}}tj|Dcgc]#}|j j |dt%c}}|jd|j|j|jDcgc]\}}| c}}|Scc}}wcc}wcc}}w)Nch|Dcgc]\}}}|jjc}}}Scc}}}wr3)r^r )xials rzMHashedPasswordOnDiskDatabaseTests.testGoodCredentials_login..s% B BWQ1 B Bs!-) r|rr[r rrr(rrrSrs rtestGoodCredentials_loginz;HashedPasswordOnDiskDatabaseTests.testGoodCredentials_loginsDHJJODAq[11!Q7O O   :C DQTYY__Qi 0 D  BC d&&tzz(Btq!(BC P D)Cs C(C, C c \|jDcgc]\}}tj|d}}}tj|Dcgc]#}|j j |dt%c}d}|j|jtj|Scc}}wcc}w)Nswrong passwordT consumeErrors) r|rr[r DeferredListrr(rr_assertFailuresr rh)r#rrbadCredsrrs rtestBadCredentialsz4HashedPasswordOnDiskDatabaseTests.testBadCredentialssKO:: CG1aK ( (,= >     :B CQTYY__Qi 0 CSW  d**E,C,CD  Ds B#(B)c|jddt}|jDcgc]"\}}|||jd||dd$}}}t j |Dcgc]#}|j j|dt%c}d}|j|jtj|Scc}}wcc}w)NrrrTr) rrr|rr rrr(rrrr UnhandledCredentials)r#rrr hashedCredsrrs rtestHashedCredentialsz7HashedPasswordOnDiskDatabaseTests.testHashedCredentials(s!%!B!B &(@+" NRZZ EIQ "1diia2A&? @     :E FQTYY__Qi 0 F  d**E,F,FG  Gs 'C$(Ccv|D]4\}}|j|tj|j|6yr3)rSr FAILUREtrap)r#failuresexpectedFailuresflagfailures rrz1HashedPasswordOnDiskDatabaseTests._assertFailures6s=% ,MD'   T5== 1 GLL* + ,rNzcrypt module not available)rrrr|rNbytesrrrrrrrskiprrrrrsY E +/e//%/E/    }+rrcXeZdZdZej dZej dZy) 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|jD]?}|jD]*\}}|j|}|j||,Ayw)zt The given credentials are accepted by all the checkers, and give the expected C{avatarID}s N) getCheckersgetGoodCredentialsrrS)r#chkcredr>rs r test_positivezCheckersMixin.test_positiveNs_ ##% .C"&"9"9"; .h--d33  H- . .sAAc#K|jD]J}|jD]5}|j|}|j|tj 7Lyw)zI The given credentials are rejected by all the checkers. N)rgetBadCredentialsr assertFailurer rh)r#rrrs r test_negativezCheckersMixin.test_negativeYse ##% EC..0 E''-((E,C,CDD E EsAA!N)rrrrr inlineCallbacksrrrrrrr@s=  .. EErrc\eZdZejZdZededefdZ gdZ dZ dZ dZ y) HashlessFilePasswordDBMixinNrrc|Sr3rrs r networkHashz'HashlessFilePasswordDBMixin.networkHashhsr))rr password1)rss password2)rt password3c#~K|jD]*\}}|j||j||f,ywr3)_validCredentials credClassrrs rrz.HashlessFilePasswordDBMixin.getGoodCredentialsrs@** .sqrc&j|Sr3)diskHash)r4r5storedr#s rrz9HashlessFilePasswordDBMixin.getCheckers..st}}X/Fr)TFrvrwrx)cachers dingle dongle  rszip,zap,s,zup,,rF)rryr{rr}rrtitle)r#r hashCheckrfnfObjrrs` rrz'HashlessFilePasswordDBMixin.getCheckers~s==1[MM F ! EBb$ ?4 22?DAqJJq4x(1+5=>? ?))"E J JBb$ M4 22MDAqJJx{-??!CeKLM M))"dAqIV VBb$ 4 22DAqJJ#aggi/(:Xa[H5P  ))D!QU '  ? ?  M M   sPAG  5F&>G >5F34AG 5AF?<*G &F0 +G 3F< 8G ?G G )rrrrr[rr staticmethodrrrrrrrrrrrdsI,,IHu <9rrceZdZedZy) LocallyHashedFilePasswordDBMixinct|Sr3rrs rrz)LocallyHashedFilePasswordDBMixin.diskHash qzrN)rrrrrrrrrrsrrcPeZdZededefdZGddejZy) NetworkHashedFilePasswordDBMixinrrct|Sr3rrs rrz,NetworkHashedFilePasswordDBMixin.networkHashrrceZdZdZy)*NetworkHashedFilePasswordDBMixin.credClassc2t|j|k(Sr3)rr5r7s rr8z8NetworkHashedFilePasswordDBMixin.credClass.checkPasswordsT]]+x7 7rN)rrrr8rrrrrs 8rrN) rrrrrrrr[rrrrrrs4u8K008rrc eZdZy)"HashlessFilePasswordDBCheckerTestsNr/rrrrr rrc eZdZy)'LocallyHashedFilePasswordDBCheckerTestsNr/rrrrrrrrc eZdZy)'NetworkHashedFilePasswordDBCheckerTestsNr/rrrrrrrrceZdZdZdZy)UsernameHashedPasswordTestszo UsernameHashedPassword is a deprecated class that is functionally equivalent to UsernamePassword. c4|jddtdy)zB Tests that UsernameHashedPassword is deprecated. rrz6Use twisted.cred.credentials.UsernamePassword instead.N)rrr's rtest_deprecationz,UsernameHashedPasswordTests.test_deprecations )) & $  D  rN)rrrrrrrrrrs   rr).rbinasciirrzope.interfacerr twisted.credrrr r twisted.internetr twisted.pythonr twisted.python.versionsr twisted.trialrr_crypt ImportErrorrrrAdapterr,registerAdapterrPr.r1IRealmr:TestCaserDrprrrrrrrrrrrrrs (1=="%+"% EiQ*   $ Y z!!   8Z; +77  ),))-) V]]EEE$Y>!!Y>x4(++4nD,(9(9D,N!E!EH55p'B 8'B8 0A0A  $mX5F5F  $mX5F5F  ("3"3 S  EsF""F-,F-