Skip to content

Commit 395d928

Browse files
Rob Hudsonjwhitlock
authored andcommitted
Remove CSPMiddlewareAlwaysGenerateNonce
1 parent 4054a7b commit 395d928

File tree

3 files changed

+1
-66
lines changed

3 files changed

+1
-66
lines changed

csp/middleware.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ class CSPMiddleware(MiddlewareMixin):
5151
Can be customised by subclassing and extending the get_policy_parts method.
5252
"""
5353

54-
always_generate_nonce = False
55-
5654
def _make_nonce(self, request: HttpRequest) -> str:
5755
# Ensure that any subsequent calls to request.csp_nonce return the same value
5856
stored_nonce = getattr(request, "_csp_nonce", None)
@@ -71,8 +69,6 @@ def _csp_nonce_post_response() -> None:
7169
def process_request(self, request: HttpRequest) -> None:
7270
nonce = partial(self._make_nonce, request)
7371
setattr(request, "csp_nonce", CheckableLazyObject(nonce))
74-
if self.always_generate_nonce:
75-
str(getattr(request, "csp_nonce"))
7672

7773
def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase:
7874
# Check for debug view
@@ -143,17 +139,3 @@ def get_policy_parts(
143139
nonce = getattr(request, "_csp_nonce", None)
144140

145141
return PolicyParts(config, update, replace, nonce)
146-
147-
148-
class CSPMiddlewareAlwaysGenerateNonce(CSPMiddleware):
149-
"""
150-
A middleware variant that always generates a nonce.
151-
152-
This is useful when a later process needs a nonce, whether or not the wrapped
153-
request uses a nonce. One example is django-debug-toolbar (DDT). The DDT
154-
middleware needs to be high in the MIDDLEWARE list, so it can inject its
155-
HTML, CSS, and JS describing the response generation. DDT users can use
156-
this middleware instead of CSPMiddleware.
157-
"""
158-
159-
always_generate_nonce = True

csp/tests/test_middleware.py

Lines changed: 1 addition & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,7 @@
1111

1212
from csp.constants import HEADER, HEADER_REPORT_ONLY, SELF
1313
from csp.exceptions import CSPNonceError
14-
from csp.middleware import (
15-
CheckableLazyObject,
16-
CSPMiddleware,
17-
CSPMiddlewareAlwaysGenerateNonce,
18-
)
14+
from csp.middleware import CheckableLazyObject, CSPMiddleware
1915
from csp.tests.utils import response
2016

2117
mw = CSPMiddleware(response())
@@ -291,44 +287,3 @@ def test_set_nonce_access_after_middleware_is_ok() -> None:
291287
mw.process_response(request, HttpResponse())
292288
assert bool(getattr(request, "csp_nonce", False)) is True
293289
assert str(getattr(request, "csp_nonce")) == nonce
294-
295-
296-
def test_csp_always_nonce_middleware_has_nonce() -> None:
297-
request = rf.get("/")
298-
mw_agn = CSPMiddlewareAlwaysGenerateNonce(response())
299-
mw_agn.process_request(request)
300-
nonce = getattr(request, "csp_nonce")
301-
assert bool(nonce) is True
302-
resp = HttpResponse()
303-
mw_agn.process_response(request, resp)
304-
assert str(nonce) in resp[HEADER]
305-
306-
307-
def test_csp_always_nonce_middleware_nonce_regenerated_on_new_request() -> None:
308-
mw_agn = CSPMiddlewareAlwaysGenerateNonce(response())
309-
request1 = rf.get("/")
310-
request2 = rf.get("/")
311-
mw_agn.process_request(request1)
312-
mw_agn.process_request(request2)
313-
nonce1 = str(getattr(request1, "csp_nonce"))
314-
nonce2 = str(getattr(request2, "csp_nonce"))
315-
assert nonce1 != nonce2
316-
317-
response1 = HttpResponse()
318-
response2 = HttpResponse()
319-
mw_agn.process_response(request1, response1)
320-
mw_agn.process_response(request2, response2)
321-
assert nonce1 not in response2[HEADER]
322-
assert nonce2 not in response1[HEADER]
323-
324-
325-
def test_csp_always_nonce_middleware_access_after_middleware_is_ok() -> None:
326-
# Test accessing a set nonce after the response has been processed is OK.
327-
request = rf.get("/")
328-
mw_agn = CSPMiddlewareAlwaysGenerateNonce(response())
329-
mw_agn.process_request(request)
330-
nonce = getattr(request, "csp_nonce")
331-
assert bool(nonce) is True
332-
mw_agn.process_response(request, HttpResponse())
333-
assert bool(nonce) is True
334-
assert str(getattr(request, "csp_nonce")) == nonce

docs/nonce.rst

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,6 @@ If other middleware or a later process needs to access ``request.csp_nonce``, th
6868

6969
* The middleware can be placed after ``csp.middleware.CSPMiddleware`` in the ``MIDDLEWARE`` setting.
7070
This ensures that the middleware generates the nonce before ``CSPMiddleware`` writes the CSP header.
71-
* Use the alternate ``csp.middleware.CSPMiddlewareAlwaysGenerateNonce`` middleware, which always
72-
generates a nonce and includes it in the CSP header.
7371
* Add a later middleware that accesses the nonce. For example, this function:
7472

7573
.. code-block:: python

0 commit comments

Comments
 (0)