
    @Li                     X    d dl Z d dlmZ d dlmZmZ d dlmZ dZdZ	d Z
dedefd	Zd
 Zy)    N)transaction)make_passwordcheck_password)RecoveryCode
   c                     g }t        t              D ]g  }t        j                  t        dz        j                         }|j                  |       t        j                  j                  | t        |             i |S )zg
    Generate and store recovery codes.
    Returns the plain-text codes (shown once to the user).
       )user	code_hash)rangeRECOVERY_CODE_COUNTsecrets	token_hexRECOVERY_CODE_LENGTHupperappendr   objectscreater   )r
   codes_codes       J/var/www/html/dp2/backend_v2.1/server/apps/core/services/recovery_codes.pygenerate_recovery_codesr      so    
 E&'  !5!:;AACT###D) 	$ 	
	 ( L    r   returnc                     | j                   j                  d      }|D ]4  }t        ||j                        sd|_        |j                  dg        y y)z-
    Verify and consume a recovery code.
    F)usedTr   )update_fields)recovery_codesfilterr   r   r   save)r
   r   unused_codesrecoverys       r   verify_recovery_coder$      sV     &&--5-9L $ 2 23 HMMMM1	 ! r   c                     t        j                         5  t        j                  j	                  |       j                          t        |       cddd       S # 1 sw Y   yxY w)z:
    Delete old recovery codes and generate new ones.
    r
   N)r   atomicr   r   r    deleter   r&   s    r   regenerate_recovery_codesr)   -   sD     
			###.557&t, 
		s   9AA!)r   	django.dbr   django.contrib.auth.hashersr   r   apps.core.modelsr   r   r   r   strboolr$   r)    r   r   <module>r0      s<     ! E )   &S T -r   