
    (8i                      \   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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  ee      j.                  j.                  d
z  Z ee        ej2                  e      Zdee   dee   fdZdeddfdZ ed       e	e      fdee   dedefdZy)    N)Path)Optional)load_dotenv)DependsHTTPExceptionRequestHeaderstatus)AsyncSession)get_sqlserver_db)AuthService)Clientez.env)dotenv_pathauthorization_headerreturnc                     | sy | j                         }t        |      dk(  r)|d   j                         dk(  r|d   j                         S y )N   r   bearer   )splitlenlowerstrip)r   partss      /srv/www/app-alerta/core/auth.py_extract_bearer_tokenr      sG     &&(E
5zQ58>>+x7Qx~~    requestc                 L  K   t         j                  d| j                  j                          t	        j
                  dd      j                         }|r#t         j                  dt        |       d       n*t         j                  d       t         j                  d       | j                  j                  d      xs | j                  j                  d	      }|r2t         j                  d
       t         j                  d|dd  d       nt         j                  d       t        |      xs d}|s0t         j                  d       t        t        j                   d      |sGt         j                  d| j                  j                          t        t        j"                  d      ||k7  r\t         j                  d| j                  j                          t         j                  d       t        t        j"                  d      t         j                  d       yw)zQ
    Valida o token fixo da API.
    - Authorization: Bearer <FIX_API_TOKEN>
    u!   Validando autenticação - Path: FIX_API_TOKEN z-Token configurado no ambiente: Sim (tamanho: z caracteres)uX   ❌ Token de API NÃO configurado no ambiente (FIX_API_TOKEN está vazio ou não existe)u6      Configure a variável FIX_API_TOKEN no arquivo .envauthorizationAuthorizationz"Header Authorization presente: Simu   Header Authorization contém: N   z...u,   Header Authorization ausente na requisiçãouL   ERRO: Token de API não configurado. Configure FIX_API_TOKEN no arquivo .envuF   Token de API não configurado. Verifique a configuração do servidor.status_codedetailu4   Token Bearer não fornecido na requisição - Path: uT   Credenciais inválidas ou ausentes. Forneça o header: Authorization: Bearer <token>u"   Token inválido fornecido - Path: u4   Token recebido não corresponde ao token configuradou"   Credenciais inválidas ou ausentesu   ✅ Token validado com sucesso)loggerinfourlpathosgetenvr   debugr   errorheadersgetwarningr   r   r
   HTTP_500_INTERNAL_SERVER_ERRORHTTP_401_UNAUTHORIZED)r   fix_api_tokenauth_headerr   s       r   require_fix_tokenr7      s     KK3GKK4D4D3EFGIIor288:MDSEWDXXdefopMN//%%o6^'//:M:Mo:^K9;5k#26F5GsKLEG";/52Fcd==[
 	

 MgkkN^N^M_`a44i
 	

 ;GKK<L<L;MNOKM447
 	

 KK01s   H"H$r#   dbc                   K   | 0t         j                  d       t        t        j                  d      	 | j                  dd      j                         }	 t        j                  ||       d{   }|S # t        $ r8}t         j                  d|        t        t        j                  d      d}~ww xY w7 J# t        $ r  t        $ r:}t         j                  d	| d
       t        t        j                  d      d}~ww xY ww)u  
    Dependência para obter o cliente autenticado baseado no token do cliente.
    Usa o token retornado no login (token do cliente da tabela dbo.Cliente).
    
    Args:
        Authorization: Header Authorization com Bearer token
        db: Sessão do banco de dados SQL Server
        
    Returns:
        Cliente autenticado
        
    Raises:
        HTTPException: Se token não fornecido ou inválido
    Nu   Token não enviador%   zBearer r!   zErro ao extrair token: u   Formato de token inválido)r8   tokenzErro ao validar token: T)exc_infozErro interno ao validar token)r(   r2   r   r
   r4   replacer   	Exceptionr   get_current_clienter/   r3   )r#   r8   r:   eclientes        r   get_current_userrA   M   s    $ +,44'
 	

%%i4::<

#772UKK  
04544/
 	

 L  
.qc2TB==2
 	

sX   3D A8 B> 1B<2B> 7D8	B93B44B99D<B> >D
5DD

D) r,   loggingpathlibr   typingr   dotenvr   fastapir   r   r   r	   r
   sqlalchemy.ext.asyncior   core.databaser   services.authr   models.alerta_clienter   __file__parentenv_path	getLogger__name__r(   strr   r7   rA    r   r   <module>rR      s    	     C C / * % )>  ''&0  !			8	$ (3- 0202	02f $*$</0-
C=-
-
 -
r   