tor-browser

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

test_originInit.js (8687B)


      1 /**
      2 * Any copyright is dedicated to the Public Domain.
      3 * http://creativecommons.org/publicdomain/zero/1.0/
      4 */
      5 
      6 async function testSteps() {
      7  const storageDirName = "storage";
      8  const persistenceTypeDefaultDirName = "default";
      9  const persistenceTypePersistentDirName = "permanent";
     10 
     11  const principal = getPrincipal("http://example.com");
     12 
     13  const originDirName = "http+++example.com";
     14 
     15  const clientLSDirName = "ls";
     16 
     17  const dataFile = getRelativeFile(
     18    `${storageDirName}/${persistenceTypeDefaultDirName}/${originDirName}/` +
     19      `${clientLSDirName}/data.sqlite`
     20  );
     21 
     22  const usageJournalFile = getRelativeFile(
     23    `${storageDirName}/${persistenceTypeDefaultDirName}/${originDirName}/` +
     24      `${clientLSDirName}/usage-journal`
     25  );
     26 
     27  const usageFile = getRelativeFile(
     28    `${storageDirName}/${persistenceTypeDefaultDirName}/${originDirName}/` +
     29      `${clientLSDirName}/usage`
     30  );
     31 
     32  const persistentLSDir = getRelativeFile(
     33    `${storageDirName}/${persistenceTypePersistentDirName}/${originDirName}/` +
     34      `${clientLSDirName}`
     35  );
     36 
     37  const data = {};
     38  data.key = "key1";
     39  data.value = "value1";
     40  data.usage = data.key.length + data.value.length;
     41 
     42  const usageFileCookie = 0x420a420a;
     43 
     44  async function createTestOrigin() {
     45    let storage = getLocalStorage(principal);
     46 
     47    storage.setItem(data.key, data.value);
     48 
     49    let request = reset();
     50    await requestFinished(request);
     51  }
     52 
     53  async function createPersistentTestOrigin() {
     54    let database = getSimpleDatabase(principal, "persistent");
     55 
     56    let request = database.open("data");
     57    await requestFinished(request);
     58 
     59    request = reset();
     60    await requestFinished(request);
     61  }
     62 
     63  function removeFile(file) {
     64    file.remove(false);
     65  }
     66 
     67  function createEmptyFile(file) {
     68    file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o0644);
     69  }
     70 
     71  function createEmptyDirectory(dir) {
     72    dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o0755);
     73  }
     74 
     75  function getBinaryOutputStream(file) {
     76    var ostream = Cc[
     77      "@mozilla.org/network/file-output-stream;1"
     78    ].createInstance(Ci.nsIFileOutputStream);
     79    ostream.init(file, -1, parseInt("0644", 8), 0);
     80 
     81    let bstream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(
     82      Ci.nsIBinaryOutputStream
     83    );
     84    bstream.setOutputStream(ostream);
     85 
     86    return bstream;
     87  }
     88 
     89  async function initTestOrigin() {
     90    let request = initStorage();
     91    await requestFinished(request);
     92 
     93    request = initTemporaryStorage();
     94    await requestFinished(request);
     95 
     96    request = initTemporaryOrigin("default", principal);
     97    await requestFinished(request);
     98  }
     99 
    100  async function initPersistentTestOrigin() {
    101    let request = initStorage();
    102    await requestFinished(request);
    103 
    104    request = initPersistentOrigin(principal);
    105    await requestFinished(request);
    106  }
    107 
    108  async function checkFiles(wantData, wantUsage) {
    109    let exists = dataFile.exists();
    110    if (wantData) {
    111      ok(exists, "Data file does exist");
    112    } else {
    113      ok(!exists, "Data file doesn't exist");
    114    }
    115 
    116    exists = usageJournalFile.exists();
    117    ok(!exists, "Usage journal file doesn't exist");
    118 
    119    exists = usageFile.exists();
    120    if (wantUsage) {
    121      ok(exists, "Usage file does exist");
    122    } else {
    123      ok(!exists, "Usage file doesn't exist");
    124      return;
    125    }
    126 
    127    let usage = await readUsageFromUsageFile(usageFile);
    128    Assert.equal(usage, data.usage, "Correct usage");
    129  }
    130 
    131  async function clearTestOrigin() {
    132    let request = clearOrigin(principal, "default");
    133    await requestFinished(request);
    134  }
    135 
    136  async function clearPersistentTestOrigin() {
    137    let request = clearOrigin(principal, "persistent");
    138    await requestFinished(request);
    139  }
    140 
    141  info("Setting prefs");
    142 
    143  Services.prefs.setBoolPref(
    144    "dom.storage.enable_unsupported_legacy_implementation",
    145    false
    146  );
    147 
    148  info(
    149    "Stage 1 - " +
    150      "data.sqlite file doesn't exist, " +
    151      "usage-journal file doesn't exist, " +
    152      "any usage file exists"
    153  );
    154 
    155  await createTestOrigin();
    156 
    157  removeFile(dataFile);
    158 
    159  await initTestOrigin();
    160 
    161  await checkFiles(/* wantData */ false, /* wantUsage */ false);
    162 
    163  await clearTestOrigin();
    164 
    165  info(
    166    "Stage 2 - " +
    167      "data.sqlite file doesn't exist, " +
    168      "any usage-journal file exists, " +
    169      "any usage file exists"
    170  );
    171 
    172  await createTestOrigin();
    173 
    174  removeFile(dataFile);
    175  createEmptyFile(usageJournalFile);
    176 
    177  await initTestOrigin();
    178 
    179  await checkFiles(/* wantData */ false, /* wantUsage */ false);
    180 
    181  await clearTestOrigin();
    182 
    183  info(
    184    "Stage 3 - " +
    185      "valid data.sqlite file exists, " +
    186      "usage-journal file doesn't exist, " +
    187      "usage file doesn't exist"
    188  );
    189 
    190  await createTestOrigin();
    191 
    192  removeFile(usageFile);
    193 
    194  await initTestOrigin();
    195 
    196  await checkFiles(/* wantData */ true, /* wantUsage */ true);
    197 
    198  await clearTestOrigin();
    199 
    200  info(
    201    "Stage 4 - " +
    202      "valid data.sqlite file exists, " +
    203      "usage-journal file doesn't exist, " +
    204      "invalid (wrong file size) usage file exists"
    205  );
    206 
    207  await createTestOrigin();
    208 
    209  removeFile(usageFile);
    210  createEmptyFile(usageFile);
    211 
    212  await initTestOrigin();
    213 
    214  await checkFiles(/* wantData */ true, /* wantUsage */ true);
    215 
    216  await clearTestOrigin();
    217 
    218  info(
    219    "Stage 5 - " +
    220      "valid data.sqlite file exists, " +
    221      "usage-journal file doesn't exist, " +
    222      "invalid (wrong cookie) usage file exists"
    223  );
    224 
    225  await createTestOrigin();
    226 
    227  let stream = getBinaryOutputStream(usageFile);
    228  stream.write32(usageFileCookie - 1);
    229  stream.write64(data.usage);
    230  stream.close();
    231 
    232  await initTestOrigin();
    233 
    234  await checkFiles(/* wantData */ true, /* wantUsage */ true);
    235 
    236  await clearTestOrigin();
    237 
    238  info(
    239    "Stage 6 - " +
    240      "valid data.sqlite file exists, " +
    241      "usage-journal file doesn't exist, " +
    242      "valid usage file exists"
    243  );
    244 
    245  await createTestOrigin();
    246 
    247  await initTestOrigin();
    248 
    249  await checkFiles(/* wantData */ true, /* wantUsage */ true);
    250 
    251  await clearTestOrigin();
    252 
    253  info(
    254    "Stage 7 - " +
    255      "valid data.sqlite file exists, " +
    256      "any usage-journal exists, " +
    257      "usage file doesn't exist"
    258  );
    259 
    260  await createTestOrigin();
    261 
    262  createEmptyFile(usageJournalFile);
    263  removeFile(usageFile);
    264 
    265  await initTestOrigin();
    266 
    267  await checkFiles(/* wantData */ true, /* wantUsage */ true);
    268 
    269  await clearTestOrigin();
    270 
    271  info(
    272    "Stage 8 - " +
    273      "valid data.sqlite file exists, " +
    274      "any usage-journal exists, " +
    275      "invalid (wrong file size) usage file exists"
    276  );
    277 
    278  await createTestOrigin();
    279 
    280  createEmptyFile(usageJournalFile);
    281  removeFile(usageFile);
    282  createEmptyFile(usageFile);
    283 
    284  await initTestOrigin();
    285 
    286  await checkFiles(/* wantData */ true, /* wantUsage */ true);
    287 
    288  await clearTestOrigin();
    289 
    290  info(
    291    "Stage 9 - " +
    292      "valid data.sqlite file exists, " +
    293      "any usage-journal exists, " +
    294      "invalid (wrong cookie) usage file exists"
    295  );
    296 
    297  await createTestOrigin();
    298 
    299  createEmptyFile(usageJournalFile);
    300  stream = getBinaryOutputStream(usageFile);
    301  stream.write32(usageFileCookie - 1);
    302  stream.write64(data.usage);
    303  stream.close();
    304 
    305  await initTestOrigin();
    306 
    307  await checkFiles(/* wantData */ true, /* wantUsage */ true);
    308 
    309  await clearTestOrigin();
    310 
    311  info(
    312    "Stage 10 - " +
    313      "valid data.sqlite file exists, " +
    314      "any usage-journal exists, " +
    315      "invalid (wrong usage) usage file exists"
    316  );
    317 
    318  await createTestOrigin();
    319 
    320  createEmptyFile(usageJournalFile);
    321  stream = getBinaryOutputStream(usageFile);
    322  stream.write32(usageFileCookie);
    323  stream.write64(data.usage - 1);
    324  stream.close();
    325 
    326  await initTestOrigin();
    327 
    328  await checkFiles(/* wantData */ true, /* wantUsage */ true);
    329 
    330  await clearTestOrigin();
    331 
    332  info(
    333    "Stage 11 - " +
    334      "valid data.sqlite file exists, " +
    335      "any usage-journal exists, " +
    336      "valid usage file exists"
    337  );
    338 
    339  await createTestOrigin();
    340 
    341  createEmptyFile(usageJournalFile);
    342 
    343  await initTestOrigin();
    344 
    345  await checkFiles(/* wantData */ true, /* wantUsage */ true);
    346 
    347  await clearTestOrigin();
    348 
    349  // Verify that InitializeOrigin doesn't fail when a
    350  // storage/permanent/${origin}/ls exists.
    351  info(
    352    "Stage 12 - Testing initialization of ls directory placed in permanent " +
    353      "origin directory"
    354  );
    355 
    356  await createPersistentTestOrigin();
    357 
    358  createEmptyDirectory(persistentLSDir);
    359 
    360  try {
    361    await initPersistentTestOrigin();
    362 
    363    ok(true, "Should not have thrown");
    364  } catch (ex) {
    365    ok(false, "Should not have thrown");
    366  }
    367 
    368  let exists = persistentLSDir.exists();
    369  ok(exists, "ls directory in permanent origin directory does exist");
    370 
    371  await clearPersistentTestOrigin();
    372 }
    373 
    374 add_task(
    375  {
    376    pref_set: [["dom.quotaManager.loadQuotaFromCache", false]],
    377  },
    378  testSteps
    379 );