tor-browser

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

file_blocked_script.sjs (2254B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4  * License, v. 2.0. If a copy of the MPL was not distributed with this
      5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 function setGlobalState(data, key) {
      8   x = {
      9     data,
     10     QueryInterface(iid) {
     11       return this;
     12     },
     13   };
     14   x.wrappedJSObject = x;
     15   setObjectState(key, x);
     16 }
     17 
     18 function getGlobalState(key) {
     19   var data;
     20   getObjectState(key, function (x) {
     21     data = x && x.wrappedJSObject.data;
     22   });
     23   return data;
     24 }
     25 
     26 function finishBlockedRequest(request, response, query) {
     27   response.setStatusLine(request.httpVersion, 200, "OK");
     28   response.setHeader("Cache-Control", "no-cache", false);
     29   response.setHeader("Content-Type", "application/javascript", false);
     30   response.write("scriptLoaded('" + query[1] + "');");
     31   response.finish();
     32 
     33   setGlobalState(undefined, query[1]);
     34 }
     35 
     36 function handleRequest(request, response) {
     37   var query = request.queryString.split("&");
     38   switch (query[0]) {
     39     case "blocked":
     40       var alreadyUnblocked = getGlobalState(query[1]);
     41 
     42       response.processAsync();
     43       if (alreadyUnblocked === true) {
     44         // the unblock request came before the blocked request, just go on and finish synchronously
     45         finishBlockedRequest(request, response, query);
     46       } else {
     47         setGlobalState(response, query[1]);
     48       }
     49       break;
     50 
     51     case "unblock":
     52       response.setStatusLine(request.httpVersion, 200, "OK");
     53       response.setHeader("Cache-Control", "no-cache", false);
     54       response.setHeader("Content-Type", "image/png", false);
     55       response.write("\x89PNG"); // just a broken image is enough for our purpose
     56 
     57       var blockedResponse = getGlobalState(query[1]);
     58       if (blockedResponse === undefined) {
     59         // the unblock request came before the blocked request, remember to not block it
     60         setGlobalState(true, query[1]);
     61       } else if (typeof blockedResponse == "object") {
     62         finishBlockedRequest(request, blockedResponse, query);
     63       }
     64       break;
     65 
     66     default:
     67       response.setStatusLine(request.httpVersion, 400, "Bad request");
     68       break;
     69   }
     70 }