diff options
Diffstat (limited to 'toolkit/mozapps/webextensions/test/browser/browser_hotfix.js')
-rw-r--r-- | toolkit/mozapps/webextensions/test/browser/browser_hotfix.js | 171 |
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"); +}); |