o
    Lf                     @   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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dZd!ddZdd Zdd Zdd Zdd Z dd Z!dd Z"G dd dZ#dS )"    N)BytesIO)quote)cache)	urlencode)SvgPathImage)context)app_settings)Authenticator)decryptencryptzmfa.totp.secret   c                 C   s   t | }t|dS )Nzutf-8)secretstoken_bytesbase64	b32encodedecode)lengthrandom_bytes r   Q/var/www/html/humari/django-venv/lib/python3.10/site-packages/allauth/mfa/totp.pygenerate_totp_secret   s   
r   Fc                 C   s0   d }| st jjt}|st  }t jjt< |S N)r   requestsessiongetSECRET_SESSION_KEYr   )
regenerate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#   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   countercounter_bytes
secret_enchmac_resultoffsettruncated_hashvaluer   r   r   
hotp_value,   s   r>   c                 C   sJ   ||d}t jdkrt j|d< t jdkrt j|d< dt|  dt| S )N)r   issuer   digits   periodzotpauth://totp/?)r   r6   r!   r   r   )labelr?   r   paramsr   r   r   build_totp_url>   s   



rG   c                 C   s,   t j| td}t }|| | dS )N)image_factoryutf8)qrcodemaker   r   savegetvaluer   )urlimgbufr   r   r   build_totp_svgL   s   
rQ   c                 C   s   | dt j S )N0)r   r6   )r=   r   r   r   format_hotp_valueS   s   rS   c                 C   s   t | t }|t|kS r   )r>   r#   rS   )r   coder=   r   r   r   validate_totp_codeW   s   rU   c                   @   sH   e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )TOTPc                 C   s
   || _ d S r   )instance)selfrW   r   r   r   __init__]   s   
zTOTP.__init__c                 C   s*   t |t jjdt|id}|  | |S )Nr   )usertypedata)r	   TyperV   r   rL   )clsrZ   r   rW   r   r   r   activate`   s
   zTOTP.activatec                 C   s   | j   d S r   )rW   delete)rX   r   r   r   
deactivateh   s   zTOTP.deactivatec                 C   s:   |  |rdS t| jjd }t||}|r| | |S )NFr   )_is_code_usedr
   rW   r\   rU   _mark_code_used)rX   rT   r   validr   r   r   validate_codek   s   


zTOTP.validate_codec                 C   s   d| j j d| S )Nzallauth.mfa.totp.used?user=z&code=)rW   user_idrX   rT   r   r   r   _get_used_cache_keyu      zTOTP._get_used_cache_keyc                 C   s   t | |dkS )Ny)r   r   rh   rg   r   r   r   rb   x   ri   zTOTP._is_code_usedc                 C   s   t j| |dtjd d S )Nrj   )timeout)r   setrh   r   r!   rg   r   r   r   rc   {   s   zTOTP._mark_code_usedN)__name__
__module____qualname__rY   classmethodr_   ra   re   rh   rb   rc   r   r   r   r   rV   \   s    

rV   )r   )F)$r   r1   r/   r   r+   r    ior   urllib.parser   django.core.cacher   django.utils.httpr   rJ   qrcode.image.svgr   allauth.corer   allauth.mfar   allauth.mfa.modelsr	   allauth.mfa.utilsr
   r   r   r   r   r#   r>   rG   rQ   rS   rU   rV   r   r   r   r   <module>   s4    

	