o
    io7                  	   @   s  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 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G dd dZG dd dZedg i ddde i ZG dd dZ G dd dZ!G dd dZ"G dd dZ#G dd  d Z$d!ed"ed#ee fd$d%Z%d&e&d#e&fd'd(Z'd&ed#ee fd)d*Z(G d+d, d,Z)d-ed#e*fd.d/Z+d-ed#efd0d1Z,d;d2ej-d3e&d4e.d#e&fd5d6Z/ej0d#ej1d fd7d8Z2d-ed#e*fd9d:Z3dS )<    N)Any)Optional)Union)SUPPORTED_PROXY_SPAN_NAMES)Span)API_SECURITY)APPSEC)"_get_header_value_case_insensitive)unpatched_json_loads)
get_logger)config         c                   @   sZ   e Zd ZdddZdeddfddZdeddfd	d
ZdeddfddZdefddZ	dS )_observatorreturnNc                 C   s   d | _ d | _d | _d S Nstring_lengthcontainer_sizecontainer_depthself r   I/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/appsec/_utils.py__init__      
z_observator.__init__lengthc                 C   &   | j d u r
|| _ d S t| j || _ d S r   )r   max)r   r   r   r   r   set_string_length#      

z_observator.set_string_lengthsizec                 C   r   r   )r   r   )r   r"   r   r   r   set_container_size)   r!   z_observator.set_container_sizedepthc                 C   r   r   )r   r   )r   r$   r   r   r   set_container_depth/   r!   z_observator.set_container_depthc                 C   s   d| j  d| j d| j dS )Nz_observator(length=z, size=z, depth=)r   r   r   r   r   __repr__5   s   z_observator.__repr__r   N)
__name__
__module____qualname__r   intr    r#   r%   strr'   r   r   r   r   r      s    
r   c                   @   st   e Zd Zg dZ	ddedeeeef  deeef de	de	de
d	ed
eeef de
ddfddZdefddZdS )DDWaf_resultreturn_codedataactionsruntimetotal_runtimetimeout
truncation	meta_tagsmetricsapi_securitykeepFr0   r1   r2   r3   r4   r5   r6   derivativesr:   r   Nc
                 C   s   || _ || _|| _|| _|| _|| _|| _i | _i | _i | _	|
 D ],\}
}|
dr1|| j	|
< q"t|tr<|| j|
< q"t|trIt|| j|
< q"|| j|
< q"|	| _d S )Nz_dd.appsec.s.)r0   r1   r2   r3   r4   r5   r6   r8   r7   r9   items
startswith
isinstancer-   boolr,   r:   )r   r0   r1   r2   r3   r4   r5   r6   r;   r:   kvr   r   r   r   H   s&   



zDDWaf_result.__init__c                 C   s\   d| j  d| j d| j d| j d| j d| j d| j d| j d	| j d
| j	 d| j
 S )NzDDWaf_result(return_code: z data: z, actions: z, runtime: z, total_runtime: z, timeout: z, truncation: z, meta_tags: z) metrics: z, api_security: z, keep: r/   r   r   r   r   r'   i   s(   zDDWaf_result.__repr__)F)r)   r*   r+   	__slots__r,   listdictr-   r   floatr?   r   r   r'   r   r   r   r   r.   9   s2    

	

!r.   i        Fc                
   @   s@   e Zd Zg dZdededededdf
