o
    Lf                     @   sf   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mZ G dd dZdS )    N)sha1)app_settings)Authenticator)decryptencryptc                   @   sd   e Zd Zdd Zedd Zedd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd ZdS )RecoveryCodesc                 C   s
   || _ d S N)instance)selfr	    r   [/var/www/html/humari/django-venv/lib/python3.10/site-packages/allauth/mfa/recovery_codes.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_codesc                 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 rA   )r	   r   r   rD   r   r   r   _mark_code_used@   s   zRecoveryCodes._mark_code_usedc                 C   sH   |   }|d ur
|S g }t|  D ]\}}| |rq|| q|S r   )r*   	enumerater@   rE   r:   )r
   r$   r;   r=   r&   r   r   r   get_unused_codesF   s   
zRecoveryCodes.get_unused_codesc                 C   sh   |   }|d u r
d S z||}W n
 ty   Y dS w | jjd }|| || jjd< | j  dS )NFr$   T)r*   index
ValueErrorr	   r   popr   )r
   r&   r$   idxr   r   r   _validate_migrated_codeR   s   

z%RecoveryCodes._validate_migrated_codec                 C   sT   |  |}|d ur|S t|  D ]\}}| |rq||kr'| |  dS qdS )NTF)rM   rG   r@   rE   rF   )r
   r&   r;   r=   cr   r   r   validate_codea   s   


zRecoveryCodes.validate_codeN)__name__
__module____qualname__r   classmethodr   r   r*   r@   rE   rF   rH   rM   rO   r   r   r   r   r      s    

r   )r   r1   r    r7   hashlibr   allauth.mfar   allauth.mfa.modelsr   allauth.mfa.utilsr   r   r   r   r   r   r   <module>   s    