django.utils.log.AdminEmailHandlerdjango
django.views.debug.ExceptionReporter.get_traceback_textapp
HIDDEN_SETTINGS = re.compile('API|TOKEN|KEY|SECRET|PASS|SIGNATURE', flags=re.IGNORECASE)
import functoolsimport reimport sysimport typesfrom pathlib import Pathfrom django.conf import settingsfrom django.http import HttpResponse, HttpResponseNotFoundfrom django.template import Context, Engine, TemplateDoesNotExistfrom django.template.defaultfilters import pprintfrom django.urls import Resolver404, resolvefrom django.utils import timezonefrom django.utils.datastructures import MultiValueDictfrom django.utils.encoding import force_textfrom django.utils.module_loading import import_stringfrom django.utils.version import get_docs_version# Minimal Django templates engine to render the error templates# regardless of the project's TEMPLATES setting. Templates are# read directly from the filesystem so that the error handler# works even if the template loader is broken.DEBUG_ENGINE = Engine( debug=True, libraries={'i18n': 'django.templatetags.i18n'},)HIDDEN_SETTINGS = re.compile('API|TOKEN|KEY|SECRET|PASS|SIGNATURE', flags=re.IGNORECASE)CLEANSED_SUBSTITUTE = '********************'CURRENT_DIR = Path(__file__).parentclass CallableSettingWrapper: """ Object to wrap callable appearing in settings. * Not to call in the debug page (#21345). * Not to break the debug page if the callable forbidding to set attributes (#23070). """ def __init__(self, callable_setting): self._wrapped = callable_setting def __repr__(self): return repr(self._wrapped)def cleanse_setting(key, value): """ Cleanse an individual setting key/value of sensitive content. If the value is a dictionary, recursively cleanse the keys in that dictionary. """ try: if HIDDEN_SETTINGS.search(key): cleansed = CLEANSED_SUBSTITUTE else: if isinstance(value, dict): cleansed = {k: cleanse_setting(k, v) for k, v in value.items()} else: cleansed = value except TypeError: # If the key isn't regex-able, just return as-is. cleansed = value if callable(cleansed): # For fixing #21345 and #23070 cleansed = CallableSettingWrapper(cleansed) return cleanseddef get_safe_settings(): """ Return a dictionary of the settings module with values of sensitive settings replaced with stars (*********). """ settings_dict = {} for k in dir(settings): if k.isupper(): settings_dict[k] = cleanse_setting(k, getattr(settings, k)) return settings_dict