o
    "4g                     @   sv   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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   q/var/www/html/authentication-server/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 tdd}|S )N   ascii)binasciihexlifyosurandomdecode)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 ])}||ddd td| d d d	 }|d
; }|d}|| q$|S )Nr   r    )r&   msg	digestmod3,zutf-8z>I   r   i 08)r-   r   r
   r   hmacnewencoder   ranger   RECOVERY_CODE_COUNTupdatestructunpackdigestappend)r   r'   retr   hivalue	fmt_valuer   r   r   generate_codes.   s   zRecoveryCodes.generate_codesr@   c                 C   s   | j jd }t|d|> @ S Nr      )r
   r   boolr   r@   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 rD   )r
   r   r   rG   r   r   r   _mark_code_usedB   s   zRecoveryCodes._mark_code_usedc                 C   sH   |   }|d ur
|S g }t|  D ]\}}| |rq|| q|S r   )r-   	enumeraterC   rH   r=   )r   r'   r>   r@   r)   r   r   r   get_unused_codesH   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_codeT   s   

z%RecoveryCodes._validate_migrated_codec                 C   sT   |  |}|d ur|S t|  D ]\}}| |rq||kr'| |  dS qdS )NTF)rR   rJ   rC   rH   rI   )r   r)   r>   r@   cr   r   r   validate_coded   s   


zRecoveryCodes.validate_code)r   r	   )__name__
__module____qualname__r   r   classmethodr   strr   r   r   r-   rC   intrF   rH   rI   rK   rR   rT   r   r   r   r   r	      s    r	   )r!   r4   r#   r:   hashlibr   typingr   r   allauth.mfar   allauth.mfa.modelsr   allauth.mfa.utilsr   r   r	   r   r   r   r   <module>   s    