40 """Check if the browser supports Sec-Fetch headers.
42 https://caniuse.com/mdn-http_headers_sec-fetch-dest
43 https://caniuse.com/mdn-http_headers_sec-fetch-mode
44 https://caniuse.com/mdn-http_headers_sec-fetch-site
50 - Edge (mirrors Chrome)
51 - Opera (mirrors Chrome)
53 user_agent = user_agent.lower()
56 chrome_match = re.search(
r'chrome/(\d+)', user_agent)
58 version = int(chrome_match.group(1))
62 firefox_match = re.search(
r'firefox/(\d+)', user_agent)
64 version = int(firefox_match.group(1))
68 safari_match = re.search(
r'version/(\d+)\.(\d+)', user_agent)
70 major = int(safari_match.group(1))
71 minor = int(safari_match.group(2))
72 return major > 16
or (major == 16
and minor >= 4)
78 network: IPv4Network | IPv6Network,
79 request: flask.Request,
81) -> werkzeug.Response |
None:
83 if not request.is_secure:
85 "Sec-Fetch cannot be verified for non-secure requests (HTTP headers are not set/sent by the client)."
90 user_agent = request.headers.get(
'User-Agent',
'')
92 val = request.headers.get(
"Sec-Fetch-Mode",
"")
93 if val
not in (
'navigate',
'cors'):
94 logger.debug(
"invalid Sec-Fetch-Mode '%s'", val)
95 return flask.redirect(flask.url_for(
'index'), code=302)
97 val = request.headers.get(
"Sec-Fetch-Site",
"")
98 if val
not in (
'same-origin',
'same-site',
'none'):
99 logger.debug(
"invalid Sec-Fetch-Site '%s'", val)
100 flask.redirect(flask.url_for(
'index'), code=302)
102 val = request.headers.get(
"Sec-Fetch-Dest",
"")
103 if val
not in (
'document',
'empty'):
104 logger.debug(
"invalid Sec-Fetch-Dest '%s'", val)
105 flask.redirect(flask.url_for(
'index'), code=302)