diff --git a/ietf/middleware.py b/ietf/middleware.py index 8816fbb69..31b23b960 100644 --- a/ietf/middleware.py +++ b/ietf/middleware.py @@ -1,9 +1,10 @@ # Copyright The IETF Trust 2007, All Rights Reserved from django.db import connection +from django.db.utils import OperationalError from django.shortcuts import render from django.http import HttpResponsePermanentRedirect -from ietf.utils.log import log +from ietf.utils.log import log, exception_components from ietf.utils.mail import log_smtp_exception import re import smtplib @@ -31,6 +32,20 @@ class SMTPExceptionMiddleware(object): {'exception': extype, 'args': value, 'traceback': "".join(tb)} ) return None +class Utf8ExceptionMiddleware(object): + def __init__(self, get_response): + self.get_response = get_response + def __call__(self, request): + return self.get_response(request) + def process_exception(self, request, exception): + if isinstance(exception, OperationalError): + extype, value, tb = exception_components(exception) + if value[0] == 1366: + log("Database 4-byte utf8 exception: %s: %s" % (extype, value)) + return render(request, 'utf8_4byte_failed.html', + {'exception': extype, 'args': value, 'traceback': "".join(tb)} ) + return None + def redirect_trailing_period_middleware(get_response): def redirect_trailing_period(request): response = get_response(request) @@ -53,4 +68,4 @@ def unicode_nfkc_normalization_middleware(get_response): response = get_response(request) return response return unicode_nfkc_normalization - \ No newline at end of file + diff --git a/ietf/settings.py b/ietf/settings.py index 726d666b0..e0c1c1561 100644 --- a/ietf/settings.py +++ b/ietf/settings.py @@ -341,6 +341,7 @@ MIDDLEWARE = ( 'django.middleware.http.ConditionalGetMiddleware', 'ietf.middleware.sql_log_middleware', 'ietf.middleware.SMTPExceptionMiddleware', + 'ietf.middleware.Utf8ExceptionMiddleware', 'ietf.middleware.redirect_trailing_period_middleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'ietf.middleware.unicode_nfkc_normalization_middleware', diff --git a/ietf/templates/utf8_4byte_failed.html b/ietf/templates/utf8_4byte_failed.html new file mode 100644 index 000000000..215391079 --- /dev/null +++ b/ietf/templates/utf8_4byte_failed.html @@ -0,0 +1,21 @@ +{% extends "base.html" %} +{# Copyright The IETF Trust 2015, All Rights Reserved #} +{% load origin %} + +{% block title %}Unicode outside the Basic Multilingual Plane{% endblock %} + +{% block content %} + {% origin %} +
+ + You submitted data containing unicode characters outside the Basic + Multilingual Plane. Such character cannot be stored in the database at + this time. If this causes inconvenience, please send an e-mail with + details to webmaster@ietf.org, in + order for us to understand the issue. + +
+ +{% endblock %} diff --git a/ietf/utils/log.py b/ietf/utils/log.py index a3b130739..33c949216 100644 --- a/ietf/utils/log.py +++ b/ietf/utils/log.py @@ -1,8 +1,10 @@ # Copyright The IETF Trust 2007, All Rights Reserved +import sys import logging import inspect import os.path +import traceback try: import syslog @@ -49,10 +51,16 @@ def log(msg): file, line, where = "/