
    Xj@                        d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
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 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 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+ d dl,m-Z-m.Z. d dl/m0Z0  e            Z1 e            Z2 ee3          Z4 G d de          Z5e16                    de7           e)j8        d           ee'          fde	de5dedefd                        Z9e16                    de.e
j:                   e)j8        d           ee'          fde	d e-dedefd!                        Z;e16                    d"e7           ee'           ee          fded#e+defd$            Z<e1=                    d%e.           ee          fd#e+defd&            Z>e16                    d'           ed(           ee          fd)e?d(z  d#e+defd*            Z@d(S )+    )	timedelta)Any)	APIRouterDependsHeaderHTTPExceptionRequeststatus)	BaseModel)Session)get_current_user)settings)get_translator)is_account_lockedrecord_failed_loginreset_failed_attempts)
get_logger)create_access_tokendecode_access_tokenrevoke_tokenverify_password)user)	user_role)get_db_without_tenant)limiter)User)
UserCreateUserResponse)RBACBootstrapServicec                   B    e Zd ZU dZedz  ed<   dZedz  ed<   eed<   dS )LoginRequestNusernameemailpassword)__name__
__module____qualname__r"   str__annotations__r#        >/lsinfo/ai/hellotax_ai/base_platform/app/api/v1/access/auth.pyr!   r!       sA         HcDjE3:MMMMMr+   r!   z/login)response_modelz5/minuterequest
login_datadbreturnc           	         |j         st          t          j        d          	 t	          |j                   rt          t          j        d          n;# t          $ r.}t          t          j        t          |                    d d }~ww xY w|	                    t                                        t          j         |j         k                                              }|st          t          j        dddi          t          |j        |j                  s	 t#          |j                    n;# t          $ r.}t          t          j        t          |                    d d }~ww xY wt$                              |j        |j                                       d	           t          t          j        dddi          |j        st          t          j        d
          t1          j        ||           t5          j        ||j                  }d |D             }t9          |j                    t;          t<          j                  }tA          t          |j                  |j         |j!        |j"        |d|          }t$                              |j        |j                   #                    d           |d|j        |j         |j$        |j!        |j"        |ddS )NzEmail is requiredstatus_codedetailzMAccount locked due to too many failed login attempts. Please try again later.zIncorrect email or passwordzWWW-AuthenticateBearer)r4   r5   headers)user_idr#   z Login failed: incorrect passwordz?Email not verified. Please verify your email before logging in.r8   c                     g | ]	}|j         
S r*   code.0roles     r,   
<listcomp>zlogin.<locals>.<listcomp>P       333$)333r+   minutessubr#   	tenant_idr?   
role_codesdataexpires_deltazUser logged in successfullybearer)idr#   namerF   r?   roles)access_token
token_typer   )%r#   r   r
   HTTP_422_UNPROCESSABLE_ENTITYr   HTTP_429_TOO_MANY_REQUESTSRuntimeErrorHTTP_503_SERVICE_UNAVAILABLEr(   queryr   filterfirstHTTP_401_UNAUTHORIZEDr   r$   hashed_passwordr   loggerbindrL   warningis_verifiedHTTP_403_FORBIDDENr   sync_user_role_bindingcrud_user_roleget_user_rolesr   r   r   ACCESS_TOKEN_EXPIRE_MINUTESr   rF   r?   inforM   )	r.   r/   r0   er   
user_rolesrG   access_token_expiresrO   s	            r,   loginrg   &   s   
  
<EX
 
 
 	
fZ-.. 	"=f   	
  f f f(KTWXYTZTZ[[[aeef88D>>  z/?!?@@FFHHD 
40'2
 
 
 	

 :.0DEE 

	j
 01111 	j 	j 	jF,OX[\]X^X^___eii	jDG:+;<<DDEghhh40'2
 
 
 	

  
1T
 
 
 	
 /D999.r47CCCJ33
333J**+++$X-QRRR&tw<<ZI$
 
 +	 	 	L KKtzK22778UVVV$'ZII
 
  s/   /A 
B)BBD1 1
E);)E$$E)z	/register)r-   r4   z3/houruser_inc                    |                     t                                        t          j        |j        k                                              }|rt          t          j        d          t          j	        ||          }|S )NzEmail already registeredr3   )r0   obj_in)
rU   r   rV   r#   rW   r   r
   HTTP_400_BAD_REQUEST	crud_usercreate)r.   rh   r0   r   s       r,   registerrn   l   sz    
 88D>>  w}!<==CCEED 
3<V
 
 
 	
 r'222DKr+   z/refreshcurrent_userc                     t          j        | |j                  }d |D             }t          t          j                  }t          t          |j                  |j        |j	        |j
        |d|          }|ddS )Nr9   c                     g | ]	}|j         
S r*   r;   r=   s     r,   r@   z!refresh_token.<locals>.<listcomp>   rA   r+   rB   rD   rH   rK   )rO   rP   )r`   ra   rL   r   r   rb   r   r(   r#   rF   r?   )r0   ro   re   rG   rf   rO   s         r,   refresh_tokenrr   z   s      .r<?KKKJ33
333J$X-QRRR&|''!'%/ %$
 
 +	 	 	L )AAAr+   z/mec                     | S )Nr*   )ro   s    r,   get_current_user_infort      s    r+   z/logoutNauthorizationc                 (   | r	 |                                  \  }}|                                dk    r+t          |          }|rd|v rt          ||d                    n1# t          $ r$}t
                              d           Y d }~nd }~ww xY wddiS )NrK   expz$Failed to revoke token during logoutmessagezSuccessfully logged out)splitlowerr   r   	ExceptionrZ   r\   )ru   ro   schemetokenpayloadrd   s         r,   logoutr      s      C	C)//11MFE||~~))-e44 8u// 777 	C 	C 	CNNABBBBBBBB	C011s   AA 
B)BB)Adatetimer   typingr   fastapir   r   r   r   r	   r
   pydanticr   sqlalchemy.ormr   app.api.depsr   
app.configr   app.core.i18nr   app.core.login_securityr   r   r   common_loggingr   app.core.securityr   r   r   r   app.crud.userr   rl   app.crud.user_roler   r`   app.db.sessionr   app.middleware.rate_limitr   app.models.userr   app.schemas.userr   r   *app.services.access.rbac_bootstrap_servicer   router
translatorr%   rZ   r!   postdictlimitrg   HTTP_201_CREATEDrn   rr   getrt   r(   r   r*   r+   r,   <module>r      s/               N N N N N N N N N N N N N N N N       " " " " " " ) ) ) ) ) )       ( ( ( ( ( ( a a a a a a a a a a % % % % % %            , + + + + + : : : : : : 0 0 0 0 0 0 - - - - - -             5 5 5 5 5 5 5 5 K K K K K K	^
	H		    9    Xd++z>EgF[>\>\A AA".A4;AA A A  ,+AH [6CZ[[x9@AV9W9W	 		)	/6		 	 	  \[	 Z--'/00wwO_G`G`B BB@DBB B B .-B& E,///6w7G/H/H   S    0/ Y &t77K[C\C\2 2:2<@22 2 2 2 2 2r+   