diff options
Diffstat (limited to 'services/settings/SharedUtils.jsm')
-rw-r--r-- | services/settings/SharedUtils.jsm | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/services/settings/SharedUtils.jsm b/services/settings/SharedUtils.jsm new file mode 100644 index 0000000000..db5017a742 --- /dev/null +++ b/services/settings/SharedUtils.jsm @@ -0,0 +1,58 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Common logic shared by RemoteSettingsWorker.js (Worker) and the main thread. + */ + +var EXPORTED_SYMBOLS = ["SharedUtils"]; + +// Import globals that are available by default in workers but not in JSMs. +if (typeof crypto == "undefined") { + Cu.importGlobalProperties(["fetch", "crypto"]); +} + +var SharedUtils = { + /** + * Check that the specified content matches the expected size and SHA-256 hash. + * @param {ArrayBuffer} buffer binary content + * @param {Number} size expected file size + * @param {String} size expected file SHA-256 as hex string + * @returns {boolean} + */ + async checkContentHash(buffer, size, hash) { + const bytes = new Uint8Array(buffer); + // Has expected size? (saves computing hash) + if (bytes.length !== size) { + return false; + } + // Has expected content? + const hashBuffer = await crypto.subtle.digest("SHA-256", bytes); + const hashBytes = new Uint8Array(hashBuffer); + const toHex = b => b.toString(16).padStart(2, "0"); + const hashStr = Array.from(hashBytes, toHex).join(""); + return hashStr == hash; + }, + + /** + * Load (from disk) the JSON file distributed with the release for this collection. + * @param {String} bucket + * @param {String} collection + */ + async loadJSONDump(bucket, collection) { + // When using the preview bucket, we still want to load the main dump. + // But we store it locally in the preview bucket. + const jsonBucket = bucket.replace("-preview", ""); + const fileURI = `resource://app/defaults/settings/${jsonBucket}/${collection}.json`; + let response; + try { + response = await fetch(fileURI); + } catch (e) { + // Return null if file is missing. + return { data: null }; + } + // Will throw if JSON is invalid. + return response.json(); + }, +}; |