U
    ԒFj                     @  s  d Z ddlm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m	Z	 ddl
mZ ddlmZ ddlmZ dZd	Zd
d
dddZd
d
d
dddZd
ddddZd
dddZd
d
d
dddZd
ddddZdd
ddd d!Zd'd
ddd"d#d$Zd
d
ddd%d&ZdS )(u.   OTP de login via WhatsApp (5 min, uso único).    )annotationsN)datetime	timedelta)Config)conectar)uazapi   uV   Se o usuário existir e tiver WhatsApp cadastrado, enviaremos um código em instantes.str)telefonereturnc                 C  s   d dd t| pdD }t|dkr>|dr>|dd }t|dk rNd	S |dd }|d
d }t|dkrd| d| S d| d| S )u   Ex.: (11) 9••••-7534 c                 s  s   | ]}|  r|V  qd S Nisdigit.0ch r   ./var/www/html/LojaOnline/services/login_otp.py	<genexpr>   s      z#mascara_whatsapp.<locals>.<genexpr>   55   N
   u   ••••   (u   ) 9••••-u   ) ••••-)joinr	   len
startswith)r
   ddddZlast4r   r   r   mascara_whatsapp   s    r"   )usuariocodigor   c                 C  s<   t jpd }|    d|  }t||tj	 S )Nzotp-dev:)
r   
SECRET_KEYencodestriplowerhmacnewhashlibsha256	hexdigest)r#   r$   Zsecretmsgr   r   r   _hash_codigo#   s    r0   zdict | None)r#   r   c              
   C  s   t |pd  }|sd S z| d|f W nB tk
rp } z$t|dd dkrR | d|f W 5 d }~X Y nX |  }|rt|tsd S |	dd  |	dd |	d	d
 |S )Nr   z
            SELECT usuario, whatsapp, id_cliente, funcao, ativo
            FROM usuarios WHERE LOWER(usuario) = %s LIMIT 1
            errnoi  zYSELECT usuario, id_cliente, funcao, ativo FROM usuarios WHERE LOWER(usuario) = %s LIMIT 1whatsappativo   funcaogerente)
r	   r(   r)   execute	Exceptiongetattrfetchone
isinstancedict
setdefault)curr#   loginerowr   r   r   _fetch_usuario_whatsapp)   s,    rB   )r   c                   C  s   t dd dS )Ni i Z06d)secrets	randbelowr   r   r   r   _gerar_codigoE   s    rE   c                 C  s2   |d d |dd   }}d| d| d|  dS )N   u1   🔐 *PcTrim Commerce*

Seu código de acesso:

* u/   *

⏱ Válido por *5 minutos*
👤 Usuário: *u.   *

Não compartilhe este código com ninguém.r   )r#   r$   Zc1c2r   r   r   _formatar_mensagemI   s    rI   bool)telr   c                 C  s(   d dd t| pdD }t|dkS )Nr   c                 s  s   | ]}|  r|V  qd S r   r   r   r   r   r   r   V   s      z#_telefone_valido.<locals>.<genexpr>r   )r   r	   r   )rK   r    r   r   r   _telefone_validoU   s    rL   r<   )session_storer#   r   c                   s   t    t|pd  }| di } fdd||g D }t|dkrRdS |rj |d  dk rjdS |  |||< d	S )
zTrue se pode enviar.r   Zotp_send_timesc                   s   g | ]} | d k r|qS )i  r   )r   tnowr   r   
<listcomp>_   s      z%_check_rate_limit.<locals>.<listcomp>r   F<   T)timer	   r(   r)   r=   getr   append)rM   r#   keybuckettimesr   rO   r   _check_rate_limitZ   s    
rZ   )r#   rM   r   c                 C  s  |dk	r|ni }t | pd  }|s2dddS t||sHddddS tjrTtjs`ddddS t }|	dst
d	|d
d ddddS d}d}zzt }|jd
d}t||}|sdddW W S |	ddk	rt|	ddkrdddW W S t |	dpd }|r,t|s>dddW W lS t }t ttd }	t||}
|d|f |d||
|	f |  |	dpd}tt |	dp||}tj||d|d}|	dst |	dpd }t
d|d
d d|krdnd}dd|dW W S d
t|dW W |S  tk
r } zVt
d|d
d t  |rz|  W n tk
r~   Y nX ddd W Y W S d}~X Y nX W 5 |r|  |r|  X dS )z2Retorna {enviado, whatsapp_mascara, codigo_erro?}.Nr   F)enviadowhatsapp_mascara
rate_limit)r[   r\   codigo_errowhatsapp_nao_configurado	connectedu/   [LOGIN OTP] instância plataforma desconectada:Tflushwhatsapp_desconectado
dictionaryr3   r   r2   )minuteszGUPDATE usuario_login_otp SET usado = 1 WHERE usuario = %s AND usado = 0z
            INSERT INTO usuario_login_otp (usuario, codigo_hash, expira_em, usado)
            VALUES (%s, %s, %s, 0)
            
id_clienter#   Z	login_otp)eventoZid_cliente_logokerroz[LOGIN OTP] falha envio:
disconnectZwhatsapp_falha_envioz[LOGIN OTP solicitar ERRO]) r	   r(   r)   rZ   r   	UZAPI_URLUZAPI_TOKENr   Zstatus_instancia_plataformarU   printcloser   cursorrB   intrL   rE   r   rP   r   OTP_TTL_MINUTESr0   r7   commitrI   Zenviar_texto_plataformar"   r8   	traceback	print_excrollback)r#   rM   r?   stconnr>   rA   r2   r$   Zexpiracodigo_hashrg   r/   resulterrr^   r@   r   r   r   solicitar_codigo_whatsappi   s    



$
   (r|   c           	      C  sB  t | pd  }ddd t |p&dD }|r@t|dkrDdS t||}d }d }zz\t }|jdd}|	d||f |
 }|sW W dS |	d	|d
 f |  W W ndS  tk
r } zFtd|dd |r z|  W n tk
 r   Y nX W Y W dS d }~X Y nX W 5 |r.|  |r<|  X d S )Nr   c                 s  s   | ]}|  r|V  qd S r   r   r   r   r   r   r      s      z*validar_codigo_whatsapp.<locals>.<genexpr>   FTrd   z
            SELECT id FROM usuario_login_otp
            WHERE usuario = %s AND codigo_hash = %s AND usado = 0 AND expira_em > NOW()
            ORDER BY id DESC LIMIT 1
            z4UPDATE usuario_login_otp SET usado = 1 WHERE id = %sidz[LOGIN OTP validar ERRO]ra   )r	   r(   r)   r   r   r0   ro   r   rp   r7   r:   rs   r8   rn   rv   )	r#   r$   r?   digitsry   rx   r>   rA   r@   r   r   r   validar_codigo_whatsapp   s@    


 r   )N)__doc__
__future__r   r,   r*   rC   rT   rt   r   r   configr   databaser   servicesr   rr   OTP_MSG_GENERICr"   r0   rB   rE   rI   rL   rZ   r|   r   r   r   r   r   <module>   s,   N