§
    HŠtj”¡  ã                   óÐ  — 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      ú[/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/passlib/tests/test_ext_django.pyÚupdate_settingsr+   N   sf   € å˜‰Œð $ð $‰ˆˆ!Ø•ˆ:ˆ:Ý•x Ñ#Ô#ð %Ý� !Ñ$Ô$Ð$øå•H˜a Ñ#Ô#Ð#Ð#ð$ð $ó    )Ú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   € € € € € Ø ˆIˆIˆIr,   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   € ð,ØÔ+¨A¨A¨AÔ.àÔ(¨¨¨Ð+Ð+ø�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à�a�a�a��ø��a�a�a�ˆLˆLˆLˆLs   ƒ	 ’)rJ   )rH   rJ   rG   s     @r*   Úcreate_mock_setterrK   p   sH   ø€ Ø€Eðð ð ð ð ðð ð ð ð ð
 €F„OØ€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ˆ   € ð
 €K€Kˆ4Ø9Ð9Ð9Ð9Ð9Ð9ðØˆ�b Ð&Ñ&Ô&Ð&ØˆtøÝð ð ð ÝŒ8ÐIÍ3ÈsÉ8Ì8ÑTÔTð 	Ø�5�5�5�5�5Øøøøøðøøø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œ   € õ ˆt�YÑÔð à�|Š|‰~Œ~ˆð 	‡K‚Kàð ñ ô ð ð Ð�nÐØDÐDÐDÐDÐDÐDØ)Ô4ˆ
ð ð 
Ø�ŠØ/9Ø1;ð 	ñ 	
ô 	
ð 	
ð
 €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 — ŒsŒˆd	S )
zàhelper 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Ð)Ø˜,Ð'ð
ˆð !ð 
	?ð 
	?‰LˆC�Ý˜C™œð 	?ð 	?�Ø—?’? 3Ñ'Ô'ð ØØœ×(Ò(¨­uÑ5Ô5�Ø�E�>�> d°'Ð&9Ð&9ØÝ+¨EÑ2Ô2�Ý  ¨°dÑ;Ô;�Øð ?Ø˜t V¨d°g¨oÐ>Ð>Ð>Ð>øð	?ð
	?ð 
	?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þ   € õ
 Œk�oŠoÐ9Ñ:Ô:ˆØ×Ò˜Ð4 ¤Ô!4Ð6SÑTÔTÐTð +/×*EÒ*EÑ*GÔ*Gð 	5ð 	5Ñ&ˆC��v˜wØð 5Ø—’ × 1Ò 1Ð2HÑ IÔ IÐ Ià!$   d d d¨F¨Fð!4ñ5ô 5ð 5ð 5ð × Ò  ×!2Ò!2°:Ñ!>Ô!>Ð!>à!$   d d d¨F¨Fð!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  € õ
 Œk�oŠoÐ9Ñ:Ô:ˆØ�Š˜Ð3 ¤Ô 3Ð5UÑVÔVÐVð +/×*EÒ*EÑ*GÔ*Gð 	5ð 	5Ñ&ˆC��v˜wØð 5Ø—’ Ð*DÒ DÐ Dà!$   d d d¨F¨Fð!4ñ5ô 5ð 5ð 5ð × Ò  ×!2Ò!2°:Ñ!>Ô!>Ð!>à!$   d d d¨F¨Fð!4ñ5ô 5ð 5ð 5ð
 ÐÝ"Ô/°Ñ8Ô8ˆGØ×Ò˜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Ø—X’XÐ.Ñ/Ô/ÐN°4·8²8Ð<MÑ3NÔ3NˆFØÔ$ð 	(ð 	(ˆCØ�OŠO˜C¥Ñ'Ô'Ð'Ð'ÝÐÐ˜$ÐÐÐØ(Ð(Ð(Ð(Øð 	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…   € õ
 Œk�oŠoÐ9Ñ:Ô:ˆØð 	9ØŒK×$Ò$Ñ&Ô&Ð&Ý”Ð7Ð8åÐJÐJ�$ÐIÐI°tÔ7HÐ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ÐP€Lð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š   ø€ Ý�n˜dÑ#Ô#×)Ò)Ñ+Ô+Ð+à×Ò˜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Ô3°RÑ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Ð2Ø7;´}°}Ð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ÀÑAZÔAZÑ[Ô[Ð[ð 	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ˆð 	>Ð=Ð=Ð=Ð=Ð=õ ‰zŒzˆØ×Ò�%Ñ Ô Ð Ø�Š˜Ÿš™œ×,Ò,­U°D´MÑBÔBÑCÔCÐCØ×"Ò" 4Ñ(Ô(Ð(ð
 ˆ}�UÑ#Ô#ˆØ�Š˜Ÿš™œ×,Ò,­U°DÑ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ˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ ‰zŒzˆØ×Ò˜"ÑÔÐØŒ}ˆØ�Š˜Ÿš™œ×,Ò,¨R°Ñ6Ô6Ñ7Ô7Ð7Ø×"Ò" 4¨Ñ.Ô.Ð.ð 	�Š˜×+Ò+¨BÑ/Ô/Ñ0Ô0Ð0Ø×"Ò" 4¨Ñ.Ô.Ð.ð 	�Š˜˜ r¨4Ñ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ô  € ð
	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ ‰zŒzˆØ×"Ò"Ñ$Ô$Ð$Ø×%Ò% dÑ+Ô+Ð+õ ‰zŒzˆØ×Ò˜$ÑÔÐØ×%Ò% 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Ò6°sÑ;Ô;Ñ<Ô<Ð<ð 	×Ò˜˜­¨sÑ3Ô3Ñ4Ô4Ð4ð 	×ÒÐ+Ð+¨D¬MÑ:Ô:Ñ;Ô;Ð;Ø×Ò�* o°t´}Ñ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  € ð ”,ˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ ‰zŒzˆØˆŒÝÔ2ð 	9¸7ð 	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à×Ò˜^˜^­E°4Ñ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  € ð
	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ ‰zŒzˆØˆŒØ×Ò˜×,Ò,­UÑ3Ô3Ñ4Ô4Ð4ð 	×Ò˜œ¨Ñ+Ô+Ð+Ø×Ò˜×1Ò1Ñ3Ô3°RÑ8Ô8Ð8ð 	×Ò˜×1Ò1Ñ3Ô3µVÔ5TÑUÔUÐUð 	×Ò˜˜­¨rÑ2Ô2Ñ3Ô3Ð3ð 	×Ò�* o°rÑ:Ô:Ð:Ð:Ð: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ð 	7ˆDð —’ 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  € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ ‰zŒzˆØˆŒØ×Ò˜×,Ò,­UÑ3Ô3Ñ4Ô4Ð4ð 	×Ò˜œ¨Ñ-Ô-Ð-Ø×Ò˜×1Ò1Ñ3Ô3°RÑ8Ô8Ð8ð 	×Ò˜×1Ò1Ñ3Ô3µVÔ5VÑWÔWÐWð 	×Ò˜˜­¨tÑ4Ô4Ñ5Ô5Ð5ð 	×Ò�* o°tÑ<Ô<Ð<Ð<Ð<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ð 	7ˆFØ—’ 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Á  € ð
 �nŠnÑÔˆØŒlˆØ”,ˆÝ#Ñ%Ô%ˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð —+’+˜fÑ%Ô%ˆØ�	Š	Ð,¨f°gÑ>Ô>Ð>Ø—[’[ Ñ(Ô(Ô3ˆ
