tor-browser

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

test_proxy_pac.js (3378B)


      1 // These are globlas defined for proxy servers, in ProxyAutoConfig.cpp. See
      2 // PACGlobalFunctions
      3 /* globals dnsResolve, alert */
      4 
      5 "use strict";
      6 
      7 const { TestUtils } = ChromeUtils.importESModule(
      8  "resource://testing-common/TestUtils.sys.mjs"
      9 );
     10 const override = Cc["@mozilla.org/network/native-dns-override;1"].getService(
     11  Ci.nsINativeDNSResolverOverride
     12 );
     13 
     14 class ConsoleListener {
     15  messages = [];
     16  observe(message) {
     17    // Ignore unexpected messages.
     18    if (!(message instanceof Ci.nsIConsoleMessage)) {
     19      return;
     20    }
     21    if (!message.message.includes("PAC")) {
     22      return;
     23    }
     24 
     25    this.messages.push(message.message);
     26  }
     27 
     28  register() {
     29    Services.console.registerListener(this);
     30  }
     31 
     32  unregister() {
     33    Services.console.unregisterListener(this);
     34  }
     35 
     36  clear() {
     37    this.messages = [];
     38  }
     39 }
     40 
     41 async function configurePac(fn) {
     42  let pacURI = `data:application/x-ns-proxy-autoconfig;charset=utf-8,${encodeURIComponent(
     43    fn.toString()
     44  )}`;
     45  Services.prefs.setIntPref("network.proxy.type", 2);
     46  Services.prefs.setStringPref("network.proxy.autoconfig_url", pacURI);
     47 
     48  // Do a request so the PAC gets loaded
     49  let chan = NetUtil.newChannel({
     50    uri: `http://localhost:1234/`,
     51    loadUsingSystemPrincipal: true,
     52  }).QueryInterface(Ci.nsIHttpChannel);
     53  await new Promise(resolve =>
     54    chan.asyncOpen(new ChannelListener(resolve, null, CL_EXPECT_FAILURE))
     55  );
     56 
     57  await TestUtils.waitForCondition(
     58    () =>
     59      !!consoleListener.messages.filter(
     60        e => e.includes("PAC file installed from"),
     61        0
     62      ).length,
     63    "Wait for PAC file to be installed."
     64  );
     65  consoleListener.clear();
     66 }
     67 
     68 let consoleListener = null;
     69 function setup() {
     70  Services.prefs.setIntPref("network.proxy.type", 2);
     71  Services.prefs.setStringPref("network.proxy.autoconfig_url", "");
     72  consoleListener = new ConsoleListener();
     73  consoleListener.register();
     74 
     75  registerCleanupFunction(() => {
     76    Services.prefs.clearUserPref("network.proxy.type");
     77    Services.prefs.clearUserPref("network.proxy.autoconfig_url");
     78    if (consoleListener) {
     79      consoleListener.unregister();
     80      consoleListener = null;
     81    }
     82  });
     83 }
     84 setup();
     85 
     86 // This method checks that calling dnsResult(null) does not result in
     87 // resolving the DNS name "null"
     88 add_task(async function test_bug1724345() {
     89  consoleListener.clear();
     90  // isInNet is defined by ascii_pac_utils.js which is included for proxies.
     91  /* globals isInNet */
     92  let pac = function FindProxyForURL(url, host) {
     93    alert(`PAC resolving: ${host}`);
     94    let destIP = dnsResolve(host);
     95    alert(`PAC result: ${destIP}`);
     96    alert(
     97      `PAC isInNet: ${host} ${destIP} ${isInNet(
     98        destIP,
     99        "127.0.0.0",
    100        "255.0.0.0"
    101      )}`
    102    );
    103    return "DIRECT";
    104  };
    105 
    106  await configurePac(pac);
    107 
    108  override.clearOverrides();
    109  override.addIPOverride("example.org", "N/A");
    110  override.addIPOverride("null", "127.0.0.1");
    111  Services.dns.clearCache(true);
    112 
    113  let chan = NetUtil.newChannel({
    114    uri: `http://example.org:1234/`,
    115    loadUsingSystemPrincipal: true,
    116  }).QueryInterface(Ci.nsIHttpChannel);
    117  await new Promise(resolve =>
    118    chan.asyncOpen(new ChannelListener(resolve, null, CL_EXPECT_FAILURE))
    119  );
    120  ok(
    121    !!consoleListener.messages.filter(e =>
    122      e.includes("PAC isInNet: example.org null false")
    123    ).length,
    124    `should have proper result ${consoleListener.messages}`
    125  );
    126 });