stylesheet.py (2363B)
1 import os, sys 2 from wptserve.utils import isomorphic_decode 3 import importlib 4 subresource = importlib.import_module("common.security-features.subresource.subresource") 5 6 def generate_payload(request, server_data): 7 data = (u'{"headers": %(headers)s}') % server_data 8 type = b'image' 9 if b"type" in request.GET: 10 type = request.GET[b"type"] 11 12 if b"id" in request.GET: 13 request.server.stash.put(request.GET[b"id"], data) 14 15 if type == b'image': 16 return subresource.get_template(u"image.css.template") % {u"id": isomorphic_decode(request.GET[b"id"])} 17 18 elif type == b'font': 19 return subresource.get_template(u"font.css.template") % {u"id": isomorphic_decode(request.GET[b"id"])} 20 21 elif type == b'svg': 22 return subresource.get_template(u"svg.css.template") % { 23 u"id": isomorphic_decode(request.GET[b"id"]), 24 u"property": isomorphic_decode(request.GET[b"property"])} 25 26 # A `'stylesheet-only'`-type stylesheet has no nested resources; this is 27 # useful in tests that cover referrers for stylesheet fetches (e.g. fetches 28 # triggered by `@import` statements). 29 elif type == b'stylesheet-only': 30 return u'' 31 32 def generate_import_rule(request, server_data): 33 return u"@import url('%(url)s');" % { 34 u"url": subresource.create_url(request, swap_origin=True, 35 query_parameter_to_remove=u"import-rule") 36 } 37 38 def generate_report_headers_payload(request, server_data): 39 stashed_data = request.server.stash.take(request.GET[b"id"]) 40 return stashed_data 41 42 def main(request, response): 43 payload_generator = lambda data: generate_payload(request, data) 44 content_type = b"text/css" 45 referrer_policy = b"unsafe-url" 46 if b"import-rule" in request.GET: 47 payload_generator = lambda data: generate_import_rule(request, data) 48 49 if b"report-headers" in request.GET: 50 payload_generator = lambda data: generate_report_headers_payload(request, data) 51 content_type = b'application/json' 52 53 if b"referrer-policy" in request.GET: 54 referrer_policy = request.GET[b"referrer-policy"] 55 56 subresource.respond( 57 request, 58 response, 59 payload_generator = payload_generator, 60 content_type = content_type, 61 maybe_additional_headers = { b"Referrer-Policy": referrer_policy })