o
    i8                     @  s  U d dl mZ d dlZd dlZd dlZd dlmZmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZmZm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mZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z,m-Z- dddddddddddddgdd dD Z.dZ/d e0d!< eG d"d# d#Z1ee1gef Z2G d$d% d%eZ3eG d&d' d'Z4G d(d) d)eZ5G d*d+ d+e5Z6e6 Z7G d,d- d-e5Z8G d.d/ d/Z9G d0d1 d1Z:dS )2    )annotationsN)ABCabstractmethod)MappingSequence)	dataclass)AnyCallable	TypedDictcast)BoundedAttributes)	LogRecord)Event)Link   )ATTRIBUTES_JSON_SCHEMA_KEYATTRIBUTES_LOG_LEVEL_NAME_KEYATTRIBUTES_LOG_LEVEL_NUM_KEYATTRIBUTES_LOGGING_NAMEATTRIBUTES_MESSAGE_KEYATTRIBUTES_MESSAGE_TEMPLATE_KEY'ATTRIBUTES_PENDING_SPAN_REAL_PARENT_KEYATTRIBUTES_SAMPLE_RATE_KEYATTRIBUTES_SCRUBBED_KEYATTRIBUTES_SPAN_TYPE_KEYATTRIBUTES_TAGS_KEY$MESSAGE_FORMATTED_VALUE_LENGTH_LIMIT$RESOURCE_ATTRIBUTES_PACKAGE_VERSIONS)STACK_INFO_KEYS)ReadableSpanDicttruncate_stringpasswordpasswd	mysql_pwdsecretzauth(?!ors?\b)
