
    )Jf                         d dl Z d dlZ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Zd dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d
ZddZddZd Zd Zd Zd Zd Zd Z  G d d          Z!dS )    N)BytesIO)quote)	urlencode)SvgPathImage)context)app_settings)Authenticator)decryptencryptzmfa.totp.secret   c                 x    t          j        |           }t          j        |                              d          S )Nzutf-8)secretstoken_bytesbase64	b32encodedecode)lengthrandom_bytess     S/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/allauth/mfa/totp.pygenerate_totp_secretr      s1    &v..LL))00999    Fc                     d }| s)t           j        j                            t                    }|s't                      x}t           j        j        t          <   |S N)r   requestsessiongetSECRET_SESSION_KEYr   )
regeneratesecrets     r   get_totp_secretr       sR    F A(,,-?@@ V?S?U?UU();<Mr   c                  `    t          t          j                              } | t          j        z  S r   )inttimer   TOTP_PERIOD)current_times    r   hotp_counter_from_timer&   &   s#    ty{{##L<333r   c                    t          j        d|          }t          j        |                     d          d          }t          j        ||t          j                  	                                }|d         dz  }t          |||dz                      }|d         d	z  |d<   t          j        d
|          d         }|dt          j        z  z  }|S )Nz>QasciiT)casefold      r      z>I
   )structpackr   	b32decodeencodehmacnewhashlibsha1digest	bytearrayunpackr   TOTP_DIGITS)r   countercounter_bytes
secret_enchmac_resultoffsettruncated_hashvalues           r   
hotp_valuerB   +   s    Kg..M!&--"8"84HHHJ(:}glCCJJLLK_t#F{6FQJ+>?@@N&q)D0N1M$//2E	R)))ELr   c                     ||d}t           j        dk    rt           j        |d<   t           j        dk    rt           j        |d<   dt          |            dt	          |           S )N)r   issuer   digits   periodzotpauth://totp/?)r   r:   r$   r   r   )labelrD   r   paramss       r   build_totp_urlrL   =   sr     	 F 1$$'3x2%%'3x?U5\\??If,=,=???r   c                     t          j        | t                    }t                      }|                    |           |                                                    d          S )N)image_factoryutf8)qrcodemaker   r   savegetvaluer   )urlimgbufs      r   build_totp_svgrW   K   sJ    
+c
6
6
6C
))CHHSMMM<<>>  (((r   c                 $    | dt           j         S )N0)r   r:   )rA   s    r   format_hotp_valuerZ   R   s    1l.1111r   c                 `    t          | t                                }|t          |          k    S r   )rB   r&   rZ   )r   coderA   s      r   validate_totp_coder]   V   s,    v57788E$U++++r   c                   6    e Zd Zd Zed             Zd Zd ZdS )TOTPc                     || _         d S r   )instance)selfra   s     r   __init__zTOTP.__init__\   s     r   c                     t          |t           j        j        dt          |          i          }|                                  | |          S )Nr   )usertypedata)r	   Typer_   r   rR   )clsre   r   ra   s       r   activatezTOTP.activate_   sK     M.38WV__:U
 
 
 	s8}}r   c                 8    | j                                          d S r   )ra   delete)rb   s    r   
deactivatezTOTP.deactivateg   s    r   c                 `    t          | j        j        d                   }t          ||          S )Nr   )r
   ra   rg   r]   )rb   r\   r   s      r   validate_codezTOTP.validate_codej   s)    +H566!&$///r   N)__name__
__module____qualname__rc   classmethodrj   rm   ro    r   r   r_   r_   [   s\        ! ! !   [  0 0 0 0 0r   r_   )r   )F)"r   r5   r3   r   r/   r#   ior   urllib.parser   django.utils.httpr   rP   qrcode.image.svgr   allauth.corer   allauth.mfar   allauth.mfa.modelsr	   allauth.mfa.utilsr
   r   r   r   r    r&   rB   rL   rW   rZ   r]   r_   rt   r   r   <module>r}      s                     ' ' ' ' ' '  ) ) ) ) ) )             $ $ $ $ $ $ , , , , , , . . . . . . . . ' : : : :
   4 4 4
  $@ @ @) ) )2 2 2, , ,
0 0 0 0 0 0 0 0 0 0r   