tor-browser

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

socks_client_subprocess.js (2310B)


      1 /* global arguments */
      2 
      3 "use strict";
      4 
      5 var CC = Components.Constructor;
      6 
      7 const BinaryInputStream = CC(
      8  "@mozilla.org/binaryinputstream;1",
      9  "nsIBinaryInputStream",
     10  "setInputStream"
     11 );
     12 const ProtocolProxyService = CC(
     13  "@mozilla.org/network/protocol-proxy-service;1",
     14  "nsIProtocolProxyService"
     15 );
     16 var sts = Cc["@mozilla.org/network/socket-transport-service;1"].getService(
     17  Ci.nsISocketTransportService
     18 );
     19 
     20 function waitForStream(stream, streamType) {
     21  return new Promise((resolve, reject) => {
     22    stream = stream.QueryInterface(streamType);
     23    if (!stream) {
     24      reject("stream didn't implement given stream type");
     25    }
     26    let currentThread =
     27      Cc["@mozilla.org/thread-manager;1"].getService().currentThread;
     28    stream.asyncWait(resolve, 0, 0, currentThread);
     29  });
     30 }
     31 
     32 async function launchConnection(
     33  socks_vers,
     34  socks_port,
     35  dest_host,
     36  dest_port,
     37  dns
     38 ) {
     39  let pi_flags = 0;
     40  if (dns == "remote") {
     41    pi_flags = Ci.nsIProxyInfo.TRANSPARENT_PROXY_RESOLVES_HOST;
     42  }
     43 
     44  let pps = new ProtocolProxyService();
     45  let pi = pps.newProxyInfo(
     46    socks_vers,
     47    "localhost",
     48    socks_port,
     49    "",
     50    "",
     51    pi_flags,
     52    -1,
     53    null
     54  );
     55  let trans = sts.createTransport([], dest_host, dest_port, pi, null);
     56  let input = trans.openInputStream(0, 0, 0);
     57  let output = trans.openOutputStream(0, 0, 0);
     58  input = await waitForStream(input, Ci.nsIAsyncInputStream);
     59  let bin = new BinaryInputStream(input);
     60  let data = bin.readBytes(5);
     61  let response;
     62  if (data == "PING!") {
     63    print("client: got ping, sending pong.");
     64    response = "PONG!";
     65  } else {
     66    print("client: wrong data from server:", data);
     67    response = "Error: wrong data received.";
     68  }
     69  output = await waitForStream(output, Ci.nsIAsyncOutputStream);
     70  output.write(response, response.length);
     71  output.close();
     72  input.close();
     73 }
     74 
     75 async function run(args) {
     76  for (let arg of args) {
     77    print("client: running test", arg);
     78    let test = arg.split("|");
     79    await launchConnection(
     80      test[0],
     81      parseInt(test[1]),
     82      test[2],
     83      parseInt(test[3]),
     84      test[4]
     85    );
     86  }
     87 }
     88 
     89 var satisfied = false;
     90 run(arguments).then(() => (satisfied = true));
     91 var mainThread = Cc["@mozilla.org/thread-manager;1"].getService().mainThread;
     92 while (!satisfied) {
     93  mainThread.processNextEvent(true);
     94 }