credentialzprivate[._ -]?keyzapi[._ -]?keysessioncookiezsocial[._ -]?securityzcredit[._ -]?cardzlogfire[._ -]?tokenc                 C  s   g | ]}d | d qS )z(?:\b|_) ).0acronymr(   r(   a/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/logfire/_internal/scrubbing.py
<listcomp>1   s    
r,   )csrfxsrfjwtssnztuple[str | int, ...]ztyping_extensions.TypeAliasJsonPathc                   @  s.   e Zd ZU dZded< 	 ded< 	 ded< dS )	
ScrubMatchz`An object passed to a [`ScrubbingOptions.callback`][logfire.ScrubbingOptions.callback] function.r1   pathr   valuezre.Match[str]pattern_matchN)__name__
__module____qualname____doc____annotations__r(   r(   r(   r+   r2   A   s   
 r2   c                   @  s   e Zd ZU ded< ded< dS )ScrubbedNoter1   r3   strmatched_substringN)r6   r7   r8   r:   r(   r(   r(   r+   r;   U   s   
 r;   c                   @  s,   e Zd ZU dZdZded< 	 dZded< dS )ScrubbingOptionsz%Options for redacting sensitive data.NScrubCallback | NonecallbackSequence[str] | Noneextra_patterns)r6   r7   r8   r9   r@   r:   rB   r(   r(   r(   r+   r>   Z   s   
 r>   c                   @  s   e Zd Zh eeeeeee	e
eeeeeddddddddd	d
ddddddddddddddddddddZed0d!d"Zed1d&d'Zed2d-d.Zd/S )3BaseScrubberzexception.stacktracezexception.typezexception.messagez
error.typezhttp.methodzhttp.status_codezhttp.schemezhttp.urlzhttp.targetz
http.routezdb.statementzdb.planzfastapi.route.namezfastapi.route.operation_idzurl.fullzurl.pathz	url.queryz
event.nameagent_session_iddo_not_scrubbinary_contentzgen_ai.input.messageszgen_ai.output.messageszgen_ai.system_instructionszpydantic_ai.all_messageszgen_ai.tool.namezgen_ai.tool.call.idz
rpc.methodzgen_ai.systemmodel_request_parametersspanr   c                 C     d S Nr(   selfrH   r(   r(   r+   
scrub_span      zBaseScrubber.scrub_spanlogr   returnc                 C  rI   rJ   r(   rL   rO   r(   r(   r+   	scrub_log   rN   zBaseScrubber.scrub_logr3   r1   r4   r   tuple[Any, list[ScrubbedNote]]c                 C  rI   rJ   r(   rL   r3   r4   r(   r(   r+   scrub_value   rN   zBaseScrubber.scrub_valueNrH   r   rO   r   rP   r   r3   r1   r4   r   rP   rS   )r6   r7   r8   r   r   r   r   r   r   r   r   r   r   r   r   r   	SAFE_KEYSr   rM   rR   rU   r(   r(   r(   r+   rC   n   s    	
 !"#$%&'()*+,/rC   c                   @  s*   e Zd ZdddZddd	ZdddZdS )NoopScrubberrH   r   c                 C  rI   rJ   r(   rK   r(   r(   r+   rM      rN   zNoopScrubber.scrub_spanrO   r   rP   c                 C  s   |S rJ   r(   rQ   r(   r(   r+   rR      rN   zNoopScrubber.scrub_logr3   r1   r4   r   rS   c                 C  s   |g fS rJ   r(   rT   r(   r(   r+   rU      s   zNoopScrubber.scrub_valueNrV   rW   rX   )r6   r7   r8   rM   rR   rU   r(   r(   r(   r+   rZ      s    

rZ   c                   @  s:   e Zd ZdZddddZdddZdddZdddZdS )Scrubberz#Redacts potentially sensitive data.NpatternsrA   r@   r?   c                 C  s6   g t |pg }td|tjtjB | _|| _d S )N|)DEFAULT_PATTERNSrecompilejoin
IGNORECASEDOTALL_pattern	_callback)rL   r\   r@   r(   r(   r+   __init__   s   
zScrubber.__init__rO   r   rP   c                 C  s   t | }||S rJ   )SpanScrubberrR   )rL   rO   span_scrubberr(   r(   r+   rR      s   
zScrubber.scrub_logrH   r   c                 C  s   |d }|r|j dv rd S t| }|| |jrO|d }td|td}z
tdt|}W n tj	y<   g }Y nw i |tt
||j i|d< d S d S )Ninstrumentation_scope)zlogfire.openaizlogfire.anthropic
attributesr<   z[]zlist[ScrubbedNote])namerg   rM   scrubbedr   getr   jsonloadsJSONDecodeErrordumps)rL   rH   scoperh   rj   already_scrubbedr(   r(   r+   rM      s&   
zScrubber.scrub_spanr3   r1   r4   r   rS   c                 C  s   t | }|||}||jfS rJ   )rg   scrubrl   )rL   r3   r4   rh   resultr(   r(   r+   rU      s   
zScrubber.scrub_valuerJ   )r\   rA   r@   r?   rW   rV   rX   )r6   r7   r8   r9   rf   rR   rM   rU   r(   r(   r(   r+   r[      s    

r[   c                   @  sL   e Zd ZdZd ddZd!dd	Zd"ddZd#ddZd$ddZd%ddZ	dS )&rg   zDoes the actual scrubbing work.

    This class is separate from Scrubber so that it can be instantiated more regularly
    and hold and mutate state about the span being scrubbed, specifically the scrubbed notes.
    parentr[   c                 C  s    |j | _ |j| _g | _d| _d S )NF)rd   re   rl   	did_scrub)rL   rv   r(   r(   r+   rf      s   
zSpanScrubber.__init__rH   r   c                   sd     d|d } jrt|d|d<  fddt|d D |d<  fddt|d D |d< d S )Nrj   rj   c              	     s0   g | ]\}}t |jt ||d |jdqS )rx   )rk   rj   	timestamp)r   rk   r   scrub_event_attributesry   )r)   ieventrL   r(   r+   r,      s    z+SpanScrubber.scrub_span.<locals>.<listcomp>eventsc              
     s4   g | ]\}}t |jt d |df|jddqS )linksrj   rx   )contextrj   )r   r   r   rt   rj   )r)   r{   linkr}   r(   r+   r,      s    r   )rt   rw   r   	enumerate)rL   rH   new_attributesr(   r}   r+   rM      s   





zSpanScrubber.scrub_spanrO   r   rP   c                 C  sd   |  d|j}|  d|j}| js|S | jr"|pi }t| j|t< t|}t	|d|_||_|S )Nrx   )log_body)
rt   rj   bodyrw   rl   rn   rq   r   copyr   )rL   rO   r   new_bodyru   r(   r(   r+   rR     s   
zSpanScrubber.scrub_logr|   r   indexintc                 C  s$   |j pi }d|df}| ||}|S )Notel_eventsrj   )rj   rt   )rL   r|   r   rj   r3   r   r(   r(   r+   rz     s   

z#SpanScrubber.scrub_event_attributesr3   r1   r4   r   c              	     sT  t |tr?j| }r=| dt|fkr|S zt|}W n tjy3   	t
 || Y S w t |S |S t |trS fddttd|D S t |tri }td| D ]D\}}|tjv ro|||< qaj| }r	t
 |f ||}t |trt |trt |ts|g}|||< qa |f |||< qa|S |S )a  Redacts sensitive data from `value`, recursing into nested sequences and mappings.

        `path` is a list of keys and indices leading to `value` in the span.
        Similar to the truncation code, it should use the field names in the frontend, e.g. `otel_events`.
        r   c                   s"   g | ]\}}  |f |qS r(   )rt   )r)   r{   xr3   rL   r(   r+   r,   2  s   " z&SpanScrubber.scrub.<locals>.<listcomp>zSequence[Any]zMapping[str, Any])
isinstancer<   rd   searchrH   lenrn   ro   rp   _redactr2   rq   rt   r   r   r   r   itemsrC   rY   )rL   r3   r4   matchru   kvredactedr(   r   r+   rt     s4   





zSpanScrubber.scrubr   r2   c                 C  sb   | j r|  | }d ur| jp||ju| _|S d| _|jd}| jt|j|d d|dS )NTr   )r3   r=   z[Scrubbed due to ])	re   rw   r4   r5   grouprl   appendr;   r3   )rL   r   ru   r=   r(   r(   r+   r   B  s   zSpanScrubber._redactN)rv   r[   rV   rW   )r|   r   r   r   )r3   r1   r4   r   rP   r   )r   r2   rP   r   )
r6   r7   r8   r9   rf   rM   rR   rz   rt   r   r(   r(   r(   r+   rg      s    




#rg   c                   @  s8   e Zd ZdZdddZdddZdddZdddZdS )MessageValueCleanera~  Scrubs and truncates formatted field values to be included in the message attribute.

    Use to construct the message for a single span, e.g:

        cleaner = MessageValueCleaner(scrubber, check_keys=...)
        message_parts = [cleaner.clean_value(field_name, str(value)) for field_name, value in fields]
        message = <construct from message parts>
        attributes = {**other_attributes, **cleaner.extra_attrs(), ATTRIBUTES_MESSAGE_KEY: message}

    check_keys determines whether the key should be accounted for in scrubbing.
    Set to False if the user explicitly provided the key, e.g. `logfire.info(f'... {password} ...')`
    means that the password is clearly expected to be logged.
    The password will therefore not be scrubbed here and will appear in the message.
    However it may still be scrubbed out of the attributes, just because that process is independent.
    scrubberrC   
check_keysboolc                C  s   || _ g | _|| _d S rJ   )r   rl   r   )rL   r   r   r(   r(   r+   rf   ]  s   
zMessageValueCleaner.__init__
field_namer<   r4   rP   c                 C  s^   || j jvr*| jr| j d||i\}}|| }n| j d|f|\}}| j| | |S )N)messager   )r   rY   r   rU   rl   extendtruncate)rL   r   r4   scrubbed_valuescrubbed_notesr(   r(   r+   clean_valueb  s   

zMessageValueCleaner.clean_valuec                 C  s   t |tdS )N)
max_length)r    r   )rL   r4   r(   r(   r+   r   r  s   zMessageValueCleaner.truncatedict[str, Any]c                 C  s   | j rtt| j iS i S rJ   )rl   r   rn   rq   r}   r(   r(   r+   extra_attrsu  s   zMessageValueCleaner.extra_attrsN)r   rC   r   r   )r   r<   r4   r<   rP   r<   )r4   r<   rP   r<   )rP   r   )r6   r7   r8   r9   rf   r   r   r   r(   r(   r(   r+   r   L  s    


r   );
__future__r   r   rn   r_   abcr   r   collections.abcr   r   dataclassesr   typingr   r	   r
   r   typing_extensionsopentelemetry.attributesr   opentelemetry.sdk._logsr   opentelemetry.sdk.tracer   opentelemetry.tracer   	constantsr   r   r   r   r   r   r   r   r   r   r   r   r   
stack_infor   utilsr   r    r^   r1   r:   r2   ScrubCallbackr;   r>   rC   rZ   NOOP_SCRUBBERr[   rg   r   r(   r(   r(   r+   <module>   s^    <<&n