tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

record-header.py (5344B)


      1 import os
      2 import hashlib
      3 import json
      4 
      5 from wptserve.utils import isomorphic_decode
      6 
      7 def main(request, response):
      8  ## Get the query parameter (key) from URL ##
      9  ## Tests will record POST requests (CSP Report) and GET (rest) ##
     10  if request.GET:
     11    key = request.GET[b'file']
     12  elif request.POST:
     13    key = request.POST[b'file']
     14 
     15  ## Convert the key from String to UUID valid String ##
     16  testId = hashlib.md5(key).hexdigest()
     17 
     18  ## Handle the header retrieval request ##
     19  if b'retrieve' in request.GET:
     20    response.writer.write_status(200)
     21    response.writer.write_header(b"Connection", b"close")
     22    response.writer.end_headers()
     23    try:
     24      header_value = request.server.stash.take(testId)
     25      response.writer.write(header_value)
     26    except (KeyError, ValueError) as e:
     27      response.writer.write(u"No header has been recorded")
     28      pass
     29 
     30    response.close_connection = True
     31 
     32  ## Record incoming fetch metadata header value
     33  else:
     34    try:
     35      ## Return a serialized JSON object with one member per header. If the ##
     36      ## header isn't present, the member will contain an empty string.     ##
     37      header = json.dumps({
     38        u"dest": isomorphic_decode(request.headers.get(b"sec-fetch-dest", b"")),
     39        u"mode": isomorphic_decode(request.headers.get(b"sec-fetch-mode", b"")),
     40        u"site": isomorphic_decode(request.headers.get(b"sec-fetch-site", b"")),
     41        u"user": isomorphic_decode(request.headers.get(b"sec-fetch-user", b"")),
     42      })
     43      request.server.stash.put(testId, header)
     44    except KeyError:
     45      ## The header is already recorded or it doesn't exist
     46      pass
     47 
     48    ## Prevent the browser from caching returned responses and allow CORS ##
     49    response.headers.set(b"Access-Control-Allow-Origin", b"*")
     50    response.headers.set(b"Cache-Control", b"no-cache, no-store, must-revalidate")
     51    response.headers.set(b"Pragma", b"no-cache")
     52    response.headers.set(b"Expires", b"0")
     53 
     54    ## Add a valid ServiceWorker Content-Type ##
     55    if key.startswith(b"serviceworker"):
     56      response.headers.set(b"Content-Type", b"application/javascript")
     57 
     58    ## Add a valid image Content-Type ##
     59    if key.startswith(b"image"):
     60      response.headers.set(b"Content-Type", b"image/png")
     61      file = open(os.path.join(request.doc_root, u"media", u"1x1-green.png"), u"rb")
     62      image = file.read()
     63      file.close()
     64      return image
     65 
     66    ## Return a valid .vtt content for the <track> tag ##
     67    if key.startswith(b"track"):
     68      return b"WEBVTT"
     69 
     70    ## Return a valid SharedWorker ##
     71    if key.startswith(b"sharedworker"):
     72      response.headers.set(b"Content-Type", b"application/javascript")
     73      file = open(os.path.join(request.doc_root, u"fetch", u"metadata",
     74                               u"resources", u"sharedWorker.js"), u"rb")
     75      shared_worker = file.read()
     76      file.close()
     77      return shared_worker
     78 
     79    ## Return a valid font content and Content-Type ##
     80    if key.startswith(b"font"):
     81      response.headers.set(b"Content-Type", b"application/x-font-ttf")
     82      file = open(os.path.join(request.doc_root, u"fonts", u"Ahem.ttf"), u"rb")
     83      font = file.read()
     84      file.close()
     85      return font
     86 
     87    ## Return a valid audio content and Content-Type ##
     88    if key.startswith(b"audio"):
     89      response.headers.set(b"Content-Type", b"audio/mpeg")
     90      file = open(os.path.join(request.doc_root, u"media", u"sound_5.mp3"), u"rb")
     91      audio = file.read()
     92      file.close()
     93      return audio
     94 
     95    ## Return a valid video content and Content-Type ##
     96    if key.startswith(b"video"):
     97      response.headers.set(b"Content-Type", b"video/mp4")
     98      file = open(os.path.join(request.doc_root, u"media", u"A4.mp4"), u"rb")
     99      video = file.read()
    100      file.close()
    101      return video
    102 
    103    ## Return valid style content and Content-Type ##
    104    if key.startswith(b"style"):
    105      response.headers.set(b"Content-Type", b"text/css")
    106      return b"div { }"
    107 
    108    ## Return a valid embed/object content and Content-Type ##
    109    if key.startswith(b"embed") or key.startswith(b"object"):
    110      response.headers.set(b"Content-Type", b"text/html")
    111      return b"<html>EMBED!</html>"
    112 
    113    ## Return a valid image content and Content-Type for redirect requests ##
    114    if key.startswith(b"redirect"):
    115      response.headers.set(b"Content-Type", b"image/jpeg")
    116      file = open(os.path.join(request.doc_root, u"media", u"1x1-green.png"), u"rb")
    117      image = file.read()
    118      file.close()
    119      return image
    120 
    121    ## Return a valid dedicated worker
    122    if key.startswith(b"worker"):
    123      response.headers.set(b"Content-Type", b"application/javascript")
    124      return b"self.postMessage('loaded');"
    125 
    126    ## Return a valid worklet
    127    if key.startswith(b"worklet"):
    128      response.headers.set(b"Content-Type", b"application/javascript")
    129      return b""
    130 
    131    ## Return a valid XSLT
    132    if key.startswith(b"xslt"):
    133      response.headers.set(b"Content-Type", b"text/xsl")
    134      return b"""<?xml version="1.0" encoding="UTF-8"?>
    135 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    136  <xsl:template match="@*|node()">
    137    <xsl:copy>
    138      <xsl:apply-templates select="@*|node()"/>
    139    </xsl:copy>
    140  </xsl:template>
    141 </xsl:stylesheet>"""
    142 
    143    if key.startswith(b"script"):
    144      response.headers.set(b"Content-Type", b"application/javascript")
    145      return b"void 0;"