o
    i)                     @   s  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  mZ d dlmZ d d	lmZ d
ZeZdZeeZG dd dejdZeD ]\ZZeeej qTddddZedBdededededdf
ddZ dededdfddZ!dededdfddZ"ej#j$j%d ej#j$j&d!ej#j$j'd"ej#j$j(d#ej#j$j)d$ej#j$j*d%ej#j$j+d&iZ,d'Z-d(Z.d)Z/d*eddfd+d,Z0d-e1d.ed/e j2e ddfd0d1Z3d2eddfd3d4Z4dCd6ed7e1d8eddfd9d:Z5d/ed;eddfd<d=Z6dBd>ed?eddfd@dAZ7dS )D    N)
_constants)deduplication)
DDWaf_info)Telemetry_result)_observator)	telemetry)TELEMETRY_LOG_LEVEL)TELEMETRY_NAMESPACEunknown)falsetruec                   @   s   e Zd ZdZdZdS )WARNING_TAGStelemetry_logstelemetry_metricsN)__name__
__module____qualname__TELEMETRY_LOGSTELEMETRY_METRICS r   r   K/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/appsec/_metrics.pyr      s    r   )	metaclassappsec   )productstack_limit
exec_limitTmsgversionactionerror_levelreturnc                 C   s   zt |ptd}|rtjntj}tjj|| |d W n ty2   dddd}t	j
tj|dd Y nw zd	t fd
|p;tfd|ff}tjjtjdd|d W dS  tyg   dddd}t	j
tj|dd Y dS w )z!used for waf configuration errors)waf_versionevent_rules_versiontagsr      z
:waf:errorr   r   	more_infoTextraexc_infor"   r#   r   waf.config_errors   z:waf:config_errorsN)ddwaf_versionUNKNOWN_VERSIONr   ERRORWARNINGr   telemetry_writeradd_log	Exceptionloggerwarningr   r   add_count_metricr	   APPSECr   )r   r   r   r    log_tagslevelr*   r%   r   r   r   _set_waf_error_log"   s(   
r;   infosuccessc                 C   st   z d| j ptfdtff}tjjtjdd|dt| ff d W d S  t	y9   ddd	d
}t
jtj|dd Y d S w )Nr#   r"   zwaf.updatesr-   r=   r$   r   r&   z:waf:updatesr'   Tr)   r   r/   r.   r   r2   r7   r	   r8   bool_strr4   r5   r6   r   r   r<   r=   r%   r*   r   r   r   _set_waf_updates_metric;   s   rA   c                 C   s   z2d| j ptfdtff}tjjtjdd|dt| ff d |s0tjjtjdd|d d W d S W d S  t	yK   d	d
dd}t
jtj|dd Y d S w )Nr#   r"   zwaf.initr-   r=   r$   r,   ))r   initr   r&   z	:waf:initr'   Tr)   r>   r@   r   r   r   _set_waf_init_metricJ   s    rC   )	rule_typecommand_injection)rule_variantexec)rD   )rG   shell))rE   lfi)rE   ssrf)rK   )rG   request)rK   )rG   response))rE   sql_injection))truncation_reason1))rP   2))rP   4
observatorc                 C   s   zVd}| j d ur|dO }tjtjd| j t | jd ur+|dO }tjtjd| jt | j	d ur?|dO }tjtjd| j	t
 |rTtjjtjdddt|ffd W d S W d S  tyo   d	d
dd}tjtj|dd Y d S w )Nr   r-   zwaf.truncated_value_size   r   zwaf.input_truncatedrP   r$   r   r&   z:waf:truncationsr'   Tr)   )string_lengthr   r2   add_distribution_metricr	   r8   TAGS_STRING_LENGTHcontainer_sizeTAGS_CONTAINER_SIZEcontainer_depthTAGS_CONTAINER_DEPTHr7   strr4   r5   r6   r   r   )rT   bitfieldr*   r   r   r   _report_waf_truncationsl   s:   


