diff -r b758351d191f -r cc9b7e14412b web/lib/django/views/debug.py --- a/web/lib/django/views/debug.py Wed May 19 17:43:59 2010 +0200 +++ b/web/lib/django/views/debug.py Tue May 25 02:43:45 2010 +0200 @@ -1,15 +1,17 @@ +import datetime import os import re import sys -import datetime from django.conf import settings -from django.template import Template, Context, TemplateDoesNotExist +from django.http import HttpResponse, HttpResponseServerError, HttpResponseNotFound +from django.template import (Template, Context, TemplateDoesNotExist, + TemplateSyntaxError) from django.utils.html import escape from django.utils.importlib import import_module -from django.http import HttpResponse, HttpResponseServerError, HttpResponseNotFound from django.utils.encoding import smart_unicode, smart_str + HIDDEN_SETTINGS = re.compile('SECRET|PASSWORD|PROFANITIES_LIST') def linebreak_iter(template_source): @@ -20,15 +22,31 @@ p = template_source.find('\n', p+1) yield len(template_source) + 1 +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 = '********************' + else: + if isinstance(value, dict): + cleansed = dict((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 + return cleansed + def get_safe_settings(): "Returns a dictionary of the settings module, with sensitive settings blurred out." settings_dict = {} for k in dir(settings): if k.isupper(): - if HIDDEN_SETTINGS.search(k): - settings_dict[k] = '********************' - else: - settings_dict[k] = getattr(settings, k) + settings_dict[k] = cleanse_setting(k, getattr(settings, k)) return settings_dict def technical_500_response(request, exc_type, exc_value, tb): @@ -76,11 +94,16 @@ for t in source_list_func(str(self.exc_value))] except (ImportError, AttributeError): template_list = [] + if hasattr(loader, '__class__'): + loader_name = loader.__module__ + '.' + loader.__class__.__name__ + else: + loader_name = loader.__module__ + '.' + loader.__name__ self.loader_debug_info.append({ - 'loader': loader.__module__ + '.' + loader.__name__, + 'loader': loader_name, 'templates': template_list, }) - if settings.TEMPLATE_DEBUG and hasattr(self.exc_value, 'source'): + if (settings.TEMPLATE_DEBUG and hasattr(self.exc_value, 'source') and + isinstance(self.exc_value, TemplateSyntaxError)): self.get_template_exception_info() frames = self.get_traceback_frames() @@ -245,7 +268,7 @@ "Create a technical 404 error response. The exception should be the Http404." try: tried = exception.args[0]['tried'] - except (IndexError, TypeError): + except (IndexError, TypeError, KeyError): tried = [] else: if not tried: @@ -400,6 +423,10 @@ {{ request.build_absolute_uri|escape }} + Django Version: + {{ django_version_info }} + + Exception Type: {{ exception_type }} @@ -809,7 +836,7 @@

Of course, you haven't actually done any work yet. Here's what to do next: