diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_cache_certdb.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/xpcshell/test_cache_certdb.js | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_cache_certdb.js b/toolkit/mozapps/extensions/test/xpcshell/test_cache_certdb.js new file mode 100644 index 000000000..edb442aad --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_cache_certdb.js @@ -0,0 +1,82 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// We require signature checks for this test +Services.prefs.setBoolPref(PREF_XPI_SIGNATURES_REQUIRED, true); +gUseRealCertChecks = true; + +const CERT = `MIIDITCCAgmgAwIBAgIJALAv8fydd6nBMA0GCSqGSIb3DQEBBQUAMCcxJTAjBgNV +BAMMHGJvb3RzdHJhcDFAdGVzdHMubW96aWxsYS5vcmcwHhcNMTYwMjAyMjMxNjUy +WhcNMjYwMTMwMjMxNjUyWjAnMSUwIwYDVQQDDBxib290c3RyYXAxQHRlc3RzLm1v +emlsbGEub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5caNuLTu +H8dEqNntLlhKi4y09hrgcF3cb6n5Xx9DIHA8CKiZxt9qGXKeeiDwEiiQ8ibJYzdc +jLkbzJUyPVUaH9ygrWynSpSTOvv/Ys3+ERrCo9W7Zuzwdmzt6TTEjFMS4lVx06us +3uUqkdp3JMgCqCEbOFZiztICiSKrp8QFJkAfApZzBqmJOPOWH0yZ2CRRzvbQZ6af +hqQDUalJQjWfsenyUWphhbREqExetxHJFR3OrmJt/shXVyz6dD7TBuE3PPUh1RpE +3ejVufcTzjV3XmK79PxsKLM9V2+ww9e9V3OET57kyvn+bpSWdUYm3X4DA8dxNW6+ +kTFWRnQNZ+zQVQIDAQABo1AwTjAdBgNVHQ4EFgQUac36ccv+99N5HxYa8dCDYRaF +HNQwHwYDVR0jBBgwFoAUac36ccv+99N5HxYa8dCDYRaFHNQwDAYDVR0TBAUwAwEB +/zANBgkqhkiG9w0BAQUFAAOCAQEAFfu3MN8EtY5wcxOFdGShOmGQPm2MJJVE6MG+ +p4RqHrukHZSgKOyWjkRk7t6NXzNcnHco9HFv7FQRAXSJ5zObmyu+TMZlu4jHHCav +GMcV3C/4SUGtlipZbgNe00UAIm6tM3Wh8dr38W7VYg4KGAwXou5XhQ9gCAnSn90o +H/42NqHTjJsR4v18izX2aO25ARQdMby7Lsr5j9RqweHywiSlPusFcKRseqOnIP0d +JT3+qh78LeMbNBO2mYD3SP/zu0TAmkAVNcj2KPw0+a0kVZ15rvslPC/K3xn9msMk +fQthv3rDAcsWvi9YO7T+vylgZBgJfn1ZqpQqy58xN96uh6nPOw==`; + +function overrideCertDB() { + // Unregister the real database. + let registrar = Components.manager.QueryInterface(AM_Ci.nsIComponentRegistrar); + let factory = registrar.getClassObject(CERTDB_CID, AM_Ci.nsIFactory); + registrar.unregisterFactory(CERTDB_CID, factory); + + // Get the real DB + let realCertDB = factory.createInstance(null, AM_Ci.nsIX509CertDB); + + let fakeCert = realCertDB.constructX509FromBase64(CERT.replace(/\n/g, "")); + + let fakeCertDB = { + openSignedAppFileAsync(root, file, callback) { + callback.openSignedAppFileFinished(Components.results.NS_OK, null, fakeCert); + }, + + verifySignedDirectoryAsync(root, dir, callback) { + callback.verifySignedDirectoryFinished(Components.results.NS_OK, fakeCert); + }, + + QueryInterface: XPCOMUtils.generateQI([AM_Ci.nsIX509CertDB]) + }; + + for (let property of Object.keys(realCertDB)) { + if (property in fakeCertDB) { + continue; + } + + if (typeof realCertDB[property] == "function") { + fakeCertDB[property] = realCertDB[property].bind(realCertDB); + } + } + + let certDBFactory = { + createInstance: function(outer, iid) { + if (outer != null) { + throw Components.results.NS_ERROR_NO_AGGREGATION; + } + return fakeCertDB.QueryInterface(iid); + } + }; + registrar.registerFactory(CERTDB_CID, "CertDB", + CERTDB_CONTRACTID, certDBFactory); +} + +add_task(function*() { + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + startupManager(); + + // Once the application is started we shouldn't be able to replace the + // certificate database + overrideCertDB(); + + let install = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), resolve)); + do_check_eq(install.state, AddonManager.STATE_DOWNLOAD_FAILED); +}); |