worker.py (1865B)
1 import os, sys, json 2 3 from wptserve.utils import isomorphic_decode, isomorphic_encode 4 import importlib 5 util = importlib.import_module("common.security-features.scope.util") 6 7 def main(request, response): 8 policyDeliveries = json.loads(request.GET.first(b'policyDeliveries', b'[]')) 9 worker_type = request.GET.first(b'type', b'classic') 10 commonjs_url = u'%s://%s:%s/common/security-features/resources/common.sub.js' % ( 11 request.url_parts.scheme, request.url_parts.hostname, 12 request.url_parts.port) 13 if worker_type == b'classic': 14 import_line = u'importScripts("%s");' % commonjs_url 15 else: 16 import_line = u'import "%s";' % commonjs_url 17 18 maybe_additional_headers = {} 19 error = u'' 20 for delivery in policyDeliveries: 21 if delivery[u'deliveryType'] == u'meta': 22 error = u'<meta> cannot be used in WorkerGlobalScope' 23 elif delivery[u'deliveryType'] == u'http-rp': 24 if delivery[u'key'] == u'referrerPolicy': 25 maybe_additional_headers[b'Referrer-Policy'] = isomorphic_encode(delivery[u'value']) 26 elif delivery[u'key'] == u'mixedContent' and delivery[u'value'] == u'opt-in': 27 maybe_additional_headers[b'Content-Security-Policy'] = b'block-all-mixed-content' 28 elif delivery[u'key'] == u'upgradeInsecureRequests' and delivery[u'value'] == u'upgrade': 29 maybe_additional_headers[b'Content-Security-Policy'] = b'upgrade-insecure-requests' 30 else: 31 error = u'invalid delivery key for http-rp: %s' % delivery[u'key'] 32 else: 33 error = u'invalid deliveryType: %s' % delivery[u'deliveryType'] 34 35 handler = lambda: util.get_template(u'worker.js.template') % ({ 36 u'import': import_line, 37 u'error': error 38 }) 39 util.respond( 40 request, 41 response, 42 payload_generator=handler, 43 content_type=b'text/javascript', 44 maybe_additional_headers=maybe_additional_headers)