r_   errorrule_versionrE   c                 C   s   zD|du r"dt fd|ptfdt| ff}tjjtjdd|d W dS dt fd|p)tfdt| fft	|d }tjjtjd	d|d W dS  t
y`   d
dd|pQd d}tjtj|dd  w )zused for waf run errorsNr"   r#   	waf_errorz	waf.errorr-   r$   r   z
rasp.errorr   r&   z:waf:run_error:srbr'   Tr)   )r.   r/   r]   r   r2   r7   r	   r8   _TYPES_AND_TAGSgetr4   r5   r6   r   r   )r`   ra   rE   waf_tags	rasp_tagsr*   r   r   r   _report_waf_run_error   s&   




rh   resultc              
   C   sd  z| j }t|jp|jp|j}d| jptfdtfdt| j	 fdt| j
 fdtt| j fdt| fdt| jdk  fd	t| j ff}tjjtjd
d|d | j}|jrdD ]A\}}t|| D ]2\}}|rt|ddtfd| jprtff }	|dkr|	dddg|j
 ff }	tjjtj|||	d q_qTW d S W d S  ty   dddd}
tjtj|
dd Y d S w )Nr#   r"   rule_triggeredrequest_blockedwaf_timeoutinput_truncatedrb   r   rate_limitedzwaf.requestsr-   r$   ))evalzrasp.rule.eval)matchzrasp.rule.match)timeoutzrasp.timeoutr   rp   block
irrelevantr=   r   r&   z:waf:requestr'   Tr)   )
truncationboolrV   rY   r[   r   r/   r.   r?   	triggeredblockedrq   r`   rn   r   r2   r7   r	   r8   raspsum_evalgetattritemsrd   re   r4   r5   r6   r   r   )ri   rt   rm   tags_requestrx   tnrE   valuer%   r*   r   r   r   _set_waf_request_metrics   sB   


r    routeschemas	frameworkc                 C   s   z,| r|dkr	dnd}t jjtj|dd|ffd W d S t jjtjddd|ffd W d S  tyE   dd	d
d}tjtj	|dd Y d S w )Nr   zapi_security.request.schemazapi_security.request.no_schemar-   r   r$   zapi_security.missing_router   r&   z:api_securityr'   Tr)   
r   r2   r7   r	   r8   r4   r5   r6   r   r   )r   r   r   metric_namer*   r   r   r   _report_api_security   s   r   import_errorc              	   C   sz   zt | dd|rdndff }tjjtjdd|d W d S  ty<   dd	d
|  d| d}tj	t
j|dd Y d S w )Nr   reasonzapp-startupzout-of-requestzrasp.rule.skippedr-   r$   r   r&   z:waf:rasp_rule_skipped::r'   Tr)   )rd   re   r   r2   r7   r	   r8   r4   r5   r6   r   r   )rE   r   r%   r*   r   r   r   _report_rasp_skipped   s   r   
event_typev2c              	   C   sx   |rdnd}zd| fd|ff}t jjtjdd|d W d S  ty;   dd	d
|  d| d}tjtj	|dd Y d S w )Nr   v1r   sdk_versionz	sdk.eventr-   r$   r   r&   z:waf:sdk.event:r   r'   Tr)   r   )r   r   r   r%   r*   r   r   r   _report_ato_sdk_usage   s   r   )T)r   )8typingddtrace.appsecr   ddtrace.appsec._deduplicationsr   ddtrace.appsec._utilsr   r   r   ddtrace.internalr   ddtrace.internal.loggerinternalr5   ddlogger$ddtrace.internal.telemetry.constantsr   r	   r/   r.   r?   
get_loggerr   Constant_Classr   _tagset_tag_rate_limitHOUR	log_extrar]   ru   r;   rA   rC   EXPLOIT_PREVENTIONTYPECMDISHILFISSRFSSRF_REQSSRF_RESSQLIrd   rX   rZ   r\   r_   intOptionalrh   r   r   r   r   r   r   r   r   <module>   sN    
"







 !