tor-browser

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

test_prefs_engine.js (4222B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 const { getPrefsGUIDForTest } = ChromeUtils.importESModule(
      5  "resource://services-sync/engines/prefs.sys.mjs"
      6 );
      7 const PREFS_GUID = getPrefsGUIDForTest();
      8 const { Service } = ChromeUtils.importESModule(
      9  "resource://services-sync/service.sys.mjs"
     10 );
     11 
     12 async function cleanup(engine, server) {
     13  await engine._tracker.stop();
     14  await engine.wipeClient();
     15  for (const pref of Svc.PrefBranch.getChildList("")) {
     16    Svc.PrefBranch.clearUserPref(pref);
     17  }
     18  Service.recordManager.clearCache();
     19  await promiseStopServer(server);
     20 }
     21 
     22 add_task(async function test_modified_after_fail() {
     23  let engine = Service.engineManager.get("prefs");
     24 
     25  let server = await serverForFoo(engine);
     26  await SyncTestingInfrastructure(server);
     27 
     28  try {
     29    // The homepage pref is synced by default.
     30    _("Set homepage before first sync");
     31    Services.prefs.setStringPref("browser.startup.homepage", "about:welcome");
     32 
     33    _("First sync; create collection and pref record on server");
     34    await sync_engine_and_validate_telem(engine, false);
     35 
     36    let collection = server.user("foo").collection("prefs");
     37    equal(
     38      collection.cleartext(PREFS_GUID).value["browser.startup.homepage"],
     39      "about:welcome",
     40      "Should upload homepage in pref record"
     41    );
     42    ok(
     43      !engine._tracker.modified,
     44      "Tracker shouldn't be modified after first sync"
     45    );
     46 
     47    // Our tracker only has a `modified` flag that's reset after a
     48    // successful upload. Force it to remain set by failing the
     49    // upload.
     50    _("Second sync; flag tracker as modified and throw on upload");
     51    Services.prefs.setStringPref("browser.startup.homepage", "about:robots");
     52    engine._tracker.modified = true;
     53    let oldPost = collection.post;
     54    collection.post = () => {
     55      throw new Error("Sync this!");
     56    };
     57    await Assert.rejects(
     58      sync_engine_and_validate_telem(engine, true),
     59      ex => ex.success === false
     60    );
     61    ok(
     62      engine._tracker.modified,
     63      "Tracker should remain modified after failed sync"
     64    );
     65 
     66    _("Third sync");
     67    collection.post = oldPost;
     68    await sync_engine_and_validate_telem(engine, false);
     69    equal(
     70      collection.cleartext(PREFS_GUID).value["browser.startup.homepage"],
     71      "about:robots",
     72      "Should upload new homepage on third sync"
     73    );
     74    ok(
     75      !engine._tracker.modified,
     76      "Tracker shouldn't be modified again after third sync"
     77    );
     78  } finally {
     79    await cleanup(engine, server);
     80  }
     81 });
     82 
     83 add_task(async function test_allow_arbitrary() {
     84  let engine = Service.engineManager.get("prefs");
     85 
     86  let server = await serverForFoo(engine);
     87  await SyncTestingInfrastructure(server);
     88 
     89  try {
     90    _("Create collection and pref record on server");
     91    await sync_engine_and_validate_telem(engine, false);
     92 
     93    let collection = server.user("foo").collection("prefs");
     94 
     95    _("Insert arbitrary pref into remote record");
     96    let cleartext1 = collection.cleartext(PREFS_GUID);
     97    cleartext1.value.let_viruses_take_over = true;
     98    collection.insert(
     99      PREFS_GUID,
    100      encryptPayload(cleartext1),
    101      new_timestamp() + 5
    102    );
    103 
    104    _("Sync again; client shouldn't allow pref");
    105    await sync_engine_and_validate_telem(engine, false);
    106    ok(
    107      !Services.prefs.getBoolPref("let_viruses_take_over", false),
    108      "Shouldn't allow arbitrary remote prefs without control pref"
    109    );
    110 
    111    _("Sync with control pref set; client should set new pref");
    112    Services.prefs.setBoolPref(
    113      "services.sync.prefs.sync.let_viruses_take_over_take_two",
    114      true
    115    );
    116 
    117    let cleartext2 = collection.cleartext(PREFS_GUID);
    118    cleartext2.value.let_viruses_take_over_take_two = true;
    119    collection.insert(
    120      PREFS_GUID,
    121      encryptPayload(cleartext2),
    122      new_timestamp() + 5
    123    );
    124    // Reset the last sync time so that the engine fetches the record again.
    125    await engine.setLastSync(0);
    126    await sync_engine_and_validate_telem(engine, false);
    127    ok(
    128      Services.prefs.getBoolPref("let_viruses_take_over_take_two"),
    129      "Should set arbitrary remote pref with control pref"
    130    );
    131  } finally {
    132    await cleanup(engine, server);
    133  }
    134 });