§
    xÅjÀ,  ã                   ó:  — d Z ddlZddlmZmZmZmZmZmZm	Z	m
Z
 ddlmZmZ ddlmZ erddlmZmZmZmZmZ g d¢ZdZd	Zg d
¢Zd-dedddefd„Zdeddddfd„Zef	 	 	 	 	 	 	 d.d„Zdedededdfd„Z	 	 	 	 d/d"„Z	 	 	 	 d0d$„Z 	 	 	 	 d1d&„Z!d2d(„Z"	 	 	 	 d3d*„Z#d4d,„Z$dS )5a*  
Data Collection configuration.

Implements the ``data_collection`` client option described in the Sentry SDK
"Data Collection" spec
(https://develop.sentry.dev/sdk/foundations/client/data-collection/).

``data_collection`` supersedes the single ``send_default_pii`` boolean with a
structured configuration that lets users enable or restrict automatically
collected data by category (user identity, cookies, HTTP headers, URL query params,
HTTP bodies, generative AI inputs/outputs, stack frame variables, source
context).

Resolution precedence (see :func:`_resolve_data_collection`):

* ``data_collection`` set, ``send_default_pii`` unset -> honour ``data_collection``
  using the spec defaults for any omitted field.
* ``send_default_pii`` set, ``data_collection`` unset -> derive a
  resolved ``DataCollection`` that mirrors what ``send_default_pii`` collects today.
* neither set -> treated as ``send_default_pii=False``.
* both set -> ``data_collection`` wins (it is the single source of truth); a
  ``DeprecationWarning`` is emitted for ``send_default_pii``.
é    N)ÚTYPE_CHECKINGÚAnyÚDictÚListÚMappingÚOptionalÚUnionÚcast)Úparse_qsÚ	urlencode)ÚSENSITIVE_DATA_SUBSTITUTE)ÚDataCollectionÚGenAICollectionBehaviourÚGraphQLCollectionBehaviourÚHttpHeadersCollectionBehaviourÚKeyValueCollectionBehaviour)Úincoming_requestÚoutgoing_requestÚoutgoing_responseé   )ÚoffÚdenylistÚ	allowlist)ÚauthÚtokenÚsecretÚpasswordÚpasswdÚpwdÚkeyÚjwtÚbearerÚssoÚsamlÚcsrfÚxsrfÚcredentialsÚsessionÚsidÚidentityr    Úextra_termszOptional[List[str]]Úreturnc                 ó”   — |                       ¦   «         }t          D ]	}||v r dS Œ
|r |D ]}|r|                      ¦   «         |v r dS ŒdS )zü
    Return whether ``key`` matches the sensitive denylist using a partial,
    case-insensitive substring match.

    :param extra_terms: additional deny terms (e.g. user-provided) to consider
        alongside the built-in `_SENSITIVE_DENYLIST`.
    TF)ÚlowerÚ_SENSITIVE_DENYLIST)r    r+   ÚloweredÚterms       úKC:\Projects\Historical\venv\Lib\site-packages\sentry_sdk/data_collection.pyÚ_is_sensitive_keyr3   R   ss   € ð �iŠi‰kŒk€GÝ#ð ð ˆØ�7ˆ?ˆ?Ø�4�4ð àð Øð 	ð 	ˆDØð ˜Ÿ
