mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-08-22 20:33:10 +09:00
215 lines
7.9 KiB
JavaScript
215 lines
7.9 KiB
JavaScript
// -*- 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 various aspects of the cert delete confirmation dialog.
|
||
// Among other things, tests that for each type of cert that can be deleted:
|
||
// 1. The various lines of explanation text are correctly set.
|
||
// 2. The implementation correctly falls back through multiple cert attributes
|
||
// to determine what to display to represent a cert.
|
||
|
||
/**
|
||
* An array of tree items corresponding to TEST_CASES.
|
||
* @type nsICertTreeItem[]
|
||
*/
|
||
var gCertArray = [];
|
||
|
||
const FAKE_HOST_PORT = "Fake host and port";
|
||
|
||
/**
|
||
* @typedef {TestCase}
|
||
* @type Object
|
||
* @property {String} certFilename
|
||
* Filename of the cert, or null if we don't want to import a cert for
|
||
* this test case (i.e. we expect the hostPort attribute of
|
||
* nsICertTreeItem to be used).
|
||
* @property {String} expectedDisplayString
|
||
* The string we expect the UI to display to represent the given cert.
|
||
*/
|
||
|
||
/**
|
||
* A list of test cases representing certs that get "deleted".
|
||
* @type TestCase[]
|
||
*/
|
||
const TEST_CASES = [
|
||
{ certFilename: null,
|
||
expectedDisplayString: FAKE_HOST_PORT },
|
||
{ certFilename: "has-cn.pem",
|
||
expectedDisplayString: "Foo" },
|
||
{ certFilename: "has-ou.pem",
|
||
expectedDisplayString: "Bar" },
|
||
{ certFilename: "has-o.pem",
|
||
expectedDisplayString: "Baz" },
|
||
{ certFilename: "has-non-empty-subject.pem",
|
||
expectedDisplayString: "C=US" },
|
||
{ certFilename: "has-empty-subject.pem",
|
||
expectedDisplayString: "Certificate with serial number: 0A" },
|
||
];
|
||
|
||
/**
|
||
* Opens the cert delete confirmation dialog.
|
||
*
|
||
* @param {String} tabID
|
||
* The ID of the cert category tab the certs to delete belong to.
|
||
* @returns {Promise}
|
||
* A promise that resolves when the dialog has finished loading, with
|
||
* an array consisting of:
|
||
* 1. The window of the opened dialog.
|
||
* 2. The return value object passed to the dialog.
|
||
*/
|
||
function openDeleteCertConfirmDialog(tabID) {
|
||
let retVals = {
|
||
deleteConfirmed: false,
|
||
};
|
||
let win = window.openDialog("chrome://pippki/content/deletecert.xul", "", "",
|
||
tabID, gCertArray, retVals);
|
||
return new Promise((resolve, reject) => {
|
||
win.addEventListener("load", function onLoad() {
|
||
win.removeEventListener("load", onLoad);
|
||
resolve([win, retVals]);
|
||
});
|
||
});
|
||
}
|
||
|
||
add_task(function* setup() {
|
||
for (let testCase of TEST_CASES) {
|
||
let cert = null;
|
||
if (testCase.certFilename) {
|
||
cert = yield readCertificate(testCase.certFilename, ",,");
|
||
}
|
||
let certTreeItem = {
|
||
hostPort: FAKE_HOST_PORT,
|
||
cert: cert,
|
||
QueryInterface(iid) {
|
||
if (iid.equals(Ci.nsICertTreeItem)) {
|
||
return this;
|
||
}
|
||
|
||
throw new Error(Cr.NS_ERROR_NO_INTERFACE);
|
||
}
|
||
};
|
||
gCertArray.push(certTreeItem);
|
||
}
|
||
});
|
||
|
||
/**
|
||
* Test helper for the below test cases.
|
||
*
|
||
* @param {String} tabID
|
||
* ID of the cert category tab the certs to delete belong to.
|
||
* @param {String} expectedTitle
|
||
* Title the dialog is expected to have.
|
||
* @param {String} expectedConfirmMsg
|
||
* Confirmation message the dialog is expected to show.
|
||
* @param {String} expectedImpact
|
||
* Impact the dialog is expected to show.
|
||
*/
|
||
function* testHelper(tabID, expectedTitle, expectedConfirmMsg, expectedImpact) {
|
||
let [win, retVals] = yield openDeleteCertConfirmDialog(tabID);
|
||
let certList = win.document.getElementById("certlist");
|
||
|
||
Assert.equal(win.document.title, expectedTitle,
|
||
`Actual and expected titles should match for ${tabID}`);
|
||
Assert.equal(win.document.getElementById("confirm").textContent,
|
||
expectedConfirmMsg,
|
||
`Actual and expected confirm message should match for ${tabID}`);
|
||
Assert.equal(win.document.getElementById("impact").textContent,
|
||
expectedImpact,
|
||
`Actual and expected impact should match for ${tabID}`);
|
||
|
||
Assert.equal(certList.itemCount, TEST_CASES.length,
|
||
`No. of certs displayed should match for ${tabID}`);
|
||
for (let i = 0; i < certList.itemCount; i++) {
|
||
Assert.equal(certList.getItemAtIndex(i).label,
|
||
TEST_CASES[i].expectedDisplayString,
|
||
"Actual and expected display string should match for " +
|
||
`index ${i} for ${tabID}`);
|
||
}
|
||
|
||
yield BrowserTestUtils.closeWindow(win);
|
||
}
|
||
|
||
// Test deleting certs from the "Your Certificates" tab.
|
||
add_task(function* testDeletePersonalCerts() {
|
||
const expectedTitle = "Delete your Certificates";
|
||
const expectedConfirmMsg =
|
||
"Are you sure you want to delete these certificates?";
|
||
const expectedImpact =
|
||
"If you delete one of your own certificates, you can no longer use it to " +
|
||
"identify yourself.";
|
||
yield* testHelper("mine_tab", expectedTitle, expectedConfirmMsg,
|
||
expectedImpact);
|
||
});
|
||
|
||
// Test deleting certs from the "People" tab.
|
||
add_task(function* testDeleteOtherPeopleCerts() {
|
||
const expectedTitle = "Delete E-Mail Certificates";
|
||
// ’ doesn't seem to work when embedded in the following literals, which is
|
||
// why escape codes are used instead.
|
||
const expectedConfirmMsg =
|
||
"Are you sure you want to delete these people\u2019s e-mail certificates?";
|
||
const expectedImpact =
|
||
"If you delete a person\u2019s e-mail certificate, you will no longer be " +
|
||
"able to send encrypted e-mail to that person.";
|
||
yield* testHelper("others_tab", expectedTitle, expectedConfirmMsg,
|
||
expectedImpact);
|
||
});
|
||
|
||
// Test deleting certs from the "Servers" tab.
|
||
add_task(function* testDeleteServerCerts() {
|
||
const expectedTitle = "Delete Server Certificate Exceptions";
|
||
const expectedConfirmMsg =
|
||
"Are you sure you want to delete these server exceptions?";
|
||
const expectedImpact =
|
||
"If you delete a server exception, you restore the usual security checks " +
|
||
"for that server and require it uses a valid certificate.";
|
||
yield* testHelper("websites_tab", expectedTitle, expectedConfirmMsg,
|
||
expectedImpact);
|
||
});
|
||
|
||
// Test deleting certs from the "Authorities" tab.
|
||
add_task(function* testDeleteCACerts() {
|
||
const expectedTitle = "Delete or Distrust CA Certificates";
|
||
const expectedConfirmMsg =
|
||
"You have requested to delete these CA certificates. For built-in " +
|
||
"certificates all trust will be removed, which has the same effect. Are " +
|
||
"you sure you want to delete or distrust?";
|
||
const expectedImpact =
|
||
"If you delete or distrust a certificate authority (CA) certificate, " +
|
||
"this application will no longer trust any certificates issued by that CA.";
|
||
yield* testHelper("ca_tab", expectedTitle, expectedConfirmMsg,
|
||
expectedImpact);
|
||
});
|
||
|
||
// Test deleting certs from the "Other" tab.
|
||
add_task(function* testDeleteOtherCerts() {
|
||
const expectedTitle = "Delete Certificates";
|
||
const expectedConfirmMsg =
|
||
"Are you sure you want to delete these certificates?";
|
||
const expectedImpact = "";
|
||
yield* testHelper("orphan_tab", expectedTitle, expectedConfirmMsg,
|
||
expectedImpact);
|
||
});
|
||
|
||
// Test that the right values are returned when the dialog is accepted.
|
||
add_task(function* testAcceptDialogReturnValues() {
|
||
let [win, retVals] = yield openDeleteCertConfirmDialog("ca_tab" /*arbitrary*/);
|
||
info("Accepting dialog");
|
||
win.document.getElementById("deleteCertificate").acceptDialog();
|
||
yield BrowserTestUtils.windowClosed(win);
|
||
|
||
Assert.ok(retVals.deleteConfirmed,
|
||
"Return value should signal user accepted");
|
||
});
|
||
|
||
// Test that the right values are returned when the dialog is canceled.
|
||
add_task(function* testCancelDialogReturnValues() {
|
||
let [win, retVals] = yield openDeleteCertConfirmDialog("ca_tab" /*arbitrary*/);
|
||
info("Canceling dialog");
|
||
win.document.getElementById("deleteCertificate").cancelDialog();
|
||
yield BrowserTestUtils.windowClosed(win);
|
||
|
||
Assert.ok(!retVals.deleteConfirmed,
|
||
"Return value should signal user did not accept");
|
||
});
|