tor-browser

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

test_cookiejars.js (5096B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 /*
      6 *  Test that channels with different LoadInfo
      7 *  are stored in separate namespaces ("cookie jars")
      8 */
      9 
     10 "use strict";
     11 
     12 ChromeUtils.defineLazyGetter(this, "URL", function () {
     13  return "http://localhost:" + httpserver.identity.primaryPort;
     14 });
     15 
     16 const { HttpServer } = ChromeUtils.importESModule(
     17  "resource://testing-common/httpd.sys.mjs"
     18 );
     19 
     20 var httpserver = new HttpServer();
     21 
     22 var cookieSetPath = "/setcookie";
     23 var cookieCheckPath = "/checkcookie";
     24 
     25 function inChildProcess() {
     26  return Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
     27 }
     28 
     29 // Test array:
     30 //  - element 0: name for cookie, used both to set and later to check
     31 //  - element 1: loadInfo (determines cookie namespace)
     32 //
     33 // TODO: bug 722850: make private browsing work per-app, and add tests.  For now
     34 // all values are 'false' for PB.
     35 
     36 var tests = [
     37  {
     38    cookieName: "LCC_App0_BrowF_PrivF",
     39    originAttributes: new OriginAttributes(0),
     40  },
     41  {
     42    cookieName: "LCC_App1_BrowF_PrivF",
     43    originAttributes: new OriginAttributes(1),
     44  },
     45 ];
     46 
     47 // test number: index into 'tests' array
     48 var i = 0;
     49 
     50 function setupChannel(path) {
     51  var chan = NetUtil.newChannel({
     52    uri: URL + path,
     53    loadUsingSystemPrincipal: true,
     54  });
     55  chan.loadInfo.originAttributes = tests[i].originAttributes;
     56  chan.QueryInterface(Ci.nsIHttpChannel);
     57 
     58  let loadGroup = Cc["@mozilla.org/network/load-group;1"].createInstance(
     59    Ci.nsILoadGroup
     60  );
     61 
     62  if (chan.loadInfo.originAttributes.privateBrowsingId == 0) {
     63    loadGroup.notificationCallbacks = Cu.createLoadContext();
     64    chan.loadGroup = loadGroup;
     65 
     66    chan.notificationCallbacks = Cu.createLoadContext();
     67  } else {
     68    loadGroup.notificationCallbacks = Cu.createPrivateLoadContext();
     69    chan.loadGroup = loadGroup;
     70 
     71    chan.notificationCallbacks = Cu.createPrivateLoadContext();
     72  }
     73 
     74  return chan;
     75 }
     76 
     77 function setCookie() {
     78  var channel = setupChannel(cookieSetPath);
     79  channel.setRequestHeader("foo-set-cookie", tests[i].cookieName, false);
     80  channel.asyncOpen(new ChannelListener(setNextCookie, null));
     81 }
     82 
     83 function setNextCookie() {
     84  if (++i == tests.length) {
     85    // all cookies set: switch to checking them
     86    i = 0;
     87    checkCookie();
     88  } else {
     89    info("setNextCookie:i=" + i);
     90    setCookie();
     91  }
     92 }
     93 
     94 // Open channel that should send one and only one correct Cookie: header to
     95 // server, corresponding to it's namespace
     96 function checkCookie() {
     97  var channel = setupChannel(cookieCheckPath);
     98  channel.asyncOpen(new ChannelListener(completeCheckCookie, null));
     99 }
    100 
    101 function completeCheckCookie(request) {
    102  // Look for all cookies in what the server saw: fail if we see any besides the
    103  // one expected cookie for each namespace;
    104  var expectedCookie = tests[i].cookieName;
    105  request.QueryInterface(Ci.nsIHttpChannel);
    106  var cookiesSeen = request.getResponseHeader("foo-saw-cookies");
    107 
    108  var j;
    109  for (j = 0; j < tests.length; j++) {
    110    var cookieToCheck = tests[j].cookieName;
    111    let found = cookiesSeen.includes(cookieToCheck);
    112    if (found && expectedCookie != cookieToCheck) {
    113      do_throw(
    114        "test index " +
    115          i +
    116          ": found unexpected cookie '" +
    117          cookieToCheck +
    118          "': in '" +
    119          cookiesSeen +
    120          "'"
    121      );
    122    } else if (!found && expectedCookie == cookieToCheck) {
    123      do_throw(
    124        "test index " +
    125          i +
    126          ": missing expected cookie '" +
    127          expectedCookie +
    128          "': in '" +
    129          cookiesSeen +
    130          "'"
    131      );
    132    }
    133  }
    134  // If we get here we're good.
    135  info("Saw only correct cookie '" + expectedCookie + "'");
    136  Assert.ok(true);
    137 
    138  if (++i == tests.length) {
    139    // end of tests
    140    httpserver.stop(do_test_finished);
    141  } else {
    142    checkCookie();
    143  }
    144 }
    145 
    146 function run_test() {
    147  // Allow all cookies if the pref service is available in this process.
    148  if (!inChildProcess()) {
    149    Services.prefs.setIntPref("network.cookie.cookieBehavior", 0);
    150    Services.prefs.setBoolPref(
    151      "network.cookieJarSettings.unblocked_for_testing",
    152      true
    153    );
    154  }
    155 
    156  httpserver.registerPathHandler(cookieSetPath, cookieSetHandler);
    157  httpserver.registerPathHandler(cookieCheckPath, cookieCheckHandler);
    158  httpserver.start(-1);
    159 
    160  setCookie();
    161  do_test_pending();
    162 }
    163 
    164 function cookieSetHandler(metadata, response) {
    165  var cookieName = metadata.getHeader("foo-set-cookie");
    166 
    167  response.setStatusLine(metadata.httpVersion, 200, "Ok");
    168  response.setHeader("Set-Cookie", cookieName + "=1; Path=/", false);
    169  response.setHeader("Content-Type", "text/plain");
    170  response.bodyOutputStream.write("Ok", "Ok".length);
    171 }
    172 
    173 function cookieCheckHandler(metadata, response) {
    174  var cookies = metadata.getHeader("Cookie");
    175 
    176  response.setStatusLine(metadata.httpVersion, 200, "Ok");
    177  response.setHeader("foo-saw-cookies", cookies, false);
    178  response.setHeader("Content-Type", "text/plain");
    179  response.bodyOutputStream.write("Ok", "Ok".length);
    180 }