
     h                        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(rSddl)m*Z*m+Z+  e,e*e+      s e-de*      e*j\                  s e*j^                          ddl0mZ  ejb                  ddg       edk\  reje                  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jx                        Z=n*edk\  r e;ej|                        Z=n e;ej&                        Z=ddl?m@Z@  eAd e@j                  e=j                  d             j                  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      ZLy).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 ]@  \  }}|t        u r"t        t        |      st	        t        |       0t        t        ||       B y)z*helper to update django settings from kwdsN)r   UNSEThasattrr   delattrsetattr)kwdskvs      _/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/passlib/tests/test_ext_django.pyupdate_settingsr+   N   s@     $!:x#!$Ha#$    )Userc                   B    e Zd ZdZ G d d      Zed        Zd ZddZy)	FakeUserz#mock user object for use in testingc                       e Zd Ze Zy)FakeUser.MetaN)__name__
__module____qualname__	app_label r,   r*   Metar1   _   s     Ir,   r7   c                     g S Nr6   selfs    r*   saved_passwordszFakeUser.saved_passwordsb   s    Ir,   c                 h    	 | 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   s2    ,++A.((+D((+s     1Nc                 N    | j                   j                  | j                         y r9   )r<   appendpassword)r;   update_fieldss     r*   savezFakeUser.savel   s      ''6r,   r9   )	r2   r3   r4   __doc__r7   r   r<   r>   rC   r6   r,   r*   r/   r/   Z   s-    1	! 	! 
	 
		,	7r,   r/   c                  .    g fd} fd}|| _         | S )Nc                 (    j                  |        y r9   )r@   )rA   states    r*   setterz"create_mock_setter.<locals>.setterr   s    Xr,   c                  .    	  d d   d d = S #  d d = w xY wr9   r6   )rG   s   r*   popstatez$create_mock_setter.<locals>.popstatet   s    	8aas    )rJ   )rH   rJ   rG   s     @r*   create_mock_setterrK   p   s     E
 FOMr,   c                     | sJ ddl m} 	  |d|        y# t        $ r*}t        j                  dt        |            rY d}~y 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   }   sG    
 K9b& 88I3s8Ts   
 	A
AAA
c                     t        | d      r| j                         } | j                  d       |t        rddlm} |j                  }|r| j                  ||       | S )z
    helper to build django CryptContext config matching expected setup for stock django deploy.
    :param kwds:
    :param sha_rounds:
    :return:
    to_dictauto)
