releases-comm-central/mailnews/extensions/smime/msgReadSMIMEOverlay.js

252 строки
7.6 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* import-globals-from ../../../mail/base/content/aboutMessage.js */
var gEncryptionStatus = -1;
var gSignatureStatus = -1;
var gSignerCert = null;
var gEncryptionCert = null;
function showImapSignatureUnknown() {
const readSmimeBundle = Services.strings.createBundle(
"chrome://messenger-smime/locale/msgReadSMIMEOverlay.properties"
);
const brandBundle = document.getElementById("bundle_brand");
if (!readSmimeBundle || !brandBundle) {
return;
}
if (
Services.prompt.confirm(
window,
brandBundle.getString("brandShortName"),
readSmimeBundle.GetStringFromName("ImapOnDemand")
)
) {
gDBView.reloadMessageWithAllParts();
}
}
/**
* Populate the message security popup panel with S/MIME data.
*/
function loadSmimeMessageSecurityInfo() {
const sBundle = Services.strings.createBundle(
"chrome://messenger-smime/locale/msgSecurityInfo.properties"
);
let sigInfoLabel = null;
let sigInfoHeader = null;
let sigInfo = null;
let sigInfo_clueless = false;
let sigClass = null;
switch (gSignatureStatus) {
case -1:
case Ci.nsICMSMessageErrors.VERIFY_NOT_SIGNED:
sigInfoLabel = "SINoneLabel";
sigInfo = "SINone";
sigClass = "none";
break;
case Ci.nsICMSMessageErrors.SUCCESS:
sigInfoLabel = "SIValidLabel";
sigInfo = "SIValid";
sigClass = "ok";
break;
case Ci.nsICMSMessageErrors.VERIFY_BAD_SIGNATURE:
case Ci.nsICMSMessageErrors.VERIFY_DIGEST_MISMATCH:
sigInfoLabel = "SIInvalidLabel";
sigInfoHeader = "SIInvalidHeader";
sigInfo = "SIContentAltered";
sigClass = "mismatch";
break;
case Ci.nsICMSMessageErrors.VERIFY_UNKNOWN_ALGO:
case Ci.nsICMSMessageErrors.VERIFY_UNSUPPORTED_ALGO:
sigInfoLabel = "SIInvalidLabel";
sigInfoHeader = "SIInvalidHeader";
sigInfo = "SIInvalidCipher";
sigClass = "unknown";
break;
case Ci.nsICMSMessageErrors.VERIFY_HEADER_MISMATCH:
sigInfoLabel = "SIPartiallyValidLabel";
sigInfoHeader = "SIPartiallyValidHeader";
sigInfo = "SIHeaderMismatch";
sigClass = "mismatch";
break;
case Ci.nsICMSMessageErrors.VERIFY_CERT_WITHOUT_ADDRESS:
sigInfoLabel = "SIPartiallyValidLabel";
sigInfoHeader = "SIPartiallyValidHeader";
sigInfo = "SICertWithoutAddress";
sigClass = "unknown";
break;
case Ci.nsICMSMessageErrors.VERIFY_UNTRUSTED:
sigInfoLabel = "SIInvalidLabel";
sigInfoHeader = "SIInvalidHeader";
sigInfo = "SIUntrustedCA";
sigClass = "notok";
// XXX Need to extend to communicate better errors
// might also be:
// SIExpired SIRevoked SINotYetValid SIUnknownCA SIExpiredCA SIRevokedCA SINotYetValidCA
break;
case Ci.nsICMSMessageErrors.VERIFY_NOT_YET_ATTEMPTED:
case Ci.nsICMSMessageErrors.GENERAL_ERROR:
case Ci.nsICMSMessageErrors.VERIFY_NO_CONTENT_INFO:
case Ci.nsICMSMessageErrors.VERIFY_BAD_DIGEST:
case Ci.nsICMSMessageErrors.VERIFY_NOCERT:
case Ci.nsICMSMessageErrors.VERIFY_ERROR_UNVERIFIED:
case Ci.nsICMSMessageErrors.VERIFY_ERROR_PROCESSING:
case Ci.nsICMSMessageErrors.VERIFY_MALFORMED_SIGNATURE:
case Ci.nsICMSMessageErrors.VERIFY_TIME_MISMATCH:
sigInfoLabel = "SIInvalidLabel";
sigInfoHeader = "SIInvalidHeader";
sigInfo_clueless = true;
sigClass = "unverified";
break;
default:
console.error("Unexpected gSignatureStatus: " + gSignatureStatus);
}
document.getElementById("techLabel").textContent = "- S/MIME";
const signatureLabel = document.getElementById("signatureLabel");
signatureLabel.textContent = sBundle.GetStringFromName(sigInfoLabel);
// Remove the second class to properly update the signature icon.
signatureLabel.classList.remove(signatureLabel.classList.item(1));
signatureLabel.classList.add(sigClass);
if (sigInfoHeader) {
const label = document.getElementById("signatureHeader");
label.collapsed = false;
label.textContent = sBundle.GetStringFromName(sigInfoHeader);
}
let str;
if (sigInfo) {
str = sBundle.GetStringFromName(sigInfo);
} else if (sigInfo_clueless) {
str =
sBundle.GetStringFromName("SIClueless") + " (" + gSignatureStatus + ")";
}
document.getElementById("signatureExplanation").textContent = str;
let encInfoLabel = null;
let encInfoHeader = null;
let encInfo = null;
let encInfo_clueless = false;
let encClass = null;
switch (gEncryptionStatus) {
case -1:
encInfoLabel = "EINoneLabel2";
encInfo = "EINone";
encClass = "none";
break;
case Ci.nsICMSMessageErrors.SUCCESS:
encInfoLabel = "EIValidLabel";
encInfo = "EIValid";
encClass = "ok";
break;
case Ci.nsICMSMessageErrors.ENCRYPT_INCOMPLETE:
encInfoLabel = "EIInvalidLabel";
encInfo = "EIContentAltered";
encClass = "notok";
break;
case Ci.nsICMSMessageErrors.GENERAL_ERROR:
encInfoLabel = "EIInvalidLabel";
encInfoHeader = "EIInvalidHeader";
encInfo_clueless = 1;
encClass = "notok";
break;
default:
console.error("Unexpected gEncryptionStatus: " + gEncryptionStatus);
}
const encryptionLabel = document.getElementById("encryptionLabel");
encryptionLabel.textContent = sBundle.GetStringFromName(encInfoLabel);
// Remove the second class to properly update the encryption icon.
encryptionLabel.classList.remove(encryptionLabel.classList.item(1));
encryptionLabel.classList.add(encClass);
if (encInfoHeader) {
const label = document.getElementById("encryptionHeader");
label.collapsed = false;
label.textContent = sBundle.GetStringFromName(encInfoHeader);
}
if (encInfo) {
str = sBundle.GetStringFromName(encInfo);
} else if (encInfo_clueless) {
str = sBundle.GetStringFromName("EIClueless");
}
document.getElementById("encryptionExplanation").textContent = str;
if (gSignerCert) {
document.getElementById("signatureCert").collapsed = false;
if (gSignerCert.subjectName) {
document.getElementById("signedBy").textContent = gSignerCert.commonName;
}
if (gSignerCert.emailAddress) {
document.getElementById("signerEmail").textContent =
gSignerCert.emailAddress;
}
if (gSignerCert.issuerName) {
document.getElementById("sigCertIssuedBy").textContent =
gSignerCert.issuerCommonName;
}
}
if (gEncryptionCert) {
document.getElementById("encryptionCert").collapsed = false;
if (gEncryptionCert.subjectName) {
document.getElementById("encryptedFor").textContent =
gEncryptionCert.commonName;
}
if (gEncryptionCert.emailAddress) {
document.getElementById("recipientEmail").textContent =
gEncryptionCert.emailAddress;
}
if (gEncryptionCert.issuerName) {
document.getElementById("encCertIssuedBy").textContent =
gEncryptionCert.issuerCommonName;
}
}
}
function viewSignatureCert() {
if (!gSignerCert) {
return;
}
const url = `about:certificate?cert=${encodeURIComponent(
gSignerCert.getBase64DERString()
)}`;
const mail3PaneWindow = Services.wm.getMostRecentWindow("mail:3pane");
mail3PaneWindow.switchToTabHavingURI(url, true, {});
}
function viewEncryptionCert() {
if (!gEncryptionCert) {
return;
}
const url = `about:certificate?cert=${encodeURIComponent(
gEncryptionCert.getBase64DERString()
)}`;
const mail3PaneWindow = Services.wm.getMostRecentWindow("mail:3pane");
mail3PaneWindow.switchToTabHavingURI(url, true, {});
}