konova/konova/utils/exception_reporter.py
mpeltriaux 38b81996ed # ExceptionReporter adjustment
* extends the KonovaExceptionReporter to hold POST body content (practical for debugging broken content on API)
2025-12-17 14:02:08 +01:00

88 lines
2.4 KiB
Python

"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 11.12.23
"""
import json
from json import JSONDecodeError
from django.views.debug import ExceptionReporter
class KonovaExceptionReporter(ExceptionReporter):
""" Custom exception reporter class
Adapts the base functionality of ExceptionReporter but adds whitelist filtering to prevent sensitive data
to be exploitable via mail delivery.
References:
https://docs.djangoproject.com/en/4.2/ref/logging/#handlers
"""
def _filter_traceback_data(self, tb_data: dict):
""" Filters given traceback data according to whitelist
Args:
tb_data (dict): Aggregates traceback data
Returns:
clean_data (dict): Whitelist based filtered traceback data
"""
whitelist = [
"is_email",
"unicdoe_hint",
"frames",
"request",
"user_str",
"sys_executable",
"sys_version_info",
"raising_view_name",
"exception_type",
"exception_value",
"filtered_GET_items",
"filtered_POST_items",
]
clean_data = dict()
for entry in whitelist:
try:
clean_data[entry] = tb_data[entry]
except KeyError:
continue
return clean_data
def get_traceback_data(self):
""" Custom traceback data aggregation
Returns:
tb_data (dict): The traceback data
"""
tb_data = super().get_traceback_data()
return_data = tb_data
if self.is_email:
filtered_data = dict()
filtered_data.update(self._filter_traceback_data(tb_data))
filtered_data.update(self._filter_POST_body(tb_data))
return_data = filtered_data
return return_data
def _filter_POST_body(self, tb_data: dict):
""" Filters POST body from traceback data
"""
post_data = tb_data.get("request", None)
if post_data:
post_data = post_data.body
try:
post_data = json.loads(post_data)
except JSONDecodeError:
pass
post_data = {
"filtered_POST_items": [
("body", post_data),
]
}
return post_data