dd	Zdefd
dZdS )
DDWaf_infoloadedfailederrorsversionrI   rJ   rK   rL   r   Nc                 C   s   || _ || _|| _|| _d S r   rH   )r   rI   rJ   rK   rL   r   r   r   r   y   s   
zDDWaf_info.__init__c                 C   s   d| j | j| j| jf S )Nz1{loaded: %d, failed: %d, errors: %s, version: %s}rH   r   r   r   r   r'      s   zDDWaf_info.__repr__)r)   r*   r+   rB   r,   r-   r   r'   r   r   r   r   rG   v   s    rG   c                   @      e Zd Zg dZdddZdS )Truncation_resultr   r   Nc                 C   s   g | _ g | _g | _d S r   r   r   r   r   r   r      r   zTruncation_result.__init__r(   r)   r*   r+   rB   r   r   r   r   r   rN          rN   c                   @   rM   )Rasp_result)blockedsum_evaldurationtotal_durationevalmatchr5   	durationsr   Nc                 C   sL   d| _ d| _d| _d| _tt| _tt| _tt| _	tt
| _d S )NFr   rF   )rR   rS   rT   rU   collectionsdefaultdictr,   rV   rW   r5   rE   rX   r   r   r   r   r      s   zRasp_result.__init__r(   rO   r   r   r   r   rQ      rP   rQ   c                   @   s   e Zd Zg dZ					ddeded	ed
edededdfddZddededeeef fddZ	dede
eeef  fddZdedefddZdS )Block_config)block_idgrpc_status_codestatus_codetypecontent_typelocationauto  
   default r_   r^   r]   security_response_idra   _kwargsr   Nc                 K   s2   || _ || _|| _|| _|tj|| _d| _d S )Nzapplication/json)	r\   r]   r^   r_   replacer   SECURITY_RESPONSE_IDra   r`   )r   r_   r^   r]   rg   ra   rh   r   r   r   r      s   	
zBlock_config.__init__keyc                 C   s   |dkrd}t | ||S )a  
        Dictionary-like get method for backward compatibility with Lambda integration.

        Returns the attribute value if it exists, otherwise returns the default value.
        This allows Block_config to be used in contexts that expect dictionary-like access.
        content-typer`   getattr)r   rk   re   r   r   r   get   s   zBlock_config.getc                 C   s   |dkrd}t | |d S Nrl   r`   rm   r   rk   r   r   r   __getitem__   s   zBlock_config.__getitem__c                 C   s   |dkrd}t t| |d S rp   )r?   rn   rq   r   r   r   __contains__   s   zBlock_config.__contains__)rb   rc   rd   re   rf   r   )r)   r*   r+   rB   r-   r,   r   r   r   ro   r   rr   r?   rs   r   r   r   r   r[      s2    
 r[   c                   @   rM   )Telemetry_result)
rR   	triggeredr5   rL   rT   rU   r6   rasprate_limitederrorr   Nc                 C   sD   d| _ d| _d| _d| _d| _d| _t | _t | _	d| _
d| _d S )NFr   rf   rF   )rR   ru   r5   rL   rT   rU   rN   r6   rQ   rv   rw   rx   r   r   r   r   r      s   
zTelemetry_result.__init__r(   rO   r   r   r   r   rt      s    rt   raw_bodyheadersr   c                 C   s   | sd S t | tr| S |sd S tdd t| D d}|s!d S dtdtfdd}d }z'd|v r:t|| }W |S d	|v rQd
d lm  m} |	|| }W |S W d S  t
yd   tjddd Y d S w )Nc                 S   s   i | ]\}}t |t |qS r   )r-   ).0r@   rA   r   r   r   
<dictcomp>   s    z'parse_response_body.<locals>.<dictcomp>rl   bdr   c                 S   sf   t | trt | d ttfr| d d d | } t| ddr&| jddd} t| tj	kr1t
d| S )Nr   decodeFzUTF-8ignore)rK   zresponse body larger than 16MB)r>   rC   r-   bytesjoinrn   r~   lenr   MAX_PAYLOAD_SIZE
ValueError)r}   r   r   r   access_body   s   z(parse_response_body.<locals>.access_bodyjsonxmlr   zFailed to parse response bodyTexc_info)r>   rD   r	   r<   r   r
   ddtrace.vendor.xmltodictvendor	xmltodictparse	Exceptionlogdebug)ry   rz   r`   r   req_bodyr   r   r   r   parse_response_body   s6   
	
r   user_idc                 C   s(   dd l }d||   d d  S )Nr   anon_    )hashlibsha256encode	hexdigest)r   r   r   r   r   _hash_user_id  s    r   c                 C   sR   zt | }| W S  ty(   zdd l}|| }| W  Y S  ty'   Y Y d S w w )Nr   )r,   r   uuidUUID)r   _r   r   r   r   _safe_userid  s   

r   c                   @   s   e Zd ZdeddfddZdeje deje fddZ	defd	d
Z
defddZdefddZdefddZddedededeeeeef f fddZdS )_UserInfoRetrieveruserr   Nc                 C   s2   || _ g d| _g d| _g d| _g d| _d S )N)	pkiduiduseridr   PKIDUIDUSERID)usernamer   loginUSERNAMEUSERLOGIN)emailmailaddressEMAILMAILADDRESS)namefullname	full_name
first_nameNAMEFULLNAME	FULL_NAME
FIRST_NAME)r   possible_user_id_fieldspossible_login_fieldspossible_email_fieldspossible_name_fields)r   r   r   r   r   r   '  s
   


