JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrJFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr 0ipddlmZmZmZddlmZmZmZmZer ddl m Z ddlm Z gdZ gdZ GddZy ) )capture_internal_exceptionsAnnotatedValueiter_event_frames) TYPE_CHECKINGcastListDict)Event)Optional) passwordpasswdsecretapi_keyapikeyauth credentials mysql_pwd privatekey private_keytokensession csrftoken sessionid x_csrftokenx_forwarded_for set_cookiecookie authorization x_api_keyaiohttp_sessionz connect.sid csrf_tokencsrf_csrf _csrf_token PHPSESSID_sessionsymfony user_session_xsrfz XSRF-TOKEN)r x_real_ip ip_address remote_addrcLeZdZ d dZdZdZdZdZdZdZ d Z d Z d Z y) EventScrubberNc|tjn||_|s-|tjn|}|xj|z c_|jDcgc]}|j c}|_||_ycc}w)a  A scrubber that goes through the event payload and removes sensitive data configured through denylists. :param denylist: A security denylist that is always scrubbed, defaults to DEFAULT_DENYLIST. :param recursive: Whether to scrub the event payload recursively, default False. :param send_default_pii: Whether pii is sending is on, pii fields are not scrubbed. :param pii_denylist: The denylist to use for scrubbing when pii is not sent, defaults to DEFAULT_PII_DENYLIST. N)DEFAULT_DENYLISTcopydenylistDEFAULT_PII_DENYLISTlower recursive)selfr2r5send_default_pii pii_denylistxs B/opt/hc_python/lib/python3.12/site-packages/sentry_sdk/scrubber.py__init__zEventScrubber.__init__>st4<3C(--/ /;/C$))+  MM\ )M,0MM:MqM: ";sBcxt|tsy|D]$}|j||j|&y)a* If a list is passed to this method, the method recursively searches the list and any nested lists for any dictionaries. The method calls scrub_dict on all dictionaries it finds. If the parameter passed to this method is not a list, the method does nothing. N) isinstancelist scrub_dict scrub_list)r6lstvs r:r@zEventScrubber.scrub_listUs3#t$ A OOA  OOA c<t|tsy|jD]x\}}t|tr4|j |j vrt j||<J|jsW|j||j|zy)a[ If a dictionary is passed to this method, the method scrubs the dictionary of any sensitive data. The method calls itself recursively on any nested dictionaries ( including dictionaries nested in lists) if self.recursive is True. This method does nothing if the parameter passed to it is not a dictionary. N) r=dictitemsstrr4r2r+substituted_because_contains_sensitive_datar5r?r@)r6dkrBs r:r?zEventScrubber.scrub_dictdss!T" GGIDAq!S!aggi4==&@%QQS!""rCct5d|vrZd|dvr|j|ddd|dvr|j|ddd|dvr|j|dddddy#1swYyxYw)Nrequestheaderscookiesdatarr?r6events r: scrub_requestzEventScrubber.scrub_requestxs ( *E!i 00OOE)$4Y$?@i 00OOE)$4Y$?@U9--OOE)$4V$<=+ * *s AA33A<crt5d|vr|j|ddddy#1swYyxYw)NextrarPrQs r: scrub_extrazEventScrubber.scrub_extras, ( *%g/+ * *-6crt5d|vr|j|ddddy#1swYyxYw)NuserrPrQs r: scrub_userzEventScrubber.scrub_users+ ( *f .+ * *rWct5d|vr@t|dts-d|dvr&|ddD]}d|vs|j|ddddy#1swYyxYw)N breadcrumbsvaluesrO)rr=rr?)r6rRvalues r:scrub_breadcrumbszEventScrubber.scrub_breadcrumbssd ( *%"5#7H E-$88!&}!5h!?!U? OOE&M:"@ + * *s.AAA"ct5t|D]}d|vs|j|d dddy#1swYyxYw)Nvars)rrr?)r6rRframes r: scrub_frameszEventScrubber.scrub_framess: ( **51U?OOE&M22+ * *s ??Act5d|vrEttttt f|dD]}d|vs|j |ddddy#1swYyxYw)NspansrO)rrrr rGobjectr?)r6rRspans r: scrub_spanszEventScrubber.scrub_spanssW ( *% d3;&7!8%.ID~V 5J+ * *s3AAA'c|j||j||j||j||j ||j |y)N)rSrVrZr_rcrhrQs r: scrub_eventzEventScrubber.scrub_eventsT 5!   u% %  rC)NFFN) __name__ __module__ __qualname__r;r@r?rSrVrZr_rcrhrjrCr:r.r.=s7SW#. #( >0 / ;36 rCr.N)sentry_sdk.utilsrrrtypingrrrr sentry_sdk._typesr r r0r3r.rnrCr:rrs= 32'%Nt t rC