From 322c1a40d29d5b1280e6b44c9e68a876c07a27ba Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 9 Mar 2011 01:19:16 -0400 Subject: [PATCH] Added new permission denied middleware --- apps/common/templates/403.html | 12 ++++++ apps/common/templates/404.html | 4 +- apps/permissions/middleware/__init__.py | 0 .../middleware/permissiondeniedmiddleware.py | 43 +++++++++++++++++++ .../templatetags/permission_tags.py | 5 ++- settings.py | 1 + 6 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 apps/common/templates/403.html create mode 100644 apps/permissions/middleware/__init__.py create mode 100644 apps/permissions/middleware/permissiondeniedmiddleware.py diff --git a/apps/common/templates/403.html b/apps/common/templates/403.html new file mode 100644 index 0000000000..86ceb04dcf --- /dev/null +++ b/apps/common/templates/403.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} +{% load i18n %} +{% block title %} :: {% blocktrans %}Insufficient permissions{% endblocktrans %}{% endblock %} + +{% block content %} +
+

{% blocktrans %}Insufficient permissions{% endblocktrans %}

+
+

{% blocktrans %}You don't have enough permissions for this operation.{% endblocktrans %}

+
+
+{% endblock %} diff --git a/apps/common/templates/404.html b/apps/common/templates/404.html index 2cea36e3c0..0c76c0560c 100644 --- a/apps/common/templates/404.html +++ b/apps/common/templates/404.html @@ -1,10 +1,10 @@ {% extends "base.html" %} {% load i18n %} -{% block title %}{% trans "Page not found" %}{% endblock %} +{% block title %} :: {% blocktrans %}Page not found{% endblocktrans %}{% endblock %} {% block content %}
-

{% blocktrans %}Page not found or insufficient permissions.{% endblocktrans %}

+

{% blocktrans %}Page not found{% endblocktrans %}

{% blocktrans %}Sorry, but the requested page could not be found.{% endblocktrans %}

diff --git a/apps/permissions/middleware/__init__.py b/apps/permissions/middleware/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/apps/permissions/middleware/permissiondeniedmiddleware.py b/apps/permissions/middleware/permissiondeniedmiddleware.py new file mode 100644 index 0000000000..939fbc8195 --- /dev/null +++ b/apps/permissions/middleware/permissiondeniedmiddleware.py @@ -0,0 +1,43 @@ +from django.conf import settings +from django.core.exceptions import PermissionDenied +from django.http import HttpResponseForbidden +from django.template import RequestContext, Template, loader, TemplateDoesNotExist +from django.utils.importlib import import_module + +#http://mitchfournier.com/2010/07/12/show-a-custom-403-forbidden-error-page-in-django/ +class PermissionDeniedMiddleware(object): + def process_exception(self, request, exception): + if isinstance(exception, PermissionDenied): + if settings.DEBUG==123: + raise PermissionDenied + else: + try: + # Handle import error but allow any type error from view + callback = getattr(import_module(settings.ROOT_URLCONF),'handler403') + return callback(request,exception) + except (ImportError,AttributeError): + # Try to get a 403 template + try: + # First look for a user-defined template named "403.html" + t = loader.get_template('403.html') + except TemplateDoesNotExist: + # If a template doesn't exist in the projct, use the following hardcoded template + t = Template("""{% load i18n %} + + + + {% trans "403 ERROR: Access denied" %} + + +

{% trans "Access Denied (403)" %}

+ {% trans "We're sorry, but you are not authorized to view this page." %} + + """) + + # Now use context and render template + c = RequestContext(request, { + 'message': exception.message + }) + + return HttpResponseForbidden(t.render(c)) diff --git a/apps/permissions/templatetags/permission_tags.py b/apps/permissions/templatetags/permission_tags.py index d4168af744..31eb2b60eb 100644 --- a/apps/permissions/templatetags/permission_tags.py +++ b/apps/permissions/templatetags/permission_tags.py @@ -1,7 +1,8 @@ +from django.core.exceptions import PermissionDenied from django.template import TemplateSyntaxError, Library, \ VariableDoesNotExist, Node, Variable -from permissions.api import check_permissions as check_permission_function, Unauthorized +from permissions.api import check_permissions as check_permission_function register = Library() @@ -20,7 +21,7 @@ class CheckPermissionsNode(Node): check_permission_function(requester, namespace, permission_list) context['permission'] = True return '' - except Unauthorized: + except PermissionDenied: context['permission'] = False return '' diff --git a/settings.py b/settings.py index ff299cbff7..ab74642e24 100644 --- a/settings.py +++ b/settings.py @@ -98,6 +98,7 @@ MIDDLEWARE_CLASSES = ( 'common.middleware.login_required_middleware.LoginRequiredMiddleware', 'pagination.middleware.PaginationMiddleware', 'common.middleware.strip_spaces_widdleware.SpacelessMiddleware', + 'permissions.middleware.permissiondeniedmiddleware.PermissionDeniedMiddleware', ) ROOT_URLCONF = 'urls'