def _payload(self): # Fetch the notifier version from the package notifier_version = package_version("bugsnag") or "unknown" filters = self.config.params_filters encoder = SanitizingJSONEncoder(separators=(',', ':'), keyword_filters=filters) # Construct the payload dictionary return encoder.encode({ "apiKey": self.api_key, "notifier": { "name": self.NOTIFIER_NAME, "url": self.NOTIFIER_URL, "version": notifier_version, }, "events": [{ "severity": self.severity, "severityReason": self.severity_reason, "unhandled": self.unhandled, "releaseStage": self.release_stage, "app": { "version": self.app_version, "type": self.app_type, }, "context": self.context, "groupingHash": self.grouping_hash, "exceptions": [{ "errorClass": class_name(self.exception), "message": self.exception, "stacktrace": self.stacktrace, }], "metaData": FilterDict(self.metadata), "user": FilterDict(self.user), "device": FilterDict({ "hostname": self.hostname, "runtimeVersions": self.runtime_versions }), "projectRoot": self.config.project_root, "libRoot": self.config.lib_root, "session": self.session }] })
def test_filter_dict_with_inner_dict(self): """ Test that nested dict uniqueness checks work and are not recycled when a reference to a nested dict goes out of scope """ data = { 'level1-key1': { 'level2-key1': FilterDict({ 'level3-key1': { 'level4-key1': 'level4-value1' }, 'level3-key4': { 'level4-key3': 'level4-value3' }, }), 'level2-key2': FilterDict({ 'level3-key2': 'level3-value1', 'level3-key3': { 'level4-key2': 'level4-value2' }, 'level3-key5': { 'level4-key4': 'level4-value4' }, }), } } encoder = SanitizingJSONEncoder(keyword_filters=['password']) sane_data = json.loads(encoder.encode(data)) self.assertEqual( sane_data, { 'level1-key1': { 'level2-key1': { 'level3-key1': { 'level4-key1': 'level4-value1' }, 'level3-key4': { 'level4-key3': 'level4-value3' } }, 'level2-key2': { 'level3-key2': 'level3-value1', 'level3-key3': { 'level4-key2': 'level4-value2' }, 'level3-key5': { 'level4-key4': 'level4-value4' }, }, } })
def test_filter_dict(self): data = FilterDict({"metadata": {"another_password": "******"}}) encoder = SanitizingJSONEncoder(keyword_filters=["password"]) sane_data = encoder.filter_string_values(data) self.assertEqual(sane_data, {"metadata": { "another_password": "******" }})
def test_sanitize_nested_object_filters(self): data = FilterDict({"metadata": {"another_password": "******"}}) encoder = SanitizingJSONEncoder(keyword_filters=["password"]) sane_data = json.loads(encoder.encode(data)) self.assertEqual(sane_data, {"metadata": { "another_password": "******" }})
def test_decode_bytes(self): if not is_py3: return data = FilterDict({b"metadata": "value"}) encoder = SanitizingJSONEncoder(keyword_filters=["password"]) sane_data = json.loads(encoder.encode(data)) self.assertEqual(sane_data, {"metadata": "value"})
def test_sanitize_list(self): data = FilterDict({"list": ["carrots", "apples", "peas"], "passwords": ["abc", "def"]}) encoder = SanitizingJSONEncoder(keyword_filters=["credit_card", "passwords"]) sane_data = json.loads(encoder.encode(data)) self.assertEqual(sane_data, {"list": ["carrots", "apples", "peas"], "passwords": "[FILTERED]"})
def test_encode_filters(self): data = FilterDict({"credit_card": "123213213123", "password": "******", "cake": True}) encoder = SanitizingJSONEncoder(keyword_filters=["credit_card", "password"]) sane_data = json.loads(encoder.encode(data)) self.assertEqual(sane_data, {"credit_card": "[FILTERED]", "password": "******", "cake": True})
def _payload(self): # Fetch the notifier version from the package notifier_version = package_version("bugsnag") or "unknown" # Construct the payload dictionary filters = self.config.params_filters encoder = SanitizingJSONEncoder(separators=(',', ':'), keyword_filters=filters) return encoder.encode({ "apiKey": self.api_key, "notifier": { "name": self.NOTIFIER_NAME, "url": self.NOTIFIER_URL, "version": notifier_version, }, "events": [{ "payloadVersion": self.PAYLOAD_VERSION, "severity": self.severity, "releaseStage": self.release_stage, "appVersion": self.app_version, "context": self.context, "groupingHash": self.grouping_hash, "exceptions": [{ "errorClass": class_name(self.exception), "message": self.exception, "stacktrace": self.stacktrace, }], "metaData": FilterDict(self.meta_data), "user": self.user, "device": { "hostname": self.hostname }, "projectRoot": self.config.get("project_root"), "libRoot": self.config.get("lib_root") }] })
def __deliver(self, sessions: List[Dict]): if not sessions: bugsnag.logger.debug("No sessions to deliver") return if not self.config.api_key: bugsnag.logger.debug("Not delivering due to an invalid api_key") return if not self.config.should_notify(): bugsnag.logger.debug("Not delivering due to release_stages") return notifier_version = package_version('bugsnag') or 'unknown' payload = { 'notifier': { 'name': Event.NOTIFIER_NAME, 'url': Event.NOTIFIER_URL, 'version': notifier_version }, 'device': FilterDict({ 'hostname': self.config.hostname, 'runtimeVersions': self.config.runtime_versions }), 'app': { 'releaseStage': self.config.release_stage, 'version': self.config.app_version }, 'sessionCounts': sessions } try: filters = self.config.params_filters encoder = SanitizingJSONEncoder(separators=(',', ':'), keyword_filters=filters) encoded_payload = encoder.encode(payload) self.config.delivery.deliver_sessions(self.config, encoded_payload) except Exception as e: bugsnag.logger.exception('Sending sessions failed %s', e)
def test_filter_strings_with_inner_dict(self): """ Test that nested dict uniqueness checks work and are not recycled when a reference to a nested dict goes out of scope """ data = FilterDict({ 'level1-key1': { 'level2-key1': { 'level3-key1': { 'level4-key1': 'level4-value1' }, 'token': 'mypassword', }, 'level2-key2': { 'level3-key3': { 'level4-key2': 'level4-value2' }, 'level3-key4': { 'level4-key3': 'level4-value3' }, 'level3-key5': { 'password': '******' }, 'level3-key6': { 'level4-key4': 'level4-value4' }, 'level3-key7': { 'level4-key4': 'level4-value4' }, 'level3-key8': { 'level4-key4': 'level4-value4' }, 'level3-key9': { 'level4-key4': 'level4-value4' }, 'level3-key0': { 'level4-key4': 'level4-value4' }, }, } }) encoder = SanitizingJSONEncoder(keyword_filters=['password', 'token']) filtered_data = encoder.filter_string_values(data) self.assertEqual( filtered_data, { 'level1-key1': { 'level2-key1': { 'level3-key1': { 'level4-key1': 'level4-value1' }, 'token': '[FILTERED]' }, 'level2-key2': { 'level3-key3': { 'level4-key2': 'level4-value2' }, 'level3-key4': { 'level4-key3': 'level4-value3' }, 'level3-key5': { 'password': '******' }, 'level3-key6': { 'level4-key4': 'level4-value4' }, 'level3-key7': { 'level4-key4': 'level4-value4' }, 'level3-key8': { 'level4-key4': 'level4-value4' }, 'level3-key9': { 'level4-key4': 'level4-value4' }, 'level3-key0': { 'level4-key4': 'level4-value4' }, }, } })