
    f                     |    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      Zy)	    N)sha1)ListOptional)app_settings)Authenticator)decryptencryptc                       e Zd ZdeddfdZedd       Zedefd       Zde	e
e      fdZde
e   fdZd	edefd
Zd	eddfdZde
e   fdZdede	e   fdZdedefdZy)RecoveryCodesinstancereturnNc                     || _         y N)r   )selfr   s     c/var/www/cs2snipe.com/venv/lib/python3.12/site-packages/allauth/mfa/recovery_codes/internal/auth.py__init__zRecoveryCodes.__init__   s	         c                 T   t         j                  j                  |t         j                  j                        j                         }|r | |      S t        |t         j                  j                  t        | j                               dd      }|j                           | |      S )N)usertyper   )seed	used_mask)r   r   data)	r   objectsfilterTypeRECOVERY_CODESfirstr	   generate_seedsave)clsr   r   s      r   activatezRecoveryCodes.activate   s     ((//M..== 0 

%' 	 x=  ##22 1 1 34
 	8}r   c                 t    t        j                  t        j                  d            j	                  d      }|S )N   ascii)binasciihexlifyosurandomdecode)r   keys     r   r   zRecoveryCodes.generate_seed#   s*    rzz"~.55g>
r   c                     | j                   j                  j                  d      }||D cg c]  }t        |       c}S y c c}w )Nmigrated_codes)r   r   getr   )r   codescodes      r   _get_migrated_codesz!RecoveryCodes._get_migrated_codes(   s@    ""&&'78.34dGDM44 5s   Ac                    | j                         }||S g }t        | j                  j                  d         }t	        j
                  |j                  d      d t              }t        t        j                        D ]j  }|j                  |ddj                  d             t        j                  d|j                         d d       d	   }|d
z  }|d}|j                  |       l |S )Nr   r%   )r+   msg	digestmod3,zutf-8z>I   r   i 08)r1   r   r   r   hmacnewencoder   ranger   RECOVERY_CODE_COUNTupdatestructunpackdigestappend)r   r-   retr   hivalue	fmt_values           r   generate_codeszRecoveryCodes.generate_codes.   s    113%!!t}}))&12HHW-44H|778 	"AHH1Qi''01MM$
2A7:EUNE *IJJy!	" 
r   rE   c                 V    | j                   j                  d   }t        |d|z  z        S Nr      )r   r   boolr   rE   r   s      r   _is_code_usedzRecoveryCodes._is_code_used>   s*    MM&&{3	Ia())r   c                     | j                   j                  d   }|d|z  z  }|| j                   j                  d<   | j                   j                          y rJ   )r   r   r    rM   s      r   _mark_code_usedzRecoveryCodes._mark_code_usedB   sH    MM&&{3	Q!V	*3;'r   c                     | j                         }||S g }t        | j                               D ](  \  }}| j                  |      r|j	                  |       * |S r   )r1   	enumeraterH   rN   rB   )r   r-   rC   rE   r0   s        r   get_unused_codeszRecoveryCodes.get_unused_codesH   sf    113%!! !4!4!67 	GAt!!!$JJt	 
r   r0   c                 J   | j                         }|y 	 |j                  |      }| j                  j                  d   }t	        |t
              sJ |j                  |       || j                  j                  d<   | j                  j                          y# t        $ r Y yw xY w)Nr-   TF)	r1   indexr   r   
isinstancelistpopr    
ValueError)r   r0   r-   idxs       r   _validate_migrated_codez%RecoveryCodes._validate_migrated_codeT   s    113!
	 &&t,C "]]//0@ANnd333s#3ADMM/0MM   		s   B 	B"!B"c                     | j                  |      }||S t        | j                               D ]/  \  }}| j                  |      r||k(  s| j	                  |        y y)NTF)r[   rR   rH   rN   rP   )r   r0   rC   rE   cs        r   validate_codezRecoveryCodes.validate_coded   sk    **40?Jd1134 	DAq!!!$qy$$Q'	 r   )r   r   )__name__
__module____qualname__r   r   classmethodr"   strr   r   r   r1   rH   intrL   rN   rP   rS   r[   r^    r   r   r   r      s    ! !4 !  " s  Xd3i%8 S	  *s *t *  
$s) 
C HTN  # $ r   r   )r&   r9   r(   r?   hashlibr   typingr   r   allauth.mfar   allauth.mfa.modelsr   allauth.mfa.utilsr   r	   r   re   r   r   <module>rk      s,      	   ! $ , .b br   