Skip to content

Commit

Permalink
Cherry-pick: Fixes #7966: Fix Sentry report corruption by SentryScrubber
Browse files Browse the repository at this point in the history
  • Loading branch information
kozlovsky committed Apr 18, 2024
1 parent 54939b7 commit e41c634
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 16 deletions.
9 changes: 7 additions & 2 deletions src/tribler/core/sentry_reporter/sentry_scrubber.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,17 +172,22 @@ def scrub_entity_recursively(self, entity: Union[str, Dict, List, Any], depth=10
if isinstance(entity, dict):
result = {}
for key, value in entity.items():
if key in self.dict_keys_for_scrub:
if key in self.dict_keys_for_scrub and isinstance(value, str):
value = value.strip()
fake_value = obfuscate_string(value)
placeholder = self.create_placeholder(fake_value)
self.add_sensitive_pair(value, placeholder)
result[key] = self.scrub_entity_recursively(value, depth)
result[key] = placeholder
else:
result[key] = self.scrub_entity_recursively(value, depth)
return result

return entity

def add_sensitive_pair(self, text, placeholder):
if not (text and text.strip()): # We should not replace empty substrings in the middle of other strings
return

if text in self.sensitive_occurrences:
return

Expand Down
3 changes: 0 additions & 3 deletions src/tribler/core/sentry_reporter/sentry_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,9 +200,6 @@ def obfuscate_string(s: str, part_of_speech: str = 'noun') -> str:
The same random words will be generated for the same given strings.
"""
if not s:
return s

faker = Faker(locale='en_US')
faker.seed_instance(s)
return faker.word(part_of_speech=part_of_speech)
23 changes: 14 additions & 9 deletions src/tribler/core/sentry_reporter/tests/test_sentry_scrubber.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,16 +213,16 @@ def test_scrub_event(scrubber):
}
assert scrubber.scrub_event(event) == {
'the very first item': '<highlight>',
'server_name': '<protection>',
'server_name': '<kid>',
CONTEXTS: {
REPORTER: {
'any': {
'USERNAME': '<father>',
'USERNAME': '<conference>',
'USERDOMAIN_ROAMINGPROFILE': '<protection>',
'PATH': '/users/<highlight>/apps',
'TMP_WIN': 'C:\\Users\\<restaurant>\\AppData\\Local\\Temp',
'USERDOMAIN': '<marriage>',
'COMPUTERNAME': '<message>',
'USERDOMAIN': '<tune>',
'COMPUTERNAME': '<lady>',
},
STACKTRACE: [
'Traceback (most recent call last):',
Expand Down Expand Up @@ -301,15 +301,20 @@ def test_scrub_dict(scrubber):
assert scrubber.scrub_entity_recursively(None) is None
assert scrubber.scrub_entity_recursively({}) == {}

given = {'PATH': '/home/username/some/', 'USERDOMAIN': 'UD', 'USERNAME': 'U', 'REPEATED': 'user username UD U'}
assert scrubber.scrub_entity_recursively({'key': [1]}) == {'key': [1]} # non-string values should not lead to error

given = {'PATH': '/home/username/some/', 'USERDOMAIN': 'UD', 'USERNAME': 'U', 'REPEATED': 'user username UD U',
'key': ''}
assert scrubber.scrub_entity_recursively(given) == {'PATH': '/home/<highlight>/some/',
'REPEATED': 'user <highlight> <school> <night>',
'USERDOMAIN': '<school>',
'USERNAME': '<night>'}
'USERNAME': '<night>',
'key': '<dress>'}

assert 'username' in scrubber.sensitive_occurrences.keys()
assert 'UD' in scrubber.sensitive_occurrences.keys()
assert 'U' in scrubber.sensitive_occurrences.keys()
assert 'username' in scrubber.sensitive_occurrences
assert 'UD' in scrubber.sensitive_occurrences
assert 'U' in scrubber.sensitive_occurrences
assert '' not in scrubber.sensitive_occurrences


def test_scrub_list(scrubber):
Expand Down
3 changes: 1 addition & 2 deletions src/tribler/core/sentry_reporter/tests/test_sentry_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,7 @@ def test_extract_dict():


OBFUSCATED_STRINGS = [
(None, None),
('', ''),
('', 'dress'),
('any', 'challenge'),
('string', 'quality'),
]
Expand Down

0 comments on commit e41c634

Please sign in to comment.