tor-browser

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

test_collections_recovery.js (2586B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 // Verify that we wipe the server if we have to regenerate keys.
      5 const { Service } = ChromeUtils.importESModule(
      6  "resource://services-sync/service.sys.mjs"
      7 );
      8 
      9 add_task(async function test_missing_crypto_collection() {
     10  enableValidationPrefs();
     11 
     12  let johnHelper = track_collections_helper();
     13  let johnU = johnHelper.with_updated_collection;
     14  let johnColls = johnHelper.collections;
     15 
     16  let empty = false;
     17  function maybe_empty(handler) {
     18    return function (request, response) {
     19      if (empty) {
     20        let body = "{}";
     21        response.setStatusLine(request.httpVersion, 200, "OK");
     22        response.bodyOutputStream.write(body, body.length);
     23      } else {
     24        handler(request, response);
     25      }
     26    };
     27  }
     28 
     29  let handlers = {
     30    "/1.1/johndoe/info/collections": maybe_empty(johnHelper.handler),
     31    "/1.1/johndoe/storage/crypto/keys": johnU(
     32      "crypto",
     33      new ServerWBO("keys").handler()
     34    ),
     35    "/1.1/johndoe/storage/meta/global": johnU(
     36      "meta",
     37      new ServerWBO("global").handler()
     38    ),
     39  };
     40  let collections = [
     41    "clients",
     42    "bookmarks",
     43    "forms",
     44    "history",
     45    "passwords",
     46    "prefs",
     47    "tabs",
     48  ];
     49  // Disable addon sync because AddonManager won't be initialized here.
     50  await Service.engineManager.unregister("addons");
     51  await Service.engineManager.unregister("extension-storage");
     52 
     53  for (let coll of collections) {
     54    handlers["/1.1/johndoe/storage/" + coll] = johnU(
     55      coll,
     56      new ServerCollection({}, true).handler()
     57    );
     58  }
     59  let server = httpd_setup(handlers);
     60  await configureIdentity({ username: "johndoe" }, server);
     61 
     62  try {
     63    let fresh = 0;
     64    let orig = Service._freshStart;
     65    Service._freshStart = async function () {
     66      _("Called _freshStart.");
     67      await orig.call(Service);
     68      fresh++;
     69    };
     70 
     71    _("Startup, no meta/global: freshStart called once.");
     72    await sync_and_validate_telem();
     73    Assert.equal(fresh, 1);
     74    fresh = 0;
     75 
     76    _("Regular sync: no need to freshStart.");
     77    await Service.sync();
     78    Assert.equal(fresh, 0);
     79 
     80    _("Simulate a bad info/collections.");
     81    delete johnColls.crypto;
     82    await sync_and_validate_telem();
     83    Assert.equal(fresh, 1);
     84    fresh = 0;
     85 
     86    _("Regular sync: no need to freshStart.");
     87    await sync_and_validate_telem();
     88    Assert.equal(fresh, 0);
     89  } finally {
     90    for (const pref of Svc.PrefBranch.getChildList("")) {
     91      Svc.PrefBranch.clearUserPref(pref);
     92    }
     93    await promiseStopServer(server);
     94  }
     95 });