diff --git a/addon/bootstrap.js b/addon/bootstrap.js index 63974fdffd..5edd63e4a0 100644 --- a/addon/bootstrap.js +++ b/addon/bootstrap.js @@ -1,8 +1,12 @@ -/* globals Components */ +/* globals Components, AddonManager */ /* eslint-disable no-unused-vars */ +const OLD_ADDON_PREF_NAME = "extensions.jid1-NeEaf3sAHdKHPA@jetpack.deviceIdInfo"; +const OLD_ADDON_ID = "jid1-NeEaf3sAHdKHPA@jetpack"; + const prefs = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); +Components.utils.import("resource://gre/modules/AddonManager.jsm"); function startup(data, reason) { data.webExtension.startup().then((api) => { @@ -19,5 +23,16 @@ function handleMessage(msg, sender, sendReply) { if (msg && msg.funcName === "getTelemetryPref") { let enableTelemetry = prefs.getPrefType('toolkit.telemetry.enabled') && prefs.getBoolPref("toolkit.telemetry.enabled"); sendReply({type: "success", value: enableTelemetry}); + } else if (msg && msg.funcName === "getOldDeviceInfo") { + let oldDeviceInfo = prefs.prefHasUserValue(OLD_ADDON_PREF_NAME) && prefs.getCharPref(OLD_ADDON_PREF_NAME); + sendReply({type: "success", value: oldDeviceInfo || null}); + } else if (msg && msg.funcName === "removeOldAddon") { + AddonManager.getAddonByID(OLD_ADDON_ID, (addon) => { + // FIXME: remove OLD_ADDON_PREF_NAME, see #2370 + if (addon) { + addon.uninstall(); + } + sendReply({type: "success", value: !! addon}); + }); } } diff --git a/addon/webextension/background/auth.js b/addon/webextension/background/auth.js index 834c905b5b..812e70cae3 100644 --- a/addon/webextension/background/auth.js +++ b/addon/webextension/background/auth.js @@ -150,5 +150,26 @@ window.auth = (function () { return registrationInfo.registered; }; + exports.setDeviceInfoFromOldAddon = function (newDeviceInfo) { + if (! (newDeviceInfo.deviceId && newDeviceInfo.secret)) { + throw new Error("Bad deviceInfo"); + } + if (registrationInfo.deviceId === newDeviceInfo.deviceId && + registrationInfo.secret === newDeviceInfo.secret) { + // Probably we already imported the information + return Promise.resolve(false); + } + let newInfo = { + deviceId: newDeviceInfo.deviceId, + secret: newDeviceInfo.secret, + deviceInfo: JSON.stringify(deviceInfo()), + registered: true + }; + initialized = false; + return browser.storage.local.set({registrationInfo: newInfo}).then(() => { + return true; + }); + }; + return exports; })(); diff --git a/addon/webextension/background/main.js b/addon/webextension/background/main.js index 3c05f11c1d..f3c43b5283 100644 --- a/addon/webextension/background/main.js +++ b/addon/webextension/background/main.js @@ -1,5 +1,5 @@ /* globals browser, console, XMLHttpRequest, Image, document, setTimeout, navigator */ -/* globals loadSelector, analytics, communication, catcher, makeUuid */ +/* globals loadSelector, analytics, communication, catcher, makeUuid, auth */ window.main = (function () { let exports = {}; @@ -82,5 +82,20 @@ window.main = (function () { } }); + catcher.watchPromise(browser.runtime.sendMessage({funcName: "getOldDeviceInfo"}).then((deviceInfo) => { + deviceInfo = deviceInfo.value; + if (! deviceInfo) { + return; + } + deviceInfo = JSON.parse(deviceInfo); + if (deviceInfo && typeof deviceInfo == "object") { + return auth.setDeviceInfoFromOldAddon(deviceInfo).then((updated) => { + if (updated) { + return browser.runtime.sendMessage({funcName: "removeOldAddon"}); + } + }); + } + })); + return exports; })();