Guard admin messages from leaking to frontend

This commit is contained in:
2026-03-15 17:28:33 +00:00
parent 1a0617fbd0
commit 9b3992f250
4 changed files with 150 additions and 0 deletions

View File

@@ -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)