Skip to content

Commit 00b8f29

Browse files
committed
Address review comments
1 parent 20f0bb7 commit 00b8f29

File tree

5 files changed

+48
-9
lines changed

5 files changed

+48
-9
lines changed

django-stubs/conf/global_settings.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -545,5 +545,5 @@ SECURE_SSL_REDIRECT: bool
545545
##################
546546
# CSP MIDDLEWARE #
547547
##################
548-
SECURE_CSP: dict[str, Any] = {}
549-
SECURE_CSP_REPORT_ONLY: dict[str, Any] = {}
548+
SECURE_CSP: dict[str, Sequence[str] | str]
549+
SECURE_CSP_REPORT_ONLY: dict[str, Sequence[str] | str]

django-stubs/middleware/csp.pyi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from django.http import HttpRequest, HttpResponse
22
from django.utils.csp import CSP as CSP
3+
from django.utils.csp import LazyNonce
34
from django.utils.deprecation import MiddlewareMixin
45

6+
def get_nonce(request: HttpRequest) -> LazyNonce | None: ...
7+
58
class ContentSecurityPolicyMiddleware(MiddlewareMixin):
69
def process_request(self, request: HttpRequest) -> None: ...
710
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ...

django-stubs/utils/csp.pyi

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import sys
2+
from collections.abc import Sequence
3+
4+
from django.utils.functional import SimpleLazyObject
25

36
if sys.version_info >= (3, 11):
4-
from enum import StrEnum
7+
from enum import StrEnum as _StrEnum
58
else:
69
from enum import Enum
710

8-
class ReprEnum(Enum): ... # type: ignore[misc]
9-
class StrEnum(str, ReprEnum): ... # type: ignore[misc]
11+
class _ReprEnum(Enum): ... # type: ignore[misc]
12+
class _StrEnum(str, _ReprEnum): ... # type: ignore[misc]
1013

11-
class CSP(StrEnum):
14+
class CSP(_StrEnum):
1215
HEADER_ENFORCE = "Content-Security-Policy"
1316
HEADER_REPORT_ONLY = "Content-Security-Policy-Report-Only"
1417

@@ -22,3 +25,9 @@ class CSP(StrEnum):
2225
WASM_UNSAFE_EVAL = "'wasm-unsafe-eval'"
2326

2427
NONCE = "<CSP_NONCE_SENTINEL>"
28+
29+
class LazyNonce(SimpleLazyObject):
30+
def __init__(self) -> None: ...
31+
def __bool__(self) -> bool: ...
32+
33+
def build_policy(config: dict[str, Sequence[str] | str], nonce: SimpleLazyObject | str | None = None) -> str: ...
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from collections.abc import Callable
1+
from collections.abc import Callable, Sequence
22
from typing import Any, TypeVar
33

44
_F = TypeVar("_F", bound=Callable[..., Any])
55

6-
def csp_override(config: dict[str, Any]) -> Callable[[_F], _F]: ...
7-
def csp_report_only_override(config: dict[str, Any]) -> Callable[[_F], _F]: ...
6+
def csp_override(config: dict[str, Sequence[str] | str]) -> Callable[[_F], _F]: ...
7+
def csp_report_only_override(config: dict[str, Sequence[str] | str]) -> Callable[[_F], _F]: ...
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from django.http import HttpRequest, HttpResponse
2+
from django.views.decorators.csp import csp_override, csp_report_only_override
3+
from typing_extensions import assert_type
4+
5+
6+
@csp_override(
7+
{
8+
"default-src": ["'self'"],
9+
"script-src": ["'self'", "'unsafe-inline'"],
10+
"report-uri": "/path/to/reports-endpoint/",
11+
}
12+
)
13+
def my_view(request: HttpRequest) -> HttpResponse: ...
14+
15+
16+
@csp_report_only_override(
17+
{
18+
"default-src": ["'self'"],
19+
"script-src": ["'self'", "'unsafe-inline'"],
20+
"report-uri": "/path/to/reports-endpoint/",
21+
}
22+
)
23+
def my_view2(request: HttpRequest) -> HttpResponse: ...
24+
25+
26+
assert_type(my_view(HttpRequest()), HttpResponse)
27+
assert_type(my_view2(HttpRequest()), HttpResponse)

0 commit comments

Comments
 (0)