z_UserInfoRetriever.__init__possible_fieldsc                 C   s,   |D ]}t | j|d }|d ur|  S qd S r   )rn   r   )r   r   fieldvaluer   r   r   find_in_user_model7  s   z%_UserInfoRetriever.find_in_user_modelc                 C   s,   t | jtjd }|d ur|S | | j}|S r   )rn   r   
asm_config_user_model_login_fieldr   r   )r   
user_loginr   r   r   
get_userid?  s
   z_UserInfoRetriever.get_useridc                 C   sb   t | jtjd }|d ur|S t| jdr+z| j W S  ty*   tjddd Y nw | 	| j
S )Nget_usernamez6User model get_username member produced an exception: Tr   )rn   r   r   _user_model_name_fieldhasattrr   r   r   r   r   r   )r   r   r   r   r   r   G  s   z_UserInfoRetriever.get_usernamec                 C   (   t | jtjd }|d ur|S | | jS r   )rn   r   r   _user_model_email_fieldr   r   )r   r   r   r   r   get_user_emailT     z!_UserInfoRetriever.get_user_emailc                 C   r   r   )rn   r   r   r   r   r   )r   r   r   r   r   get_name[  r   z_UserInfoRetriever.get_nameFr   r   r   c                 C   sT   i }|   }|du rdi fS |r|  |d< |r|  |d< |r&|  |d< ||fS )z
        In safe mode, try to get the user id from the user object.
        In extended mode, try to also get the username (which will be the returned user_id),
        email and name.
        Nr   r   r   )r   r   r   r   )r   r   r   r   user_extra_infor   r   r   r   get_user_infob  s   z _UserInfoRetriever.get_user_info)FFF)r)   r*   r+   r   r   typingSequencer-   r   r   r   r   r   r   r?   tuplerD   r   r   r   r   r   r   &  s    0r   spanc                 C   s2   t jr| tjp
i dd d uS | tjd uS )Ntriggers)r   _use_metastruct_for_triggers_get_struct_tagr   STRUCTro   get_tagJSONr   r   r   r   has_triggersw  s   r   c                 C   sj   t jr| tjp
i dd S | tj}|r3z
t	|dd W S  t
y2   tjddd Y d S w d S )Nr   zFailed to parse triggersTr   )r   r   r   r   r   ro   r   r   r   loadsr   r   r   )r   json_payloadr   r   r   get_triggers}  s   r   loggermsgoffsetc                 C   s4   |  dd| \}}}}| d| d| d| dS )NF   [z, line z, in ])
findCaller)r   r   r   filenameline_numberfunction_name_stack_infor   r   r   add_context_log  s   r   c               
   c   s    ddl } ddl}ddlm} ddlm} | j}|| _|j}t|d| tj	}dt_	zdV  W t|d| || _tj
r@|t_	dS dt_	dS t|d| || _tj
rU|t_	w dt_	w )z
    Context manager to temporarily unpatch `subprocess.Popen` for testing purposes.
    This is useful to ensure that the original `Popen` behavior is restored after the context.
    r   N)unpatched_close)unpatched_PopenPopenTF)os
subprocessddtrace.internal._unpatchedr   r   closer   setattrr   _bypass_instrumentation_for_waf#_is_testing_instrumentation_for_waf)r   r   r   r   original_os_closeoriginal_popenoriginal_bypass_flagr   r   r   unpatching_popen  s.   


r   c                 C   s
   | j tv S r   )r   r   r   r   r   r   is_inferred_span  s   
r   )r   )4rY   
contextlibr   loggingr   r   r   r   ddtrace._trace._inferred_proxyr   ddtrace._trace.spanr   ddtrace.appsec._constantsr   r   )ddtrace.contrib.internal.trace_utils_baser	   r   r
   ddtrace.internal.loggerr   ddtrace.internal.settings.asmr   r   r)   r   _TRUNC_STRING_LENGTH_TRUNC_CONTAINER_DEPTH_TRUNC_CONTAINER_SIZEr   r.   Binding_errorrG   rN   rQ   r[   rt   r   r-   r   r   r   r?   r   r   Loggerr,   r   contextmanagerIteratorr   r   r   r   r   r   <module>   sL   :	)+Q!