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 * Common logic shared by RemoteSettingsWorker.js (Worker) and the main thread.
7 */
8
9var EXPORTED_SYMBOLS = ["SharedUtils"];
10
11// Import globals that are available by default in workers but not in JSMs.
12if (typeof crypto == "undefined") {
13  Cu.importGlobalProperties(["fetch", "crypto"]);
14}
15
16var SharedUtils = {
17  /**
18   * Check that the specified content matches the expected size and SHA-256 hash.
19   * @param {ArrayBuffer} buffer binary content
20   * @param {Number} size expected file size
21   * @param {String} size expected file SHA-256 as hex string
22   * @returns {boolean}
23   */
24  async checkContentHash(buffer, size, hash) {
25    const bytes = new Uint8Array(buffer);
26    // Has expected size? (saves computing hash)
27    if (bytes.length !== size) {
28      return false;
29    }
30    // Has expected content?
31    const hashBuffer = await crypto.subtle.digest("SHA-256", bytes);
32    const hashBytes = new Uint8Array(hashBuffer);
33    const toHex = b => b.toString(16).padStart(2, "0");
34    const hashStr = Array.from(hashBytes, toHex).join("");
35    return hashStr == hash;
36  },
37
38  /**
39   * Load (from disk) the JSON file distributed with the release for this collection.
40   * @param {String}  bucket
41   * @param {String}  collection
42   */
43  async loadJSONDump(bucket, collection) {
44    // When using the preview bucket, we still want to load the main dump.
45    // But we store it locally in the preview bucket.
46    const jsonBucket = bucket.replace("-preview", "");
47    const fileURI = `resource://app/defaults/settings/${jsonBucket}/${collection}.json`;
48    let response;
49    try {
50      response = await fetch(fileURI);
51    } catch (e) {
52      // Return null if file is missing.
53      return { data: null };
54    }
55    // Will throw if JSON is invalid.
56    return response.json();
57  },
58};
59