o
    "4g4                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZ dZd!d	ed
efddZd"ded
efddZd
efddZdeded
efddZded
efddZded
efddZdeded
efddZG dd  d ZdS )#    N)cache)context)app_settings)Authenticator)decryptencryptzmfa.totp.secret   lengthreturnc                 C   s   t | }t|dS )Nzutf-8)secretstoken_bytesbase64	b32encodedecode)r	   random_bytes r   g/var/www/html/authentication-server/venv/lib/python3.10/site-packages/allauth/mfa/totp/internal/auth.pygenerate_totp_secret   s   
r   F
regeneratec                 C   s0   d }| st jjt}|st  }t jjt< |S N)r   requestsessiongetSECRET_SESSION_KEYr   )r   secretr   r   r   get_totp_secret   s   r   c                  C   s   t t } | tj S r   )inttimer   TOTP_PERIOD)current_timer   r   r   hotp_counter_from_time!   s   
r    r   counterc                 C   s   t d|}tj| ddd}t||tj	 }|d d@ }t
|||d  }|d d	@ |d< t d
|d }|dtj ; }|S )Nz>QasciiT)casefold      r      z>I
   )structpackr   	b32decodeencodehmacnewhashlibsha1digest	bytearrayunpackr   TOTP_DIGITS)r   r!   counter_bytes
secret_enchmac_resultoffsettruncated_hashvaluer   r   r   
hotp_value&   s   r;   r:   c                 C   s   | dt j S )N0)r   r4   )r:   r   r   r   format_hotp_value8   s   r=   codec                 C   s   t | otj| kS r   )boolr   TOTP_INSECURE_BYPASS_CODE)r>   r   r   r   _is_insecure_bypass<   s   rA   c                 C   s$   t |rdS t| t }|t|kS )NT)rA   r;   r    r=   )r   r>   r:   r   r   r   validate_totp_code@   s   rB   c                   @   s|   e Zd ZdeddfddZededd fddZd	edefd
dZ	d	edefddZ
d	edefddZd	eddfddZdS )TOTPinstancer
   Nc                 C   s
   || _ d S r   )rD   )selfrD   r   r   r   __init__H   s   
zTOTP.__init__r   c                 C   s*   t |t jjdt|id}|  | |S )Nr   )usertypedata)r   TyperC   r   save)clsrG   r   rD   r   r   r   activateK   s
   zTOTP.activater>   c                 C   sF   t |rdS | |rdS t| jjd }t||}|r!| | |S )NTFr   )rA   _is_code_usedr   rD   rI   rB   _mark_code_used)rE   r>   r   validr   r   r   validate_codeS   s   


zTOTP.validate_codec                 C   s   d| j j d| S )Nzallauth.mfa.totp.used?user=z&code=)rD   user_idrE   r>   r   r   r   _get_used_cache_key_      zTOTP._get_used_cache_keyc                 C   s   t | |dkS )Ny)r   r   rT   rS   r   r   r   rN   b   rU   zTOTP._is_code_usedc                 C   s   t j| |dtjd d S )NrV   )timeout)r   setrT   r   r   rS   r   r   r   rO   e   s   zTOTP._mark_code_used)__name__
__module____qualname__r   rF   classmethodstrrM   r?   rQ   rT   rN   rO   r   r   r   r   rC   G   s    rC   )r   )F)r   r/   r-   r   r)   r   django.core.cacher   allauth.corer   allauth.mfar   allauth.mfa.modelsr   allauth.mfa.utilsr   r   r   r   r]   r   r?   r   r    r;   r=   rA   rB   rC   r   r   r   r   <module>   s(    	