
    4h&                        d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlZd dlZd dl	Z	d dl
Z
d dlmZ  e         ej                  dd      Z e ej                  dd            Z e ej                  d	d
            Z ej$                  e      ZdedefdZdeeef   defdZdedefdZdedefdZddededefdZdedefdZy)    N)datetime)DictAny)load_dotenvN8N_WEBHOOK_URLz>https://dev.n8n.catastroantioquia-mas.com/webhook/tasa-pru-webREQUEST_TIMEOUT120MAX_RETRIES2valuereturnc                 6   t        | t              st        d      g d}|D ]8  }t        j                  ||       st
        j                  d       t        d       t        j                  | j                               }t        |      dkD  rt        d      |S )uH   Sanitización básica de entrada - Bloquea patrones maliciosos conocidosz%El valor debe ser una cadena de texto)(?i)(<script[^>]*>.*?</script>)(?i)(javascript:|vbscript:)z'(?i)(union\s+select|select\s+.*\s+from)z$(?i)(or\s+1\s*=\s*1|and\s+1\s*=\s*1)(?i)(<iframe|<object|<embed)z(\.\./){2,}z[<>\"'`](?=.*[{}[\]\\;|&])u&   Patrón malicioso bloqueado en entradaz Contenido no permitido detectadoi  zContenido demasiado largo)
isinstancestr
ValueErrorresearchloggerwarninghtmlescapestriplen)r   malicious_patternspatterncleaneds       K/var/www/pru.catia.catastroantioquia-mas.com/tasa/chat_tasa/chat_tasa_ia.pysanitize_input_basicr!      s    eS!@AA	 & A99We$NNCE?@@A kk%++-(G 7|d455N    response_datac                     	 t        j                  |       }g d}|D ]/  }t        j                  ||      st        j                  d        y y# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)zDValidar que la respuesta del webhook no contenga contenido malicioso)r   r   z(?i)(on\w+\s*=)r   z2Respuesta del webhook contiene contenido peligrosoFTzError validando respuesta: N)jsondumpsr   r   r   r   	Exceptionerror)r#   response_strdangerous_patternsr   es        r    validate_webhook_responser,   >   sx    zz-0
 * 	Gyy,/ST	
  21#67s"   4A A A 	A;A66A;datosc           
      	  K   	 | j                  d      xs dj                         }| j                  d      xs dj                         }| j                  dd      }|r|s t        j                  d       t	        d      S 	 t        |      }t        |      }t        |      dkD  rt	        d      S ||t        |      t        j                         j                  d      d}t        s t        j                  d       t	        d      S t        j                  d|d
d  d       d
}d
}	t        t               D ]j  }
	 t#        j$                  t#        j&                  t(              t#        j*                  d            4 d
{   }|j-                  t        |dddd       d
{   }d
d
d
      d
{    j.                  dk(  rOt        j                  d       |
t         dz
  k  r!t1        j2                  d|
z         d
{    t	        d      c S |j.                  d k7  r<t        j                  d!|j.                          t	        d"|j.                         c S 	 |j5                         }t9        |      s"t        j                  d%       t	        d&      c S  n |#t        j                  d,|	        t	        d-      S tA        |j                  d.d/      tC        |      0      }t        j                  d1|d
d  d       |S # t        $ r-}t        j                  d|        t	        d	      cY d
}~S d
}~ww xY w7 7 7 # 1 d
{  7  sw Y   xY w7 `# t4        j6                  $ r% t        j                  d#       t	        d$      cY c S w xY w# t"        j:                  $ r  d'}	t        j                  d(|
dz           Y nKt"        j<                  $ r6}d)t?        |       }	t        j                  d*|
dz    d+|        Y d
}~nd
}~ww xY w|
t         dz
  k  st1        j2                  d       d
{  7   # tD        $ r*}t        jG                  d2       t	        d3      cY d
}~S d
}~ww xY ww)4uC   
    Función principal con medidas de seguridad implementadas
    	sessionId preguntaaudio_enabledFzCampos requeridos faltantesz"Faltan campos sessionId y preguntaz!Entrada rechazada por seguridad: u   Datos de entrada no válidosNd   zsessionId demasiado largoz%Y-%m-%d %H:%M:%S)r/   r1   r2   	timestampzURL del webhook no configuradau(   Configuración de servicio no encontradau#   Procesando solicitud para sesión:    z***   )max_connections)timeoutlimitszapplication/jsonzSecureChatAPI/1.0)zContent-TypeAcceptz
