o
    &zhd                     @   sf   d dl Z d dlZd dlmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlmZmZ G dd dZdS )	    N)sha1)ListOptional)app_settings)Authenticator)decryptencryptc                   @   s   e Zd ZdeddfddZedddZedefdd	Zde	e
e  fd
dZde
e fddZdedefddZdeddfddZde
e fddZdede	e fddZdedefddZdS )RecoveryCodesinstancereturnNc                 C   s
   || _ d S N)r
   )selfr
    r   c/var/www/html/kangema/venv/lib/python3.10/site-packages/allauth/mfa/recovery_codes/internal/auth.py__init__   s   
zRecoveryCodes.__init__c                 C   sT   t jj|t jjd }|r| |S t |t jjt|  ddd}|  | |S )N)usertyper   )seed	used_mask)r   r   data)	r   objectsfilterTypeRECOVERY_CODESfirstr   generate_seedsave)clsr   r
   r   r   r   activate   s    
zRecoveryCodes.activatec                 C   s   t d}|S )N(   )secrets	token_hex)r   keyr   r   r   r   !   s   
zRecoveryCodes.generate_seedc                 C   s(   | j jd}|d urdd |D S d S )Nmigrated_codesc                 S   s   g | ]}t |qS r   )r   ).0coder   r   r   
<listcomp>)   s    z5RecoveryCodes._get_migrated_codes.<locals>.<listcomp>)r
   r   get)r   codesr   r   r   _get_migrated_codes&   s   z!RecoveryCodes._get_migrated_codesc           	      C   s   |   }|d ur
|S g }t| jjd }tj|dd td}tt	j
d |j}tt	jD ]0}||ddd tj| d | dd	d
}|dt	j
 ; }t|t	j
}|| q-|S )Nr   ascii)r"   msg	digestmod   3,zutf-8bigF)	byteordersigned
   )r)   r   r
   r   hmacnewencoder   minr   RECOVERY_CODE_DIGITSdigest_sizerangeRECOVERY_CODE_COUNTupdateint
from_bytesdigeststrzfillappend)	r   r#   retr   h
byte_countivalue	fmt_valuer   r   r   generate_codes,   s    zRecoveryCodes.generate_codesrF   c                 C   s   | j jd }t|d|> @ S Nr      )r
   r   boolr   rF   r   r   r   r   _is_code_used?   s   zRecoveryCodes._is_code_usedc                 C   s2   | j jd }|d|> O }|| j jd< | j   d S rJ   )r
   r   r   rM   r   r   r   _mark_code_usedC   s   zRecoveryCodes._mark_code_usedc                 C   sH   |   }|d ur
|S g }t|  D ]\}}| |rq|| q|S r   )r)   	enumeraterI   rN   rB   )r   r#   rC   rF   r%   r   r   r   get_unused_codesI   s   
zRecoveryCodes.get_unused_codesr%   c                 C   sv   |   }|d u r
d S z||}W n
 ty   Y dS w | jjd }t|ts)J || || jjd< | j  dS )NFr#   T)	r)   index
ValueErrorr
   r   
isinstancelistpopr   )r   r%   r#   idxr   r   r   _validate_migrated_codeU   s   

z%RecoveryCodes._validate_migrated_codec                 C   sT   |  |}|d ur|S t|  D ]\}}| |rq||kr'| |  dS qdS )NTF)rX   rP   rI   rN   rO   )r   r%   rC   rF   cr   r   r   validate_codee   s   


zRecoveryCodes.validate_code)r   r	   )__name__
__module____qualname__r   r   classmethodr   r@   r   r   r   r)   rI   r=   rL   rN   rO   rQ   rX   rZ   r   r   r   r   r	      s    r	   )r4   r    hashlibr   typingr   r   allauth.mfar   allauth.mfa.modelsr   allauth.mfa.utilsr   r   r	   r   r   r   r   <module>   s    