o
    iB#                     @   sf  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 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 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 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 d dlmZ ee Z!dZ"dZ#dZ$d Z%dZ&dZ'G dd deZ(d e)fd!d"Z*dS )#    N)Any)Optional)Sequence)DEFAULT)ddwaf_config)ddwaf_get_version)ddwaf_object)ddwaf_object_free)	ddwaf_run)py_add_or_update_config)py_ddwaf_builder_build_instance)py_ddwaf_builder_init)py_ddwaf_context_init)py_ddwaf_known_addresses)py_remove_config)WAF)
DDWaf_info)DDWaf_result)DDWafRulesType)ddwaf_context_capsule)_observator)
get_logger)PayloadType   zASM_DD/defaultc                   @   s   e Zd Ze Zdededededdf
ddZede	e
 fd	d
Zdede
ddfddZedefddZdeee
e
f  deee
e
ef  defddZdee fddZdejfdededee dedef
ddZedefddZd!dd ZdS )"DDWafruleset_json_str obfuscation_parameter_key_regexp"obfuscation_parameter_value_regexpmetricsreturnNc           	      C   s   |j | _t||d}t }t|}|stdt|| _t| jt	|| t
| j| _d| _t	h| _| |d | j}| jrA|jrLtd|j|j|j || _t |_i | _d| _d| _d| _d S )N)	key_regexvalue_regexz-Invalid ruleset provided to DDWaf constructor initz?DDWAF.__init__: invalid rules
 ruleset: %s
loaded:%s
errors:%s
r   )_set_waf_error_logreport_errorr   r   from_json_bytes
ValueErrorr   _builderr   ASM_DD_DEFAULTr   _handle_cached_version_asm_dd_cache	_set_infoinfofailedLOGGERdebugstructerrors_default_rulesetversionddwaf_version_rc_products_rc_products_str_rc_updates	_lifespan)	selfr   r   r    r!   configdiagnosticsruleset_map_objectr1    rB   M/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/appsec/_ddwaf/waf.py__init__,   s8   	


zDDWaf.__init__c                 C   s   | j rt| j S g S N)r-   r   r>   rB   rB   rC   required_dataT   s   zDDWaf.required_datar@   actionc              
   C   s  |j pi }|di }|di }|d| j}|| _| D ]?\}}t|tr^|dd }	rB| d| d| d|	 | j| q|dd }
r^| d| d| dt|
 | j|d qtt	|dg t	|d	g |rwt
j|d
dnd|| _t| d S )Nrulesr6   ruleset_versionerrorFzappsec.waf.error::z::loadedr2   ),:)
separatorsr%   )r5   getr.   items
isinstancedictr(   strr   lenjsondumps_infor	   )r>   r@   rH   info_structrI   errors_resultr8   keyvaluerK   r6   rB   rB   rC   r0   X   s0   

$zDDWaf._set_infoc                 C   s   | j S rE   )rX   rF   rB   rB   rC   r1   q   s   z
DDWaf.inforemovalsupdatesc           
      C   s  d}|D ]!\}}|t | j|M }| j|t | |dkr%| j| q|D ]U\}}}|| jvr8t | j|< | j| | |dkr]t| jv rW|t | jtM }| jt | j| t	 }t	
|}|t| j|||M }| |d t| t| q(| jst	 }|t| jt| j|M }| |d t| | jt t| j}	ddd t| j D | _|	r|	| _|  jd7  _|S )zFupdate the rules of the WAF instance. return False if an error occurs.TASM_DDupdaterM   c                 s   s*    | ]\}}|r| d t | V  qdS )rN   N)rU   ).0pvrB   rB   rC   	<genexpr>   s   ( z%DDWaf.update_rules.<locals>.<genexpr>r   )r   r+   r:   rP   setdiscardr/   addr,   r   create_without_limitsr   r0   r	   r7   r   joinsortedrQ   r;   r-   r<   )
r>   r]   r^   okproductpathrI   r@   ruleset_object
new_handlerB   rB   rC   update_rulesu   sD   




 zDDWaf.update_rulesc                 C   sR   d }| j r |  jd7  _t| j }d| j d| j d| j |_|s'td |S )Nr   [z] u:z r:z7DDWaf._at_request_start: failure to create the context.)r-   r=   r   r;   r<   rc_productsr3   r4   )r>   ctxrB   rB   rC   _at_request_start   s   

zDDWaf._at_request_startrs   dataephemeral_data
timeout_msc                 C   sH  t  }|std tdg i dt   | d d| ji S t }t }t||d}|r1t||dnd }	|j t	|j
||	|t|d }
W d    n1 sNw   Y  |
dk rbtd|
|j| jj |j}|
tksnt|ts~t| t|
g i ddd| ji S t|
|d |d	 |d
 d t  | d |d ||d |d 	}t| |S )Nz'DDWaf.run: dry run. no context created.r   g    .AF)
observatori  z%run DDWAF error: %d
input %s
error %seventsactionsdurationg     @@timeout
attributeskeep)time	monotonicr3   r4   r   empty_observatorr   r   _lockr
   rs   intr5   r1   r6   DDWAF_ERR_INTERNALrR   rS   r	   )r>   rs   ru   rv   rw   start
result_objrx   wrapperwrapper_ephemeralrK   resultmain_resrB   rB   rC   run   s<   
$
z	DDWaf.runc                 C   s
   t | jS rE   )boolr-   rF   rB   rB   rC   initialized   s   
zDDWaf.initializedc                 C   s   t | drt| j d S d S )Nr7   )hasattrr	   r7   rF   rB   rB   rC   __del__   s   
zDDWaf.__del__)r"   N) __name__
__module____qualname__r   r   bytesr   rD   propertylistrT   rG   r   r0   r   r1   r   tupler   r   rp   r   r   rt   r   WAF_TIMEOUTr   floatr   r   r   r   rB   rB   rB   rC   r   )   sT    
(
(
'r   r"   c                   C   s   t  dS )NzUTF-8)r   decoderB   rB   rB   rC   r8      s   r8   )+rV   r   typingr   r   r   ddtrace.appsec._constantsr   !ddtrace.appsec._ddwaf.ddwaf_typesr   r   r   r	   r
   r   r   r   r   r   r   ddtrace.appsec._ddwaf.waf_stubsr   r   r   r   r   ddtrace.appsec._utilsr   ddtrace.internal.loggerr   ddtrace.internal.remoteconfigr   r   r3   r   DDWAF_ERR_INVALID_OBJECTDDWAF_ERR_INVALID_ARGUMENTDDWAF_OKDDWAF_MATCHr,   r   rT   r8   rB   rB   rB   rC   <module>   sF     /