š
™œ¨Ð/Ð/Ø�t�tøØˆ5ó    Úquery_stringÚ	behaviourr   zUnion[str, None]c                 óp   — t          | d¬¦  «        }t          ||¬¦  «        }|rt          |d¬¦  «        S d S )NT)Úkeep_blank_values)Úitemsr6   )Údoseq)r   Ú%_apply_key_value_collection_filteringr   )r5   r6   Ú	parsed_qsÚfiltered_qss       r2   Ú0_apply_data_collection_filtering_to_query_stringr>   e   sQ   € õ ˜¸Ð>Ñ>Ô>€IÝ7Ø 9ðñ ô €Kð ð 2Ý˜¨DÐ1Ñ1Ô1Ð1àˆ4r4   r9   úMapping[str, Any]Ú
substituter   úDict[str, Any]c                 ó"  ‡— |d         dk    ri S i }|d         dk    r’|                       ¦   «         D ]{\  }}d}t          |t          ¦  «        rC|                     ¦   «         Št	          ˆfd„|                     dg ¦  «        D ¦   «         ¦  «        }|rt          |¦  «        s|||<   Œv|||<   Œ||S |                       ¦   «         D ]J\  }}t          |t          ¦  «        r+t          ||                     dg ¦  «        ¬¦  «        r|||<   ŒE|||<   ŒK|S )NÚmoder   r   Fc              3   óH   •K  — | ]}|o|                      ¦   «         ‰v V — Œd S ©N)r.   )Ú.0r1   r0   s     €r2   ú	<genexpr>z8_apply_key_value_collection_filtering.<locals>.<genexpr>„   sI   øè è € ð !ð !àð Ð4˜TŸZšZ™\œ\¨WÐ4ð!ð !ð !ð !ð !ð !r4   Úterms)r    r+   )r9   Ú
isinstanceÚstrr.   ÚanyÚgetr3   )r9   r6   r@   Úresultr    ÚvalueÚ
is_allowedr0   s          @r2   r;   r;   t   s\  ø€ ð �Ô˜EÒ!Ð!Øˆ	à!€Fà�Ô˜KÒ'Ð'ØŸ+š+™-œ-ð 	)ð 	)‰JˆC�ØˆJÝ˜#�sÑ#Ô#ð ØŸ)š)™+œ+�Ý ð !ð !ð !ð !à )§¢¨g°rÑ :Ô :ð!ñ !ô !ñ ô �
ð ð )Õ"3°CÑ"8Ô"8ð )Ø#��s‘�à(��s‘�Øˆð —k’k‘m”mð  ð  ‰
ˆˆUÝ�c�3ÑÔð 	 Õ$5Ø §¢¨w¸Ñ!;Ô!;ð%
ñ %
ô %
ð 	 ð %ˆF�3‰KˆKàˆF�3‰KˆKØ€Mr4   Úsend_default_piiÚinclude_local_variablesÚinclude_source_contextr   c                 óˆ   — | rg ng d¢}d| d|dœdd|dœit          t          ¦  «        d|dœ| | dœ| | dœ| | ||rt          ndd	œS )
zµ
    Build a fully-resolved ``DataCollection`` dict that mirrors the data
    ``send_default_pii`` collects today. Used when ``data_collection`` is not
    provided explicitly.
    )Ú	forwardedz-ipzremote-Úviaz-userFr   )rC   rH   Úrequest©ÚdocumentÚ	variables©ÚinputsÚoutputsr   ©Úprovided_by_userÚ	user_infoÚcookiesÚhttp_headersÚhttp_bodiesÚurl_query_paramsÚgraphqlÚgen_aiÚdatabase_query_dataÚqueuesÚstack_frame_variablesÚframe_context_lines)ÚlistÚ_ALL_HTTP_BODY_TYPESÚ_DEFAULT_FRAME_CONTEXT_LINES)rP   rQ   rR   rH   s       r2   Ú_map_from_send_default_piirm   ™   s—   € ð #ÐWˆBˆBÐ(WÐ(WÐ(W€Eð "Ø%Ø&°Ð7Ð7ð  
°UÐ;Ð;ð
õ
 Õ0Ñ1Ô1Ø%/¸%Ð@Ð@Ø 0Ð?OÐPÐPØ-Ð:JÐKÐKØ/Ø"Ø!8à,BÐIÕ(Ð(Èð'ð ð r4   Údúdict[str, Any]c                 óÆ  — |                       d¦  «        }|€t          }nKt          |t          ¦  «        r|rt          nd}n*t          |t          ¦  «        r|dk     rt          d¦  «        ‚|                       dd¦  «        }t          |t          ¦  «        rt          |¦  «        nt          |¦  «        }|                       d¦  «        }|�t          |¦  «        nt          t          ¦  «        }d|                       dd¦  «        t          |                       d	¦  «        pi ¦  «        t          |                       d