deprecatedr   )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      sj     tY||~ 	KK   nD)44
 /91; 	 	

 Kr,   )r!      rf   
   )django_pbkdf2_sha256znot a passwordr`   roundsc                   D    e Zd ZdZed        Zd Zd	dZg dZd
dZ	d Z
y)r   zx
    test support funcs for loading/unloading extension.
    this class is mixed in to various TestCase subclasses.
    c              #   Z  K   ddl m}m} ddg}ddg}g d}||f|j                  |f||fg}|D ]y  \  }}t	        |      D ]f  }	|	j                  d      r|j                  j                  |	t              }
|
t        u r|	|vrBt        |
      }
t        |
dd	      }|s]||	||	|v f h { y	w)
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
'9'%j),'
 ! 
	?LCC 	???3'((u5E>d'&9+E2 d;tVdgo>>	?
	?s   BB+B+c           
      x   t         j                  j                  d      }| j                  |xr |j                  j
                  d       | j                         D ]^  \  }}}}|r+| j                  |j                  d      d|d|d|       5| j                  |j                  d      d|d|d|       ` y	)
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    
 kkoo9:4!4!46ST +/*E*E*G 	5&Cvw 1 12H I!$dF!45   !2!2:!>!$dF!45	5r,   Nc           
         t         j                  j                  d      }| j                  |xr |j                  j
                  d       | j                         D ]R  \  }}}}|r| j                  |dk(  d|d|d|       )| j                  |j                  d      d|d|d|       T |Rt        j                  |      }| j                  |j                  j                  d
      |j                  d
             y	y	)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  s    
 kkoo9:3 3 35UV +/*E*E*G 	5&Cvw*D D!$dF!45   !2!2:!>!$dF!45	5 "//8GS1199$9G$__T_:< r,   )PASSLIB_CONFIGPASSLIB_CONTEXTPASSLIB_GET_CATEGORYc                    | j                          |r$|j                  d      xs |j                  d      }| j                  D ]  }|j                  |t                t        di | ddl}|r| j                         yy)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{     	XX./N488<M3NF$$ 	(COOC'	($(/ r,   c                    t         j                  j                  d      }|r+|j                  j	                          t         j                  d= t        di t        d | j                  D               | j                          y)z?
        helper to remove patches and unload extension
        r   c              3   ,   K   | ]  }|t         f  y wr9   )r#   ).0r   s     r*   	<genexpr>z5_ExtensionSupport.unload_extension.<locals>.<genexpr>G  s     IU|Is   Nr6   )	r   r   rz   r   remove_patchr+   dictr   r   )r;   r   s     r*   r   z"_ExtensionSupport.unload_extension=  s_    
 kkoo9:KK$$&78J$It7H7HIIJr,   r9   )T)r2   r3   r4   rD   classmethodr   r   r   r   r   r   r6   r,   r*   r   r      s8     ? ?H5&<: QL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                     t         t        |           | j                  d       t        s| j                  d      t        s| j                  d      | j                          | j                  | j                         y )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]  sf    nd)+y)-- 677-- 899 	 	--.r,   )r2   r3   r4   rD   r   __classcell__r   s   @r*   r   r   T  s    / /r,   r   toomanysecretsletmeinc                   z    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y)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                 @    t        j                  | j                        S )z?
        per-test CryptContext() created from .config.
        )r   r   r   r:   s    r*   r   zDjangoBehaviorTest.context  s    
 ((55r,   c                     | j                  |j                  j                  d             | j                  |j	                                | j                  |j                         g        y)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  sO     	00561134113R8r,   Nc                 l   |t         u r9| j                  |j                  d       | j                  |j                  d       n| j                  |j                  |       | j	                  |j                         d|j                         | j                  |j                         |g        y|g       y)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t4T]]D10027;}}F	H113$}	;38'	;r,   c                    | j                   s| j                  d      | j                  }ddlm} ddlm} | j                  |j                  d      |j                  d             ddl	m} | j                  ||       y)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  sm     ||-- 677ll 	?>)11$1?UYAZ[ 	Q.9r,   c                    | j                   }ddlm} t               }|j	                  t
               | j                  |j                         j                  t
        |j                               | j                  |        |t
              }| j                  |j                         j                  t
        |             y)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     ll 	> z% ,,UDMMBC""4(
 U#,,UD9:r,   c                    | j                   }ddlm}m}m}m} t               }|j                  d       |j                  }| j                  |j                         j                  d|             | j                  ||       | j                  |j                  d             | j                  ||       | j                   |d|             y)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     ll	
 	
 z"}},,R67""4. 	++B/0""4. 	r401r,   c                 D   ddl m}m}m}m} t               }|j                          | j                  |       t               }|j                  d       | j                  |       | j                  |j                  d             | j                  |j                  d             | j                  |j                  d             | j                  |j                  t                     | j                  |j                  t                     | j                  |       | j                   |d      j                  d             | j                   |t        d             | j                   ||j                               | j                  t         ||j                         y)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  sF   
	
 	
 z""$%%d+ z$%%d+ 	,,T23,,V45,,R01,,U34,,V45%%d+ 	d+66s;< 	s34 	+DMM:;*ot}}Er,   c                 .   | j                   }ddlm}m}m}m} t               }d|_        t        j                  r(|s&| j                  t        |j                  t               n$| j                  |j                  t                     | j                  |j                         t        j                          t        j                  r|s| j                  t        |t        d       n| j                   |t        d             | j                  t        |d       y)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  s     ,,	
 	
 z227i)<)<eDT007811388	: 227iE^E489 	)_d;r,   c                    ddl m}m}m}m} t               }d|_        | j                  |j                  t                     | j                  |j                  d       | j                  |j                         g        | j                  |j                         t        j                         | j                   |t        d             | j                  t        |d       y)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    
	
 	
 z,,U34 	+113R8 	113V5T5TU 	r23 	*or:r,   c                     dD ].  }| j                  |      5  | j                  |       ddd       0 y# 1 sw Y   ;xY w)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  sK    
 	7D 4( 70067 7	77 7s   5>	c                    ddl m}m}m}m} t               }||_        | j                  |j                  t                     | j                  |j                  |       | j                  |j                         g        | j                  |j                         t        j                         | j                   |t        |             | j                  t        ||       y )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    	
 	
 z,,U34 	-113R8 	113V5V5VW 	t45 	*ot<r,   c                     | j                   j                         D ].  }| j                  |      5  | j                  |       ddd       0 y# 1 sw Y   ;xY w)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  sV    
 ll**, 	7FV, 7..v67 7	77 7s   AA	c                    | j                         }| j                  }| j                  }t               }ddlm}m}m}m}	 |j                  |      }
|j                  d||
       |j                  |      j                  }|r||j                         k7  sJ 	 t        |      }t#        |
|j                        sJ |
j$                  r| j!                  d      |sFt'        |
j(                        s1|dv s
J d|z         |j+                  d|       | j!                  d	      	 t,        |   \  }}d}t3               }||_        | j7                  |j                  d             | j7                  |j                  |             | j9                  ||       | j;                  |j                  |             |}|r| j=                  |j4                  |       | j7                  |
j?                  |j4                               | j;                  |j                         jA                  ||j4                               | j9                  ||j4                         n| j9                  ||       tC        d      rytE               jG                  |      } |||      }| j;                  |
jA                  ||             | j;                   ||||             | jI                  |jK                         |r|gng        | j7                   ||||             | jI                  |jK                         g        | j;                   ||             tE               jM                   |	|      jN                        }| jI                  ||       y# t        j                  $ r | j!                  d      w xY w# t.        $ r%  |d
      j0                  }	  |       \  }}|rnY w xY w)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   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  si   
 nnll,,#%	
 	
 ++f%		,fg>[[(33
3+=+=+?!??	9'/H $GX-=-=>>-- 677
 >w?R?RSWW G=FGKKMvV-- @AA	(0LFD  z 	,,T23,,U34""4. 	++F34 "t4W--dmm<=OOCKKM00GH&&t4==&A&&tT2 #
  77?fS1vu56 	vtFCD*VH"M 	tFCD*B/ 	*401!889N9X9XYv&s && 	9-- 788	9$  	&w/??O.0  	s   N  N(  %N%(*OO)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9 05D ;J:$;. 2D&FP'<R#;J7!=F7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                 p    t         t        |           | j                  | j                         d| _        y )Nr   T)r   r   r   r   r   r   r   s    r*   r   zExtensionBehaviorTest.setUpN  s/    #T02 	4;;7r,   )	r2   r3   r4   rD   r  r   r   r   r   r   s   @r*   r   r   C  s*     46"F
 r,   r   c                   D    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)r   z0
    test the ``passlib.ext.django`` plugin
    zpasslib.ext.django pluginc                    | j                  dd       | j                          | j                  d      5  | j                  dd       ddd       | j                          | j                  dd       | j                  t               | j                          | j                  dd       | j                  t               | j                          y# 1 sw Y   xY w)	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  s     	:UC ##$GH 	Bt5A	B 	<uE$45 	 	<uE$45 	!	B 	Bs   CCc                    d}| j                  |       ddlmc mc m} ddlm} d }|j                  j                  }||j                  _        | j                  d      5  |j                  j                          ddd       ||j                  _        |j                  }||_        | j                  d      5  |j                  j                          ddd       ||_        y# 1 sw Y   ixY w# 1 sw Y   ||_        yxY w)	z(test detection of foreign monkeypatchingz[passlib]
schemes=des_crypt
r  r   N)r   c                       y r9   r6   r6   r,   r*   dummyz>DjangoExtensionTest.test_01_overwrite_detection.<locals>.dummy  s    r,   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 	435	 {{''#( ##$UV 	)&&(	)#'  $$ %##$XY 	)&&(	) $	) 	)	) $s   "C%:C1%C.1Dc           	      0   ddl m} t               j                  }t        dkD  r| j                  t        |d       n$ |d      }| j                  ||j                          |d      }| j                  ||j                         ddl
m}  |d      }| j                  |j                  d       |j                  d	      }| j                  |j!                  d	|             | j                  |j!                  d	|             | j#                  |j!                  d
|             |j                  d	dd      }| j                  |d       | j                  |j%                  |      dt'        d      dt'        d      d       | j                  t(        |d       y)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  sm   /,.@@ G#j*;YG&y1F!!&'*K*KL
 #?3fg&B&BC 	.">2))+AB --'++FG<=fg67vw78 ---> #P 	Q,,W5()*DE	 	($57GHr,   c                     | j                  d      5  | j                  dd       ddd       | j                          | j                  dd       | j                          y# 1 sw Y   =xY w)ztest PASSLIB_CONFIG='disabled'r  NFr  r  )r  r   r   r:   s    r*   test_11_config_disabledz+DjangoExtensionTest.test_11_config_disabled  sl     ##$GH 	Bt5A	B 	:UC	B 	Bs   A""A+c                     | j                  dd       t        }| j                  |       | j                  dd       | j                  t               | j                  dd       | j                  t               y)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  so     	,<EJC <uE,-<uE,-r,   c                    ddl m} t        j                  |      }| j	                          | j                  |       | j	                  dd       | j                  |       | j	                  |d       | j                  |       y)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  sx     	=**?;O, 	,=UKO, 	O5IO,r,   c                     t        dt               | j                  t        t        d       | j                          t        dt               | j                  t        t        d       y)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  sI    EB)Z1LM'7O*j2MNr,   c                    t        dgddd      }ddlm fd}| j                  |	       | j	                   |       d       | j	                   |d
      d       | j	                   |d
      d       d }| j                  ||       | j	                   |       d       | j	                   |d      d       | j	                   |d      d       | j	                   |d      d       d }| j                  ||       | j	                   |       d       | j	                   |d      d       | j	                   |dd
      d       | j	                   |dd
      d       | j                  t        | j                  |d       y)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 | }|j                  d       j                  |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  s9    #d#Df%++DMM:AAAr,   r  T)is_staff)is_superuserc                 "    | j                   xs 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                      y r9   r6   rQ  s    r*   rR  zBDjangoExtensionTest.test_21_category_setting.<locals>.get_category%  s    r,   )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  s|    %&+/266:	 	.	B 	62%d+T2$/6	+F1= 	 	?%0$70$74d;	F1= 	 	?%0$7$?F$GN 	)T%8%8&/2 	 	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`	 .- O-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 0 M M (  C B 1 I I 8  #55  3h- U]_``  !DMM02GHI VHH@.Q 	$ /74 7,
&R V()?)?@Lw()@)@AL ))?)?@L
 .* -!,@ 5(8(89_(`-b4 013z  z J/X0 /D 		' 'R. ,W4. W4r,   