tor-browser

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

test_PreferencesBackupResource_searchEngines.js (8564B)


      1 /* Any copyright is dedicated to the Public Domain.
      2 https://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 const { PreferencesBackupResource } = ChromeUtils.importESModule(
      7  "resource:///modules/backup/PreferencesBackupResource.sys.mjs"
      8 );
      9 const { SearchTestUtils } = ChromeUtils.importESModule(
     10  "resource://testing-common/SearchTestUtils.sys.mjs"
     11 );
     12 const { SearchUtils } = ChromeUtils.importESModule(
     13  "moz-src:///toolkit/components/search/SearchUtils.sys.mjs"
     14 );
     15 const { updateAppInfo } = ChromeUtils.importESModule(
     16  "resource://testing-common/AppInfo.sys.mjs"
     17 );
     18 
     19 const SEARCH_PREFS_FILENAME = "search.json.mozlz4";
     20 
     21 SearchTestUtils.init(this);
     22 
     23 updateAppInfo({ name: "XPCShell", version: "48", platformVersion: "48" });
     24 do_get_profile();
     25 
     26 const FAKE_SEARCH_EXTENSION_NAME = "Some WebExtension Search Engine";
     27 const FAKE_PRIVATE_SEARCH_EXTENSION_NAME =
     28  "Some Private WebExtension Search Engine";
     29 
     30 add_setup(async function () {
     31  Services.prefs.setBoolPref("browser.search.separatePrivateDefault", true);
     32  Services.prefs.setBoolPref(
     33    "browser.search.separatePrivateDefault.ui.enabled",
     34    true
     35  );
     36 
     37  await SearchTestUtils.setRemoteSettingsConfig([
     38    { identifier: "engine1" },
     39    { identifier: "engine2" },
     40  ]);
     41 
     42  Services.prefs.setCharPref(SearchUtils.BROWSER_SEARCH_PREF + "region", "US");
     43  Services.locale.availableLocales = ["en-US"];
     44  Services.locale.requestedLocales = ["en-US"];
     45 
     46  await Services.search.init();
     47 
     48  await SearchTestUtils.installSearchExtension(
     49    {
     50      name: FAKE_SEARCH_EXTENSION_NAME,
     51      search_url: "https://example.com/plain",
     52    },
     53    { setAsDefault: true }
     54  );
     55 
     56  await SearchTestUtils.installSearchExtension(
     57    {
     58      name: FAKE_PRIVATE_SEARCH_EXTENSION_NAME,
     59      search_url: "https://example.com/",
     60      search_url_get_params: "private={searchTerms}",
     61    },
     62    { setAsDefaultPrivate: true }
     63  );
     64 
     65  await SearchTestUtils.promiseSearchNotification(
     66    "write-settings-to-disk-complete"
     67  );
     68 });
     69 
     70 /**
     71 * Tests that PreferencesBackupResource will correctly recompute search engine
     72 * verification hashes after a recovery. This is more of an integration test
     73 * than what already exists in test_PreferencesBackupResource.js.
     74 */
     75 add_task(async function test_recover_searchEngines_verified() {
     76  let preferencesBackupResource = new PreferencesBackupResource();
     77  let recoveryPath = await IOUtils.createUniqueDirectory(
     78    PathUtils.tempDir,
     79    "PreferencesBackupResource-recovery-test"
     80  );
     81  let destProfilePath = await IOUtils.createUniqueDirectory(
     82    PathUtils.tempDir,
     83    "PreferencesBackupResource-test-profile"
     84  );
     85 
     86  await IOUtils.copy(
     87    PathUtils.join(PathUtils.profileDir, SEARCH_PREFS_FILENAME),
     88    PathUtils.join(recoveryPath, SEARCH_PREFS_FILENAME)
     89  );
     90 
     91  let postRecoveryEntry = await preferencesBackupResource.recover(
     92    { profilePath: PathUtils.profileDir },
     93    recoveryPath,
     94    destProfilePath
     95  );
     96 
     97  Assert.equal(
     98    postRecoveryEntry,
     99    null,
    100    "PreferencesBackupResource.recover should return null as its post recovery entry"
    101  );
    102 
    103  let originalSearchEngineSettings = await IOUtils.readJSON(
    104    PathUtils.join(PathUtils.profileDir, SEARCH_PREFS_FILENAME),
    105    { decompress: true }
    106  );
    107 
    108  let recoveredSearchEngineSettings = await IOUtils.readJSON(
    109    PathUtils.join(destProfilePath, SEARCH_PREFS_FILENAME),
    110    { decompress: true }
    111  );
    112 
    113  Assert.notEqual(
    114    originalSearchEngineSettings.metaData.defaultEngineIdHash,
    115    recoveredSearchEngineSettings.metaData.defaultEngineIdHash,
    116    "defaultEngineIdHash was updated."
    117  );
    118  Assert.equal(
    119    recoveredSearchEngineSettings.metaData.defaultEngineIdHash,
    120    SearchUtils.getVerificationHash(
    121      originalSearchEngineSettings.metaData.defaultEngineId,
    122      destProfilePath
    123    ),
    124    "defaultEngineIdHash was updated correctly."
    125  );
    126 
    127  Assert.notEqual(
    128    originalSearchEngineSettings.metaData.privateDefaultEngineIdHash,
    129    recoveredSearchEngineSettings.metaData.privateDefaultEngineIdHash,
    130    "privateDefaultEngineIdHash was updated."
    131  );
    132  Assert.equal(
    133    recoveredSearchEngineSettings.metaData.privateDefaultEngineIdHash,
    134    SearchUtils.getVerificationHash(
    135      originalSearchEngineSettings.metaData.privateDefaultEngineId,
    136      destProfilePath
    137    ),
    138    "privateDefaultEngineIdHash was updated correctly."
    139  );
    140 
    141  Assert.equal(
    142    originalSearchEngineSettings.engines.length,
    143    recoveredSearchEngineSettings.engines.length,
    144    "Got the same number of engines"
    145  );
    146 
    147  for (let i = 0; i < originalSearchEngineSettings.engines.length; ++i) {
    148    let originalEngine = originalSearchEngineSettings.engines[i];
    149    let recoveredEngine = recoveredSearchEngineSettings.engines[i];
    150 
    151    if (originalEngine._metaData.loadPathHash) {
    152      Assert.ok(
    153        recoveredEngine._metaData.loadPathHash,
    154        "Recovered engine also has a loadPathHash"
    155      );
    156      Assert.notEqual(
    157        originalEngine._metaData.loadPathHash,
    158        recoveredEngine._metaData.loadPathHash,
    159        "loadPathHash was updated."
    160      );
    161      Assert.equal(
    162        recoveredEngine._metaData.loadPathHash,
    163        SearchUtils.getVerificationHash(
    164          originalEngine._loadPath,
    165          destProfilePath
    166        ),
    167        "loadPathHash had the expected value."
    168      );
    169    } else {
    170      Assert.deepEqual(
    171        originalEngine,
    172        recoveredEngine,
    173        "Engine was not changed."
    174      );
    175    }
    176  }
    177 
    178  await maybeRemovePath(recoveryPath);
    179  await maybeRemovePath(destProfilePath);
    180 });
    181 
    182 /**
    183 * Tests that PreferencesBackupResource will not update the verification hashes
    184 * for any search engines that fail to verify for the original path.
    185 */
    186 add_task(async function test_recover_searchEngines_unverified() {
    187  let preferencesBackupResource = new PreferencesBackupResource();
    188  let recoveryPath = await IOUtils.createUniqueDirectory(
    189    PathUtils.tempDir,
    190    "PreferencesBackupResource-recovery-test"
    191  );
    192  let destProfilePath = await IOUtils.createUniqueDirectory(
    193    PathUtils.tempDir,
    194    "PreferencesBackupResource-test-profile"
    195  );
    196 
    197  // Now let's read in the original search preferences file and break some
    198  // of the verification hashes...
    199  let searchEngineSettings = await IOUtils.readJSON(
    200    PathUtils.join(PathUtils.profileDir, SEARCH_PREFS_FILENAME),
    201    { decompress: true }
    202  );
    203 
    204  const BOGUS_HASH = "bogus hash!";
    205 
    206  searchEngineSettings.metaData.defaultEngineIdHash = BOGUS_HASH;
    207  searchEngineSettings.metaData.privateDefaultEngineIdHash = BOGUS_HASH;
    208 
    209  for (let engine of searchEngineSettings.engines) {
    210    if (engine._metaData.loadPathHash) {
    211      engine._metaData.loadPathHash = BOGUS_HASH;
    212    }
    213  }
    214 
    215  // And now let us write this data out to the recovery path.
    216  await IOUtils.writeJSON(
    217    PathUtils.join(recoveryPath, SEARCH_PREFS_FILENAME),
    218    searchEngineSettings,
    219    {
    220      compress: true,
    221    }
    222  );
    223 
    224  let postRecoveryEntry = await preferencesBackupResource.recover(
    225    { profilePath: PathUtils.profileDir },
    226    recoveryPath,
    227    destProfilePath
    228  );
    229 
    230  Assert.equal(
    231    postRecoveryEntry,
    232    null,
    233    "PreferencesBackupResource.recover should return null as its post recovery entry"
    234  );
    235 
    236  // And now let us write this data out to the recovery path.
    237  let recoveredSearchEngineSettings = await IOUtils.readJSON(
    238    PathUtils.join(destProfilePath, SEARCH_PREFS_FILENAME),
    239    {
    240      decompress: true,
    241    }
    242  );
    243 
    244  Assert.equal(
    245    recoveredSearchEngineSettings.metaData.defaultEngineIdHash,
    246    BOGUS_HASH,
    247    "Bogus defaultEngineIdHash was not changed."
    248  );
    249 
    250  Assert.equal(
    251    recoveredSearchEngineSettings.metaData.privateDefaultEngineIdHash,
    252    BOGUS_HASH,
    253    "Bogus privateDefaultEngineIdHash was not changed."
    254  );
    255 
    256  Assert.equal(
    257    searchEngineSettings.engines.length,
    258    recoveredSearchEngineSettings.engines.length,
    259    "Got the same number of engines"
    260  );
    261 
    262  for (let i = 0; i < searchEngineSettings.engines.length; ++i) {
    263    let originalEngine = searchEngineSettings.engines[i];
    264    let recoveredEngine = recoveredSearchEngineSettings.engines[i];
    265 
    266    if (originalEngine._metaData.loadPathHash) {
    267      Assert.ok(
    268        recoveredEngine._metaData.loadPathHash,
    269        "Recovered engine also has a loadPathHash"
    270      );
    271      Assert.equal(
    272        recoveredEngine._metaData.loadPathHash,
    273        BOGUS_HASH,
    274        "Bogus loadPathHash was not changed."
    275      );
    276    } else {
    277      Assert.deepEqual(
    278        originalEngine,
    279        recoveredEngine,
    280        "Engine was not changed."
    281      );
    282    }
    283  }
    284 
    285  await maybeRemovePath(recoveryPath);
    286  await maybeRemovePath(destProfilePath);
    287 });