Fixed #23593 -- Fixed crash in AdminEmailHandler with non-ASCII characters in request.
Thanks edevil for the report and Simon Charette for review.
This commit is contained in:
parent
6f6e7d01dc
commit
9dff5ce7c7
|
@ -1,3 +1,5 @@
|
|||
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,
|
||||
|
|
|
@ -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`).
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# -*- 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):
|
||||
"""
|
||||
|
|
Loading…
Reference in New Issue