
[XMc           @   s  d  Z  d d l Z d d l m Z m Z d d l 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 m Z y d d	 l m Z Wn e k
 r d Z n Xy d d
 l m Z Wn e k
 r d Z n Xd d l m Z d e f d     YZ d d0 d     YZ d e j f d     YZ e j e e e  d e
 j  f d     YZ! d e" f d     YZ# d d1 d     YZ$ d e j% f d     YZ& d e j% f d     YZ' d e j% f d     YZ( d e j% f d     YZ) d  e j% f d!     YZ* d" d2 d#     YZ+ d$ d3 d%     YZ, d& e, f d'     YZ- d( e, f d)     YZ. d* e, e+ e j% f d+     YZ/ d, e- e+ e j% f d-     YZ0 d. e. e+ e j% f d/     YZ1 d S(4   s6   
Tests for L{twisted.cred}, now with 30% more starch.
iN(   t
   implementst	   Interface(   t   unittest(   t   portalt   checkerst   credentialst   error(   t
   components(   t   defer(   t   deferredGeneratort   waitForDeferred(   t   crypt(   t   callIntoPAM(   t   pamautht	   ITestablec           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR      s   t
   TestAvatarc           B   s#   e  Z d    Z d   Z d   Z RS(   c         C   s   | |  _  t |  _ t |  _ d  S(   N(   t   namet   Falset   loggedInt	   loggedOut(   t   selfR   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   __init__#   s    		c         C   s   |  j  s t  t |  _  d  S(   N(   R   t   AssertionErrort   True(   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   login(   s    c         C   s   t  |  _ d  S(   N(   R   R   (   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   logout,   s    (   R   R   R   R   R   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR   "   s   		t   Testablec           B   s   e  Z e e  RS(    (   R   R   R    R   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR   /   s   t   IDerivedCredentialsc           B   s   e  Z RS(    (   R   R   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR   6   s   t   DerivedCredentialsc           B   s'   e  Z e e e  d    Z d   Z RS(   c         C   s   | |  _  | |  _ d  S(   N(   t   usernamet   password(   R   R   R    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR   <   s    	c         C   s   | |  j  k S(   N(   R    (   R   R    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   checkPassword@   s    (   R   R   R    R   R   R   R!   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR   9   s   	t	   TestRealmc           B   s'   e  Z e e j  d    Z d   Z RS(   c         C   s   i  |  _  d  S(   N(   t   avatars(   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR   F   s    c         G   sc   |  j  j |  r" |  j  | } n t |  } | |  j  | <| j   | d | d |  | j f S(   Ni    (   R#   t   has_keyR   R   R   (   R   t   avatarIdt   mindt
   interfacest   avatar(    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   requestAvatarI   s    
(   R   R   R    R   t   IRealmR   R)   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR"   D   s   	t   NewCredTestc           B   s>   e  Z d    Z d   Z d   Z d   Z d   Z d   Z RS(   c         C   sZ   t    } |  _ t j |  } |  _ t j   } |  _ | j d d  | j |  d  S(   Nt   bobt   hello(	   R"   t   realmR   t   PortalR   t'   InMemoryUsernamePasswordDatabaseDontUset   checkert   addUsert   registerChecker(   R   t   rt   pt   up(    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   setUpT   s
    c         C   sI   t  j t  j g } |  j j   } | j   | j   |  j | |  d  S(   N(   R   t   IUsernamePasswordt   IUsernameHashedPasswordR   t   listCredentialsInterfacest   sortt   assertEquals(   R   t   expectedt   got(    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testListCheckers[   s
    

c         C   s   g  } g  } |  j  j t j d d  |  t  j | j  j | j  | rY | d  n  | d \ } } } |  j | t  |  j	 | j
 |  d | | f  |  j	 | j j  |  j	 | j j  |   |  j	 | j j  d  S(   NR,   R-   i    s   %s does not implement %s(   R   R   R   t   UsernamePasswordR   t   addCallbackt   appendt
   addErrbackR<   t
   failUnlesst
   providedByt   originalR   R   (   R   t   lt   ft   ifacet   implR   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testBasicLoginb   s     c         C   s   g  } g  } |  j  j t d d  |  t  j | j  j | j  | rV | d  n  | d \ } } } |  j | t  |  j | j	 |  d | | f  |  j | j
 j  |  j | j
 j  |   |  j | j
 j  d S(   s   
        Login with credentials implementing an interface inheriting from an
        interface registered with a checker (but not itself registered).
        R,   R-   i    s   %s does not implement %sN(   R   R   R   R   RA   RB   RC   R<   RD   RE   RF   R   R   (   R   RG   RH   RI   RJ   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   test_derivedInterfaceu   s    !
c         C   sh   g  } |  j  j t j d d  |  t  j d    j | j  |  j |  |  j	 t
 j | d  d  S(   NR,   t   h3lloc         S   s   |  j  t j  S(   N(   t   trapR   t   UnauthorizedLogin(   t   x(    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   <lambda>   s    i    (   R   R   R   R@   R   RC   RA   RB   RD   t   failUnlessEqualR   RO   (   R   RG   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testFailedLogin   s    c         C   sh   g  } |  j  j t j d d  |  t  j d    j | j  |  j |  |  j	 t
 j | d  d  S(   Nt   jayR-   c         S   s   |  j  t j  S(   N(   RN   R   RO   (   RP   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyRQ      s    i    (   R   R   R   R@   R   RC   RA   RB   RD   RR   R   RO   (   R   RG   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testFailedLoginName   s    (   R   R   R7   R?   RK   RL   RS   RU   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR+   S   s   					t   CramMD5CredentialsTestCasec           B   s#   e  Z d    Z d   Z d   Z RS(   c         C   s2   t  j   } | j   } |  j | | j    d  S(   N(   R   t   CramMD5Credentialst   getChallengeR<   (   R   t   ct   chal(    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testIdempotentChallenge   s    c         C   sM   t  j   } | j   } t j d |  j   | _ |  j | j d   d  S(   Nt   secret(	   R   RW   RX   t   hmact   HMACt	   hexdigestt   responseRD   R!   (   R   RY   RZ   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testCheckPassword   s    c         C   s&   t  j   } |  j | j d   d  S(   NR\   (   R   RW   t   failIfR!   (   R   RY   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testWrongPassword   s    (   R   R   R[   Ra   Rc   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyRV      s   		t   OnDiskDatabaseTestCasec           B   s;   e  Z d
 d d g Z d   Z d   Z d   Z d	   Z RS(   t   user1t   pass1t   user2t   pass2t   user3t   pass3c         C   s   |  j    } t j |  } t | d  } x. |  j D]# \ } } | j d | | f  q4 W| j   xR |  j D]G \ } } |  j t | j	 | j
    |  j | j	 |  | | f  qo Wd  S(   Nt   ws   %s:%s
(   t   mktempR   t   FilePasswordDBt   filet   userst   writet   closet   failUnlessRaisest   KeyErrort   getUsert   upperR<   (   R   t   dbfilet   dbRH   t   uR5   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testUserLookup   s    
c         C   s   |  j    } t j | d d } t | d  } x. |  j D]# \ } } | j d | | f  q: W| j   x< |  j D]1 \ } } |  j | j | j	    | | f  qu Wd  S(   Nt   caseSensitivei    Rk   s   %s:%s
(
   Rl   R   Rm   Rn   Ro   Rp   Rq   R<   Rt   Ru   (   R   Rv   Rw   RH   Rx   R5   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testCaseInSensitivity   s    
c   	      C   s   |  j    } t j | d d } t | d  } x. |  j D]# \ } } | j d | | f  q: W| j   g  |  j D] \ } } t j | |  ^ qu } t	 j
 g  | D] } t	 j | j |  ^ q  } | j |  j g  |  j D] \ } } | ^ q  | S(   NRz   i    Rk   s   %s:%s
(   Rl   R   Rm   Rn   Ro   Rp   Rq   R   R@   R   t   gatherResultst   maybeDeferredt   requestAvatarIdRA   R<   (	   R   Rv   Rw   RH   Rx   R5   t   credsRY   t   d(    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testRequestAvatarId   s    
.+/c   	      C   s   |  j    } t j | d d } t | d  } x. |  j D]# \ } } | j d | | f  q: W| j   g  |  j D] \ } } t j | |  ^ qu } t	 j
 g  | D] } t	 j | j |  ^ q  } | j |  j g  |  j D] \ } } | ^ q  | S(   NRz   i    Rk   s   %s:%s
(   Rl   R   Rm   Rn   Ro   Rp   Rq   R   t   UsernameHashedPasswordR   R|   R}   R~   RA   R<   (	   R   Rv   Rw   RH   Rx   R5   R   RY   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testRequestAvatarId_hashed   s    
.+/(   Re   Rf   (   Rg   Rh   (   Ri   Rj   (   R   R   Ro   Ry   R{   R   R   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyRd      s   				t$   HashedPasswordOnDiskDatabaseTestCasec           B   sk   e  Z d d d g Z d   Z d   Z d   Z d	   Z d
   Z d   Z d   Z	 e
 d k ri d Z n  RS(   Re   Rf   Rg   Rh   Ri   Rj   c         C   s   t  | |  S(   N(   R   (   R   Rx   R5   t   s(    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   hash   s    c         C   s   |  j    } t j | d |  j |  _ t | d  } x; |  j D]0 \ } } | j d | t | | d   f  q@ W| j	   t
   } t j |  |  _ |  j j |  j  d  S(   NR   Rk   s   %s:%s
i   (   Rl   R   Rm   R   Rw   Rn   Ro   Rp   R   Rq   R"   R   R/   t   portR3   (   R   Rv   RH   Rx   R5   R4   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR7      s    (
	c         C   s   g  |  j  D] \ } } t j | |  ^ q
 } t j g  | D] } |  j j |  ^ q;  } | j |  j g  |  j  D] \ } } | ^ qr  | S(   N(	   Ro   R   R@   R   R|   Rw   R~   RA   R<   (   R   Rx   R5   t	   goodCredsRY   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testGoodCredentials   s    ../c         C   s   g  |  j  D] \ } } t j | |  ^ q
 } t j g  | D] } |  j j | d  t  ^ q;  } | j	 d    | j	 |  j
 g  |  j  D] \ } } | ^ q  | S(   Nc         S   s&   g  |  D] \ } } } | j  j ^ q S(   N(   RF   R   (   RP   t   it   aRG   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyRQ     s    (   Ro   R   R@   R   R|   R   R   t   NoneR   RA   R<   (   R   Rx   R5   R   RY   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testGoodCredentials_login  s    .	+/c         C   s   g  |  j  D] \ } } t j | d  ^ q
 } t j g  | D] } |  j j | d  t  ^ q; d t	 } | j
 |  j t j  | S(   Ns   wrong passwordt   consumeErrors(   Ro   R   R@   R   t   DeferredListR   R   R   R   R   RA   t   _assertFailuresR   RO   (   R   Rx   R5   t   badCredsRY   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testBadCredentials  s    +	1c         C   s   g  |  j  D]+ \ } } t j | t | | d    ^ q
 } t j g  | D] } |  j j | d  t	  ^ qH d t
 } | j |  j t j  | S(   Ni   R   (   Ro   R   R   R   R   R   R   R   R   R   R   RA   R   R   t   UnhandledCredentials(   R   Rx   R5   t   hashedCredsRY   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testHashedCredentials  s    8	1c         G   s;   x4 | D], \ } } |  j  | t j  | j |   q Wd  S(   N(   RR   R   t   FAILURERN   R   (   R   t   failurest   expectedFailurest   flagt   failure(    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR     s    s   crypt module not available(   s   user1s   pass1(   s   user2s   pass2(   s   user3s   pass3N(   R   R   Ro   R   R7   R   R   R   R   R   R   R   t   skip(    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR      s   								t"   PluggableAuthenticationModulesTestc           B   sV   e  Z d    Z d   Z d   Z d   Z d   Z d   Z d   Z e	 sT d Z
 n  RS(   c         C   s   t  j |  _ |  j t  _ d S(   su   
        Replace L{pamauth.callIntoPAM} with a dummy implementation with
        easily-controlled behavior.
        N(   R   R   t   _oldCallIntoPAM(   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR7   '  s    c         C   s   |  j  t _ d S(   sG   
        Restore the original value of L{pamauth.callIntoPAM}.
        N(   R   R   R   (   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   tearDown0  s    c         C   s   | d k r" t  j d |   n  | d k rD t  j d |   n  d d d g } | |  } | d d d g k r t  j d t |    n  d S(   Nt   Twisteds   bad service: %st   testusers   bad username: %si   t   Passwordi   s   Message w/ Inputi   s   Message w/o InputR    i    t   entryt    s   bad conversion: %s(   i   R   (   i   s   Message w/ Input(   i   s   Message w/o Input(   s   passwordi    (   s   entryi    (   R   i    (   R   RO   t   repr(   R   t   servicet   usert   convt	   questionst   replies(    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR   7  s    	c            s     f d   } | S(   Nc            s0   t  j g  |  D] \ } }   | d f ^ q  S(   Ni    (   R   t   succeed(   R   t   tt   q(   R   (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR   K  s    (    (   R   R   R   (    (   R   s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt	   _makeConvJ  s    c         C   sh   t  j   } |  j i d d 6d d 6d d 6 } t j d |  } | j |  } | j |  j d  | S(   NR    i   R   i   R   i   R   (   R   t%   PluggableAuthenticationModulesCheckerR   R   t   PluggableAuthenticationModulesR~   RA   R<   (   R   Rw   R   R   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR   O  s    $		c         C   sh   t  j   } |  j i d d 6d d 6d d 6 } t j d |  } | j |  } |  j | t j  | S(   NR   i   i   i   R   (	   R   R   R   R   R   R~   t   assertFailureR   RO   (   R   Rw   R   R   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR   X  s    $		c         C   sh   t  j   } |  j i d d 6d d 6d d 6 } t j d |  } | j |  } |  j | t j  | S(   NR    i   R   i   R   i   t   baduser(	   R   R   R   R   R   R~   R   R   RO   (   R   Rw   R   R   R   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testBadUsernamea  s    $		s   Can't run without PyPAM(   R   R   R7   R   R   R   R   R   R   R   R   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR   %  s   											t   CheckersMixinc           B   s2   e  Z d    Z e e  Z d   Z e e  Z RS(   c         c   sh   xa |  j    D]S } xJ |  j   D]< \ } } t | j |   } | V|  j | j   |  q  Wq Wd  S(   N(   t   getCheckerst   getGoodCredentialst   wFDR~   R<   t	   getResult(   R   t   chkt   credR%   R4   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testPositiven  s
    c         c   sb   x[ |  j    D]M } xD |  j   D]6 } t | j |   } | V|  j t j | j  q  Wq Wd  S(   N(   R   t   getBadCredentialsR   R~   t   assertRaisesR   RO   R   (   R   R   R   R4   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   testNegativev  s
    (   R   R   R   t   dGR   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR   m  s   		t   HashlessFilePasswordDBMixinc           B   sP   e  Z e j Z d
 Z e d     Z d d d g Z	 d   Z
 d   Z d	   Z RS(   c         C   s   |  S(   N(    (   RP   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyRQ     s    Re   t	   password1Rg   t	   password2Ri   t	   password3c         c   s>   x7 |  j  D], \ } } |  j | |  j |   | f Vq
 Wd  S(   N(   t   _validCredentialst	   credClasst   networkHash(   R   Rx   R5   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR     s    c         c   s>   x7 d d d	 g D]& \ } } |  j  | |  j |   Vq Wd  S(
   NRe   R   Rg   R   t   blooft   blarf(   s   user1R   (   s   user2R   (   R   R   (   R   R   (   R   Rx   R5   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR     s    c         #   s    j  p d   }   j  o'   f d   } xt t f D]}   j   } t | d  } x4   j D]) \ } } | j d | | |  f  qb W| j   t j	 | d | d | V  j   } t | d  } x4   j D]) \ } } | j d | |  | f  q W| j   t j	 | d d	 d
 d | d | V  j   } t | d  } x:   j D]/ \ } } | j d | j
   | |  f  qWW| j   t j	 | d d d t d | d | Vq7 Wd  S(   Nc         S   s   |  S(   N(    (   RP   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyRQ     s    c            s     j  |  S(   N(   t   diskHash(   R   R    t   stored(   R   (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyRQ     s    Rk   s   %s:%s
t   cacheR   s   %s dingle dongle %s
t    i   i    s   zip,zap,%s,zup,%s
t   ,i   i   (   R   R   R   Rl   Rn   R   Rp   Rq   R   Rm   t   title(   R   R   t	   hashCheckR   t   fnt   fObjRx   R5   (    (   R   s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR     s*    !
!
#'
N(   s   user1s	   password1(   s   user2R   (   s   user3s	   password3(   R   R   R   R@   R   R   R   t   staticmethodR   R   R   R   R   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR   ~  s   				t    LocallyHashedFilePasswordDBMixinc           B   s   e  Z e d     Z RS(   c         C   s   |  j  d  S(   Nt   hex(   t   encode(   RP   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyRQ     s    (   R   R   R   R   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR     s   t    NetworkHashedFilePasswordDBMixinc           B   s0   e  Z e d     Z d e j f d     YZ RS(   c         C   s   |  j  d  S(   NR   (   R   (   RP   (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyRQ     s    R   c           B   s   e  Z d    Z RS(   c         C   s   |  j  j d  | k S(   NR   (   t   hashedt   decode(   R   R    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR!     s    (   R   R   R!   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR     s   (   R   R   R   R   R   R   R   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR     s   t%   HashlessFilePasswordDBCheckerTestCasec           B   s   e  Z RS(    (   R   R   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR     s   t*   LocallyHashedFilePasswordDBCheckerTestCasec           B   s   e  Z RS(    (   R   R   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR     s   t*   NetworkHashedFilePasswordDBCheckerTestCasec           B   s   e  Z RS(    (   R   R   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyR     s   (    (    (    (    (2   t   __doc__R]   t   zope.interfaceR    R   t   twisted.trialR   t   twisted.credR   R   R   R   t   twisted.pythonR   t   twisted.internetR   t   twisted.internet.deferR	   R   R
   R   R   t   ImportErrorR   t   twisted.cred.pamauthR   R   R   R   t   AdapterR   t   registerAdapterR8   R   t   objectR   R"   t   TestCaseR+   RV   Rd   R   R   R   R   R   R   R   R   R   (    (    (    s=   /usr/lib/python2.7/dist-packages/twisted/test/test_newcred.pyt   <module>   sF   "

J;=H.