blob: 81299b24bdc95614c54ac6af9e6009aea3724038 [file] [log] [blame]
#!/usr/bin/env python3
import os
import sys
from urllib.parse import parse_qs
query = parse_qs(os.environ.get('QUERY_STRING', ''), keep_blank_values=True)
csp = query.get('csp', [None])[0]
typ = query.get('type', [''])[0]
sys.stdout.write(
'Expires: Thu, 01 Dec 2003 16:00:00 GMT\r\n'
'Cache-Control: no-cache, must-revalidate\r\n'
'Pragma: no-cache\r\n'
'Content-Type: text/javascript\r\n'
)
if csp is not None:
sys.stdout.write('Content-Security-Policy: {}\r\n'.format(csp))
elif typ == 'multiple-headers':
sys.stdout.write(
'Content-Security-Policy: connect-src \'none\'\r\n'
'Content-Security-Policy: script-src \'self\'\r\n'
)
sys.stdout.write('\r\n')
if typ == 'eval':
sys.stdout.write(
'var id = 0;\n'
'try {\n'
' id = eval("1 + 2 + 3");\n'
'}\n'
' catch (e) {\n'
'}\n'
'\n'
'postMessage(id === 0 ? "eval blocked" : "eval allowed");\n'
)
elif typ == 'function-function':
sys.stdout.write(
'var fn = function() {\n'
' postMessage(\'Function() function blocked\');\n'
'}\n'
'try {\n'
' fn = new Function("", "postMessage(\'Function() function allowed\');");\n'
'}\n'
'catch(e) {\n'
'}\n'
'fn();\n'
)
elif typ == 'importscripts':
sys.stdout.write(
'try {\n'
' importScripts("http://localhost:8000/security/contentSecurityPolicy/resources/post-message.js");\n'
' postMessage("importScripts allowed");\n'
'} catch(e) {\n'
' postMessage("importScripts blocked: " + e);\n'
'}\n'
)
elif typ == 'make-xhr':
sys.stdout.write(
'var xhr = new XMLHttpRequest;\n'
'xhr.addEventListener("load", function () {\n'
' postMessage("xhr allowed");\n'
'});\n'
'xhr.addEventListener("error", function () {\n'
' postMessage("xhr blocked");\n'
'});\n'
'xhr.open("GET", "http://127.0.0.1:8000/xmlhttprequest/resources/get.txt", true);\n'
'xhr.send();\n'
)
elif typ == 'set-timeout':
sys.stdout.write(
'var id = 0;\n'
'try {\n'
' id = setTimeout("postMessage(\'handler invoked\')", 100);\n'
'} catch(e) {\n'
'}\n'
'postMessage(id === 0 ? "setTimeout blocked" : "setTimeout allowed");\n'
)
elif typ == 'post-message-pass':
sys.stdout.write('postMessage("PASS");')
elif typ == 'report-referrer':
sys.stdout.write(
'var xhr = new XMLHttpRequest;\n'
'xhr.open("GET", "http://127.0.0.1:8000/security/resources/echo-referrer-header.py", true);\n'
'xhr.onload = function () {\n'
' postMessage(this.responseText);\n'
'};\n'
'xhr.send();\n'
)
elif typ == 'shared-report-referrer':
sys.stdout.write(
'onconnect = function (e) {\n'
' var port = e.ports[0];\n'
' var xhr = new XMLHttpRequest;\n'
' xhr.open(\n'
' "GET",\n'
' "http://127.0.0.1:8000/security/resources/echo-referrer-header.py",\n'
' true);\n'
' xhr.onload = function () {\n'
' port.postMessage(this.responseText);\n'
' };\n'
' xhr.send();\n'
'};\n'
)
elif typ == 'multiple-headers':
sys.stdout.write(
'var xhr = new XMLHttpRequest;\n'
'xhr.addEventListener("load", function () {\n'
' postMessage("xhr allowed");\n'
'});\n'
'xhr.addEventListener("error", function () {\n'
' postMessage("xhr blocked");\n'
'});\n'
'xhr.open("GET", "http://127.0.0.1:8000/xmlhttprequest/resources/get.txt", true);\n'
'xhr.send();\n'
'\n'
'var id = 0;\n'
'try {\n'
' id = eval("1 + 2 + 3");\n'
'}\n'
'catch (e) {\n'
'}\n'
'\n'
'postMessage(id === 0 ? "eval blocked" : "eval allowed");\n'
)