U
    >i
                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZmZ d dlmZ d dlmZ d d	lmZ eG d
d dZeedddZeee dddZee edddZeeeddddZeeedddZdS )    N)	dataclass)List)AbstractBaseUser)BadSignatureSigner)HttpRequestHttpResponse)salted_hmac)app_settings)Authenticatorc                   @   s   e Zd ZU eed< eed< dS )IssuedTrustfingerprintatN)__name__
__module____qualname__str__annotations__int r   r   D/tmp/pip-unpacked-wheel-upujnpc2/allauth/mfa/internal/flows/trust.pyr      s   
r   )userreturnc                 C   s   d}g }| t| j | | j tjj| jddD ]F}| t|j | t|j |j	
d}|dk	r:| t| q:t|d|dd S )	z|
    If the user changes anything about his security setup, we want to invalidate
    any trust that was issued before.
    zallauth.mfa.trust)Zuser_idpkseedN|sha256)	algorithm)appendr   r   passwordr   ZobjectsfilterZorder_bytypedatagetr	   join	hexdigest)r   ZsaltpartsZauthenticatorr   r   r   r   create_config_fingerprint   s    r'   )requestr   c                    st   | j tj}|sg S t }z||}W n tk
rB   g  Y S X dd |D }t  tt	 fdd|}|S )Nc                 S   s    g | ]}t |d  |d dqS )r      r   r   )r   ).0entryr   r   r   
<listcomp>/   s     z'decode_trust_cookie.<locals>.<listcomp>c                    s   | j tj   kS )N)r   r
   TRUST_COOKIE_AGEtotal_seconds)tnowr   r   <lambda>3       z%decode_trust_cookie.<locals>.<lambda>)
ZCOOKIESr#   r
   TRUST_COOKIE_NAMEr   Zunsign_objectr   timelistr    )r(   valuesignerr"   trustsr   r1   r   decode_trust_cookie&   s"    

 r;   )r:   r   c                 C   s   t  }|dd | D S )Nc                 S   s   g | ]}|j |jfqS r   r*   )r+   itr   r   r   r-   ;   s     z'encode_trust_cookie.<locals>.<listcomp>)r   Zsign_object)r:   r9   r   r   r   encode_trust_cookie9   s    r=   )r(   r   responser   c              
   C   sZ   t |}t| }|t|tt d |jtjt	|tj
tjtjtjtjtjd d S )Nr*   )Zmax_agepathdomainsecurehttponlysamesite)r'   r;   r   r   r   r6   
set_cookier
   r5   r=   r.   ZTRUST_COOKIE_PATHZTRUST_COOKIE_DOMAINZTRUST_COOKIE_SECUREZTRUST_COOKIE_HTTPONLYZTRUST_COOKIE_SAMESITE)r(   r   r>   r   r:   r   r   r   trust_browser>   s    rE   )r(   r   r   c                    s0   t js
dS t| }t| t fdd|D S )NFc                    s   g | ]}|j  kqS r   r   )r+   r0   rF   r   r   r-   U   s     z&is_trusted_browser.<locals>.<listcomp>)r
   Z_TRUST_STAGE_ENABLEDr;   r'   any)r(   r   r:   r   rF   r   is_trusted_browserP   s
    rH   )r6   Zdataclassesr   typingr   Zdjango.contrib.auth.modelsr   Zdjango.core.signingr   r   Zdjango.httpr   r   Zdjango.utils.cryptor	   Zallauth.mfar
   Zallauth.mfa.modelsr   r   r   r'   r;   r=   rE   boolrH   r   r   r   r   <module>   s&     