summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/webextensions/test/browser/browser_hotfix.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/webextensions/test/browser/browser_hotfix.js')
-rw-r--r--toolkit/mozapps/webextensions/test/browser/browser_hotfix.js171
1 files changed, 171 insertions, 0 deletions
diff --git a/toolkit/mozapps/webextensions/test/browser/browser_hotfix.js b/toolkit/mozapps/webextensions/test/browser/browser_hotfix.js
new file mode 100644
index 000000000..b7bb3f580
--- /dev/null
+++ b/toolkit/mozapps/webextensions/test/browser/browser_hotfix.js
@@ -0,0 +1,171 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+const PREF_EM_HOTFIX_ID = "extensions.hotfix.id";
+const PREF_EM_HOTFIX_LASTVERSION = "extensions.hotfix.lastVersion";
+const PREF_EM_HOTFIX_URL = "extensions.hotfix.url";
+const PREF_EM_HOTFIX_CERTS = "extensions.hotfix.certs.";
+const PREF_EM_CERT_CHECKATTRIBUTES = "extensions.hotfix.cert.checkAttributes";
+
+const PREF_INSTALL_REQUIREBUILTINCERTS = "extensions.install.requireBuiltInCerts";
+const PREF_UPDATE_REQUIREBUILTINCERTS = "extensions.update.requireBuiltInCerts";
+
+const PREF_APP_UPDATE_ENABLED = "app.update.enabled";
+const PREF_APP_UPDATE_URL = "app.update.url";
+
+const HOTFIX_ID = "hotfix@tests.mozilla.org";
+
+/*
+ * Register an addon install listener and return a promise that:
+ * resolves with the AddonInstall object if the install succeeds
+ * rejects with the AddonInstall if the install fails
+ */
+function promiseInstallListener() {
+ return new Promise((resolve, reject) => {
+ let listener = {
+ onInstallEnded: ai => {
+ AddonManager.removeInstallListener(listener);
+ resolve(ai);
+ },
+ onDownloadCancelled: ai => {
+ AddonManager.removeInstallListener(listener);
+ reject(ai);
+ }
+ };
+ AddonManager.addInstallListener(listener);
+ });
+}
+
+function promiseSuccessfulInstall() {
+ return promiseInstallListener().then(
+ aInstall => {
+ ok(true, "Should have seen the install complete");
+ is(aInstall.addon.id, HOTFIX_ID, "Should have installed the right add-on");
+ aInstall.addon.uninstall();
+ Services.prefs.clearUserPref(PREF_EM_HOTFIX_LASTVERSION);
+ },
+ aInstall => {
+ ok(false, "Should not have seen the download cancelled");
+ is(aInstall.addon.id, HOTFIX_ID, "Should have seen the right add-on");
+ });
+}
+
+function promiseFailedInstall() {
+ return promiseInstallListener().then(
+ aInstall => {
+ ok(false, "Should not have seen the install complete");
+ is(aInstall.addon.id, HOTFIX_ID, "Should have installed the right add-on");
+ aInstall.addon.uninstall();
+ Services.prefs.clearUserPref(PREF_EM_HOTFIX_LASTVERSION);
+ },
+ aInstall => {
+ ok(true, "Should have seen the download cancelled");
+ is(aInstall.addon.id, HOTFIX_ID, "Should have seen the right add-on");
+ });
+}
+
+add_task(function setup() {
+ var oldAusUrl = Services.prefs.getDefaultBranch(null).getCharPref(PREF_APP_UPDATE_URL);
+ Services.prefs.getDefaultBranch(null).setCharPref(PREF_APP_UPDATE_URL, TESTROOT + "ausdummy.xml");
+ Services.prefs.setBoolPref(PREF_APP_UPDATE_ENABLED, true);
+ Services.prefs.setBoolPref(PREF_INSTALL_REQUIREBUILTINCERTS, false);
+ Services.prefs.setBoolPref(PREF_UPDATE_REQUIREBUILTINCERTS, false);
+ Services.prefs.setCharPref(PREF_EM_HOTFIX_ID, HOTFIX_ID);
+ var oldURL = Services.prefs.getCharPref(PREF_EM_HOTFIX_URL);
+ Services.prefs.setCharPref(PREF_EM_HOTFIX_URL, TESTROOT + "signed_hotfix.rdf");
+
+ registerCleanupFunction(function() {
+ Services.prefs.setBoolPref(PREF_APP_UPDATE_ENABLED, false);
+ Services.prefs.getDefaultBranch(null).setCharPref(PREF_APP_UPDATE_URL, oldAusUrl);
+ Services.prefs.clearUserPref(PREF_EM_HOTFIX_ID);
+ Services.prefs.setCharPref(PREF_EM_HOTFIX_URL, oldURL);
+ Services.prefs.clearUserPref(PREF_INSTALL_REQUIREBUILTINCERTS);
+ Services.prefs.clearUserPref(PREF_UPDATE_REQUIREBUILTINCERTS);
+
+ Services.prefs.clearUserPref(PREF_EM_CERT_CHECKATTRIBUTES);
+ var prefs = Services.prefs.getChildList(PREF_EM_HOTFIX_CERTS);
+ prefs.forEach(Services.prefs.clearUserPref);
+ });
+});
+
+add_task(function* check_no_cert_checks() {
+ Services.prefs.setBoolPref(PREF_EM_CERT_CHECKATTRIBUTES, false);
+ yield Promise.all([
+ promiseSuccessfulInstall(),
+ AddonManagerPrivate.backgroundUpdateCheck()
+ ]);
+});
+
+add_task(function* check_wrong_cert_fingerprint() {
+ Services.prefs.setBoolPref(PREF_EM_CERT_CHECKATTRIBUTES, true);
+ Services.prefs.setCharPref(PREF_EM_HOTFIX_CERTS + "1.sha1Fingerprint", "foo");
+
+ yield Promise.all([
+ promiseFailedInstall(),
+ AddonManagerPrivate.backgroundUpdateCheck()
+ ]);
+ Services.prefs.clearUserPref(PREF_EM_HOTFIX_CERTS + "1.sha1Fingerprint");
+});
+
+add_task(function* check_right_cert_fingerprint() {
+ Services.prefs.setBoolPref(PREF_EM_CERT_CHECKATTRIBUTES, true);
+ Services.prefs.setCharPref(PREF_EM_HOTFIX_CERTS + "1.sha1Fingerprint", "3E:B9:4E:07:12:FE:3C:01:41:46:13:46:FC:84:52:1A:8C:BE:1D:A2");
+
+ yield Promise.all([
+ promiseSuccessfulInstall(),
+ AddonManagerPrivate.backgroundUpdateCheck()
+ ]);
+
+ Services.prefs.clearUserPref(PREF_EM_HOTFIX_CERTS + "1.sha1Fingerprint");
+});
+
+add_task(function* check_multi_cert_fingerprint_1() {
+ Services.prefs.setBoolPref(PREF_EM_CERT_CHECKATTRIBUTES, true);
+ Services.prefs.setCharPref(PREF_EM_HOTFIX_CERTS + "1.sha1Fingerprint", "3E:B9:4E:07:12:FE:3C:01:41:46:13:46:FC:84:52:1A:8C:BE:1D:A2");
+ Services.prefs.setCharPref(PREF_EM_HOTFIX_CERTS + "2.sha1Fingerprint", "foo");
+
+ yield Promise.all([
+ promiseSuccessfulInstall(),
+ AddonManagerPrivate.backgroundUpdateCheck()
+ ]);
+
+ Services.prefs.clearUserPref(PREF_EM_HOTFIX_CERTS + "1.sha1Fingerprint");
+ Services.prefs.clearUserPref(PREF_EM_HOTFIX_CERTS + "2.sha1Fingerprint");
+});
+
+add_task(function* check_multi_cert_fingerprint_2() {
+ Services.prefs.setBoolPref(PREF_EM_CERT_CHECKATTRIBUTES, true);
+ Services.prefs.setCharPref(PREF_EM_HOTFIX_CERTS + "1.sha1Fingerprint", "foo");
+ Services.prefs.setCharPref(PREF_EM_HOTFIX_CERTS + "2.sha1Fingerprint", "3E:B9:4E:07:12:FE:3C:01:41:46:13:46:FC:84:52:1A:8C:BE:1D:A2");
+
+ yield Promise.all([
+ promiseSuccessfulInstall(),
+ AddonManagerPrivate.backgroundUpdateCheck()
+ ]);
+
+ Services.prefs.clearUserPref(PREF_EM_HOTFIX_CERTS + "1.sha1Fingerprint");
+ Services.prefs.clearUserPref(PREF_EM_HOTFIX_CERTS + "2.sha1Fingerprint");
+});
+
+add_task(function* check_no_cert_no_checks() {
+ Services.prefs.setBoolPref(PREF_EM_CERT_CHECKATTRIBUTES, false);
+ Services.prefs.setCharPref(PREF_EM_HOTFIX_URL, TESTROOT + "unsigned_hotfix.rdf");
+
+ yield Promise.all([
+ promiseSuccessfulInstall(),
+ AddonManagerPrivate.backgroundUpdateCheck()
+ ]);
+});
+
+add_task(function* check_no_cert_cert_fingerprint_check() {
+ Services.prefs.setBoolPref(PREF_EM_CERT_CHECKATTRIBUTES, true);
+ Services.prefs.setCharPref(PREF_EM_HOTFIX_CERTS + "1.sha1Fingerprint", "3E:B9:4E:07:12:FE:3C:01:41:46:13:46:FC:84:52:1A:8C:BE:1D:A2");
+
+ yield Promise.all([
+ promiseFailedInstall(),
+ AddonManagerPrivate.backgroundUpdateCheck()
+ ]);
+
+ Services.prefs.clearUserPref(PREF_EM_HOTFIX_CERTS + "1.sha1Fingerprint");
+});