U
    ԒFj"                     @  sJ  d Z ddlmZ ddlZddlZddlZddlmZ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 ddlmZmZmZ dd	lmZmZmZ ed
e Z!ddddZ"ddddZ#ddddZ$ddddZ%e!j&ddgddd Z'e!j&ddgddd  Z(e!j&d!d"gdd#d$ Z)e!j&dd"gdd%d& Z*dS )'uM   
Rotas de autenticação (login) — blueprint separado do monólito app.py.
    )annotationsN)	Blueprintjsonifyrender_templaterequestsessionurl_for)collect_empty_login_fieldsparse_login_jsonvalidate_login_csrf)conectar)AUTH_CREDENTIALS_INVALID_MSGUsuarioAuthRownormalize_funcao)OTP_MSG_GENERICsolicitar_codigo_whatsappvalidar_codigo_whatsapp)hash_passwordpassword_is_bcryptverify_passwordauthstr)returnc                  C  s   t d} | td< | S )N    
login_csrf)secretstoken_urlsafer   token r   '/var/www/html/LojaOnline/auth_routes.py_issue_login_csrf   s    
r!   )usuarioc                 C  s   d }z|  d|f |  }W n tjjk
r } z`t|dd dkrF z|  d|f |  }W n. tjjk
r   |  d|f |  }Y nX W 5 d }~X Y nX |S )Nz
            SELECT usuario, senha, id_cliente, funcao, ativo
            FROM usuarios WHERE usuario = %s LIMIT 1
            errnoi  zRSELECT usuario, senha, id_cliente, funcao FROM usuarios WHERE usuario = %s LIMIT 1zJSELECT usuario, senha, id_cliente FROM usuarios WHERE usuario = %s LIMIT 1)executefetchonemysql	connectorErrorgetattr)cursorr"   rowZcol_errr   r   r    _fetch_user_row    s.     r,   boolc                 C  s4   | d kst | tsdS | d}|d k	o2t|dkS )NFativor   )
isinstancedictgetint)r+   Z	ativo_valr   r   r    _user_is_inactive=   s    
r3   r   )userc                 C  s   | j td< | jtd< t| jtd< tdd  | j}d }d }z,t }|jdd}|	d|f |
 }W 5 |rv|  |r|  X |stddd	|d
S tdd|dS )Nusuario_logado
id_clientefuncaor   T
dictionaryz5SELECT 1 FROM dadosloja WHERE id_cliente = %s LIMIT 1z/dados-lojazComplete os dados da loja)sucessoZredirecionarmensagemr6   zLogin realizado com sucesso)r:   r;   r6   )r"   r   r6   r   r7   popcloser   r*   r$   r%   r   )r4   r6   Zconn2Zcursor2Zdadosloja_exister   r   r    _complete_login_responseD   sB    


r>   z/loginGET)methodsc                   C  s   t ddtddS )uU   Splash e redirecionamento para o formulário em /login/form (token CSRF emitido lá).zsplash.htmli  zauth.login_form)Zdelay_msredirect_url)r   r   r   r   r   r    
login_pagem   s
    rB   z/login/formc                  C  s   t  } td| dS )u+   Página de login com token CSRF na sessão.z
login.html)
csrf_token)r!   r   r   r   r   r    
login_formw   s    rD   z/login/solicitar-codigoPOSTc                  C  s  t jddpi } t| dpd }| dp8| d}|sVtddd	dgd
dfS ttd|sztdddddfS t|t}dt	d}|dr|dr|d |d< t|S |d}|dkrtd|dddfS |dkrtd|dddfS |dkrtd|dddfS t|S )uR   Envia OTP por WhatsApp (instância central). Resposta genérica anti-enumeração.Tsilentr"    rC   ZcsrfFcampos_obrigatoriosu   Informe o usuário.r:   codigoerroZcampos_invalidos  r   csrf_invalidoE   Sessão de segurança expirada. Atualize a página e tente novamente.r:   rK   rL     )r:   r;   ZenviadoZwhatsapp_mascaracodigo_erroZwhatsapp_desconectadouq   WhatsApp do sistema está desconectado. Use login por senha ou peça ao suporte para reconectar no painel uazapi.i  Zwhatsapp_nao_configuradouJ   Envio por WhatsApp não configurado no servidor (UZAPI_URL / UZAPI_TOKEN).Z
rate_limitu2   Aguarde 1 minuto antes de solicitar outro código.i  )
r   get_jsonr   r1   stripr   r   r   r   r   )datar"   rC   resultbodyrR   r   r   r    login_solicitar_codigo~   sp    


	

rX   c            
   
   C  s2  t tjdd} t| j| j| j| jd}|rT| jdkr:dnd}tdd||d	d
fS t	t
d| jsztdddddfS d}d}zz.t }|jdd}t|| j}t|}t|rtdtddfW W >S | jdkr.|dkst| j| jstdtddfW W  S |dk	s tt|W W S |dk	oDt|j| j}|sdtdtddfW W S |dk	srt|jrt|jst| j}|d||jf |  t|W W ZS  tjjk
r
 }	 z0t d|	 t!"  tddddf W Y W S d}	~	X Y nX W 5 |r|  |r,|  X dS )u-   Autenticação por senha ou código WhatsApp.TrF   )metodorK   whatsappu   Preencha usuário e código.u   Preencha usuário e senha.FrI   rJ   rM   r   rN   rO   rP   rQ   Nr8   )r:   rL   i  z1UPDATE usuarios SET senha = %s WHERE usuario = %sz[DB ERROR LOGIN]u?   Não foi possível validar o login no momento. Tente novamente.i  )#r
   r   rS   r	   r"   senharY   rK   r   r   r   r1   rC   r=   r   r*   r,   r   Zfrom_db_rowr3   r   r   AssertionErrorr>   r   r   r   r$   commitr&   r'   r(   print	traceback	print_exc)
payloadZvaziosmsgconnr*   r+   r4   Zsenha_okZ	novo_hashdb_errr   r   r    login   s    



"re   )+__doc__
__future__r   r   r_   mysql.connectorr&   flaskr   r   r   r   r   r   Zauth_validationr	   r
   r   databaser   modelsr   r   r   Zservices.login_otpr   r   r   Zservices.passwordsr   r   r   __name__auth_bpr!   r,   r3   r>   routerB   rD   rX   re   r   r   r   r    <module>   s.    
)
	

D