o
    Ԏj}                     @   s*  d Z ddlmZ ddlZddlZddlmZ ddlZddlm	Z	m
Z
 ddlmZmZ ddlmZmZmZ ddlm  mZ ddlmZmZ dd	lmZ eeZd
d ZG dd deZG dd deZG dd deZ G dd dej!Z"G dd dej#ej$Z%edZ&G dd deZ'G dd deZ(dS )z>tests for passlib.hash -- (c) Assurance Technologies 2003-2009    )with_statementN)	getLogger)ldap_md5sha256_crypt)MissingBackendErrorPasslibHashWarning)str_to_uasciiuascii_to_strunicode)HandlerCaseTestCase)uc                    s    fddt |S )z1generate all strings of given size using alphabetc                 3   sH    | dk r D ]}|V  qd S  D ]}| d D ]}|| V  qqd S )N       )sizechartailalphabethelperr   a/home/air/Certificate/back/venv/lib/python3.10/site-packages/passlib/tests/test_utils_handlers.pyr      s   z_makelang.<locals>.helper)set)r   r   r   r   r   	_makelang   s   r   c                   @   sp   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )SkeletonTestztest hash support classesc                    s  G  fdddt j |  td |  d |  td |  td |  d |  td |  td	 |  td
 | t jd | t jd |  	  
d |  dd |  dtd |  dd |  dtd |  jdddd | t jdd | t jdtd |  
dd |  j
dddd dS )ztest StaticHandler classc                       sD   e Zd ZdZdZedZedZdZd fdd	Z	d	d
 Z
  ZS )z/SkeletonTest.test_00_static_handler.<locals>.d1d1flag_abr   Fc                    s    t | jdi | || _d S Nr   )super__init__r   )selfr   kwds)	__class__r   r   r   r"   9   s   
z8SkeletonTest.test_00_static_handler.<locals>.d1.__init__c                 S   s   | j rtdS tdS )Nba)r   r   r#   secretr   r   r   _calc_checksum=   s   z>SkeletonTest.test_00_static_handler.<locals>.d1._calc_checksum)F)__name__
__module____qualname__namecontext_kwdsr   _hash_prefixchecksum_charschecksum_sizer"   r*   __classcell__r   r   )r%   r   r   2   s    r   _as   _a_b_cs   _cr'   r&   cNr    ss   _bTr   )uhStaticHandler
assertTrueidentifyr   assertFalseassertRaises	TypeErrorassertEqual	genconfighashverify
ValueErrorr#   r   r4   r   test_00_static_handler/   s*   z#SkeletonTest.test_00_static_handlerc                 C   s   G dd dt j}| d |d}W d   n1 sw   Y  | |d | |d| | |d| |`| 	t
|jd dS )ztest StaticHandler legacy attrc                   @   s4   e Zd ZdZedd Zedd Zedd ZdS )	z3SkeletonTest.test_01_calc_checksum_hack.<locals>.d1r   c                 S   s:   |rt |dkr
dS zt|d W dS  ty   Y dS w )N(   F   T)lenintrF   clsrD   r   r   r   r>   f   s   z<SkeletonTest.test_01_calc_checksum_hack.<locals>.d1.identifyc                 S   sP   |d u rt dt|tr|d}|d ur| |stdtd|  S )Nzno secret providedutf-8zinvalid hashs   xyz)	rA   
isinstancer
   encoder>   rF   hashlibsha1	hexdigestrN   r)   rD   r   r   r   genhashp   s   

z;SkeletonTest.test_01_calc_checksum_hack.<locals>.d1.genhashc                 S   s$   |d u rt d| ||| kS )Nzno hash specified)rF   rV   lowerrU   r   r   r   rE   {   s   z:SkeletonTest.test_01_calc_checksum_hack.<locals>.d1.verifyN)r+   r,   r-   r.   classmethodr>   rV   rE   r   r   r   r   r   c   s    
	

