o
    &zh:                     @   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 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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)Iterator)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   Y/var/www/html/kangema/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 }ttj tjd D ]}|| V  qd S )N   )inttimer   TOTP_PERIODrangeTOTP_TOLERANCE)current_timecounterir   r   r   yield_hotp_counters_from_time"   s   
r&   r   r$   c                 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   r9   )r?   r   r   r   format_hotp_value;   s   rB   codec                 C   s   t | otj| kS r   )boolr   TOTP_INSECURE_BYPASS_CODE)rC   r   r   r   _is_insecure_bypass?   s   rF   c                 C   s<   t |rdS t }|D ]}t| |}|t|kr dS qdS )NTF)rF   r&   r@   rB   )r   rC   countersr$   r?   r   r   r   validate_totp_codeC   s   
rH   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   )rJ   )selfrJ   r   r   r   __init__O   s   
zTOTP.__init__r   c                 C   s*   t |t jjdt|id}|  | |S )Nr   )usertypedata)r   TyperI   r   save)clsrM   r   rJ   r   r   r   activateR   s
   zTOTP.activaterC   c                 C   sF   t |rdS | |rdS t| jjd }t||}|r!| | |S )NTFr   )rF   _is_code_usedr   rJ   rO   rH   _mark_code_used)rK   rC   r   validr   r   r   validate_codeZ   s   


zTOTP.validate_codec                 C   s   d| j j d| S )Nzallauth.mfa.totp.used?user=z&code=)rJ   user_idrK   rC   r   r   r   _get_used_cache_keyf      zTOTP._get_used_cache_keyc                 C   s   t | |dkS )Ny)r   r   rZ   rY   r   r   r   rT   i   r[   zTOTP._is_code_usedc                 C   s   t j| |dtjd d S )Nr\   )timeout)r   setrZ   r   r    rY   r   r   r   rU   l   s   zTOTP._mark_code_used)__name__
__module____qualname__r   rL   classmethodstrrS   rD   rW   rZ   rT   rU   r   r   r   r   rI   N   s    rI   )r	   )F)r   r4   r2   r   r.   r   typingr   django.core.cacher   allauth.corer   allauth.mfar   allauth.mfa.modelsr   allauth.mfa.utilsr   r   r   r   rc   r   rD   r   r&   r@   rB   rF   rH   rI   r   r   r   r   <module>   s*    	