U
    h+                  
   @   s  d Z ddlmZmZmZ ddlZeeZddl	m
Z
 ddlmZmZmZ ddlmZmZ ddlmZmZmZ er~dd	lmZ d
gZdZdZeddrdZnerddlZddlZejdZerej ese!de e"dd dD se!de e#de ej$edZ%ej&de% zNzddl(m)Z W n8 e*k
rn Z+ ze
e!dee+f W 5 dZ+[+X Y nX W 5 ej'e% X ndZedrej,-d nerdZndZerddl.m/Z/ ddl0m1Z1 ddl2m3Z3 dd l	m4Z4 G d!d
 d
ej5eZ6nG d"d
 d
eZ6dS )#z5
test passlib.ext.django against django source tests
    )absolute_importdivisionprint_functionN)suppress_cause)DJANGO_VERSIONDjangoTranslator_PasslibHasherWrapper)TestCase	TEST_MODE   )has_min_djangostock_config_ExtensionSupport)settingsHashersTestZquick)maxzrequires >= 'default' test modeZ PASSLIB_TESTS_DJANGO_SOURCE_PATHz django source path not found: %rc                 c   s$   | ]}t jt jt|V  qd S N)ospathexistsjoinsource_path).0name r   J./venv/lib/python3.8/site-packages/passlib/tests/test_ext_django_source.py	<genexpr>6   s   r   )Zdjangotestszinvalid django source path: %rz'using django tests from source path: %rr   )test_hashersz=error trying to import django tests from source path (%r): %rz3requires PASSLIB_TESTS_DJANGO_SOURCE_PATH to be setZfullzt
WARNING: $PASSLIB_TESTS_DJANGO_SOURCE_PATH is not set; can't run Django's own unittests against passlib.ext.django
zdjango version too oldzdjango not installed)setting_changed)receiverimport_string)get_unbound_method_functionc                       sJ   e Zd ZdZeejZdd Z fddZdd Z	e	Z
e	Ze	Ze	Z  ZS )r   zq
        Run django's hasher unittests against passlib's extension
        and workalike implementations
        c                    s   | j tdd ddlm jddlm} dD ]}| t|t	|| q0ddl
m} | |dd t jttdd	fd
d}| tj| |  fdddg  fdd}dD ]}| j||dd q| jd|dd d S )NF)ZPASSLIB_CONTEXTcheckr   )adapter)hashers)Zmake_passwordZcheck_passwordZidentify_hasherZis_password_usableZ
get_hasher)django_des_cryptZuse_duplicate_salt)Zweakc                     st   | r| d dkrd S  j ks"tfddtjD }d|krPd|krP|d |d j|dd	    d S )
NZsettingPASSWORD_HASHERSc                    s   g | ]} t | qS r   r!   )r   Z	hash_path)django_to_passlib_namer   r   
<listcomp>   s   z=HashersTest.setUp.<locals>.update_schemes.<locals>.<listcomp>Zhex_md5Zdjango_salted_md5Zdjango_disabledauto)schemesZ
deprecated)contextAssertionErrorr   r(   appendupdateZreset_hashers)kwdsr,   )r%   r-   r)   r   r   update_schemes   s    


z)HashersTest.setUp.<locals>.update_schemesc                     sl   j ddD ]Z} d| jkrq | }t|tr2qt|ddpHt|dd}|dkrTq| | _ | _| _qdS )zN
                sync django hasher config -> passlib hashers
                T)ZresolveroundsNZ
iterations)	r,   Zsetting_kwdsZpasslib_to_django
isinstancer   getattrZmin_desired_roundsZmax_desired_roundsZdefault_rounds)handlerZhasherr3   )r%   r-   r   r   update_rounds   s    



z(HashersTest.setUp.<locals>.update_roundsc              	      s0    d s&d d< z
  W 5 d d< X | ||S )zY
                wrapper around arbitrary func, that first triggers sync
                r   TFr   )wrappedargsr1   )
_in_updater7   r   r   update_wrapper   s    

z)HashersTest.setUp.<locals>.update_wrapper)r,   r6   Zdefault_schemehashZverifyZneeds_updateZverify_and_updateT)wrapZdjango_to_passlib)Zload_extensionr   Zpasslib.ext.django.modelsr%   r-   Zdjango.contrib.authr&   	patchAttrtest_hashers_modr5   Zpasslib.hashr'   r   r)   r    r   Z
addCleanupZ
disconnect)selfr&   attrr'   r2   r;   r   )r:   r%   r-   r)   r7   r   setUpn   s&    
zHashersTest.setUpc                    s   |    tt|   d S r   )Zunload_extensionsuperr   tearDownr@   	__class__r   r   rD      s    zHashersTest.tearDownc                 C   s
   |  dS )Nzomitted by passlib)skipTestrE   r   r   r   <lambda>       zHashersTest.<lambda>)__name__
__module____qualname____doc__r#   r	   r>   rB   rD   Z_OMITZtest_pbkdf2_upgrade_new_hasherZ(test_check_password_calls_harden_runtimeZtest_bcrypt_harden_runtimeZtest_pbkdf2_harden_runtime__classcell__r   r   rF   r   r   ^   s   

f
c                   @   s   e Zd Zdd ZdS )r   c                 C   s   |  tdS )zexternal django hasher testsN)rH   hashers_skip_msgrE   r   r   r   !test_external_django_hasher_tests   s    z-HashersTest.test_external_django_hasher_testsN)rK   rL   rM   rQ   r   r   r   r   r      s   )7rN   Z
__future__r   r   r   ZloggingZ	getLoggerrK   logZpasslib.utils.compatr   Zpasslib.ext.django.utilsr   r   r   Zpasslib.tests.utilsr	   r
   Ztest_ext_djangor   r   r   r   __all__r?   rP   r   sysenvirongetr   r   r   EnvironmentErrorallinfor   Z
tests_pathinsertremoveZ
auth_testsr   ImportErrorerrstderrwriteZdjango.core.signalsr   Zdjango.dispatchr    Zdjango.utils.module_loadingr"   r#   ZTestUtilsHashPassr   r   r   r   r   <module>   sh    


 