Skip to content

Commit f07f6ff

Browse files
committed
Add CSP: frame-ancestors support
1 parent cefc5fb commit f07f6ff

File tree

3 files changed

+26
-0
lines changed

3 files changed

+26
-0
lines changed

python/nav/django/settings.py

+2
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
# Middleware
128128
MIDDLEWARE = (
129129
'django.middleware.clickjacking.XFrameOptionsMiddleware',
130+
'csp.middleware.CSPMiddleware',
130131
'django.middleware.common.CommonMiddleware',
131132
'django.contrib.sessions.middleware.SessionMiddleware',
132133
'nav.web.auth.middleware.AuthenticationMiddleware',
@@ -269,6 +270,7 @@
269270
_needs_tls = bool(_websecurity_config.getboolean('security', 'needs_tls'))
270271
SESSION_COOKIE_SECURE = _needs_tls
271272
X_FRAME_OPTIONS = _websecurity_config.get_x_frame_options()
273+
CSP_FRAME_ANCESTORS = _websecurity_config.get_frame_ancestors()
272274

273275
# Hack for hackers to use features like debug_toolbar etc.
274276
# https://code.djangoproject.com/wiki/SplitSettings (Rob Golding's method)

python/nav/web/security.py

+23
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,26 @@ def get_x_frame_options(self):
2525
if frames_flag == 'none':
2626
return 'DENY'
2727
return 'SAMEORIGIN'
28+
29+
def get_frame_ancestors(self):
30+
"""Return a list of sources
31+
32+
A single 'none' or a string of one or more of self, source-scheme and
33+
host-scheme are valid. There is currently no validator for host-scheme,
34+
so source-scheme and host-scheme are both outputted as-is.
35+
36+
To be set in django settings and used by the django-csp middleware.
37+
"""
38+
default = "'self'"
39+
frames_flag = self.get(self.FRAMES_OPTION) or self.FRAMES_DEFAULT
40+
pieces = frames_flag.split()
41+
valid_pieces = []
42+
for piece in pieces:
43+
if piece == 'none':
44+
valid_pieces.append("'none'")
45+
break
46+
if piece == 'self':
47+
valid_pieces.append(default)
48+
else:
49+
valid_pieces.append(piece)
50+
return valid_pieces or [default]

requirements/base.txt

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ dnspython<3.0.0,>=2.1.0
2424
django-filter>=2
2525
djangorestframework>=3.12,<3.13
2626
django-crispy-forms>=1.8,<1.9
27+
django-csp
2728
crispy-forms-foundation>=0.7,<0.8
2829

2930
# REST framework

0 commit comments

Comments
 (0)