
    g}                        S r SSKJr  SSKrSSKrSSKJr  SSKrSSKJ	r	J
r
  SSKJrJr  SSKJrJrJr  SSKJs  Jr  SSKJrJr  SS	KJr  \" \5      rS
 r " S S\5      r " S S\5      r " S S\5      r  " S S\RB                  5      r" " S S\RF                  \RH                  5      r%\" S5      r& " S S\5      r' " S S\5      r(g)z>tests for passlib.hash -- (c) Assurance Technologies 2003-2009    )with_statementN)	getLogger)ldap_md5sha256_crypt)MissingBackendErrorPasslibHashWarning)str_to_uasciiuascii_to_strunicode)HandlerCaseTestCase)uc                 6   ^ ^ U U4S jm[        T" U5      5      $ )z1generate all strings of given size using alphabetc              3   x   >#    U S:  a  T H  nUv   M	     g T H  nT" U S-
  5       H	  nX-   v   M     M     g 7f)N       )sizechartailalphabethelpers      Z/home/matz/Project1/venv/lib/python3.13/site-packages/passlib/tests/test_utils_handlers.pyr   _makelang.<locals>.helper   sA     !8 
 ! !"46ND)O + !s   7:)set)r   r   r   s   ` @r   	_makelangr      s    $ vd|    c                   `    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rSrg)SkeletonTest)   ztest hash support classesc                   ^  " U4S jS[         R                  5      mU R                  TR                  [	        S5      5      5        U R                  TR                  S5      5        U R                  TR                  [	        S5      5      5        U R                  TR                  [	        S5      5      5        U R                  TR                  S5      5        U R                  TR                  [	        S5      5      5        U R                  TR                  [	        S	5      5      5        U R                  TR                  [	        S
5      5      5        U R                  [        TR                  S5        U R                  [        TR                  S5        U R                  TR                  5       TR                  S5      5        U R                  TR                  SS5      5        U R                  TR                  S[	        S5      5      5        U R                  TR                  SS5      5        U R                  TR                  S[	        S5      5      5        U R                  TR                  SSSS95        U R                  [        TR                  SS5        U R                  [        TR                  S[	        S5      5        U R                  TR                  S5      S5        U R                  TR                  SSS9S5        g)ztest StaticHandler classc                   b   >^  \ rS rSrSrSr\" S5      r\" S5      rSr	S	U U4S jjr
S rSrU =r$ )
/SkeletonTest.test_00_static_handler.<locals>.d12   d1flag_abr   c                 2   > [         TU ]  " S0 UD6  Xl        g Nr   )super__init__r'   )selfr'   kwds	__class__r%   s      r   r-   8SkeletonTest.test_00_static_handler.<locals>.d1.__init__9   s    b$(040 	r   c                 P    U R                   (       a  [        S5      $ [        S5      $ )Nba)r'   r   r.   secrets     r   _calc_checksum>SkeletonTest.test_00_static_handler.<locals>.d1._calc_checksum=   s    !%qv6#6r   )F)__name__
__module____qualname____firstlineno__namecontext_kwdsr   _hash_prefixchecksum_charschecksum_sizer-   r7   __static_attributes____classcell__)r0   r%   s   @r   r%   r#   2   s8    D$LS6LtWNM! !7 7r   r%   _as   _a_b_cs   _cr4   r3   cNr    ss   _bTr&   )uhStaticHandler
assertTrueidentifyr   assertFalseassertRaises	TypeErrorassertEqual	genconfighashverify
ValueErrorr.   r%   s    @r   test_00_static_handler#SkeletonTest.test_00_static_handler/   s   	7!! 	7 	AdG,-E*+AdG,-QtW-.U+,QsV,-QsV,-QsV,-)R[[$7)R[[!4 	5 			#u-.		#ag./3./3qw/0		#u4	89*biie<*biiag> 	t,40$7r   c                     " S S[         R                  5      nU R                  S5         UR                  S5      nSSS5        U R	                  WS5        U R                  UR                  SU5      5        U R                  UR                  SU5      5        U?U R                  [        UR                  S5        g! , (       d  f       N= f)ztest StaticHandler legacy attrc                   H    \ rS rSrSr\S 5       r\S 5       r\S 5       rSr	g)3SkeletonTest.test_01_calc_checksum_hack.<locals>.d1c   r%   c                 l    U(       a  [        U5      S:w  a  g [        US5        g! [         a     gf = f)N(   F   T)lenintrU   clsrS   s     r   rM   <SkeletonTest.test_01_calc_checksum_hack.<locals>.d1.identifyf   s9    s4yB !bM  " ! !s   & 
33c                     Uc  [        S5      e[        U[        5      (       a  UR                  S5      nUb!  U R	                  U5      (       d  [        S5      e[        R                  " SU-   5      R                  5       $ )Nzno secret providedutf-8zinvalid hashs   xyz)	rP   
isinstancer   encoderM   rU   hashlibsha1	hexdigestrc   r6   rS   s      r   genhash;SkeletonTest.test_01_calc_checksum_hack.<locals>.d1.genhashp   si    >#$899fg..#]]73F#CLL,>,>$^44||FVO4>>@@r   c                 b    Uc  [        S5      eU R                  X5      UR                  5       :H  $ )Nzno hash specified)rU   rm   lowerrl   s      r   rT   :SkeletonTest.test_01_calc_checksum_hack.<locals>.d1.verify{   s-    <$%899{{60DJJL@@r   r   N)
r9   r:   r;   r<   r=   classmethodrM   rm   rT   rB   r   r   r   r%   r[   c   sE    D  A A A Ar   r%   z%d1.*should be updated.*_calc_checksumtestN(7c622762588a0e5cc786ad0a143156f9fd38eea3xtest)rJ   rK   assertWarningListrS   rQ   rL   rT   rN   rm   rO   NotImplementedError)r.   r%   rS   s      r   test_01_calc_checksum_hack'SkeletonTest.test_01_calc_checksum_hack]   s    	A!! 	A> ##$KL776?D MIJ		&$/07D12 J-rww? MLs   B==
Cc                     " S S[         R                  5      nU R                  [        UR                  S5        U R                  [        UR                  S5        U R                  UR	                  S5      5        U R                  UR	                  S5      5        U R                  UR	                  S5      5        [        R                  " [        S5      5      Ul
        U R                  [        UR                  S5        U R                  [        UR                  S5        U R                  UR	                  S	5      5        U R                  UR	                  S5      5        U?
[        S
5      Ul        U R                  [        UR                  S5        U R                  [        UR                  S5        U R                  UR	                  S5      5        U R                  UR	                  S5      5        U?g)ztest GenericHandler.identify()c                   $    \ rS rSr\S 5       rSrg))SkeletonTest.test_10_identify.<locals>.d1   c                     [        U[        5      (       a  UR                  S5      nU[        S5      :X  a  U " US9$ [        e)Nasciir4   checksum)rg   bytesdecoder   rU   rb   s     r   from_string5SkeletonTest.test_10_identify.<locals>.d1.from_string   s9    dE**;;w/D1S6>--$$r   r   N)r9   r:   r;   r<   rr   r   rB   r   r   r   r%   r|      s    % %r   r%   Nr   rH   r4   r3   z@.z@a!z!a)rJ   GenericHandlerrO   rP   rM   rN   rL   recompiler   _hash_regexidentrV   s     r   test_10_identifySkeletonTest.test_10_identify   sa   	%"" 	% 	)R[[$7)R[[!4R)C()S)* AdG,)R[[$7)R[[!4D)*S)*N S6)R[[$7)R[[!4D)*S)*Hr   c                 2  ^  " S S[         R                  5      mSU4S jjnU R                  [        U[	        S5      5        U R                  U" [	        S5      5      [	        S5      5        U R                  U" [	        S5      5      [	        S5      5        U R                  [        U[	        S5      5        U R                  [        U[	        S	5      5        U R                  [        US
5        U R                  T" 5       R                  [	        S5      5        g)z%test GenericHandler checksum handlingc                   ,    \ rS rSrSrSr\" S5      rSrg).SkeletonTest.test_11_norm_checksum.<locals>.d1   r%      xzr   N)	r9   r:   r;   r<   r=   rA   r   r@   rB   r   r   r   r%   r      s    DMtWNr   r%   Nc                 ,   > T" SSU 0UD6R                   $ )Nr   r   r   )r   kr%   s     r   norm_checksum9SkeletonTest.test_11_norm_checksum.<locals>.norm_checksum   s    -x-1-666r   xxxxxxxxzxzxxxxxxxyxs   xxyxN)rJ   r   rO   rU   r   rQ   rP   _stub_checksumr.   r   r%   s     @r   test_11_norm_checksum"SkeletonTest.test_11_norm_checksum   s    	%"" 	%
	7 	*mQuX> 	qy11V9=qy11V9= 	*mQwZ@ 	*mQvY? 	)]G< 	,,ai8r   c                   ^  " S S[         R                  [         R                  5      mU4S jnU R                  U" S5      S5        U R	                  [
        U[        S5      5        U R                  T" 5       R                  S5        g)z*test GenericHandler + HasRawChecksum mixinc                       \ rS rSrSrSrSrg)2SkeletonTest.test_12_norm_checksum_raw.<locals>.d1   r%   r   r   N)r9   r:   r;   r<   r=   rA   rB   r   r   r   r%   r      s    DMr   r%   c                  (   > T" U 0 UD6R                   $ r   r   )r4   r   r%   s     r   r   =SkeletonTest.test_12_norm_checksum_raw.<locals>.norm_checksum   s    q;A;'''r   s   1234r   s       N)rJ   HasRawChecksumr   rQ   rO   rP   r   r   r   s     @r   test_12_norm_checksum_raw&SkeletonTest.test_12_norm_checksum_raw   sk    	""B$5$5 		( 	w/9 	)]AfI> 	,,i8r   c                   ^  " S S[         R                  [         R                  5      mU4S jnU4S jn[        SS5      n[        SS5      n[        SS5      nU R	                  [
        U5        U R	                  [
        US	S
9  U R                  U" SS9U5        [        R                  " SS9 nU R	                  [        USS
9  U R	                  [        USS
9  U R                  U5        U R                  U" SS
9S5        U R                  U" SS
9S5        U R                  U" SS
9S5        U R                  U5        U R	                  [        USS
9  U R                  U5        S	S	S	5        [        R                  " SS9 nU R	                  [        US5        U R	                  [        US5        U R                  U5        U R                  U" S5      U5        U R                  U" S5      U5        U R                  U" S5      U5        U R                  U5        U R	                  [        US5        U R                  U5        U R                  U" SSS9U5        U R                  US/5        S	S	S	5        T?U R                  / 5         U R                  [        U" S	5      5      S5        U R                  [        U" S5      5      S5        S	S	S	5        g	! , (       d  f       GNu= f! , (       d  f       N= f! , (       d  f       g	= f)z#test GenericHandler + HasSalt mixinc                   ,    \ rS rSrSrSrSrSrSrSr	Sr
g	)
*SkeletonTest.test_20_norm_salt.<locals>.d1   r%   saltr   r      r)   r   N)r9   r:   r;   r<   r=   setting_kwdsmin_salt_sizemax_salt_sizedefault_salt_size
salt_charsrB   r   r   r   r%   r      s!    D$LMM !Jr   r%   c                  (   > T" S0 U D6R                   $ r+   r   r   r%   s    r   	norm_salt1SkeletonTest.test_20_norm_salt.<locals>.norm_salt   s    77<<r   c                 H   > TR                   " SSU 0UD6" SS9R                  $ )N	salt_sizeTuse_defaultsr   )usingr   )szr   r%   s     r   gen_salt0SkeletonTest.test_20_norm_salt.<locals>.gen_salt   s%    88.b.A.DAFFFr   r)   r   r   r   Nr   Tr   recordrH   r4   abaabbaaaaabbr   r      )relaxedzsalt_size.*above max_salt_size)rJ   HasSaltr   r   rO   rP   assertInwarningscatch_warningsrU   consumeWarningListrQ   r   rv   r`   )r.   r   r   salts2salts3salts4wlogr%   s          @r   test_20_norm_saltSkeletonTest.test_20_norm_salt   s   	R.. 		 	G 4#4#4# 	)Y/)YT:iT2F; $$D1T j)"=j)#>##D) YD148YE2E:YF3V<##D) j)(C##D) 2$ $$D1T j(A6j(A6##D) MM(1+v.MM(1+v.MM(1+v.##D) j(A6##D)MM(1d3V<##D+K*LM% 2* ##B'S$0!4S!-q1 ('Q 21$ 21, ('s'   /B5K C+K$AK5
K!$
K25
Lc                   ^  " S S[         R                  [         R                  5      mU4S jnU R                  [        U5        U R                  [        USS9  U R                  U" SS9S5        U R                  [        US	S9  [        R                  " SS
9 nU R                  [        USS9  U R                  U5        U R                  U" SS9S5        U R                  U" SS9S5        U R                  U" SS9S5        U R                  U5        U R                  [        USS9  U R                  U5        SSS5        STl
        U R                  [        USS9  g! , (       d  f       N+= f)z%test GenericHandler + HasRounds mixinc                   (    \ rS rSrSrSrSrSrSrSr	g)	,SkeletonTest.test_30_init_rounds.<locals>.d1i8  r%   roundsr   r   r   r   N)
r9   r:   r;   r<   r=   r   
min_rounds
max_roundsdefault_roundsrB   r   r   r   r%   r   8  s    D&LJJNr   r%   c                  (   > T" S0 U D6R                   $ r+   r   r   s    r   norm_rounds5SkeletonTest.test_30_init_rounds.<locals>.norm_rounds@  s    77>>!r   Nr   Tr   r   g      ?r   r   r   r   r   )rJ   	HasRoundsr   rO   rP   rQ   r   r   rU   r   r   )r.   r   r   r%   s      @r   test_30_init_rounds SkeletonTest.test_30_init_rounds5  sI   	r00 		" 	)[1)[>$7; 	)[= $$D1Tj+a@##D) [2A6[2A6[2A6##D) j+a@##D) 2  !)[tD# 21s   B E
E-c                     " S S[         R                  [         R                  5      nU R                  [        UR
                  5        U R                  [        UR                  5        U R                  [        UR                  S5        U R                  [        UR                  S5        U R                  UR                  5       5        SUl	        U" 5       nU R                  UR                  S5      S5        UR                  S5        UR                  S5        U R                  UR                  S5      S5        U R                  [        UR                  S5        U R                  UR                  S5      5        U R                  UR                  S5      5        SUl        U R                  UR                  5       5        UR                  S5        U R                  UR                  S5      S5        U R                  [        UR                  S	5        U R                  [        UR                  S	5        UR                  S5         " S
 SU5      nU R                  [        UR                  S5        g)z+test GenericHandler + HasManyBackends mixinc                   T    \ rS rSrSrSrSrSrSr\	S 5       r
\	S 5       rS rS	 rSrg
))SkeletonTest.test_40_backends.<locals>.d1ia  r%   r   r4   r3   Fc                 ^    U R                   (       a  U R                  U R                  5        ggNTF)	_enable_a_set_calc_checksum_backend_calc_checksum_arc   s    r   _load_backend_a9SkeletonTest.test_40_backends.<locals>.d1._load_backend_aj  #    ==2233G3GH r   c                 ^    U R                   (       a  U R                  U R                  5        ggr   )	_enable_br   _calc_checksum_br   s    r   _load_backend_b9SkeletonTest.test_40_backends.<locals>.d1._load_backend_br  r   r   c                     gNr4   r   r5   s     r   r   :SkeletonTest.test_40_backends.<locals>.d1._calc_checksum_az      r   c                     gNr3   r   r5   s     r   r   :SkeletonTest.test_40_backends.<locals>.d1._calc_checksum_b}  r   r   N)r9   r:   r;   r<   r=   r   backendsr   r   rr   r   r   r   r   rB   r   r   r   r%   r   a  sK    DL!HII! ! ! !r   r%   anydefaultTrI   r3   r4   rG   c                       \ rS rSrSrSrg))SkeletonTest.test_40_backends.<locals>.d2i  Tr   N)r9   r:   r;   r<   _has_backend_arB   r   r   r   d2r     s    !Nr   r  N)rJ   HasManyBackendsr   rO   r   get_backendset_backendrN   has_backendr   rQ   r7   rL   r   rU   AssertionError)r.   r%   objr  s       r   test_40_backendsSkeletonTest.test_40_backends_  s   	##R%6%6 	@ 	-r~~>-r~~>-r~~uE-r~~yI)*  d++C0#6 	s
u++C0#6 	-r~~sCs+,,-  	()
s++C0#6 	*bnnc:*bnnc: 	s	" 	"."..#>r   c                    [         R                  " S[        SS9   " S S[        R                  [        R
                  5      nU R                  [        UR                  5        U R                  [        UR                  5        U R                  [        UR                  S5        U R                  [        UR                  S5        U R                  UR                  5       5        SUl        U" 5       nU R                  UR                  S	5      S
5        UR                  S
5        UR                  S5        U R                  UR                  S	5      S
5        U R                  [        UR                  S5        U R                  UR                  S
5      5        U R                  UR                  S5      5        SUl        U R                  UR                  5       5        UR                  S5        U R                  UR                  S	5      S5        U R                  ["        UR                  S5        U R                  ["        UR                  S5        g)z<test GenericHandler + HasManyBackends mixin (deprecated api)ignorez0.* support for \._has_backend_.* is deprecated.*)categorymessagec                   4    \ rS rSrSrSrSrSrSrS r	S r
Srg)	)SkeletonTest.test_41_backends.<locals>.d1i  r%   r   r   Fc                     gr   r   r5   s     r   r   :SkeletonTest.test_41_backends.<locals>.d1._calc_checksum_a  r   r   c                     gr   r   r5   s     r   r   :SkeletonTest.test_41_backends.<locals>.d1._calc_checksum_b  r   r   N)r9   r:   r;   r<   r=   r   r   r  _has_backend_br   r   rB   r   r   r   r%   r    s%    DL!H"N"Nr   r%   r   r   TrI   r3   r4   rG   N)r   filterwarningsDeprecationWarningrJ   r  r   rO   r   r  r  rN   r  r  rQ   r7   rL   r  rU   )r.   r%   r  s      r   test_41_backendsSkeletonTest.test_41_backends  s   'G	
	##R%6%6 	  	-r~~>-r~~>-r~~uE-r~~yI)* ! d++C0#6 	s
u++C0#6 	-r~~sCs+,,- ! 	()
s++C0#6 	*bnnc:*bnnc:r   c                   ^  " S S[         R                  [         R                  5      mU4S jnU R                  [        U5        U R                  [        USS9  U R                  U" SS9[        S5      5        U R                  U" [        S5      S9[        S5      5        U R                  U" [        S	5      S9[        S	5      5        U R                  [        U[        S
5      S9  U R                  U" [        S5      S9[        S5      5        U R                  [        U[        S5      S9  U R                  TR                  [        S5      5      5        U R                  TR                  [        S5      5      5        U R                  TR                  [        S5      5      5        U R                  TR                  [        S5      5      5        U R                  TR                  [        S5      5      5        U R                  [        TR                  S5        U R                  [        TR                  S5        STl        U R                  [        USS9  g)z#test GenericHandler + HasManyIdentsc                   l    \ rS rSrSrSr\" S5      r\" S5      \" S5      4r\" S5      \" S5      0r	Sr
g)	+SkeletonTest.test_50_norm_ident.<locals>.d1i  r%   r   !A!BAr   N)r9   r:   r;   r<   r=   r   r   default_identident_valuesident_aliasesrB   r   r   r   r%   r    s9    D%LdGMdGQtW-Lfag.Mr   r%   c                  (   > T" S0 U D6R                   $ r+   r  r   s    r   
norm_ident3SkeletonTest.test_50_norm_ident.<locals>.norm_ident  s    77== r   Nr  Tr   r  r  z!Cr   Bz!Axxxz!Bxxxz!CxxxrH   r   )rJ   HasManyIdentsr   rO   rP   rQ   r   rU   rL   rM   rN   r!  r  )r.   r%  r%   s     @r   test_50_norm_identSkeletonTest.test_50_norm_ident  s   	/!!2#4#4 	/	! 	)Z0)Zt<6$@ 	!D'2AdG<!D'2AdG<*j$@ 	!C&11T7; 	*j#? 	AgJ/0AgJ/0QwZ01QsV,-QrU+,)R[[$7)R[[!4  .*4Hr   c                    SSK Jn  UR                  R                  S5      nU R	                  U[        S5      [        S5      S.5        Sn[        S5      n[        S	5      nUR                  R                  U5      nU R	                  U[        US
SUS95        UR                  R                  USS9nU R	                  U[        US
SS95        UR                  R                  USS9nU R	                  U[        S
S[        S5      [        S5      S95        UR                  R                  S5      nU R	                  U[        [        S5      [        S5      SS95        SnUR                  R                  U5      nU R	                  U[        SSSS95        UR                  R                  USS9nU R	                  U[        [        S5      S[        S5      S95        g )!ztest parsehash()r   rS   OgAwTx2l6NADIAwTx2l6NADIOgr   r   z?$5$LKO/Ute40T3FNF95$U0prpBQd4PloSGU0pnpM4z9wKn4vZ1.jsrzQfPqxph9zLKO/Ute40T3FNF95z+U0prpBQd4PloSGU0pnpM4z9wKn4vZ1.jsrzQfPqxph9i  T)r   r   implicit_roundsr   Fr   )r   r   r1  )sanitizezLK**************z+U0pr***************************************)r   r1  r   r   zL$5$rounds=10428$uy/jIAhCetNCTtb0$YWvUOXbkqlqhyoPMpN8BMe.ZGsGx2aBvxTvDFI613c3z+YWvUOXbkqlqhyoPMpN8BMe.ZGsGx2aBvxTvDFI613c3zuy/jIAhCetNCTtb0i(  )r   r   r   z@$pbkdf2$60000$DoEwpvQeA8B4T.k951yLUQ$O26Y3/NJEiLCVaOVPxGXshyjW8ks   ;nI"U?[i`  s   0xO=\Qr   r   r   zO26************************zDo********************N)	passlibrS   	des_crypt	parsehashrQ   r   r   dictpbkdf2_sha1)r.   rS   resulthrI   rG   h1s          r   test_91_parsehashSkeletonTest.test_91_parsehash  s    	! ))/:a.>$!PQ N !;<"",,Q/1T6:Q"H 	I "",,Q,?1T4!PQ "",,Q,>T4%&EF"H 	I
 "",,-{|DE%&"
 	 P!!++B/SC"
 	 !!++B+>45+,"
 	r   c                    SSK Jn  U R                  UR                  R	                  5       SSS.5        U R                  UR
                  R	                  5       SSS.5        U R                  UR                  SS	5        U R                  UR                  R	                  5       S
SSS.5        U R                  UR                  SS5        U R                  UR                  R	                  5       SSSS.5        g)ztest bitsize()r   r,  B      r0        r   i   i     `   r3  i            N)	r4  rS   rQ   r5  bitsizebcrypt	patchAttrr   r8  r.   rS   s     r   test_92_bitsizeSkeletonTest.test_92_bitsizeJ  s     	! 	//1&("5	7 	,,.&)37	9 	t((*:MJ**224&)RD	F 	t'')9=I))113&)RE	Gr   r   N)r9   r:   r;   r<   __doc__rW   rx   r   r   r   r   r   r	  r  r)  r<  rL  rB   r   r   r   r   r   )   sQ    #
,8\.@f!F"9H9*E2R(ETI?V8;t(I\6pGr   r   c                   *    \ rS rSrSrS rS rS rSrg)dummy_handler_in_registryin  z6context manager that inserts dummy handler in registryc           	      h    Xl         [        SU-   [        R                  4[	        USS95      U l        g )Ndummy_r   )r=   r   )r=   typerJ   r   r7  dummy)r.   r=   s     r   r-   "dummy_handler_in_registry.__init__p  s2    	(T/B,=,=+?B
 
r   c                     SSK Jn  UR                  U R                  SS9  UR	                  U R
                  5        UR                  U R                  5      U R
                  L d   eU R
                  $ Nr   )registryF)	locations)r4  rX  _unload_handler_namer=   register_crypt_handlerrT  get_crypt_handler)r.   rX  s     r   	__enter__#dummy_handler_in_registry.__enter__w  sY    $%%dii5%A''

3))$))4

BBBzzr   c                 D    SSK Jn  UR                  U R                  SS9  g rW  )r4  rX  rZ  r=   )r.   exc_inforX  s      r   __exit__"dummy_handler_in_registry.__exit__~  s    $%%dii5%Ar   )rT  r=   N)	r9   r:   r;   r<   rN  r-   r]  ra  rB   r   r   r   rP  rP  n  s    @Br   rP  c                   H    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rSrg)PrefixWrapperTesti  ztest PrefixWrapper classc                    [         R                  " SSSSSS9nU R                  UR                  S5        U R	                  UR
                  S5        U R	                  UR                  [        5        U R	                  UR
                  [        5        [        S5       nU R	                  UR                  [        5        SSS5        g! , (       d  f       g= f)z*test PrefixWrapper lazy loading of handlerr%   r   {XXX}{MD5}T)lazyN)	rJ   PrefixWrapperrQ   _wrapped_nameassertIs_wrapped_handlerwrappedr   rP  r.   r%   rT  s      r   test_00_lazy_loading&PrefixWrapperTest.test_00_lazy_loading  s    dJtL 	)):6b))40 	bjj(+b))84 'z2eMM"**h/ 322s   !C
Cc                 x   [         R                  " SSSS5      nU R                  UR                  S5        U R	                  UR
                  [        5        U R	                  UR                  [        5        [        S5       nU R	                  UR                  [        5        SSS5        g! , (       d  f       g= f)z,test PrefixWrapper active loading of handlerr%   r   rf  rg  N)	rJ   ri  rQ   rj  rk  rl  r   rm  rP  rn  s      r   test_01_active_loading(PrefixWrapperTest.test_01_active_loading  s    dJA 	)):6b))84bjj(+ 'z2eMM"**h/ 322s   !B++
B9c                    [         R                  " S[        SS5      nU R                  UR                  S5        U R                  UR                  [        5        U R                  UR                  [        5        [        S5       nU R                  UR                  [        5        SSS5        g! , (       d  f       g= f)z4test PrefixWrapper with explicitly specified handlerr%   rf  rg  Nr   )	rJ   ri  r   rQ   rj  rk  rl  rm  rP  rn  s      r   test_02_explicit"PrefixWrapperTest.test_02_explicit  s     dHgw? 	))40b))84bjj(+ 'z2eMM"**h/ 322s   !B//
B=c                    [         R                  " SSSS5      nU R                  UR                  S5        U R	                  UR
                  [        R
                  5        U R                  S[        U5      ;   5        [         R                  " SSS5      nU R	                  UR
                  [        R
                  5        U R                  S[        U5      ;   5        g )Nr%   r   rf  rg  r   r  r   )rJ   ri  rQ   r=   rk  r   r   rN   dirr   rL   )r.   r%   r  s      r   test_10_wrapped_attributes,PrefixWrapperTest.test_10_wrapped_attributes  s    dJA$'boox'<'<=R01dNG<boo|'@'@AB/0r   c                    [         R                  " SSSS5      nSnSnU R                  UR                  5       S5        U R	                  [
        UR                  SS 5        U R                  UR                  SU5      U5        U R	                  [        UR                  SU5        U R                  UR                  S5      U5        U R                  UR                  U5      5        U R                  UR                  U5      5        U R	                  [        UR                  SU5        U R                  UR                  SU5      5        g )	Nr%   r   rf  rg  z{XXX}X03MO1qnZdYdgyfeuILPmQ==z{MD5}X03MO1qnZdYdgyfeuILPmQ==z{XXX}1B2M2Y8AsgTpgAmY7PhCfg==password)rJ   ri  rQ   rR   rO   rP   rm   rU   rS   rL   rM   rN   rT   )r.   r%   dphlphs       r   test_11_wrapped_methods)PrefixWrapperTest.test_11_wrapped_methods  s   dJA-- 	)HI 	)RZZTBJ4c:*bjj*cB 	,c2 	C()S)* 	*biiSA		*c23r   c           	      $   [         R                  " SSS5      nU R                  UR                  [	        S5      5        U R                  UR                  S 5        [         R                  " SSS5      nU R                  UR                  S 5        U R                  UR                  S 5        [         R                  " SSSS5      nU R                  UR                  S 5        U R                  UR                  S 5        [         R                  " SSSS	S
9nU R                  UR                  [	        S	5      5        U R                  UR                  S 5        [         R                  " SSSSS
9nU R                  [        [         R                  SSSSS
9  U R                  [        [         R                  SSSSS
9  [         R                  " SSS5      nU R                  UR                  S 5        U R                  UR                  [	        S5      [	        S5      45        [         R                  " SSSSS
9nU R                  UR                  [	        S5      5        U R                  UR                  S 5        U R                  [        [         R                  SSSS
9  U R                  S5         [         R                  " SSSSS9nS S S 5        U R                  UR                  S 5        U R                  UR                  S 5        g ! , (       d  f       NG= f)Nh2r   rf  z
{XXX}{MD5}r5  r;  rg  h3z{Xr  z{XXX}Az{XYz{XXXXh4phpassz{XXX}$P$z{XXX}$H$h5Th6z#orig_prefix.*may not work correctlyh7$?)orig_prefixprefix)
rJ   ri  rQ   r   r   rk  r"  rO   rU   rv   r.   r:  s     r   test_12_identPrefixWrapperTest.test_12_ident  sh   T:w7!L/2annd+ T;8aggt$annd+ T:w@aggt$annd+ T:wdC!D'*annd+ T:whG*b&6&6j! 	 	0*b&6&6j! 	 	2 T8W5aggt$!J-:)GH T;tD!G*-annd+ 	*b&6&6kQUV ##$IJ  xSMA K.$' KJs   (L
Lc                 h    [         R                  " SSSSS9nU R                  [        U5      S5        g)ztest repr()r  	md5_cryptrf  z$1$r  z(?x)^PrefixWrapper\(
                ['"]h2['"],\s+
                ['"]md5_crypt['"],\s+
                prefix=u?["']{XXX}['"],\s+
                orig_prefix=u?["']\$1\$['"]
            \)$N)rJ   ri  assertRegexreprr  s     r   test_13_reprPrefixWrapperTest.test_13_repr  s1    T;UKa	r   c                 r    [         R                  " SSSS9nU R                  [        UR                  S5        g)ztest orig_prefix sanity checkr  r  z$6$r  rs   N)rJ   ri  rO   rU   rS   r  s     r   test_14_bad_hash"PrefixWrapperTest.test_14_bad_hash  s.     T;EB*afff5r   r   N)r9   r:   r;   r<   rN  ro  rr  ru  ry  r  r  r  r  rB   r   r   r   rd  rd    s.    "0 00140-(^	6r   rd  c                   >    \ rS rSrSrSr\R                  rSr	S r
Srg)UnsaltedHashi  z!test algorithm which lacks a saltunsalted_test_hashr^   c                     [        U[        5      (       a  UR                  S5      nSU-   n[        [        R
                  " U5      R                  5       5      $ )Nrf   s   boblious)rg   r   rh   r	   ri   rj   rk   r.   r6   datas      r   r7   UnsaltedHash._calc_checksum  sD    fg&&]]7+FV#W\\$/99;<<r   r   N)r9   r:   r;   r<   rN  r=   rJ   LOWER_HEX_CHARSr@   rA   r7   rB   r   r   r   r  r    s    +D''NM=r   r  c                       \ rS rSrSrSrSrSrSrSr	\
R                  =rr\R                  " \" S5      5      r\S	 5       rS
 rS rSrg)
SaltedHashi$  ztest algorithm with a saltsalted_test_hashr   r   r   r^   z^@salt[0-9a-f]{42,44}$c                     U R                  U5      (       d  [        R                  R                  U 5      e[	        U[
        5      (       a  UR                  S5      nU " USS USS  S9$ )Nr   r   i)r   r   )rM   rJ   excInvalidHashErrorrg   r   r   rb   s     r   r   SaltedHash.from_string0  sZ    ||D!!&&))#..dE"";;w'DQsd34j99r   c                 `    [        S5      U R                  U R                  4-  n[        U5      $ )Nz	@salt%s%s)r   r   r   r
   rK  s     r   	to_stringSaltedHash.to_string8  s(    ~DMM ::T""r   c                    [        U[        5      (       a  UR                  S5      nU R                  R                  S5      U-   U R                  R                  S5      -   n[	        [
        R                  " U5      R                  5       5      $ )Nrf   r   )rg   r   rh   r   r	   ri   rj   rk   r  s      r   r7   SaltedHash._calc_checksum<  sg    fg&&]]7+Fyy(61DII4D4DW4MMW\\$/99;<<r   r   N)r9   r:   r;   r<   rN  r=   r   r   r   rA   rJ   r  r   r@   r   r   r   r   rr   r   r  r7   rB   r   r   r   r  r  $  s^    $DLMMM"$"4"44J**Q789K: :#=r   r  u   Ιωαννηςc                   *    \ rS rSr\rS\S4/rS rSr	g)UnsaltedHashTestiK  )r|  (61cfd32684c47de231f1f982c214e884133762c0(96b329d120b97ff81ada770042e44ba87343ad2bc                 |    U R                  [        [        SS9  U R                  [        [        R                  SS9  g )Nxr   r   r   )rO   rP   r  rR   )r.   s    r   test_bad_kwdsUnsaltedHashTest.test_bad_kwdsS  s2    )\<)\%;%;AFr   r   N)
r9   r:   r;   r<   r  handler
UPASS_TEMPknown_correct_hashesr  rB   r   r   r   r  r  K  s$    G 	A	?@
Gr   r  c                   *    \ rS rSr\rS\S4/rS rSr	g)SaltedHashTestiW  )r|  z/@salt77d71f8fe74f314dac946766c1ac4a2a58365482c0z1@salt9f978a9bfe360d069b0c13f2afecd570447407fa7e48c                     [        SS9R                  nU R                  [        [         US S9  U R                  [        [         USS9  g )NTr   r0  r   )r  r   rO   rP   rU   )r.   stubs     r   r  SaltedHashTest.test_bad_kwds_  s@    t,;;)Z$TJ*j4eLr   r   N)
r9   r:   r;   r<   r  r  r  r  r  rB   r   r   r   r  r  W  s$    G 	H	HI
Mr   r  ))rN  
__future__r   r   ri   loggingr   r   passlib.hashr   r   passlib.excr   r   passlib.utils.compatr	   r
   r   passlib.utils.handlersutilshandlersrJ   passlib.tests.utilsr   r   r   r9   logr   r   objectrP  rd  rK   r  r   r   r  r  r  r  r   r   r   <module>r     s    D & 	    0 ?8 8 # # 5 "

xG8 xGJB B(O6 O6l
=2## 
==R.. =J ;<

G{ 
GM[ Mr   