Guard admin messages from leaking to frontend
This commit is contained in:
@@ -2,6 +2,8 @@ from __future__ import annotations
|
||||
|
||||
import secrets
|
||||
|
||||
from django.contrib.messages import get_messages
|
||||
|
||||
from .consent import ConsentService
|
||||
|
||||
|
||||
@@ -40,3 +42,25 @@ class SecurityHeadersMiddleware:
|
||||
)
|
||||
response["Permissions-Policy"] = "camera=(), microphone=(), geolocation=()"
|
||||
return response
|
||||
|
||||
|
||||
class AdminMessageGuardMiddleware:
|
||||
ADMIN_PREFIXES = ("/cms/", "/django-admin/")
|
||||
|
||||
def __init__(self, get_response):
|
||||
self.get_response = get_response
|
||||
|
||||
def __call__(self, request):
|
||||
# The public site has no legitimate use of Django's shared flash queue.
|
||||
# Drain any stale admin messages before frontend rendering can see them.
|
||||
if not request.path.startswith(self.ADMIN_PREFIXES):
|
||||
storage = get_messages(request)
|
||||
list(storage)
|
||||
storage._queued_messages = []
|
||||
storage._loaded_data = []
|
||||
for sub_storage in getattr(storage, "storages", []):
|
||||
sub_storage._queued_messages = []
|
||||
sub_storage._loaded_data = []
|
||||
sub_storage.used = True
|
||||
storage.used = True
|
||||
return self.get_response(request)
|
||||
|
||||
Reference in New Issue
Block a user