in Allura/allura/lib/custom_middleware.py [0:0]
def __call__(self, environ, start_response):
req = Request(environ)
resp = req.get_response(self.app)
rules = set(resp.headers.getall('Content-Security-Policy'))
report_rules = set(resp.headers.getall('Content-Security-Policy-Report-Only'))
report_uri = self.config.get('csp.report_uri', None)
report_uri_enforce = self.config.get('csp.report_uri_enforce', None)
if rules:
resp.headers.pop('Content-Security-Policy')
if report_rules:
resp.headers.pop('Content-Security-Policy-Report-Only')
if self.config['base_url'].startswith('https'):
rules.add('upgrade-insecure-requests')
if self.config.get('csp.frame_sources'):
frame_srcs = self.config['csp.frame_sources']
if environ.get('csp_frame_domains'):
frame_srcs += ' ' + ' '.join(environ['csp_frame_domains'])
if asbool(self.config.get('csp.frame_sources_enforce', False)):
rules.add(f"frame-src {frame_srcs}")
else:
report_rules.add(f"frame-src {frame_srcs}")
if self.config.get('csp.fenced_frame_sources'):
fenced_frame_srcs = self.config['csp.fenced_frame_sources']
if asbool(self.config.get('csp.fenced_frame_sources_enforce', False)):
rules.add(f"fenced-frame-src {fenced_frame_srcs}")
else:
report_rules.add(f"fenced-frame-src {fenced_frame_srcs}")
if self.config.get('csp.form_action_urls'):
srcs = self.config['csp.form_action_urls']
if environ.get('csp_form_actions'):
srcs += ' ' + ' '.join(environ['csp_form_actions'])
oauth_endpoints = (
'/auth/oauth2/authorize', '/auth/oauth2/do_authorize', '/rest/oauth/authorize', '/rest/oauth/do_authorize')
if not req.path.startswith(oauth_endpoints): # Do not enforce CSP for OAuth1 and OAuth2 authorization
if asbool(self.config.get('csp.form_actions_enforce', False)):
rules.add(f"form-action {srcs}")
else:
report_rules.add(f"form-action {srcs}")
if self.config.get('csp.script_src'):
script_srcs = self.config['csp.script_src']
"""
Sometimes you might have the need to build custom values from inside a controller and pass it
to the middleware. In this case we pass a custom list of domains from google that can't be built
directly in here.