r   z%d1.*should be updated.*_calc_checksumtestN(7c622762588a0e5cc786ad0a143156f9fd38eea3xtest)r;   r<   assertWarningListrD   rB   r=   rE   r?   rV   r@   NotImplementedError)r#   r   rD   r   r   r   test_01_calc_checksum_hack]   s   z'SkeletonTest.test_01_calc_checksum_hackc                 C   s  G dd dt j}| t|jd | t|jd | |d | |d | |d tt	d|_
| t|jd | t|jd | |d	 | |d |`
t	d
|_| t|jd | t|jd | |d | |d |`dS )ztest GenericHandler.identify()c                   @   s   e Zd Zedd ZdS )z)SkeletonTest.test_10_identify.<locals>.d1c                 S   s.   t |tr
|d}|tdkr| |dS t)Nasciir'   checksum)rP   bytesdecoder   rF   rM   r   r   r   from_string   s
   


z5SkeletonTest.test_10_identify.<locals>.d1.from_stringN)r+   r,   r-   rX   rd   r   r   r   r   r      s    r   Nr   r9   r'   r&   z@.z@a!z!a)r;   GenericHandlerr@   rA   r>   r?   r=   recompiler   _hash_regexident)r#   r   r   r   r   test_10_identify   s$   
zSkeletonTest.test_10_identifyc                    s   G dd dt j d fdd	}| t|td | |tdtd | |tdtd | t|td	 | t|td
 | t|d |   jtd dS )z%test GenericHandler checksum handlingc                   @   s   e Zd ZdZdZedZdS )z.SkeletonTest.test_11_norm_checksum.<locals>.d1r      xzN)r+   r,   r-   r.   r2   r   r1   r   r   r   r   r      s    r   Nc                    s    dd| i|j S )Nra   r   r`   )ra   kr4   r   r   norm_checksum   s   z9SkeletonTest.test_11_norm_checksum.<locals>.norm_checksumxxxxxxxxzxzxxxxxxxyxs   xxyxN)r;   rf   r@   rF   r   rB   rA   _stub_checksumr#   ro   r   r4   r   test_11_norm_checksum   s   	z"SkeletonTest.test_11_norm_checksumc                    sX   G dd dt jt j  fdd}| |dd | t|td |   jd dS )	z*test GenericHandler + HasRawChecksum mixinc                   @   s   e Zd ZdZdZdS )z2SkeletonTest.test_12_norm_checksum_raw.<locals>.d1r   rl   N)r+   r,   r-   r.   r2   r   r   r   r   r      s    r   c                     s    | i |j S ru   r`   )r'   rn   r4   r   r   ro         z=SkeletonTest.test_12_norm_checksum_raw.<locals>.norm_checksums   1234rt   s       N)r;   HasRawChecksumrf   rB   r@   rA   r   rv   rw   r   r4   r   test_12_norm_checksum_raw   s
   z&SkeletonTest.test_12_norm_checksum_rawc                    sN  G dd dt jt j  fdd} fdd}tdd}tdd	}tdd
}| t| | jt|dd | |dd| tjddJ}| jt	|dd | jt	|dd | 
| | |ddd | |ddd | |ddd | 
| | jt	|dd | 
| W d   n1 sw   Y  tjddU}| t	|d | t	|d | 
| | |d| | |d	| | |d
| | 
| | t	|d | 
| | |ddd| | 
|dg W d   n1 sw   Y   `| g  | t|dd	 | t|dd W d   dS 1 s w   Y  dS )z#test GenericHandler + HasSalt mixinc                   @   s$   e Zd ZdZdZdZdZdZdZdS )z*SkeletonTest.test_20_norm_salt.<locals>.d1r   saltr   rl      r   N)	r+   r,   r-   r.   setting_kwdsmin_salt_sizemax_salt_sizedefault_salt_size
salt_charsr   r   r   r   r      s    r   c                         di | j S r    r|   rn   r4   r   r   	norm_salt   ry   z1SkeletonTest.test_20_norm_salt.<locals>.norm_saltc                    s    j dd| i|ddjS )N	salt_sizeTuse_defaultsr   )usingr}   )szrn   r4   r   r   gen_salt   s   z0SkeletonTest.test_20_norm_salt.<locals>.gen_saltr   r   r~   rl   Nr|   Tr   recordr9   r'   abaabbaaaaabbr   r      )relaxedzsalt_size.*above max_salt_size)r;   HasSaltrf   r   r@   rA   assertInwarningscatch_warningsrF   consumeWarningListrB   r   r\   rK   )r#   r   r   salts2salts3salts4wlogr   r4   r   test_20_norm_salt   sL   







$zSkeletonTest.test_20_norm_saltc                    s  G dd dt jt j  fdd}| t| | jt|dd | |ddd	 | jt|d
d tjddB}| jt|dd | 	| | |ddd | |d	dd	 | |ddd | 	| | jt|dd | 	| W d   n1 s{w   Y  d _
| jt|dd dS )z%test GenericHandler + HasRounds mixinc                   @   s    e Zd ZdZdZdZdZdZdS )z,SkeletonTest.test_30_init_rounds.<locals>.d1r   roundsr   r~   r   N)r+   r,   r-   r.   r   
min_rounds
max_roundsdefault_roundsr   r   r   r   r   8  s    r   c                     r   r    r   r   r4   r   r   norm_rounds@  ry   z5SkeletonTest.test_30_init_rounds.<locals>.norm_roundsNr   Tr   r   g      ?r   r   r   r~   rl   )r;   	HasRoundsrf   r@   rA   rB   r   r   rF   r   r   )r#   r   r   r   r4   r   test_30_init_rounds5  s$   

z SkeletonTest.test_30_init_roundsc                 C   sR  G dd dt jt j}| t|j | t|j | t|jd | t|jd | |  d|_	| }| 
|dd |d |d | 
|dd | t|jd | |d | |d d|_| |  |d | 
|dd | t|jd	 | t|jd	 |d G d
d d|}| t|jd dS )z+test GenericHandler + HasManyBackends mixinc                   @   sH   e Zd ZdZdZdZdZdZedd Z	edd Z
d	d
 Zdd ZdS )z)SkeletonTest.test_40_backends.<locals>.d1r   r   r'   r&   Fc                 S      | j r| | j dS dS NTF)	_enable_a_set_calc_checksum_backend_calc_checksum_arN   r   r   r   _load_backend_aj     z9SkeletonTest.test_40_backends.<locals>.d1._load_backend_ac                 S   r   r   )	_enable_br   _calc_checksum_br   r   r   r   _load_backend_br  r   z9SkeletonTest.test_40_backends.<locals>.d1._load_backend_bc                 S      dS Nr'   r   r(   r   r   r   r   z     z:SkeletonTest.test_40_backends.<locals>.d1._calc_checksum_ac                 S   r   Nr&   r   r(   r   r   r   r   }  r   z:SkeletonTest.test_40_backends.<locals>.d1._calc_checksum_bN)r+   r,   r-   r.   r   backendsr   r   rX   r   r   r   r   r   r   r   r   r   a  s    

r   anydefaultTr:   r&   r'   r8   c                   @   s   e Zd ZdZdS )z)SkeletonTest.test_40_backends.<locals>.d2TN)r+   r,   r-   _has_backend_ar   r   r   r   d2  s    r   N)r;   HasManyBackendsrf   r@   r   get_backendset_backendr?   has_backendr   rB   r*   r=   r   rF   AssertionError)r#   r   objr   r   r   r   test_40_backends_  s0    



zSkeletonTest.test_40_backendsc                 C   s8  t jdtdd G dd dtjtj}| t|j | t|j	 | t|j	d | t|j	d | 
|  d|_| }| |d	d
 |	d
 |	d | |d	d
 | t|j	d | |d
 | 
|d d|_| |  |	d | |d	d | t|j	d | t|jd dS )z<test GenericHandler + HasManyBackends mixin (deprecated api)ignorez0.* support for \._has_backend_.* is deprecated.*)categorymessagec                   @   s0   e Zd ZdZdZdZdZdZdd Zdd Z	d	S )
z)SkeletonTest.test_41_backends.<locals>.d1r   r   r   Fc                 S   r   r   r   r(   r   r   r   r     r   z:SkeletonTest.test_41_backends.<locals>.d1._calc_checksum_ac                 S   r   r   r   r(   r   r   r   r     r   z:SkeletonTest.test_41_backends.<locals>.d1._calc_checksum_bN)
r+   r,   r-   r.   r   r   r   _has_backend_br   r   r   r   r   r   r     s    r   r   r   Tr:   r&   r'   r8   N)r   filterwarningsDeprecationWarningr;   r   rf   r@   r   r   r   r?   r   r   rB   r*   r=   r   rF   )r#   r   r   r   r   r   test_41_backends  s2   


zSkeletonTest.test_41_backendsc                    sh  G dd dt jt j  fdd}| t| | jt|dd | |ddtd	 | |td	dtd	 | |td
dtd
 | jt|tdd | |tddtd	 | jt|tdd |  	td |  	td | 
 	td | 
 	td | 
 	td | t j	d | t j	d d _| jt|dd dS )z#test GenericHandler + HasManyIdentsc                   @   s<   e Zd ZdZdZedZededfZedediZdS )z+SkeletonTest.test_50_norm_ident.<locals>.d1r   rj   !A!BAN)	r+   r,   r-   r.   r   r   default_identident_valuesident_aliasesr   r   r   r   r     s    r   c                     r   r    r   r   r4   r   r   
norm_ident  ry   z3SkeletonTest.test_50_norm_ident.<locals>.norm_identNr   Tr   r   r   z!Cr   Bz!Axxxz!Bxxxz!Cxxxr9   r   )r;   HasManyIdentsrf   r@   rA   rB   r   rF   r=   r>   r?   r   r   )r#   r   r   r4   r   test_50_norm_ident  s&   zSkeletonTest.test_50_norm_identc              	   C   sB  ddl m} |jd}| |tdtdd d}td}td	}|j|}| |t|d
d|d |jj|dd}| |t|d
dd |jj|dd}| |td
dtdtdd |jd}| |ttdtddd d}|j|}| |tdddd |jj|dd}| |ttddtdd d S )!ztest parsehash()r   rD   OgAwTx2l6NADIAwTx2l6NADIOgra   r}   z?$5$LKO/Ute40T3FNF95$U0prpBQd4PloSGU0pnpM4z9wKn4vZ1.jsrzQfPqxph9zLKO/Ute40T3FNF95z+U0prpBQd4PloSGU0pnpM4z9wKn4vZ1.jsrzQfPqxph9i  T)r}   r   implicit_roundsra   Fr`   )r}   r   r   )sanitizezLK**************z+U0pr***************************************)r   r   r}   ra   zL$5$rounds=10428$uy/jIAhCetNCTtb0$YWvUOXbkqlqhyoPMpN8BMe.ZGsGx2aBvxTvDFI613c3z+YWvUOXbkqlqhyoPMpN8BMe.ZGsGx2aBvxTvDFI613c3zuy/jIAhCetNCTtb0i(  )ra   r}   r   z@$pbkdf2$60000$DoEwpvQeA8B4T.k951yLUQ$O26Y3/NJEiLCVaOVPxGXshyjW8ks   ;nI"U?[i`  s   0xO=\Qra   r   r}   zO26************************zDo********************N)	passlibrD   	des_crypt	parsehashrB   r   r   dictpbkdf2_sha1)r#   rD   resulthr:   r8   h1r   r   r   test_91_parsehash  sH   zSkeletonTest.test_91_parsehashc                 C   s   ddl m} | |j ddd | |j ddd | |jdd	 | |j d
ddd | |jdd | |j dddd dS )ztest bitsize()r   r   B      r         r   i   i     `   r   i            N)	r   rD   rB   r   bitsizebcrypt	patchAttrr   r   r#   rD   r   r   r   test_92_bitsizeJ  s   

zSkeletonTest.test_92_bitsizeN)r+   r,   r-   __doc__rH   r^   rk   rx   r{   r   r   r   r   r   r   r   r   r   r   r   r   )   s    .3#$I*K:.8r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	dummy_handler_in_registryz6context manager that inserts dummy handler in registryc                 C   s(   || _ td| tjft|dd| _d S )Ndummy_r   )r.   r   )r.   typer;   rf   r   dummy)r#   r.   r   r   r   r"   p  s
   z"dummy_handler_in_registry.__init__c                 C   sD   ddl m} |j| jdd || j || j| ju sJ | jS Nr   )registryF)	locations)r   r   _unload_handler_namer.   register_crypt_handlerr   get_crypt_handler)r#   r   r   r   r   	__enter__w  s
   z#dummy_handler_in_registry.__enter__c                 G   s    ddl m} |j| jdd d S r   )r   r   r   r.   )r#   exc_infor   r   r   r   __exit__~  s   z"dummy_handler_in_registry.__exit__N)r+   r,   r-   r   r"   r   r   r   r   r   r   r   n  s
    r   c                   @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )PrefixWrapperTestztest PrefixWrapper classc                 C   s   t jdddddd}| |jd | |jd | |jt | |jt td}| |jt W d   dS 1 s=w   Y  dS )z*test PrefixWrapper lazy loading of handlerr   r   {XXX}{MD5}T)lazyN)	r;   PrefixWrapperrB   _wrapped_nameassertIs_wrapped_handlerwrappedr   r   r#   r   r   r   r   r   test_00_lazy_loading  s   
"z&PrefixWrapperTest.test_00_lazy_loadingc                 C   sv   t dddd}| |jd | |jt | |jt td}| |jt W d   dS 1 s4w   Y  dS )z,test PrefixWrapper active loading of handlerr   r   r  r  N)	r;   r  rB   r  r  r  r   r	  r   r
  r   r   r   test_01_active_loading  s   
"z(PrefixWrapperTest.test_01_active_loadingc                 C   sv   t dtdd}| |jd | |jt | |jt td}| |jt W d   dS 1 s4w   Y  dS )z4test PrefixWrapper with explicitly specified handlerr   r  r  Nr   )	r;   r  r   rB   r  r  r  r	  r   r
  r   r   r   test_02_explicit  s   
"z"PrefixWrapperTest.test_02_explicitc                 C   st   t dddd}| |jd | |jtj | dt|v  t ddd}| |jt	j | 
dt|v  d S )Nr   r   r  r  r   r   r   )r;   r  rB   r.   r  r   r   r?   dirr   r=   )r#   r   r   r   r   r   test_10_wrapped_attributes  s   z,PrefixWrapperTest.test_10_wrapped_attributesc                 C   s   t dddd}d}d}| | d | t|jdd  | |d|| | t|jd| | |d| | 	|
| | |
| | t|jd| | 	|d| d S )	Nr   r   r  r  z{XXX}X03MO1qnZdYdgyfeuILPmQ==z{MD5}X03MO1qnZdYdgyfeuILPmQ==z{XXX}1B2M2Y8AsgTpgAmY7PhCfg==password)r;   r  rB   rC   r@   rA   rV   rF   rD   r=   r>   r?   rE   )r#   r   dphlphr   r   r   test_11_wrapped_methods  s   z)PrefixWrapperTest.test_11_wrapped_methodsc                 C   s  t ddd}| |jtd | |jd  t ddd}| |jd  | |jd  t dddd}| |jd  | |jd  t jdddd	d
}| |jtd	 | |jd  t jddddd
}| jtt jddddd
 | jtt jddddd
 t ddd}| |jd  | |jtdtdf t jddddd
}| |jtd | |jd  | jtt jdddd
 | 	d t jddddd}W d    n1 sw   Y  | |jd  | |jd  d S )Nh2r   r  z
{XXX}{MD5}r   r   r  h3z{Xr   z{XXX}Az{XYz{XXXXh4phpassz{XXX}$P$z{XXX}$H$h5Th6z#orig_prefix.*may not work correctlyh7$?)orig_prefixprefix)
r;   r  rB   rj   r   r  r   r@   rF   r\   r#   r   r   r   r   test_12_ident  s>   zPrefixWrapperTest.test_12_identc                 C   s&   t jddddd}| t|d dS )ztest repr()r  	md5_cryptr  z$1$r  z(?x)^PrefixWrapper\(
                ['"]h2['"],\s+
                ['"]md5_crypt['"],\s+
                prefix=u?["']{XXX}['"],\s+
                orig_prefix=u?["']\$1\$['"]
            \)$N)r;   r  assertRegexreprr  r   r   r   test_13_repr  s   
zPrefixWrapperTest.test_13_reprc                 C   s$   t jdddd}| t|jd dS )ztest orig_prefix sanity checkr  r!  z$6$r"  rY   N)r;   r  r@   rF   rD   r  r   r   r   test_14_bad_hash  s   z"PrefixWrapperTest.test_14_bad_hashN)r+   r,   r-   r   r  r  r  r  r  r   r%  r&  r   r   r   r   r    s    
/r  c                   @   s&   e Zd ZdZdZejZdZdd Z	dS )UnsaltedHashz!test algorithm which lacks a saltunsalted_test_hashrI   c                 C   s.   t |tr
|d}d| }tt| S )NrO   s   boblious)rP   r
   rQ   r   rR   rS   rT   r#   r)   datar   r   r   r*     s   

zUnsaltedHash._calc_checksumN)
r+   r,   r-   r   r.   r;   LOWER_HEX_CHARSr1   r2   r*   r   r   r   r   r'    s    r'  c                   @   sX   e Zd ZdZdZdZdZdZdZe	j
 ZZeedZedd	 Zd
d Zdd ZdS )
SaltedHashztest algorithm with a saltsalted_test_hashr|   r   rl   rI   z^@salt[0-9a-f]{42,44}$c                 C   sF   |  |stj| t|tr|d}| |dd |dd  dS )Nr_   r   i)r}   ra   )r>   r;   excInvalidHashErrorrP   rb   rc   rM   r   r   r   rd   0  s
   


zSaltedHash.from_stringc                 C   s   t d| j| jf }t|S )Nz	@salt%s%s)r   r}   ra   r	   r   r   r   r   	to_string8  s   zSaltedHash.to_stringc                 C   sB   t |tr
|d}| jd| | jd }tt| S )NrO   r_   )rP   r
   rQ   r}   r   rR   rS   rT   r)  r   r   r   r*   <  s   

zSaltedHash._calc_checksumN)r+   r,   r-   r   r.   r   r   r   r2   r;   r+  r   r1   rg   rh   r   ri   rX   rd   r0  r*   r   r   r   r   r,  $  s    

r,  u   Ιωαννηςc                   @   $   e Zd ZeZdedfgZdd ZdS )UnsaltedHashTest)r  (61cfd32684c47de231f1f982c214e884133762c0(96b329d120b97ff81ada770042e44ba87343ad2bc                 C   s&   | j ttdd | j ttjdd d S )Nxr|   r   r   )r@   rA   r'  rC   rG   r   r   r   test_bad_kwdsS  s   zUnsaltedHashTest.test_bad_kwdsN)r+   r,   r-   r'  handler
UPASS_TEMPknown_correct_hashesr6  r   r   r   r   r2  K      r2  c                   @   r1  )SaltedHashTest)r  z/@salt77d71f8fe74f314dac946766c1ac4a2a58365482c0z1@salt9f978a9bfe360d069b0c13f2afecd570447407fa7e48c                 C   s4   t ddj}| jtt |d d | jtt |dd d S )NTr   r   rp   )r,  rv   r@   rA   rF   )r#   stubr   r   r   r6  _  s   zSaltedHashTest.test_bad_kwdsN)r+   r,   r-   r,  r7  r8  r9  r6  r   r   r   r   r;  W  r:  r;  ))r   
__future__r   rg   rR   loggingr   r   passlib.hashr   r   passlib.excr   r   passlib.utils.compatr   r	   r
   passlib.utils.handlersutilshandlersr;   passlib.tests.utilsr   r   r   r+   logr   r   objectr   r  r<   r'  r   rf   r,  r8  r2  r;  r   r   r   r   <module>   s6        I %