
    9j                     |   d Z ddlmZ ddlmZmZmZmZ ddlm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZmZmZmZmZ dd	lmZmZmZ dd
lmZ ddlmZmZm Z m!Z!  eddg      Z"e"jG                  de!d       ee      fdedefd       Z$e"jG                  de       ee      fde defd       Z%e"jG                  de       ee      fde&defd       Z'e"jQ                  de!      defd       Z)e"jG                  d       ee      fdedefd       Z*e"jG                  d        ee      fd!e&dedefd"       Z+y#)$zAuthentication API routes.    )	timedelta)	APIRouterDependsHTTPExceptionstatus)select)AsyncSession)RequireViewerget_current_user)get_db)create_access_tokencreate_refresh_tokendecode_tokenget_password_hashverify_password)build_provisioning_urigenerate_totp_secretverify_totp)User)Token
UserCreate	UserLoginUserResponsez/authAuthentication)prefixtagsz	/register   )response_modelstatus_codedatadbc                   K   |j                  t        t              j                  t        j                  | j                  k(               d {   }|j                         rt        dd      t        | j                  t        | j                        | j                        }|j                  |       |j                          d {    |S 7 7 w)N  zEmail already registeredr   detail)emailpassword_hashrole)executer   r   wherer&   scalar_one_or_noner   r   passwordr(   addflush)r    r!   existingusers       =C:\xampp\htdocs\tradingbinance\backend\app\api\routes\auth.pyregisterr2      s     ZZt 2 24::3K LMMH""$4NOOjj'6YYD
 FF4L
((*K N s%   ACCA:C	C
CCz/login)r   c                 <  K   |j                  t        t              j                  t        j                  | j                  k(               d {   }|j                         }|r t        | j                  |j                        st        dd      |j                  st        dd      t        t        t        |j                        |j                  j                         t#        t        |j                        |j                  j                               S 7 ˭w)N  zInvalid credentialsr$   i  zAccount disabledaccess_tokenrefresh_token)r)   r   r   r*   r&   r+   r   r,   r'   r   	is_activer   r   stridr(   valuer   )r    r!   resultr0   s       r1   loginr=   #   s     ::fTl00tzz1IJKKF$$&Dt}}d6H6HI4IJJ>>4FGG(TWWtyyG*3tww<I  Ls   ADDCDz/refreshr7   c                 ,  K   	 t        |       }|j                  d      dk7  rt        dd      |d   }|d   }|j                  t        t              j                  t        j                  |k(               d {   }|j                         }|r|j                  st        dd	      t        t        t        |j                        |      t        t        |j                        |      
      S # t        t        f$ r t        dd      w xY w7 w)Ntyperefreshr4   zInvalid tokenr$   subr(   zInvalid refresh tokenzUser not foundr5   )r   getr   
ValueErrorKeyErrorr)   r   r   r*   r:   r+   r8   r   r   r9   r   )r7   r!   payloaduser_idr(   r<   r0   s          r1   r7   r7   2   s     M}-;;v)+CHH%.v ::fTl00G1CDEEF$$&Dt~~4DEE(TWWt<*3tww<>  ! M4KLLM Fs)   D6C2 AD;D<A6D2DDz/mer0   c                    K   | S w)N )r0   s    r1   get_merI   H   s     Ks   z
/2fa/setupc                    K   | j                   s't               | _         |j                          d {    t        | j                   | j                  d      | j
                  dS 7 3w)NTradingBinance)secretaccount_nameissuer)provisioning_urienabled)totp_secretr   r.   r   r&   totp_enabled)r0   r!   s     r1   	setup_2farS   M   s`     /1hhj 3###

 $$  	s   /A'A%4A'z/2fa/enablecodec                    K   |j                   st        dd      t        |j                   |       st        dd      d|_        |j	                          d {    ddiS 7 w)Nr#   z2FA setup has not been startedr$   zInvalid 2FA codeTrP   )rQ   r   r   rR   r.   )rT   r0   r!   s      r1   
enable_2farV   ]   sb     4TUUt''.4FGGD
((*t s   AA$A"	A$N),__doc__datetimer   fastapir   r   r   r   
sqlalchemyr   sqlalchemy.ext.asyncior	   app.api.depsr
   r   app.core.databaser   app.core.securityr   r   r   r   r   app.core.totpr   r   r   
app.modelsr   app.schemasr   r   r   r   routerpostr2   r=   r9   r7   rB   rI   rS   rV   rH       r1   <module>re      s{      = =  / 8 $ y y S S  B B	')9(:	; [3G8?    H Xe,4;FO i \  - Z.?Fv s   /* E,/}  0 \<CFO - \   ]HOPV 	3 	m 	 	 	rd   