ØÐ? ¨3×+=Ò+=Ñ+?Ô+?Ò!?Ð!?Ð!?Ð?ð	9Ý'¨Ñ/Ô/ˆHˆHøÝÔ&ð 	9ð 	9ð 	9Ø—-’-Ð 7Ñ8Ô8Ð8ð	9øøøå# G¨XÔ-=Ñ>Ô>Ð>Ð>Ð>ØÔð 	8Ø—-’-Ð 6Ñ7Ô7Ð7ð
 ð 	BÕ>¸wÔ?RÑSÔSð 	BØÐWÐWÐWÐWØ=ÀÑFñ XÔWÐWà�KŠKÐMÈvÑVÔVÐVØ—-’-Ð @ÑAÔAÐAð	Ý(¨Ô0‰LˆF�D�DøÝð 	ð 	ð 	Ø&˜h wÑ/Ô/Ô?ˆOðØ.˜Ñ0Ô0‘�˜Øð Øðð �Eð	øøøð ˆõ ‰zŒzˆØˆŒð 	×Ò˜×,Ò,¨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×-Ò-¨d¬mÑ<Ô<Ñ=Ô=Ð=Ø�OŠO˜CŸKšK™MœM×0Ò0°¸¼ÑGÔGÑHÔHÐHØ×&Ò& t°4´=Ð&ÑAÔAÐAÐAà×&Ò& t¨TÑ2Ô2Ð2õ ˜Ð#Ñ#Ô#ð 	ØˆFõ
 Ñ Ô ×7Ò7¸Ñ?Ô?ˆØ�˜f¨SÐ1Ñ1Ô1ˆØ�Š˜Ÿš v¨uÑ5Ô5Ñ6Ô6Ð6ð 	�Š˜˜ v¨t¸FÐCÑCÔCÑDÔDÐDØ×Ò˜ŸšÑ*Ô*¸Ð,L¨V¨H¨HÈ"ÑMÔMÐMð 	×Ò˜˜¨¨t¸FÐCÑCÔCÑDÔDÐDØ×Ò˜ŸšÑ*Ô*¨BÑ/Ô/Ð/ð 	�ŠÐ*Ð*¨4Ñ0Ô0Ñ1Ô1Ð1ÝÑ!Ô!×8Ò8¸¸ÈÑ9NÔ9NÔ9XÑ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ð 05¸Dð ;ð ;ð ;ð ;ðJ:ð :ð :ð$;ð ;ð ;ð. 2ð  2ð  2ðD&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Ø×Ò¨t¸5ÐÑ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Ô1ˆFØ×!Ò! &¨'Ô*KÑLÔLÐLð
 #Ð" ?Ñ3Ô3ˆØ×Ò˜f gÔ&BÑCÔCÐCð 	.Ð-Ð-Ð-Ð-Ð-Ø"Ð" >Ñ2Ô2ˆØ×Ò˜Ô)Ð+AÑBÔBÐBð —-’- Ñ'Ô'ˆØ�Š˜×+Ò+¨F°GÑ<Ô<Ñ=Ô=Ð=Ø�Š˜Ÿš f¨gÑ6Ô6Ñ7Ô7Ð7Ø×Ò˜Ÿš v¨wÑ7Ô7Ñ8Ô8Ð8ð —-’- ¨¸�-Ñ>Ô>ˆØ×Ò˜ð #Pñ 	Qô 	Qð 	Qà×Ò˜×,Ò,¨WÑ5Ô5Ø(ÝÐ)Ñ*Ô*ØÝÐDÑEÔEðð ñ	ô 	ð 	ð 	×Ò�(Ð$5Ð7GÑ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Ø×Ò¨t¸5ÐÑ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Ñ,Ô,Ð,ð 	×Ò¨OÀ5ÐÑ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Ø×Ò�)¥ZÐ1LÑMÔMÐMà×ÒÑÔÐÝÐ'7ÍÐOÑOÔOÐOØ×Ò�*¥jÐ2MÑ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Ñ%Ô%Ð%Ø×+Ò+¨D¬MÑ:Ô:Ô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  ø€ õ Ø%Ð&Ø+/Ø26Ø6:ð	ñ ô ˆð 	.Ð-Ð-Ð-Ð-Ð-ð	Bð 	Bð 	Bð 	Bð 	Bð 	×Ò¨6ÐÑ2Ô2Ð2Ø×Ò˜˜™œ Ñ%Ô%Ð%Ø×Ò˜˜ dÐ+Ñ+Ô+¨TÑ2Ô2Ð2Ø×Ò˜˜¨$Ð/Ñ/Ô/°Ñ6Ô6Ð6ð	+ð 	+ð 	+à×Ò¨FØ1=ð 	ñ 	?ô 	?ð 	?à×Ò˜˜™œ Ñ%Ô%Ð%Ø×Ò˜˜¨Ð0Ñ0Ô0°$Ñ7Ô7Ð7Ø×Ò˜˜¨Ð0Ñ0Ô0°$Ñ7Ô7Ð7Ø×Ò˜˜¨Ð4Ñ4Ô4°dÑ;Ô;Ð;ð	ð 	ð 	à×Ò¨FØ1=ð 	ñ 	?ô 	?ð 	?à×Ò˜˜™œ Ñ%Ô%Ð%Ø×Ò˜˜¨Ð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ð ˆlˆlÐU]ÐU]Ð_Ñ`Ô`Ð`ð Ôð ØˆÔÑÔÐð !Ð Ð Ð Ð Ð Ø€D„MÐ0Ð2GÐHÑIÔIÐIð �VÒÐØ‡H‚HÐ@À.ÑQÔQÐQð 	ˆ‰Œ€ð$ð $ð $ð ð 7Ø/Ð/Ð/Ð/Ð/Ð/ð7ð 7ð 7ð 7ð 7�4ñ 7ô 7ð 7ð,
ð 
ð 
ðð ð ð&ð ð ð ðR �VÒÐØ(Ð(¨Ô)?Ñ@Ô@€L€LØ�wÒÐØ(Ð(¨Ô)@ÑAÔA€L€Lð )Ð(¨Ô)?Ñ@Ô@€Lð
 .Ð -Ð -Ð -Ð -Ð -Ø�Ø*ð -!Ð,@Ü ¨×(8Ò(8Ð9_Ñ(`Ô(`ð-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,   