Commit 9dff5ce7 authored by Tim Graham's avatar Tim Graham
Browse files

Fixed #23593 -- Fixed crash in AdminEmailHandler with non-ASCII characters in request.

Thanks edevil for the report and Simon Charette for review.
parent 6f6e7d01
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
from __future__ import unicode_literals

import logging
import sys
import warnings
@@ -6,6 +8,7 @@ from django.conf import settings
from django.core import mail
from django.core.mail import get_connection
from django.utils.deprecation import RemovedInNextVersionWarning
from django.utils.encoding import force_text
from django.utils.module_loading import import_string
from django.views.debug import ExceptionReporter, get_exception_reporter_filter

@@ -106,7 +109,7 @@ class AdminEmailHandler(logging.Handler):
                record.getMessage()
            )
            filter = get_exception_reporter_filter(request)
            request_repr = '\n{0}'.format(filter.get_request_repr(request))
            request_repr = '\n{0}'.format(force_text(filter.get_request_repr(request)))
        except Exception:
            subject = '%s: %s' % (
                record.levelname,
+3 −0
Original line number Diff line number Diff line
@@ -97,3 +97,6 @@ Bugfixes
  possible to import arbitrary packages from the Python path. This was not
  considered a security issue because ``admindocs`` is only accessible to staff
  users (:ticket:`23601`).

* Fixed ``UnicodeDecodeError`` crash in ``AdminEmailHandler`` with non-ASCII
  characters in the request (:ticket:`23593`).
+21 −0
Original line number Diff line number Diff line
# -*- coding:utf-8 -*-
from __future__ import unicode_literals

import logging
@@ -320,6 +321,26 @@ class AdminEmailHandlerTest(TestCase):
            mail.mail_admins = orig_mail_admins
            admin_email_handler.email_backend = orig_email_backend

    @override_settings(
        ADMINS=(('whatever admin', 'admin@example.com'),),
    )
    def test_emit_non_ascii(self):
        """
        #23593 - AdminEmailHandler should allow Unicode characters in the
        request.
        """
        handler = self.get_admin_email_handler(self.logger)
        record = self.logger.makeRecord('name', logging.ERROR, 'function', 'lno', 'message', None, None)
        rf = RequestFactory()
        url_path = ''
        record.request = rf.get(url_path)
        handler.emit(record)
        self.assertEqual(len(mail.outbox), 1)
        msg = mail.outbox[0]
        self.assertEqual(msg.to, ['admin@example.com'])
        self.assertEqual(msg.subject, "[Django] ERROR (EXTERNAL IP): message")
        self.assertIn("path:%s" % url_path, msg.body)


class SettingsConfigTest(AdminScriptTestCase):
    """