
    K}bg                        d Z ddlmZmZmZ ddlZ ej        e          Zddl	Z	ddl
Z
ddlmZmZmZ ddlmZ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mZmZ dd	lm Z  dd
l!m"Z"m#Z#m$Z$ ddl%m&Z& g dZ'eek    Z(e(rPddl)m*Z*m+Z+  e,e*e+          s e-de*          e*j.        s e*j/                     ddl0mZ  ej1        ddg           edk    re2                    de            e3            Z4d Z5e(rddl6m7Z7  G d de7          Z8d Z9d Z:d-dZ;edk    r e;ej<                  Z=n'edk    r e;ej>                  Z=n e;ej                  Z=ddl?m@Z@  eAd e@jB        e=C                    d                     D                    d          f          ZE G d! d"e3          ZF G d# d$e"eF          ZGd%ZHd&ZI G d' d(eG          ZJ G d) d*eJ          ZK G d+ d,eG          ZLdS ).ztest passlib.ext.django    )absolute_importdivisionprint_functionN)appsexcregistry)django10_contextdjango14_contextdjango16_context)CryptContext)DJANGO_VERSIONMIN_DJANGO_VERSIONDjangoTranslatorquirks)	iteritemsget_method_functionu)memoized_property)TestCase	TEST_MODEhandler_derived_from)get_handler_case)DjangoBehaviorTestExtensionBehaviorTestDjangoExtensionTest_ExtensionSupport_ExtensionTest)settingsLazySettingsz2expected django.conf.settings to be LazySettings: )r   zdjango.contrib.contenttypeszdjango.contrib.auth)      z1this release hasn't been tested against Django %rc                      t          |           D ]O\  }}|t          u r+t          t          |          rt	          t          |           9t          t          ||           PdS )z*helper to update django settings from kwdsN)r   UNSEThasattrr   delattrsetattr)kwdskvs      p/home/e360mart.nyusoft.in/public_html/e360mart_env/lib/python3.11/site-packages/passlib/tests/test_ext_django.pyupdate_settingsr+   N   sf     $ $!::x## %!$$$Ha####$ $    )Userc                   P    e Zd ZdZ G d d          Zed             Zd ZddZdS )	FakeUserz#mock user object for use in testingc                       e Zd Ze ZdS )FakeUser.MetaN)__name__
__module____qualname__	app_label r,   r*   Metar1   _   s         IIIr,   r7   c                     g S Nr6   selfs    r*   saved_passwordszFakeUser.saved_passwordsb   s    Ir,   c                 T    	 | j         d d          | j         d d = S # | j         d d = w xY wr9   )r<   r:   s    r*   pop_saved_passwordszFakeUser.pop_saved_passwordsf   sC    ,+AAA.(++D(+++++s    'Nc                 D    | j                             | j                   d S r9   )r<   appendpassword)r;   update_fieldss     r*   savezFakeUser.savel   s!     ''66666r,   r9   )	r2   r3   r4   __doc__r7   r   r<   r>   rC   r6   r,   r*   r/   r/   Z   s        11	! 	! 	! 	! 	! 	! 	! 	! 
	 	 
			, 	, 	,	7 	7 	7 	7 	7 	7r,   r/   c                  .    g fd} fd}|| _         | S )Nc                 2                         |            d S r9   )r@   )rA   states    r*   setterz"create_mock_setter.<locals>.setterr   s    Xr,   c                  8    	  d d           d d = S #  d d = w xY wr9   r6   )rG   s   r*   popstatez$create_mock_setter.<locals>.popstatet   s3    	8aaaaaaLLLLs   	 )rJ   )rH   rJ   rG   s     @r*   create_mock_setterrK   p   sH    E        
 FOMr,   c                     | sJ ddl m} 	  |d|            dS # t          $ r.}t          j        dt          |                    rY d}~dS  d}~ww xY w)	z|
    check whether django hasher is available;
    or if it should be skipped because django lacks third-party library.
    r   make_password hasherTz3Couldn't load '.*?' algorithm .* No module named .*NF)django.contrib.auth.hashersrN   
ValueErrorrematchstr)namerN   errs      r*   check_django_hasher_has_backendrY   }   s    
 KK4999999b&&&&t   8I3s88TT 	55555s    
A"AAAc                     t          | d          r|                                 } |                     d           |t          rddlm} |j        }|r|                     ||           | S )z
    helper to build django CryptContext config matching expected setup for stock django deploy.
    :param kwds:
    :param sha_rounds:
    :return:
    to_dictauto)
deprecatedNr   )PBKDF2PasswordHasher)"django_pbkdf2_sha1__default_rounds$django_pbkdf2_sha256__default_rounds)r$   r[   updatehas_min_djangorR   r^   
iterations)r'   
sha_roundsr^   s      r*   _modify_django_configre      s     tY ||~~ 	KK     nDDDDDD)4
  
/91; 	 	
 	
 	

 Kr,   )r!      rf   
   )django_pbkdf2_sha256znot a passwordr`   roundsc                   L    e Zd ZdZed             Zd Zd
dZg dZddZ	d	 Z
dS )r   zx
    test support funcs for loading/unloading extension.
    this class is mixed in to various TestCase subclasses.
    c              #   f  K   ddl m}m} ddg}ddg}g d}||f|j        |f||fg}|D ]\  }}t	          |          D ]r}	|	                    d          r|j                            |	t                    }
|
t          u r|	|vrFt          |
          }
t          |
dd	          }|r
||	||	|v fV  sd	S )
zhelper to scan for monkeypatches.

        returns tuple containing:
        * object (module or class)
        * attribute of object
        * value of attribute
        * whether it should or should not be patched
        r   )modelshasherscheck_passwordset_passwordrN   )rp   rN   
get_hasheridentify_hasherget_hashers_r3   N)django.contrib.authrn   ro   r-   dir
startswith__dict__getr#   r   getattr)clsrn   ro   
user_attrsmodel_attrshasher_attrsobjsobjpatchedattrvaluesources               r*   _iter_patch_candidatesz(_ExtensionSupport._iter_patch_candidates   s#      	87777777&7
'9' ' '%j),'
 ! 
	? 
	?LCC 	? 	???3'' ((u55E>>d'&9&9+E22 d;; ?tVdgo>>>>	?
	? 
	?r,   c           
         t           j                            d          }|                     |o|j        j        d           |                                 D ]n\  }}}}|r3|                     |                    d          d|d|d|           <|                     |                    d          d|d|d|           od	S )
z8
        test that django is in unpatched state
        passlib.ext.django.modelszpatch should not be enabledzdjango.contrib.auth.obj= attr=z was not reverted: passlib. should not have been patched: N)	sysmodulesrz   assertFalseadapterr   r   
assertTruerx   )r;   modr   r   r   r   s         r*   assert_unpatchedz"_ExtensionSupport.assert_unpatched   s    
 koo9::4!46STTT +/*E*E*G*G 	5 	5&Cvw 5 1 12H I I I!$dddFF!45 5 5 5   !2!2:!>!>!>!$dddFF!45 5 5 5	5 	5r,   Nc           
      &   t           j                            d          }|                     |o|j        j        d           |                                 D ]_\  }}}}|r$|                     |dk    d|d|d|           -|                     |                    d          d|d|d|           `|Yt          j
        |          }|                     |j                            d
          |                    d
                     d	S d	S )zY
        helper to ensure django HAS been patched, and is using specified config
        r   zpatch should have been enabledzpasslib.ext.django.utilsr   r   z should have been patched: r   r   NTresolve)r   r   rz   r   r   r   r   r   rx   r   _norm_sourceassertEqualpassword_contextr[   )r;   contextr   r   r   r   r   s          r*   assert_patchedz _ExtensionSupport.assert_patched  sR   
 koo9::3 35UVVV +/*E*E*G*G 	5 	5&Cvw 5*D D D!$dddFF!45 5 5 5   !2!2:!>!>!>!$dddFF!45 5 5 5
 "/88GS199$9GG$__T_::< < < < < r,   )PASSLIB_CONFIGPASSLIB_CONTEXTPASSLIB_GET_CATEGORYTc                 $   |                                   |r*|                    d          p|                    d          }| j        D ]}|                    |t                     t          di | ddl}|r|                     |           dS dS )zO
        helper to load extension with specified config & patch django
        r   r   r   Nr   r6   )unload_extensionrz   _config_keys
setdefaultr#   r+   passlib.ext.django.modelsr   )r;   checkr'   configkeypasslibs         r*   load_extensionz _ExtensionSupport.load_extension/  s     	 	OXX.//N488<M3N3NF$ 	( 	(COOC''''$(((( 	0/////	0 	0r,   c                    t           j                            d          }|r&|j                                         t           j        d= t          di t          d | j        D                        |                                  dS )z?
        helper to remove patches and unload extension
        r   c              3   (   K   | ]}|t           fV  d S r9   )r#   ).0r   s     r*   	<genexpr>z5_ExtensionSupport.unload_extension.<locals>.<genexpr>G  s&      IIU|IIIIIIr,   Nr6   )	r   r   rz   r   remove_patchr+   dictr   r   )r;   r   s     r*   r   z"_ExtensionSupport.unload_extension=  s    
 koo9:: 	9K$$&&&78JJ$IIt7HIIIIIJJJr,   r9   )T)r2   r3   r4   rD   classmethodr   r   r   r   r   r   r6   r,   r*   r   r      s          ? ? [?H5 5 5&< < < <: QPPL0 0 0 0         r,   r   c                   "     e Zd ZdZ fdZ xZS )r   z
    TestCase mixin which makes sure extension is unloaded before test;
    and make sure it's unloaded after test as well.
    c                 L   t          t          |                                            |                     d           t          s|                     d          t          s|                     d          |                                  |                     | j                   d S )NdefaultzDjango not installedzDjango version too old)	superr   setUprequire_TEST_MODEr   skipTestrb   r   
addCleanupr;   	__class__s    r*   r   z_ExtensionTest.setUp]  s    nd##))+++y))) 	:-- 6777 	:-- 8999 	 	-.....r,   )r2   r3   r4   rD   r   __classcell__r   s   @r*   r   r   T  sB         / / / / / / / / /r,   r   toomanysecretsletmeinc                       e Zd ZdZdZdZeZed             Z	d Z
edfdZd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd ZdS )r   a	  
    tests model to verify it matches django's behavior.

    running this class verifies the tests correctly assert what Django itself does.

    running the ExtensionBehaviorTest subclass below verifies "passlib.ext.django"
    matches what the tests assert.
    zverify django behaviorFc                 4    t          j        | j                  S )z?
        per-test CryptContext() created from .config.
        )r   r   r   r:   s    r*   r   zDjangoBehaviorTest.context  s    
 (555r,   c                     |                      |j                            d                     |                     |                                           |                     |                                g            dS )zO
        check that user object is set to 'unusable password' constant
        !N)r   rA   rx   r   has_usable_passwordr   r>   )r;   users     r*   assert_unusable_passwordz+DjangoBehaviorTest.assert_unusable_password  sn     	005566611334441133R88888r,   Nc                 v   |t           u r7|                     |j        d           |                     |j        d           n|                     |j        |           |                     |                                d|j                   |                     |                                |g n|g           dS )z
        check that user object has a usable password hash.
        :param hash: optionally check it has this exact hash
        :param saved: check that mock commit history for user.password matches this list
        r   Nzhash should be usable: )r#   assertNotEqualrA   r   r   r   r>   )r;   r   hashsaveds       r*   assert_valid_passwordz(DjangoBehaviorTest.assert_valid_password  s     5==s333t4444T]D111002227;}}F	H 	H 	H1133$}5'	; 	; 	; 	; 	;r,   c                    | j         s|                     d          | j        }ddlm} ddlm} |                     |                    d          |                    d                     ddl	m} |                     ||           dS )z;
        test extension config is loaded correctly
        zextension not loadedr   )rp   )r   Tr   N)
r   r   r   rR   rp   r   r   r   r[   django.contrib.auth.models)r;   ctxrp   r   check_password2s        r*   test_extension_configz(DjangoBehaviorTest.test_extension_config  s     | 	8-- 6777l 	?>>>>>>>>>>>)11$1??UYAZAZ[[[ 	QPPPPP.99999r,   c                    | j         }ddlm} t                      }|                    t
                     |                     |                                                    t
          |j	                             | 
                    |            |t
                    }|                     |                                                    t
          |                     dS )z1
        test django's default algorithm
        r   rM   N)r   rR   rN   r/   rq   PASS1r   handlerverifyrA   r   )r;   r   rN   r   r   s        r*   test_default_algorithmz)DjangoBehaviorTest.test_default_algorithm  s     l 	>===== zz%   ,,UDMBBCCC""4(((
 }U##,,UD99:::::r,   c                    | j         }ddlm}m}m}m} t                      }|                    d           |j        }| 	                    |
                                                    d|                     |                     ||           | 	                    |                    d                     |                     ||           | 	                     |d|                     dS )zB
        test how methods handle empty string as password
        r   rp   rN   is_password_usablers   rO   N)r   rR   rp   rN   r   rs   r/   rq   rA   r   r   r   r   )r;   r   rp   rN   r   rs   r   r   s           r*   test_empty_passwordz&DjangoBehaviorTest.test_empty_password  s    l	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 zz"},,R66777""4... 	++B//000""4... 	r40011111r,   c                    ddl m}m}m}m} t                      }|                                 |                     |           t                      }|                    d           |                     |           | 	                    |                    d                     | 	                    |                    d                     | 	                    |                    d                     | 	                    |                    t                               | 	                    |                    t                               |                     |           |                      |d                              d                     | 	                     |t          d                     | 	                     ||j                             |                     t           ||j                   dS )zA
        test how methods handle 'unusable flag' in hash
        r   r   NNonerO   r   )rR   rp   rN   r   rs   r/   set_unusable_passwordr   rq   r   r   WRONG1r   rx   rA   assertRaisesrS   r;   rp   rN   r   rs   r   s         r*   test_unusable_flagz%DjangoBehaviorTest.test_unusable_flag  s   
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 zz""$$$%%d+++ zz$%%d+++ 	,,T22333,,V44555,,R00111,,U33444,,V44555%%d+++ 	d++66s;;<<< 	s33444 	++DM::;;;*ot}EEEEEr,   c                 `   | j         }ddlm}m}m}m} t                      }d|_        t          j	        r)|s'| 
                    t          |j        t                     n-|                     |                    t                               |                     |                                t          j                   t          j	        r%|s#| 
                    t          |t          d           n$|                      |t          d                     | 
                    t          |d           dS )z<
        test how methods handle None as hash value
        r   r   N)r   rR   rp   rN   r   rs   r/   rA   r    none_causes_check_password_errorr   	TypeErrorr   r   r   r   empty_is_usable_password)r;   r   rp   rN   r   rs   r   s          r*   test_none_hash_valuez'DjangoBehaviorTest.test_none_hash_valueA  sH    ,	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 zz2 	97 	9i)<eDDDDT007788811338	: 	: 	: 2 	:7 	:iEEEE^^E488999 	)_d;;;;;r,   c                    ddl m}m}m}m} t                      }d|_        |                     |                    t                               | 	                    |j        d           | 	                    |
                                g            | 	                    |                                t          j                   |                      |t          d                     |                     t          |d           dS )zD
        test how methods handle empty string as hash value
        r   r   rO   N)rR   rp   rN   r   rs   r/   rA   r   r   r   r>   r   r   r   r   rS   r   s         r*   test_empty_hash_valuez(DjangoBehaviorTest.test_empty_hash_valuej  s   
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 zz,,U33444 	+++1133R888 	1133V5TUUU 	r22333 	*or:::::r,   c                     dD ]E}|                      |          5  |                     |           ddd           n# 1 swxY w Y   FdS )z>
        test how methods handle invalid hash values.
        )z$789$foo)r   N)subTest_do_test_invalid_hash_value)r;   r   s     r*   test_invalid_hash_valuesz+DjangoBehaviorTest.test_invalid_hash_values  s    
 	7 	7D 4(( 7 7006667 7 7 7 7 7 7 7 7 7 7 7 7 7 7	7 	7s   =A	A	c                    ddl m}m}m}m} t                      }||_        |                     |                    t                               | 	                    |j        |           | 	                    |
                                g            | 	                    |                                t          j                   |                      |t          |                     |                     t          ||           d S )Nr   r   )rR   rp   rN   r   rs   r/   rA   r   r   r   r>   r   r   invalid_is_usable_passwordr   rS   )r;   r   rp   rN   r   rs   r   s          r*   r   z.DjangoBehaviorTest._do_test_invalid_hash_value  s   	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 zz,,U33444 	---1133R888 	1133V5VWWW 	t44555 	*ot<<<<<r,   c                     | j                                         D ]E}|                     |          5  |                     |           ddd           n# 1 swxY w Y   FdS )z
        run a bunch of subtests for each hasher available in the default django setup
        (as determined by reading self.context)
        )schemeN)r   schemesr   _do_test_available_scheme)r;   r   s     r*   test_available_schemesz)DjangoBehaviorTest.test_available_schemes  s    
 l**,, 	7 	7FV,, 7 7..v6667 7 7 7 7 7 7 7 7 7 7 7 7 7 7	7 	7s   AA	A	c                    |                                  }| j        }| j        }t                      }ddlm}m}m}m}	 |	                    |          }
|
                    d||
           |	                    |          j        }|r||                                k    sJ 	 t          |          }n(# t          j        $ r |                     d          w xY wt#          |
|j	                  sJ |
j        r|                     d          |sPt'          |
j                  s<|dv sJ d|z              |                    d|           |                     d	          	 t,          |         \  }}n2# t.          $ r%  |d
          j        }	  |            \  }}|rnY nw xY wd}t3                      }||_        |                     |                    d                     |                     |                    |                     |                     ||           |                     |                    |                     |}|r|                     |j        |           |                     |
                    |j                             |                     |	                                                     ||j                             |                     ||j                   n|                     ||           tC          d          rdS tE                      #                    |          } |||          }|                     |
                     ||                     |                      ||||                     | $                    |%                                |r|gng            |                      ||||                     | $                    |%                                g            |                      ||                     tE                      &                     |	|          j'                  }| $                    ||           dS )z
        helper to test how specific hasher behaves.
        :param scheme: *passlib* name of hasher (e.g. "django_pbkdf2_sha256")
        r   r   ztesting scheme: %r => %rzbackend not availablezskip disabled hasher)django_bcryptdjango_bcrypt_sha256django_argon2z+%r scheme should always have active backendz3skipping scheme %r due to missing django dependencyzskip due to missing dependencyr   TdontletmeinN)r   r   )maxrP   )rH   )(	getLoggerr   r   rK   rR   rp   rN   r   rs   r   debugr]   default_schemer   r   MissingBackendErrorr   r   is_disabledrY   django_namewarningsample_hashesKeyErrorget_sample_hashr/   rA   r   r   r   r   identifyr   r   r   passlib_to_django_namer   rJ   django_to_passlib_name	algorithm)r;   r   logr   r   rH   rp   rN   r   rs   r   r]   testcasesecretr   r  otherr   needs_updatealghash2rW   s                         r*   r   z,DjangoBehaviorTest._do_test_available_scheme  s   
 nnl,#%%	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 ++f%%		,fg>>>[[((3
?3+=+=+?+?!?!?!??	9'//HH& 	9 	9 	9-- 7888	9#GX-=>>>>> 	8-- 6777
  	B>w?RSS 	BWWWW=F XWWKKMvVVV-- @AAA	(0LFDD 	 	 	&hw//?O.00  E	  zz 	,,T22333,,U33444""4... 	++F33444 " 	3t444W--dm<<===OOCKKMM00GGHHH&&t4=&AAAA&&tT222 ### 	F
   77??fS111vu55666 	vtFCCCDDD**,LVHH"MMM 	tFCCCDDD**B/// 	**400111!!889N9N9XYYv&&&&&s    B0 0%CE/ /,FF)r2   r3   r4   rD   descriptionPrefixr   stock_configr   r   r   r   r#   r   r   r   r   r   r   r   r   r   r   r   r6   r,   r*   r   r   z  s         1 G F 6 6 69 9 9 05D ; ; ; ;J: : :$; ; ;. 2  2  2D&F &F &FP'< '< '<R#; #; #;J7 7 7!= != !=F7 7 7t' t' t' t' t'r,   r   c                   @     e Zd ZdZdZ edd          Z fdZ xZS )r   z`
    test that "passlib.ext.django" conforms to behavioral assertions in DjangoBehaviorTest
    zverify extension behaviorz sha256_crypt,md5_crypt,des_crypt	des_crypt)r   r]   c                     t          t          |                                            |                     | j                   d| _        d S )Nr   T)r   r   r   r   r   r   r   s    r*   r   zExtensionBehaviorTest.setUpN  sF    #T**00222 	4;777r,   )	r2   r3   r4   rD   r  r   r   r   r   r   s   @r*   r   r   C  sf          4T6"  F
        r,   r   c                   F    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )r   z0
    test the ``passlib.ext.django`` plugin
    zpasslib.ext.django pluginc                 $   |                      dd           |                                  |                     d          5  |                      dd           ddd           n# 1 swxY w Y   |                                  |                      dd           |                     t                     |                                  |                      dd           |                     t                     |                                  dS )	z.test set_django_password_context patch/unpatchdisabledFr   r   !PASSLIB_CONFIG=None is deprecatedN
django-1.0r   
django-1.4)r   r   assertWarningListr   r	   r   r
   r:   s    r*   test_00_patch_controlz)DjangoExtensionTest.test_00_patch_controlg  sk    	:UCCC ##$GHH 	B 	Bt5AAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	<uEEE$4555 	 	<uEEE$4555 	s   A%%A),A)c                    d}|                      |           ddlmc mc m} ddlm} d }|j        j        }||j        _        | 	                    d          5  |j
                                         ddd           n# 1 swxY w Y   ||j        _        |j        }||_        | 	                    d          5  |j
                                         ddd           n# 1 swxY w Y   ||_        dS )	z(test detection of foreign monkeypatchingz[passlib]
schemes=des_crypt
r  r   N)r   c                      d S r9   r6   r6   r,   r*   dummyz>DjangoExtensionTest.test_01_overwrite_detection.<locals>.dummy  s    Dr,   z/another library has patched.*User\.set_passwordz2another library has patched.*models:check_password)r   r   contribauthrn   r   r   r-   rq   r  _manager	check_allrp   )r;   r   rn   r   r  origs         r*   test_01_overwrite_detectionz/DjangoExtensionTest.test_01_overwrite_detection  s    26222 	433333333333555555	 	 	 {'#( ##$UVV 	) 	)&&(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)#'  $ %##$XYY 	) 	)&&(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) $s$   BBB;C!!C%(C%c           	         ddl m} t                      j        }t          dk    r|                     t          |d           n& |d          }|                     ||j                    |d          }|                     ||j	                   ddl
m}  |d          }|                     |j        d           |                    d	          }|                     |                    d	|                     |                     |                    d	|                     |                     |                    d
|                     |                    d	dd          }|                     |d           |                     |                    |          dt'          d          dt'          d          d           |                     t(          |d           dS )z'test Hasher-compatible handler wrappersr   )ro   rg   hex_md5r   sha256_cryptr(  passlib_sha256_cryptstubxxxxabcdabcdabcdabcdi  rj   zK$5$rounds=1234$abcdabcdabcdabcd$v2RWkZQzctPdejyRqmmTDQpZN6wTh7.RUy9zF2LftT6zabcdab**********z+v2RWkZ*************************************)r  saltrk   r   does_not_existN)rv   ro   r   passlib_to_djangor   r   rS   assertIsInstanceUnsaltedMD5PasswordHasherBCryptPasswordHasherpasslib.hashr(  r   r  encoder   r   r   safe_summaryr   r   )r;   ro   r/  rQ   r(  encodeds         r*   test_02_handler_wrapperz+DjangoExtensionTest.test_02_handler_wrapper  s   //////,..@ G##j*;YGGGG&&y11F!!&'*KLLL
 #"?33fg&BCCC 	.-----"">22)+ABBB --''++FG<<===fg66777vw77888 --->> #P 	Q 	Q 	Q,,W55()**DEE 	 	 	 	($57GHHHHHr,   c                    |                      d          5  |                     dd           ddd           n# 1 swxY w Y   |                                  |                     dd           |                                  dS )ztest PASSLIB_CONFIG='disabled'r  NFr  r  )r  r   r   r:   s    r*   test_11_config_disabledz+DjangoExtensionTest.test_11_config_disabled  s     ##$GHH 	B 	Bt5AAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	:UCCCs   :>>c                 0   |                      dd           t          }|                     |           |                      dd           |                     t                     |                      dd           |                     t                     dS )ztest PASSLIB_CONFIG='<preset>'zdjango-defaultFr   r   r  r  r  N)r   r   r   r	   r
   )r;   r   s     r*   test_12_config_presetsz*DjangoExtensionTest.test_12_config_presets  s     	,<EJJJC   <uEEE,---<uEEE,-----r,   c                 <   ddl m} t          j        |          }|                                  |                     |           |                     dd           |                     |           |                     |d           |                     |           dS )z$test PASSLIB_CONFIG default behaviorr   )PASSLIB_DEFAULTzpasslib-defaultFr;  N)passlib.ext.django.utilsr>  r   from_stringr   r   )r;   r>  r   s      r*   test_13_config_defaultsz+DjangoExtensionTest.test_13_config_defaults  s     	=<<<<<*?;;O,,, 	,=UKKKO,,, 	O5IIIO,,,,,r,   c                 
   t          dt                     |                     t          t          d           |                                  t          dt                     |                     t          t          d           dS )ztest PASSLIB_CONFIG type checks{   )r   r   r   zmissing-preset)r   r   N)r+   r#   r   r   
__import__r   rS   r:   s    r*   test_14_config_invalidz*DjangoExtensionTest.test_14_config_invalid  ss    EBBBB)Z1LMMM'7OOOO*j2MNNNNNr,   c                    t          dgddd          }ddlm fd}|                     |	           |                      |            d           |                      |d
          d           |                      |d
          d           d }|                     ||           |                      |            d           |                      |d          d           |                      |d          d           |                      |d          d           d }|                     ||           |                      |            d           |                      |d          d           |                      |dd
          d           |                      |dd
          d           |                     t          | j        |d           dS )z#test PASSLIB_GET_CATEGORY parameterr(  i  i  i  )r   sha256_crypt__default_rounds#staff__sha256_crypt__default_rounds'superuser__sha256_crypt__default_roundsr   r'  c                      t          di | }|                    d                               |j                  j        S )z;helper to take in user opts, return rounds used in passwordr*  r6   )r/   rq   r@  rA   rk   )r'   r   r(  s     r*   runz9DjangoExtensionTest.test_21_category_setting.<locals>.run  sC    ##d##Df%%%++DM::AAr,   r  T)is_staff)is_superuserc                     | j         pd S r9   
first_namer   s    r*   get_categoryzBDjangoExtensionTest.test_21_category_setting.<locals>.get_category  s    ?*d*r,   )r   r   r	  rO  staff	superuserc                     d S r9   r6   rQ  s    r*   rR  zBDjangoExtensionTest.test_21_category_setting.<locals>.get_category%  s    4r,   )rP  rL  )rP  rM  xN)r   r3  r(  r   r   r   r   )r;   r   rK  rR  r(  s       @r*   test_21_category_settingz,DjangoExtensionTest.test_21_category_setting  sz    %&+/266:	   	.-----	B 	B 	B 	B 	B 	6222%%%d+++T222$///666	+ 	+ 	+F1= 	 	? 	? 	?%%%000$777000$777444d;;;	 	 	F1= 	 	? 	? 	?%%%000$777$???FFF$GGGNNN 	)T%8&/2 	 	4 	4 	4 	4 	4r,   N)r2   r3   r4   rD   r  r  r$  r7  r9  r<  rA  rE  rW  r6   r,   r*   r   r   Y  s          4     4% % %<+I +I +I`	  	  	 . . .- - - O O O-4 -4 -4 -4 -4r,   r   r9   )MrD   
__future__r   r   r   loggingr   r2   r  r   rT   r   r   _appsr   r   passlib.appsr	   r
   r   passlib.contextr   r?  r   r   r   r   passlib.utils.compatr   r   r   passlib.utils.decorr   passlib.tests.utilsr   r   r   passlib.tests.test_handlersr   __all__rb   django.confr   r   
isinstanceRuntimeError
configured	configuredjango.appspopulateinfoobjectr#   r+   r   r-   r/   rK   rY   re   django21_contextr  django110_contextr3  ri   r   usingrz   r   r   r   r   r   r   r   r   r   r6   r,   r*   <module>rn     s    
 A @ @ @ @ @ @ @ @ @ 'g'11 



 				 1 0 0 0 0 0 0 0 0 0 M M M M M M M M M M ( ( ( ( ( (            C B B B B B B B B B 1 1 1 1 1 1 I I I I I I I I I I 8 8 8 8 8 8    #55  J 32222222:h-- a llU]U]_```   !     DM02GHIII VHH@.QQQ 	$ $ $  7//////7 7 7 7 74 7 7 7,
 
 
  &   R V(()?@@LLw(()@AALL )()?@@L
 . - - - - -* -!,@ (8(89_(`(`-b -b -b4 0113  z  z  z  z  z  z  z  z J/ / / / /X0 / / /D 		' ' ' ' ' ' ' 'R    .   ,W4 W4 W4 W4 W4. W4 W4 W4 W4 W4r,   