Bug 1082346 - 02. Test case. r=keeler r=Cykesiopka
MozReview-Commit-ID: 3O8gBQ06Q96
new file mode 100644
index 0000000000000000000000000000000000000000..e969d672d7357f1131c5e0f486d263aa07066825
GIT binary patch
literal 2041
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
Jq=oMv=|A)tZcP9H
new file mode 100644
--- /dev/null
+++ b/security/manager/ssl/tests/unit/test_certDB_import_pkcs12.js
@@ -0,0 +1,92 @@
+// -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+"use strict";
+
+// Tests import PKCS12 file by nsIX509CertDB.
+
+do_get_profile();
+
+const gCertDB = Cc["@mozilla.org/security/x509certdb;1"]
+ .getService(Ci.nsIX509CertDB);
+
+const CERT_COMMON_NAME = "test_cert_from_windows";
+const TEST_CERT_PASSWORD = "黒い";
+
+let gGetPKCS12Password = false;
+
+// Mock implementation of nsICertificateDialogs.
+const gCertificateDialogs = {
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsICertificateDialogs]),
+
+ getPKCS12FilePassword: (ctx, password) => {
+ ok(!gGetPKCS12Password,
+ "getPKCS12FilePassword should be called only once.");
+
+ password.value = TEST_CERT_PASSWORD;
+ do_print("getPKCS12FilePassword() is called");
+ gGetPKCS12Password = true;
+ return true;
+ },
+};
+
+const gPrompt = {
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIPrompt]),
+ alert: (title, text) => {
+ do_print("alert('" + text + "')");
+ },
+};
+
+const gPromptFactory = {
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIPromptFactory]),
+ getPrompt: (aWindow, aIID) => gPrompt,
+};
+
+function doesCertExist(commonName) {
+ let allCerts = gCertDB.getCerts();
+ let enumerator = allCerts.getEnumerator();
+ while (enumerator.hasMoreElements()) {
+ let cert = enumerator.getNext().QueryInterface(Ci.nsIX509Cert);
+ if (cert.isBuiltInRoot) {
+ continue;
+ }
+ if (cert.commonName == commonName) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function testImportPKCS12Cert() {
+ ok(!doesCertExist(CERT_COMMON_NAME),
+ "Cert should not be in the database before import");
+
+ // Import and check for success.
+ let certFile = do_get_file("test_certDB_import/cert_from_windows.pfx");
+ gCertDB.importPKCS12File(null, certFile);
+
+ ok(gGetPKCS12Password, "PKCS12 password should be asked");
+
+ ok(doesCertExist(CERT_COMMON_NAME),
+ "Cert should now be found in the database");
+}
+
+function run_test() {
+ // We have to set a password and login before we attempt to import anything.
+ loginToDBWithDefaultPassword();
+
+ let certificateDialogsCID =
+ MockRegistrar.register("@mozilla.org/nsCertificateDialogs;1",
+ gCertificateDialogs);
+ let promptFactoryCID =
+ MockRegistrar.register("@mozilla.org/prompter;1", gPromptFactory);
+
+ do_register_cleanup(() => {
+ MockRegistrar.unregister(certificateDialogsCID);
+ MockRegistrar.unregister(promptFactoryCID);
+ });
+
+ // Import PKCS12 file with utf-8 password
+ testImportPKCS12Cert();
+}
--- a/security/manager/ssl/tests/unit/xpcshell.ini
+++ b/security/manager/ssl/tests/unit/xpcshell.ini
@@ -46,16 +46,17 @@ run-sequentially = hardcoded ports
run-sequentially = hardcoded ports
[test_cert_override_bits_mismatches.js]
run-sequentially = hardcoded ports
[test_cert_sha1.js]
[test_cert_signatures.js]
[test_cert_trust.js]
[test_cert_version.js]
[test_certDB_import.js]
+[test_certDB_import_pkcs12.js]
[test_certviewer_invalid_oids.js]
skip-if = toolkit == 'android' || buildapp == 'b2g'
[test_constructX509FromBase64.js]
[test_content_signing.js]
[test_datasignatureverifier.js]
[test_ev_certs.js]
run-sequentially = hardcoded ports
[test_getchain.js]