tor-browser

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

file_upgrade_insecure_reporting_server.sjs (2961B)


      1 // Custom *.sjs specifically for the needs of Bug
      2 // Bug 1139297 - Implement CSP upgrade-insecure-requests directive
      3 
      4 const { NetUtil } = ChromeUtils.importESModule(
      5   "resource://gre/modules/NetUtil.sys.mjs"
      6 );
      7 
      8 // small red image
      9 const IMG_BYTES = atob(
     10   "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12" +
     11     "P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
     12 );
     13 
     14 const REPORT_URI =
     15   "https://example.com/tests/dom/security/test/csp/file_upgrade_insecure_reporting_server.sjs?report";
     16 const POLICY = "upgrade-insecure-requests; default-src https: 'unsafe-inline'";
     17 const POLICY_RO =
     18   "default-src https: 'unsafe-inline'; report-uri " + REPORT_URI;
     19 
     20 function loadHTMLFromFile(path) {
     21   // Load the HTML to return in the response from file.
     22   // Since it's relative to the cwd of the test runner, we start there and
     23   // append to get to the actual path of the file.
     24   var testHTMLFile = Cc["@mozilla.org/file/directory_service;1"]
     25     .getService(Ci.nsIProperties)
     26     .get("CurWorkD", Ci.nsIFile);
     27   var dirs = path.split("/");
     28   for (var i = 0; i < dirs.length; i++) {
     29     testHTMLFile.append(dirs[i]);
     30   }
     31   var testHTMLFileStream = Cc[
     32     "@mozilla.org/network/file-input-stream;1"
     33   ].createInstance(Ci.nsIFileInputStream);
     34   testHTMLFileStream.init(testHTMLFile, -1, 0, 0);
     35   var testHTML = NetUtil.readInputStreamToString(
     36     testHTMLFileStream,
     37     testHTMLFileStream.available()
     38   );
     39   return testHTML;
     40 }
     41 
     42 function handleRequest(request, response) {
     43   // avoid confusing cache behaviors
     44   response.setHeader("Cache-Control", "no-cache", false);
     45 
     46   // (1) Store the query that will report back whether the violation report was received
     47   if (request.queryString == "queryresult") {
     48     response.processAsync();
     49     setObjectState("queryResult", response);
     50     return;
     51   }
     52 
     53   // (2) We load a page using a CSP and a report only CSP
     54   if (request.queryString == "toplevel") {
     55     response.setHeader("Content-Security-Policy", POLICY, false);
     56     response.setHeader("Content-Security-Policy-Report-Only", POLICY_RO, false);
     57     response.setHeader("Content-Type", "text/html", false);
     58     response.write(
     59       loadHTMLFromFile(
     60         "tests/dom/security/test/csp/file_upgrade_insecure_reporting.html"
     61       )
     62     );
     63     return;
     64   }
     65 
     66   // (3) Return the image back to the client
     67   if (request.queryString == "img") {
     68     response.setHeader("Content-Type", "image/png");
     69     response.write(IMG_BYTES);
     70     return;
     71   }
     72 
     73   // (4) Finally we receive the report, let's return the request from (1)
     74   // signaling that we received the report correctly
     75   if (request.queryString == "report") {
     76     getObjectState("queryResult", function (queryResponse) {
     77       if (!queryResponse) {
     78         return;
     79       }
     80       queryResponse.write("report-ok");
     81       queryResponse.finish();
     82     });
     83     return;
     84   }
     85 
     86   // we should never get here, but just in case ...
     87   response.setHeader("Content-Type", "text/plain");
     88   response.write("doh!");
     89 }