¦  «        pi ¦  «        |t          |                       d¦  «        pi ¦  «        t          |                       d¦  «        pi ¦  «        t          |                       d¦  «        pi ¦  «        |                       dd¦  «        |                       dd¦  «        ||dœS )z±
    Build a fully-resolved ``DataCollection`` from a user-supplied
    ``data_collection`` dict, filling in spec defaults for any omitted or
    partially-specified field.
    ri   Nr   z:Invalid `frame_context_lines` value: Must be 0 or greater.rh   Trb   r_   r`   ra   rc   rd   re   rf   rg   r]   )rL   rl   rI   ÚboolÚintÚ
ValueErrorÚdictÚ_kvcb_from_valuerj   rk   Ú_http_headers_from_valueÚ_graphql_from_valueÚ_gen_ai_from_value)rn   ri   Úraw_stack_frame_variablesrh   rb   s        r2   Ú_resolve_explicitrz   ¾   sß  € ð Ÿ%š%Ð 5Ñ6Ô6ÐØÐ"Ý:ÐÐÝ	Ð'­Ñ	.Ô	.ð Ø>QÐXÕ:Ð:ÐWXÐÐåÐ-­sÑ3Ô3ð 	Ð7JÈQÒ7NÐ7NÝØLñô ð ð !"§¢Ð&=¸tÑ DÔ DÐõ
 Ð/µÑ6Ô6ð	-ÕÐ2Ñ3Ô3Ð3åÐ+Ñ,Ô,ð ð —%’%˜Ñ&Ô&€Kà(Ð4�ˆ[ÑÔÐ½$Õ?SÑ:TÔ:Tð ð
 !Ø—U’U˜;¨Ñ-Ô-Ý# A§E¢E¨)Ñ$4Ô$4Ð$:¸Ñ;Ô;Ý0°·²°~Ñ1FÔ1FÐ1LÈ"ÑMÔMØ"Ý,¨Q¯UªUÐ3EÑ-FÔ-FÐ-LÈ"ÑMÔMÝ& q§u¢u¨YÑ'7Ô'7Ð'=¸2Ñ>Ô>Ý$ Q§U¢U¨8¡_¤_Ð%:¸Ñ;Ô;Ø ŸušuÐ%:¸DÑAÔAØ—%’%˜ $Ñ'Ô'Ø!6Ø2ðð ð r4   Úvalc                 ó  — |                       dd¦  «        }|                       dd ¦  «        }|t          vr(t          d                     |t          ¦  «        ¦  «        ‚d|i}|�t	          |¦  «        |d<   t          d|¦  «        S )NrC   r   rH   z0Invalid collection mode {!r}. Must be one of {}.r   )rL   Ú+_VALID_KEY_VALUE_COLLECTION_BEHAVIOUR_MODESrs   Úformatrj   r
   )r{   rC   rH   r6   s       r2   ru   ru   ð   s“   € ð �7Š7�6˜:Ñ&Ô&€DØ�GŠG�G˜TÑ"Ô"€EàÕ>Ð>Ð>ÝØ>×EÒEØÕAñô ñ
ô 
ð 	
ð $*¨4 .€IØÐÝ! %™[œ[ˆ	�'ÑÝÐ-¨yÑ9Ô9Ð9r4   r   c                 óZ   — dd| v rt          | d         ¦  «        nt          ddi¦  «        iS )NrV   rC   r   )ru   ©r{   s    r2   rv   rv     s@   € ð 	à˜CÐÐõ ˜S œ^Ñ,Ô,Ð,å! 6¨:Ð"6Ñ7Ô7ð	ð r4   r   c                 ó\   — |                       dd¦  «        |                       dd¦  «        dœS )Nr[   Tr\   rZ   ©rL   r€   s    r2   rx   rx     s3   € à—'’'˜( DÑ)Ô)Ø—7’7˜9 dÑ+Ô+ðð ð r4   r   c                 ó\   — |                       dd¦  «        |                       dd¦  «        dœS )NrX   TrY   rW   r‚   r€   s    r2   rw   rw     s5   € ð —G’G˜J¨Ñ-Ô-Ø—W’W˜[¨$Ñ/Ô/ðð ð r4   Úoptionsc                 ó¾  — |                       d¦  «        }|€)|                       di ¦  «                              d¦  «        }|                       d¦  «        }|                       d¦  «        �"t          |                       d¦  «        ¦  «        nd}|                       d¦  «        �"t          |                       d¦  «        ¦  «        nd}|�vt          |t          ¦  «        s4t	          d                     t          |¦  «        j        ¦  «        ¦  «        ‚|�t          j	        d	t          d
¬¦  «         t          |¦  «        S t          t          |¦  «        ||¬¦  «        S )a8  
    Resolve the effective ``DataCollection`` dict from client ``options``.

    Reads ``data_collection``, ``send_default_pii``, ``include_local_variables``
    and ``include_source_context`` and returns a fully-resolved dict with
    concrete values for every field.

    ``data_collection`` must be a plain ``dict``.

    Must be called exactly once per options dict, before ``client._get_options``
    overwrites ``options["data_collection"]`` with the resolved result. Feeding an
    already-resolved dict back in would flip ``provided_by_user`` to ``True``.
    Údata_collectionNÚ_experimentsrP   rQ   TrR   z+`data_collection` must be a dict, got {!r}.zK`send_default_pii` is deprecated and ignored when `data_collection` is set.é   )Ú
stacklevel)rP   rQ   rR   )rL   rq   rI   rt   Ú	TypeErrorr~   ÚtypeÚ__name__ÚwarningsÚwarnÚDeprecationWarningrz   rm   )r„   Úuser_dcrP   rQ   rR   s        r2   Ú_resolve_data_collectionr‘     s}  € ð �kŠkÐ+Ñ,Ô,€GØ€Ø—+’+˜n¨bÑ1Ô1×5Ò5Ð6GÑHÔHˆà—{’{Ð#5Ñ6Ô6Ðð �;Š;Ð0Ñ1Ô1Ð=õ 	ˆW�[Š[Ð2Ñ3Ô3Ñ4Ô4Ð4àð ð �;Š;Ð/Ñ0Ô0Ð<õ 	ˆW�[Š[Ð1Ñ2Ô2Ñ3Ô3Ð3àð ð ÐÝ˜'¥4Ñ(Ô(ð 	ÝØ=×DÒDÝ˜‘M”MÔ*ñô ñô ð ð
 Ð'ÝŒMð,å"Øð	ñ ô ð õ !Øñ
ô 
ð 	
õ &ÝÐ.Ñ/Ô/Ø 7Ø5ðñ ô ð r4   rE   )r9   r?   r6   r   r@   r   r,   rA   )rn   ro   r,   r   )r{   ro   r,   r   )r{   ro   r,   r   )r{   ro   r,   r   )r{   ro   r,   r   )r„   rA   r,   r   )%Ú__doc__r�   Útypingr   r   r   r   r   r   r	   r
   Úurllib.parser   r   Úsentry_sdk._typesr   r   r   r   r   r   rk   rl   r}   r/   rJ   rq   r3   r>   r;   rm   rz   ru   rv   rx   rw   r‘   © r4   r2   ú<module>r—      sœ  ððð ð0 €€€Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à 7Ð 7Ð 7Ð 7Ð 7Ð 7àð ðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð Ð ð  !Ð ð
 /OÐ +ð
ð ð Ð ð*ð ˜3ð Ð-Bð Èdð ð ð ð ð&Øðà,ðð ðð ð ð ð$ 2ð"Øð"à,ð"ð ð"ð ð	"ð "ð "ð "ðJ"àð"ð "ð"ð !ð	"ð
 ð"ð "ð "ð "ðJ/Øð/àð/ð /ð /ð /ðd:Ø	ð:à"ð:ð :ð :ð :ð&	Ø	ð	à%ð	ð 	ð 	ð 	ðð ð ð ðØ	ðà!ðð ð ð ð5ð 5ð 5ð 5ð 5ð 5r4   