errorpages.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from django.shortcuts import redirect, render as dj_render
  2. from . import get_protected_namespace, protected_admin_view, render
  3. from ...core.utils import get_exception_message
  4. from ..auth import is_admin_authorized, update_admin_authorization
  5. # Magic error page used by admin
  6. @protected_admin_view
  7. def _error_page(request, code, exception=None, default_message=None):
  8. if not is_admin_authorized(request):
  9. return redirect("misago:admin:index")
  10. template_pattern = "misago/admin/errorpages/%s.html" % code
  11. response = render(
  12. request,
  13. template_pattern,
  14. {"message": get_exception_message(exception, default_message)},
  15. error_page=True,
  16. )
  17. response.status_code = code
  18. return response
  19. def admin_error_page(f):
  20. def decorator(request, *args, **kwargs):
  21. if get_protected_namespace(request):
  22. update_admin_authorization(request)
  23. return _error_page(request, *args, **kwargs)
  24. return f(request, *args, **kwargs)
  25. return decorator
  26. # Magic CSRF fail page for Admin
  27. def _csrf_failure(request, reason=""):
  28. if is_admin_authorized(request):
  29. update_admin_authorization(request)
  30. response = render(
  31. request,
  32. "misago/admin/errorpages/csrf_failure_authenticated.html",
  33. error_page=True,
  34. )
  35. else:
  36. response = dj_render(request, "misago/admin/errorpages/csrf_failure.html")
  37. response.status_code = 403
  38. return response
  39. def admin_csrf_failure(f):
  40. def decorator(request, *args, **kwargs):
  41. if get_protected_namespace(request):
  42. return _csrf_failure(request, *args, **kwargs)
  43. return f(request, *args, **kwargs)
  44. return decorator