зеркало из https://github.com/mozilla/gecko-dev.git
81 строка
2.9 KiB
JavaScript
81 строка
2.9 KiB
JavaScript
/* 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/. */
|
|
|
|
this.EXPORTED_SYMBOLS = ["checkVersions", "addTestKintoClient"];
|
|
|
|
const { classes: Cc, Constructor: CC, interfaces: Ci, utils: Cu } = Components;
|
|
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
Cu.import("resource://gre/modules/Task.jsm");
|
|
Cu.importGlobalProperties(['fetch']);
|
|
|
|
const PREF_KINTO_CHANGES_PATH = "services.kinto.changes.path";
|
|
const PREF_KINTO_BASE = "services.kinto.base";
|
|
const PREF_KINTO_LAST_UPDATE = "services.kinto.last_update_seconds";
|
|
const PREF_KINTO_CLOCK_SKEW_SECONDS = "services.kinto.clock_skew_seconds";
|
|
|
|
const kintoClients = {
|
|
};
|
|
|
|
// This is called by the ping mechanism.
|
|
// returns a promise that rejects if something goes wrong
|
|
this.checkVersions = function() {
|
|
return Task.spawn(function *() {
|
|
// Fetch a versionInfo object that looks like:
|
|
// {"data":[
|
|
// {
|
|
// "host":"kinto-ota.dev.mozaws.net",
|
|
// "last_modified":1450717104423,
|
|
// "bucket":"blocklists",
|
|
// "collection":"certificates"
|
|
// }]}
|
|
// Right now, we only use the collection name and the last modified info
|
|
let kintoBase = Services.prefs.getCharPref(PREF_KINTO_BASE);
|
|
let changesEndpoint = kintoBase + Services.prefs.getCharPref(PREF_KINTO_CHANGES_PATH);
|
|
|
|
let response = yield fetch(changesEndpoint);
|
|
|
|
// Record new update time and the difference between local and server time
|
|
let serverTimeMillis = Date.parse(response.headers.get("Date"));
|
|
let clockDifference = Math.abs(Date.now() - serverTimeMillis) / 1000;
|
|
Services.prefs.setIntPref(PREF_KINTO_LAST_UPDATE, serverTimeMillis / 1000);
|
|
Services.prefs.setIntPref(PREF_KINTO_CLOCK_SKEW_SECONDS, clockDifference);
|
|
|
|
let versionInfo = yield response.json();
|
|
|
|
let firstError;
|
|
for (let collectionInfo of versionInfo.data) {
|
|
let collection = collectionInfo.collection;
|
|
let kintoClient = kintoClients[collection];
|
|
if (kintoClient && kintoClient.maybeSync) {
|
|
let lastModified = 0;
|
|
if (collectionInfo.last_modified) {
|
|
lastModified = collectionInfo.last_modified
|
|
}
|
|
try {
|
|
yield kintoClient.maybeSync(lastModified, serverTimeMillis);
|
|
} catch (e) {
|
|
if (!firstError) {
|
|
firstError = e;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (firstError) {
|
|
// cause the promise to reject by throwing the first observed error
|
|
throw firstError;
|
|
}
|
|
});
|
|
};
|
|
|
|
// Add a kintoClient for testing purposes. Do not use for any other purpose
|
|
this.addTestKintoClient = function(name, kintoClient) {
|
|
kintoClients[name] = kintoClient;
|
|
};
|
|
|
|
// Add the various things that we know want updates
|
|
kintoClients.certificates =
|
|
Cu.import("resource://services-common/KintoCertificateBlocklist.js", {})
|
|
.OneCRLClient;
|