o
    i                     @   s.  d Z ddlmZ ddlmZ ddlmZ ddlmZ	 ee
Zi dejdejdejd	ejd
ejdejdejdejdejdejdejdejdejdejdejdejZdZdZG dd dZdede e fddZ!dede e" fdd Z#d!ede e fd"d#Z$de e fd$d%Z%d&S )'a  Module for parsing and applying DD_IAST_SECURITY_CONTROLS_CONFIGURATION.

This module handles the configuration of custom security controls via environment variables.
It supports both INPUT_VALIDATOR and SANITIZER types with configurable vulnerability types,
modules, methods, and parameter positions.

Format: CONTROL_TYPE:VULNERABILITY_TYPES:MODULE:METHOD[:PARAMETER_POSITIONS]
Example: INPUT_VALIDATOR:COMMAND_INJECTION,XSS:shlex:quote
    )Optional)VulnerabilityType)
get_logger)configCODE_INJECTIONCOMMAND_INJECTIONHEADER_INJECTIONUNVALIDATED_REDIRECTINSECURE_COOKIENO_HTTPONLY_COOKIENO_SAMESITE_COOKIEPATH_TRAVERSALSQL_INJECTIONSQLISSRFSTACKTRACE_LEAKWEAK_CIPHER	WEAK_HASHWEAK_RANDOMNESSXSS	SANITIZERINPUT_VALIDATORc                   @   sF   e Zd ZdZ	ddedee dededeee  f
dd	Z	d
d Z
dS )SecurityControlz3Represents a single security control configuration.Ncontrol_typevulnerability_typesmodule_pathmethod_name
parametersc                 C   sF   |  | _|| _|| _|| _|pg | _| jttfvr!td| dS )a  Initialize a security control configuration.

        Args:
            control_type: Either SC_VALIDATOR or SC_SANITIZER
            vulnerability_types: list of vulnerability types this control applies to
            module_path: Python module path (e.g., "shlex", "django.utils.http")
            method_name: Name of the method to wrap
            parameters: Optional list of parameter types for overloaded methods
        zInvalid control type: N)	upperr   r   r   r   r   SC_VALIDATORSC_SANITIZER
ValueError)selfr   r   r   r   r    r#   c/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/appsec/_iast/secure_marks/configuration.py__init__/   s   

zSecurityControl.__init__c              	   C   s0   d| j  ddd | jD  d| j d| j d	S )NzSecurityControl(type=z, vulns=c                 S   s   g | ]}|j qS r#   )name).0vr#   r#   r$   
<listcomp>L   s    z,SecurityControl.__repr__.<locals>.<listcomp>z	, module=z	, method=))r   r   r   r   )r"   r#   r#   r$   __repr__I   s   
zSecurityControl.__repr__)N)__name__
__module____qualname____doc__strlistr   r   intr%   r+   r#   r#   r#   r$   r   ,   s    

r   vuln_stringreturnc                 C   s`   |   dkrtt S g }| dD ]}|   }|tvr&td| |t|  q|S )a  Parse comma-separated vulnerability types or '*' for all types.

    Args:
        vuln_string: Comma-separated vulnerability type names or '*'

    Returns:
        list of VulnerabilityType enum values

    Raises:
        ValueError: If an unknown vulnerability type is specified
    *,zUnknown vulnerability type: )stripr1   VULNERABILITY_TYPE_MAPPINGvaluessplitr   r!   append)r3   r   	vuln_namer#   r#   r$   parse_vulnerability_typesQ   s   r=   positions_stringc              
   C   sL   |   sg S zdd | dD W S  ty% } ztd|  |d}~ww )a  Parse comma-separated parameter positions.

    Args:
        positions_string: Comma-separated parameter positions (e.g., "0,1,3")

    Returns:
        list of integer positions

    Raises:
        ValueError: If positions cannot be parsed as integers
    c                 S   s   g | ]}t | qS r#   )r2   r7   )r'   posr#   r#   r$   r)   z   s    z$parse_parameters.<locals>.<listcomp>r6   zInvalid parameter positions: N)r7   r:   r!   )r>   er#   r#   r$   parse_parametersj   s   rA   config_stringc           
   	   C   s   |   sg S g }| dD ]p}|  }|sq|d}t|dk r(td| qzD|d   }t|d   }|d   }|d   }d	}t|dkrW|d   rWt|d }t|||||d
}	||	 t	d|	 W q t
y}   tjd|dd Y qw |S )av  Parse the DD_IAST_SECURITY_CONTROLS_CONFIGURATION environment variable.

    Args:
        config_string: Configuration string with format:
                      CONTROL_TYPE:VULNERABILITY_TYPES:MODULE:METHOD[:PARAMETERS][:PARAMETER_POSITIONS]

    Returns:
        list of SecurityControl objects

    Raises:
        ValueError: If the configuration format is invalid
    ;:   z;Invalid security control configuration (missing fields): %sr            N)r   r   r   r   r   zParsed security control: %sz#Failed to parse security control %sTexc_info)r7   r:   lenlogwarningr=   rA   r   r;   debug	Exception)
rB   security_controlscontrol_configfieldsr   r   r   r   r   security_controlr#   r#   r$   parse_security_controls_config   sB   

rT   c                  C   sR   t j} | sg S zt| }tdt| |W S  ty(   tjddd g  Y S w )zGet security controls configuration from DD_IAST_SECURITY_CONTROLS_CONFIGURATION environment variable.

    Returns:
        list of SecurityControl objects parsed from the environment variable
    z3Loaded %s custom security controls from environmentz7Failed to parse DD_IAST_SECURITY_CONTROLS_CONFIGURATIONTrI   )
asm_config_iast_security_controlsrT   rL   inforK   rO   error)rB   controlsr#   r#   r$   get_security_controls_from_env   s   rZ   N)&r/   typingr   $ddtrace.appsec._iast._taint_trackingr   ddtrace.internal.loggerr   ddtrace.internal.settings.asmr   rU   r,   rL   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r8   r    r   r   r0   r1   r=   r2   rA   rT   rZ   r#   r#   r#   r$   <module>   s\    
	
%<