Skip to content

Commit 69d2be1

Browse files
ref(scrubber): Add recursive scrubbing to EventScrubber (#2755)
--------- Co-authored-by: Ivana Kellyerova <[email protected]>
1 parent cf2d3c6 commit 69d2be1

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

sentry_sdk/scrubber.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,19 +59,36 @@
5959

6060

6161
class EventScrubber(object):
62-
def __init__(self, denylist=None):
63-
# type: (Optional[List[str]]) -> None
62+
def __init__(self, denylist=None, recursive=False):
63+
# type: (Optional[List[str]], bool) -> None
6464
self.denylist = DEFAULT_DENYLIST if denylist is None else denylist
6565
self.denylist = [x.lower() for x in self.denylist]
66+
self.recursive = recursive
67+
68+
def scrub_list(self, lst):
69+
# type: (List[Any]) -> None
70+
if not isinstance(lst, list):
71+
return
72+
73+
for v in lst:
74+
if isinstance(v, dict):
75+
self.scrub_dict(v)
76+
elif isinstance(v, list):
77+
self.scrub_list(v)
6678

6779
def scrub_dict(self, d):
6880
# type: (Dict[str, Any]) -> None
6981
if not isinstance(d, dict):
7082
return
7183

72-
for k in d.keys():
84+
for k, v in d.items():
7385
if isinstance(k, string_types) and k.lower() in self.denylist:
7486
d[k] = AnnotatedValue.substituted_because_contains_sensitive_data()
87+
elif self.recursive:
88+
if isinstance(v, dict):
89+
self.scrub_dict(v)
90+
elif isinstance(v, list):
91+
self.scrub_list(v)
7592

7693
def scrub_request(self, event):
7794
# type: (Event) -> None

tests/test_scrubber.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,18 @@ def test_scrubbing_doesnt_affect_local_vars(sentry_init, capture_events):
169169
(frame,) = frames
170170
assert frame["vars"]["password"] == "[Filtered]"
171171
assert password == "cat123"
172+
173+
174+
def test_recursive_event_scrubber(sentry_init, capture_events):
175+
sentry_init(event_scrubber=EventScrubber(recursive=True))
176+
events = capture_events()
177+
complex_structure = {
178+
"deep": {
179+
"deeper": [{"deepest": {"password": "my_darkest_secret"}}],
180+
},
181+
}
182+
183+
capture_event({"extra": complex_structure})
184+
185+
(event,) = events
186+
assert event["extra"]["deep"]["deeper"][0]["deepest"]["password"] == "'[Filtered]'"

0 commit comments

Comments
 (0)