User-Agent)r%   headersi  z Rate limit del webhook alcanzado      zServicio temporalmente ocupado   zError HTTP del webhook: zError del servicio externo: u$   Respuesta JSON inválida del webhooku    Respuesta inválida del serviciou5   Respuesta del webhook falló validación de seguridadu!   Respuesta no válida del serviciozTimeout del serviciozTimeout en intento u   Error de conexión: u   Error de conexión en intento z: zTodos los reintentos fallaron: zServicio no disponiblemessagez!Respuesta procesada correctamente)r?   datau/   Solicitud procesada exitosamente para sesión: z#Error inesperado en enviar_chat_n8nz$Error al procesar el mensaje de chat)$getr   r   r   create_safe_errorr!   r   r   boolr   nowstrftimeWEBHOOK_URLr(   inforanger
   httpxAsyncClientTimeoutr   Limitspoststatus_codeasynciosleepr%   JSONDecodeErrorr,   TimeoutExceptionRequestErrorr   create_safe_successsanitize_response_datar'   	exception)r-   
session_idr1   r2   clean_session_idclean_preguntar+   payloadr#   
last_errorattemptclientresponsesafe_responses                 r    enviar_chat_n8nr`   Y   s;    qIii,299;
IIj)/R668		/59NN89$%IJJ	E3J?1(;N  3&$%@AA *&!-0!001DE	
 LL9:$%OPP 	9:J2A:N9OsST 
[) 5	'G0T ,,!MM/: <<:   %+[[#$,>&8*=! &1 &  H   ''3.NN#EFq0%mmAL999 ,-MNN''3.LL#;H<P<P;Q!RS,/KHL`L`Ka-bccQ$,MMOM 1?NN#Z[,-PQQ U5	'p  LL::,GH$%=>> ,!%%i1TU'6

 	EFVWYXYFZE[[^_`  	ENN>qcBC$%CDD	E<
    & : ++ QLL!GH,-OPPQ )) D3
!4Wq[MBC%% T3CF8<
!?!}BqcRSST
 q(mmA&&&   I>? !GHHIs  RA;Q ?RL Q /R0AQ R3Q ;AN#MN# M%M	&M*N#5M6AN#M%N#
Q 
N#Q RAN# Q "R$M(4*N#Q  R!'Q R	AQ R	M"L>8M9Q =R>MQ N#	MN#M"	MM"		N#(3N N#Q RN  N##0PQ P',PQ PQ .Q Q	Q 	RQ<6R7R<RRr?   c                 J    dt        j                  t        |       dd       dS )zCrear respuesta de error seguraFNr>   successr?   r   r   r   )r?   s    r    rB   rB      s(     ;;s7|DS12 r"   r@   c                 \    dt        j                  t        |       dd       d}|||d<   |S )zCrear respuesta exitosa seguraTNr>   rb   r@   rd   )r?   r@   r^   s      r    rT   rT      s<     ;;s7|DS12H
 Or"   c                    t        | t              rt        j                  |       S t        | t              roi }| j                         D ]X  \  }}t        |t              rt        j                  |      ||<   /t        |t        t        f      rt        |      ||<   T|||<   Z |S t        | t              r| D cg c]  }t        |       c}S | S c c}w )z.Sanitizar datos de respuesta para prevenir XSS)r   r   r   r   dictitemslistrU   )r@   	sanitizedkeyr   items        r    rU   rU      s    ${{4  	D$		**, 	'JC%%!%U!3	#ED$<0!7!>	#!&	#	' 	D$	9=>&t,>>K ?s   9C)N)rI   loggingosr   typingr   r   r%   r   r   rO   dotenvr   getenvrF   intr   r
   	getLogger__name__r   r   r!   rC   r,   rg   r`   rB   rT   rU    r"   r    <module>rv      s     	     	    bii)+klibii 159:)"))M3/0 
		8	$  >T#s(^  6uI uI$ uIvs t 
 
C 
4 
  r"   