diff --git a/src/pretix/base/templates/csrffail.html b/src/pretix/base/templates/csrffail.html new file mode 100644 index 0000000000..a1b44b5d1a --- /dev/null +++ b/src/pretix/base/templates/csrffail.html @@ -0,0 +1,24 @@ +{% extends "error.html" %} +{% load i18n %} +{% block title %}{% trans "Verification failed" %}{% endblock %} +{% block content %} + +

{% trans "Verification failed" %}

+

{% blocktrans trimmed %} + We could not verify that this request really was sent from you. For security reasons, we therefore cannot process it. + {% endblocktrans %}

+ {% if no_referer %} +

{{ no_referer1 }}

+

{{ no_referer2 }}

+ {% elif no_cookie %} +

{{ no_cookie1 }}

+

{{ no_cookie2 }}

+ {% else %} +

{% blocktrans trimmed %} + Please go back to the last page, refresh this page and then try again. If the problem persists, please get in touch with us. + {% endblocktrans %}

+ {% endif %} +

+ {% trans "Take a step back" %} +

+{% endblock %} \ No newline at end of file diff --git a/src/pretix/base/views/errors.py b/src/pretix/base/views/errors.py new file mode 100644 index 0000000000..174400762d --- /dev/null +++ b/src/pretix/base/views/errors.py @@ -0,0 +1,33 @@ +from django.http import HttpResponseForbidden +from django.middleware.csrf import REASON_NO_CSRF_COOKIE, REASON_NO_REFERER +from django.template import Context +from django.template.loader import get_template +from django.utils.translation import ugettext as _ + + +def csrf_failure(request, reason=""): + t = get_template('csrffail.html') + c = Context({ + 'reason': reason, + 'no_referer': reason == REASON_NO_REFERER, + 'no_referer1': _( + "You are seeing this message because this HTTPS site requires a " + "'Referer header' to be sent by your Web browser, but none was " + "sent. This header is required for security reasons, to ensure " + "that your browser is not being hijacked by third parties."), + 'no_referer2': _( + "If you have configured your browser to disable 'Referer' headers, " + "please re-enable them, at least for this site, or for HTTPS " + "connections, or for 'same-origin' requests."), + 'no_cookie': reason == REASON_NO_CSRF_COOKIE, + 'no_cookie1': _( + "You are seeing this message because this site requires a CSRF " + "cookie when submitting forms. This cookie is required for " + "security reasons, to ensure that your browser is not being " + "hijacked by third parties."), + 'no_cookie2': _( + "If you have configured your browser to disable cookies, please " + "re-enable them, at least for this site, or for 'same-origin' " + "requests."), + }) + return HttpResponseForbidden(t.render(c), content_type='text/html') diff --git a/src/pretix/settings.py b/src/pretix/settings.py index b848384496..d952f14631 100644 --- a/src/pretix/settings.py +++ b/src/pretix/settings.py @@ -201,6 +201,7 @@ django.conf.locale.LANG_INFO.update(EXTRA_LANG_INFO) AUTH_USER_MODEL = 'pretixbase.User' LOGIN_URL = '/login' # global login does not yet exist LOGIN_URL_CONTROL = 'control:auth.login' +CSRF_FAILURE_VIEW = 'pretix.base.views.errors.csrf_failure' template_loaders = ( 'django.template.loaders.filesystem.Loader',