Bug 1803255 - Fix and enable tests for OpenPGP and S/MIME. r=aleca

Differential Revision: https://phabricator.services.mozilla.com/D164012

--HG--
rename : mailnews/test/data/smime/Bob.p12 => mail/test/browser/openpgp/data/smime/Bob.p12
rename : mailnews/test/data/smime/alice.env.eml => mail/test/browser/openpgp/data/smime/alice.env.eml
extra : rebase_source : d57791cec042acac75e4cd9f745284c413e26f03
extra : amend_source : d4d97238a4b248812d97eaace65f0d14809213a1
This commit is contained in:
Geoff Lankow 2022-12-06 11:01:18 +13:00
Родитель fb1a38e661
Коммит 86caf49bef
27 изменённых файлов: 372 добавлений и 414 удалений

Просмотреть файл

@ -29,6 +29,7 @@ XPCOMUtils.defineLazyScriptGetter(
);
// This file stores variables common to mail windows
var messenger;
var statusFeedback;
var msgWindow;

Просмотреть файл

@ -8,7 +8,6 @@
/* import-globals-from ../../components/customizableui/content/panelUI.js */
/* import-globals-from ../../components/newmailaccount/content/provisionerCheckout.js */
/* import-globals-from ../../components/preferences/preferencesTab.js */
/* import-globals-from ../../extensions/openpgp/content/ui/enigmailMessengerOverlay.js */
/* import-globals-from commandglue.js */
/* import-globals-from folderPane.js */
/* import-globals-from glodaFacetTab.js */
@ -187,13 +186,6 @@ function verifyOpenAccountHubTab() {
function initOpenPGPIfEnabled() {
BondOpenPGP.init();
try {
Enigmail.msg.messengerStartup.bind(Enigmail.msg);
Enigmail.msg.messengerStartup();
} catch (ex) {
console.log(ex);
}
}
var gMailInit = {

Просмотреть файл

@ -114,7 +114,6 @@
<script defer="defer" src="chrome://communicator/content/contentAreaClick.js"></script>
<script defer="defer" src="chrome://messenger/content/toolbarIconColor.js"></script>
<script defer="defer" src="chrome://messenger/content/jsTreeView.js"></script>
<script defer="defer" src="chrome://openpgp/content/ui/enigmailMessengerOverlay.js"></script>
<script defer="defer" src="chrome://messenger/content/chat/chat-messenger.js"></script>
<script defer="defer" src="chrome://messenger/content/chat/imStatusSelector.js"></script>
<script defer="defer" src="chrome://messenger/content/chat/imContextMenu.js"></script>

Просмотреть файл

@ -7,8 +7,9 @@
* header to display S/MIME and OpenPGP encryption and signature info.
*/
/* globals gFolderDisplay, gSignatureStatus, Enigmail, gDBView */
/* globals showImapSignatureUnknown, loadSmimeMessageSecurityInfo */
/* import-globals-from ../../../mailnews/extensions/smime/msgReadSMIMEOverlay.js */
/* import-globals-from ../../extensions/openpgp/content/ui/enigmailMessengerOverlay.js */
/* import-globals-from aboutMessage.js */
var { XPCOMUtils } = ChromeUtils.importESModule(
"resource://gre/modules/XPCOMUtils.sys.mjs"
@ -28,10 +29,7 @@ var gEncKeyId = null;
*/
function showMessageReadSecurityInfo() {
// Interrupt if no message is selected or no encryption technology was used.
if (
!gFolderDisplay.selectedMessage ||
document.getElementById("cryptoBox").hidden
) {
if (!gMessage || document.getElementById("cryptoBox").hidden) {
return;
}

Просмотреть файл

@ -82,19 +82,8 @@ var EnigmailDecryption = {
getFromAddr(win) {
var fromAddr;
if (
win &&
win.gFolderDisplay &&
win.gFolderDisplay.messageDisplay &&
win.gFolderDisplay.messageDisplay.displayedMessage
) {
fromAddr = win.gFolderDisplay.messageDisplay.displayedMessage.author;
} else if (
win &&
win.gFolderDisplay &&
win.gFolderDisplay.selectedMessage
) {
fromAddr = win.gFolderDisplay.selectedMessage.author;
if (win?.gMessage) {
fromAddr = win.gMessage.author;
}
if (fromAddr) {
try {
@ -115,21 +104,8 @@ var EnigmailDecryption = {
// "date" appears to be available more reliably, and it appears
// to be in microseconds (1/1000000 second). Convert
// to milliseconds (1/1000 of a second) for conversion to Date.
if (
win &&
win.gFolderDisplay &&
win.gFolderDisplay.messageDisplay &&
win.gFolderDisplay.messageDisplay.displayedMessage
) {
return new Date(
win.gFolderDisplay.messageDisplay.displayedMessage.date / 1000
);
} else if (
win &&
win.gFolderDisplay &&
win.gFolderDisplay.selectedMessage
) {
return new Date(win.gFolderDisplay.selectedMessage.date / 1000);
if (win?.gMessage) {
return new Date(win.gMessage.date / 1000);
}
return null;
},

Просмотреть файл

@ -1,25 +1,16 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
/* 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 https://mozilla.org/MPL/2.0/.
*/
* file, you can obtain one at https://mozilla.org/MPL/2.0/. */
"use strict";
// TODO: Fix undefined things in this file.
/* eslint-disable no-undef */
/* import-globals-from ../../../../base/content/aboutMessage.js */
/* import-globals-from ../../../../base/content/msgHdrView.js */
/* import-globals-from ../../../../base/content/msgSecurityPane.js */
// TODO: check if this is safe
/* eslint-disable no-unsanitized/property */
/* Globals from Thunderbird: */
/* global ReloadMessage: false, gDBView: false, gSignatureStatus: false, gEncryptionStatus: false, showMessageReadSecurityInfo: false */
/* global messenger: false, currentAttachments: false, msgWindow: false, PanelUI: false */
/* global currentHeaderData: false, gViewAllHeaders: false, gExpandedHeaderList: false, goDoCommand: false, HandleSelectedAttachments: false */
/* global statusFeedback: false, displayAttachmentsForExpandedView: false, gExpandedHeaderView */
/* global gSigKeyId:true, gEncKeyId:true */
/* globals gMessageNotificationBar */
var { AppConstants } = ChromeUtils.importESModule(
"resource://gre/modules/AppConstants.sys.mjs"
);
@ -67,10 +58,7 @@ XPCOMUtils.defineLazyGetter(this, "l10n", () => {
return new Localization(["messenger/openpgp/openpgp.ftl"], true);
});
var Enigmail;
if (!Enigmail) {
Enigmail = {};
}
var Enigmail = {};
Enigmail.getEnigmailSvc = function() {
return EnigmailCore.getService(window);
@ -264,19 +252,7 @@ Enigmail.msg = {
},
getCurrentMsgUriSpec() {
try {
// Thunderbird
if (gFolderDisplay.selectedMessages.length != 1) {
return "";
}
var uriSpec = gFolderDisplay.selectedMessageUris[0];
//EnigmailLog.DEBUG("enigmailMessengerOverlay.js: getCurrentMsgUriSpec: uriSpec="+uriSpec+"\n");
return uriSpec;
} catch (ex) {
return "";
}
return gMessageURI || "";
},
getCurrentMsgUrl() {
@ -346,40 +322,6 @@ Enigmail.msg = {
}
},
prepareAppMenu() {
let menu = document.querySelector("#appMenu-mainView > vbox");
if (!menu) {
return;
}
// don't try to add Enigmail menu more than once
if (document.getElementById("appmenu-Enigmail")) {
return;
}
let tsk = document.getElementById("appmenu_toolsMenu");
let e = document.createXULElement("toolbarbutton");
e.setAttribute("label", "xxEnigmail");
e.id = "appmenu-Enigmail";
e.setAttribute(
"class",
"subviewbutton subviewbutton-nav subviewbutton-iconic"
);
e.setAttribute("closemenu", "none");
e.setAttribute(
"oncommand",
"Enigmail.msg.displayAppmenu('appMenu-enigmailView', this)"
);
e.setAttribute("overlay_source", "enigmail");
menu.insertBefore(e, tsk);
},
displayAppmenu(targetId, targetObj) {
let menuElem = document.getElementById("appmenu_enigmailMenuPlaceholder");
this.displayMainMenu(menuElem);
PanelUI.showSubView(targetId, targetObj);
},
displayMainMenu(menuPopup) {
let obj = menuPopup.firstChild;
@ -862,7 +804,7 @@ Enigmail.msg = {
);
// Warn that we can't fix a message that was opened from a local file.
if (!gFolderDisplay.selectedMessage.folder) {
if (!gFolder) {
Enigmail.msg.notificationBox.appendNotification(
"brokenExchange",
{
@ -1708,7 +1650,7 @@ Enigmail.msg = {
"subject" in currentHeaderData &&
currentHeaderData.subject.headerValue === "pEp"
) {
if (gFolderDisplay.selectedMessage) {
if (gMessage) {
let m = EnigmailMime.extractSubjectFromBody(bodyElement.textContent);
if (m) {
let node = bodyElement.firstChild;
@ -1756,7 +1698,7 @@ Enigmail.msg = {
null
);
let msg = gFolderDisplay.messageDisplay.displayedMessage;
let msg = gMessage;
EnigmailFixExchangeMsg.fixExchangeMessage(msg, this.buggyMailType)
.then(msgKey => {
// Display the new message which now has the key msgKey.
@ -1765,7 +1707,9 @@ Enigmail.msg = {
msgKey +
"\n"
);
gFolderDisplay.view.dbView.selectMsgByKey(msgKey);
// TODO: scope is about:message, and this doesn't work
// parent.gDBView.selectMsgByKey(msgKey);
// ReloadMessage();
})
.catch(async function(ex) {
console.debug(ex);
@ -1858,7 +1802,7 @@ Enigmail.msg = {
if (includeHeaders) {
try {
var msg = gFolderDisplay.selectedMessage;
var msg = gMessage;
if (msg) {
let msgHdr = {
From: msg.author,
@ -1871,10 +1815,11 @@ Enigmail.msg = {
}).format(new Date(msg.dateInSeconds * 1000)),
};
if (gFolderDisplay.selectedMessageIsNews) {
if (currentHeaderData.newsgroups) {
msgHdr.Newsgroups = currentHeaderData.newsgroups.headerValue;
}
if (
msg?.folder?.flags & Ci.nsMsgFolderFlags.Newsgroup &&
currentHeaderData.newsgroups
) {
msgHdr.Newsgroups = currentHeaderData.newsgroups.headerValue;
}
for (let headerName in msgHdr) {
@ -2105,7 +2050,7 @@ Enigmail.msg = {
msgSvc.streamMessage(
msgUriSpec,
streamListener,
msgWindow,
top.msgWindow,
null,
false,
null,
@ -2574,7 +2519,7 @@ Enigmail.msg = {
},
loadExternalURL(url) {
messenger.launchExternalURL(url);
top.messenger.launchExternalURL(url);
},
// retrieves the most recent navigator window (opens one if need be)
@ -2647,13 +2592,12 @@ Enigmail.msg = {
// decrypted and copy/move all selected messages in a target folder
async decryptToFolder(destFolder, move) {
let msgHdrs = gFolderDisplay ? gFolderDisplay.selectedMessages : null;
let msgHdrs = gDBView.getSelectedMsgHdrs();
if (!msgHdrs || msgHdrs.length === 0) {
return;
}
let total = gFolderDisplay.selectedMessages.length;
let total = msgHdrs.length;
let failures = 0;
for (let msgHdr of msgHdrs) {
await EnigmailPersistentCrypto.cryptMessage(
@ -2718,6 +2662,7 @@ Enigmail.msg = {
Enigmail.hdrView.onUnloadEnigmail();
}
// eslint-disable-next-line no-global-assign
Enigmail = undefined;
},
@ -2778,7 +2723,7 @@ Enigmail.msg = {
let existing = await db.findKeyForFingerprint(newKey.fpr);
if (existing) {
let key = await db.mergeExisting(newKey, newKey.pubKey, {
uri: `mid:${gMessageDisplay.displayedMessage.messageId}`,
uri: `mid:${gMessage.messageId}`,
type: isBinaryAutocrypt ? "autocrypt" : "attachment",
description,
});
@ -2878,7 +2823,7 @@ Enigmail.msg = {
? RNP.enArmorString(newKey.pubKey, "public key")
: newKey.pubKey;
candidate.source = {
uri: `mid:${gMessageDisplay.displayedMessage.messageId}`,
uri: `mid:${gMessage.messageId}`,
type: isBinaryAutocrypt ? "autocrypt" : "attachment",
description,
};
@ -3063,21 +3008,19 @@ Enigmail.msg = {
this.toAndCCSet = new Set();
// This message may have already disappeared.
if (!gMessageDisplay.displayedMessage) {
if (!gMessage) {
return;
}
let addresses = MailServices.headerParser.parseEncodedHeader(
gMessageDisplay.displayedMessage.author
gMessage.author
);
if (addresses.length) {
this.authorEmail = addresses[0].email.toLowerCase();
}
addresses = MailServices.headerParser.parseEncodedHeader(
gMessageDisplay.displayedMessage.recipients +
"," +
gMessageDisplay.displayedMessage.ccList
gMessage.recipients + "," + gMessage.ccList
);
for (let addr of addresses) {
this.toAndCCSet.add(addr.email.toLowerCase());

Просмотреть файл

@ -77,9 +77,7 @@ var l10nOpenPGP = new Localization(["messenger/openpgp/openpgp.ftl"]);
// const kEncryptionPolicy_IfPossible = 1;
var kEncryptionPolicy_Always = 2;
if (!Enigmail) {
var Enigmail = {};
}
var Enigmail = {};
const IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1";
const LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1";

Просмотреть файл

@ -1,18 +1,12 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
/* 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 https://mozilla.org/MPL/2.0/.
*/
* file, you can obtain one at https://mozilla.org/MPL/2.0/. */
"use strict";
// aboutMessage.js
/* global gFolderDisplay */
/* global setMessageEncryptionStateButton */
/* global currentAttachments: false */
/* global gDBView: false, msgWindow: false, messageHeaderSink: false, gMessageListeners: false */
/* global gExpandedHeaderView: false, CanDetachAttachments: true, gEncryptedURIService: false, FillAttachmentListPopup: false */
/* global attachmentList: false, currentHeaderData: false */
/* import-globals-from ../../../../base/content/aboutMessage.js */
/* import-globals-from ../../../../base/content/msgHdrView.js */
/* import-globals-from ../../../smime/content/msgHdrViewSMIMEOverlay.js */
var { XPCOMUtils } = ChromeUtils.importESModule(
"resource://gre/modules/XPCOMUtils.sys.mjs"
@ -36,10 +30,6 @@ XPCOMUtils.defineLazyModuleGetters(this, {
// EnigmailWks: "chrome://openpgp/content/modules/webKey.jsm",
});
if (!Enigmail) {
var Enigmail = {};
}
Enigmail.hdrView = {
lastEncryptedMsgKey: null,
lastEncryptedUri: null,
@ -79,6 +69,7 @@ Enigmail.hdrView = {
if (!this.alreadyWrappedCDA) {
this.alreadyWrappedCDA = true;
this.origCanDetachAttachments = CanDetachAttachments;
// eslint-disable-next-line no-global-assign
CanDetachAttachments = function() {
return (
Enigmail.hdrView.origCanDetachAttachments() &&
@ -187,11 +178,8 @@ Enigmail.hdrView = {
}
*/
if (
gFolderDisplay.selectedMessageUris &&
gFolderDisplay.selectedMessageUris.length > 0
) {
this.lastEncryptedMsgKey = gFolderDisplay.selectedMessageUris[0];
if (gMessageURI) {
this.lastEncryptedMsgKey = gMessageURI;
}
if (!errorMsg) {
@ -201,11 +189,8 @@ Enigmail.hdrView = {
}
var replaceUid = null;
if (keyId && gFolderDisplay.selectedMessage) {
replaceUid = EnigmailMsgRead.matchUidToSender(
keyId,
gFolderDisplay.selectedMessage.author
);
if (keyId && gMessage) {
replaceUid = EnigmailMsgRead.matchUidToSender(keyId, gMessage.author);
}
if (!replaceUid && userId) {
@ -598,8 +583,9 @@ Enigmail.hdrView = {
try {
EnigmailVerify.setWindow(null, null);
Enigmail.hdrView.statusBarHide();
} catch (ex) {}
Enigmail.hdrView.messageLoad();
},
beforeStartHeaders() {
@ -735,7 +721,7 @@ Enigmail.hdrView = {
updateMsgDb() {
EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: this.updateMsgDb\n");
var msg = gFolderDisplay.selectedMessage;
var msg = gMessage;
if (!msg || !msg.folder) {
return;
}
@ -794,10 +780,7 @@ Enigmail.hdrView = {
},
setSubject(subject) {
if (
gFolderDisplay.selectedMessages.length === 1 &&
gFolderDisplay.selectedMessage
) {
if (gMessage) {
// Strip multiple localised Re: prefixes. This emulates NS_MsgStripRE().
let newSubject = subject;
let prefixes = Services.prefs.getStringPref("mailnews.localizedRe", "Re");
@ -813,21 +796,14 @@ Enigmail.hdrView = {
// Update the header pane.
this.updateHdrBox("subject", hadRe ? "Re: " + newSubject : newSubject);
// Update the thread pane.
let tree = gFolderDisplay.tree;
let msgHdr = gFolderDisplay.selectedMessage;
// Update the message.
let msgHdr = gMessage;
msgHdr.subject = EnigmailData.convertFromUnicode(newSubject, "utf-8");
// Set the corred HasRe flag and refresh the row.
let oldFlags = msgHdr.flags;
if (hadRe && !(oldFlags & Ci.nsMsgMessageFlags.HasRe)) {
let newFlags = oldFlags | Ci.nsMsgMessageFlags.HasRe;
msgHdr.flags = newFlags;
if (tree && tree.view) {
tree.view.db.notifyHdrChangeAll(msgHdr, oldFlags, newFlags, {});
}
} else if (tree && tree.view && tree.view.selection) {
tree.invalidateRow(tree.view.selection.currentIndex);
}
}
},
@ -861,45 +837,7 @@ Enigmail.hdrView = {
"\n"
);
if (!uriSpec) {
// We cannot compare if no URI, => assume it's the current message.
return true;
}
let msgUriSpec = Enigmail.msg.getCurrentMsgUriSpec();
let currUrl = EnigmailFuncs.getUrlFromUriSpec(msgUriSpec);
if (!currUrl) {
return false;
}
let currMsgId = EnigmailURIs.msgIdentificationFromUrl(currUrl);
let gotMsgId = EnigmailURIs.msgIdentificationFromUrl(uri);
if (!gotMsgId) {
return false;
}
EnigmailLog.DEBUG(
"enigmailMsgHdrViewOverlay.js: EnigMimeHeaderSink.isCurrentMessage: url=" +
currUrl.spec +
"\n"
);
if (
uri.host == currUrl.host &&
currMsgId.folder === gotMsgId.folder &&
currMsgId.msgNum === gotMsgId.msgNum
) {
EnigmailLog.DEBUG(
"enigmailMsgHdrViewOverlay.js: EnigMimeHeaderSink.isCurrentMessage: true\n"
);
return true;
}
EnigmailLog.DEBUG(
"enigmailMsgHdrViewOverlay.js: EnigMimeHeaderSink.isCurrentMessage: false\n"
);
return false;
return true;
},
/**
@ -1045,8 +983,7 @@ Enigmail.hdrView = {
if (statusFlags & EnigmailConstants.DECRYPTION_OKAY) {
if (gEncryptedURIService) {
// remember encrypted message URI to enable TB prevention against EFAIL attack
Enigmail.hdrView.lastEncryptedUri =
gFolderDisplay.selectedMessageUris[0];
Enigmail.hdrView.lastEncryptedUri = gMessageURI;
gEncryptedURIService.rememberEncrypted(
Enigmail.hdrView.lastEncryptedUri
);
@ -1104,14 +1041,11 @@ Enigmail.hdrView = {
"\n"
);
let msg = gFolderDisplay.selectedMessage;
let msg = gMessage;
if (!msg) {
return;
}
if (
!this.isCurrentMessage(uri) ||
gFolderDisplay.selectedMessages.length !== 1
) {
if (!this.isCurrentMessage(uri)) {
return;
}
@ -1150,7 +1084,7 @@ Enigmail.hdrView = {
return;
}
let msg = gFolderDisplay.selectedMessage;
let msg = gMessage;
if ("subject" in hdr) {
Enigmail.hdrView.setSubject(hdr.subject);

Просмотреть файл

@ -4,7 +4,9 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* import-globals-from ../../../../mailnews/extensions/smime/msgReadSMIMEOverlay.js */
/* import-globals-from ../../../base/content/aboutMessage.js */
/* import-globals-from ../../../base/content/msgHdrView.js */
/* import-globals-from ../../../base/content/msgSecurityPane.js */
var gEncryptedURIService = null;
var gMyLastEncryptedURI = null;
@ -142,10 +144,10 @@ var smimeHeaderSink = {
* message is displayed in a separate window.
*/
getSelectedMessageURI() {
if (!gFolderDisplay.selectedMessage) {
if (!gMessage) {
return null;
}
if (!gFolderDisplay.selectedMessage.folder) {
if (!gFolder) {
// The folder should be absent only if the message gets opened
// from an external file (.eml), which is opened in its own window.
// That window won't get reused for other messages. We conclude
@ -156,7 +158,7 @@ var smimeHeaderSink = {
return null;
}
return neckoURLForMessageURI(gFolderDisplay.selectedMessageUris[0]);
return neckoURLForMessageURI(gMessageURI);
},
signedStatus(aNestingLevel, aSignatureStatus, aSignerCert, aMsgNeckoURL) {
@ -267,7 +269,7 @@ var smimeHeaderSink = {
if (gEncryptedURIService) {
// Remember the message URI and the corresponding necko URI.
gMyLastEncryptedURI = gFolderDisplay.selectedMessageUris[0];
gMyLastEncryptedURI = gMessageURI;
gEncryptedURIService.rememberEncrypted(gMyLastEncryptedURI);
gEncryptedURIService.rememberEncrypted(
neckoURLForMessageURI(gMyLastEncryptedURI)

Просмотреть файл

@ -59,7 +59,6 @@ skip-if = true # TODO
skip-if = true # TODO
[browser_invalidDbFolderLoad.js]
[browser_mailTelemetry.js]
skip-if = true # TODO
[browser_mailViews.js]
skip-if = true # TODO
[browser_messageCommands.js]

Просмотреть файл

@ -17,10 +17,20 @@ let {
} = ChromeUtils.import(
"resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
);
let { SmimeUtils } = ChromeUtils.import(
"resource://testing-common/mailnews/smimeUtils.jsm"
);
let { TelemetryTestUtils } = ChromeUtils.import(
"resource://testing-common/TelemetryTestUtils.jsm"
);
add_setup(function() {
SmimeUtils.ensureNSS();
SmimeUtils.loadCertificateAndKey(
new FileUtils.File(getTestFilePath("../openpgp/data/smime/Bob.p12"))
);
});
/**
* Check that we're counting secure mails read.
*/
@ -46,7 +56,10 @@ add_task(async function test_secure_mails_read() {
await add_message_to_folder(
[folder],
create_encrypted_smime_message({
clobberHeaders: headers,
to: "Bob@example.com",
body: {
body: smimeMessage,
},
})
);
}
@ -102,3 +115,20 @@ add_task(async function test_secure_mails_read() {
"Count of openpgp encrypted mails read must still be correct."
);
});
var smimeMessage = [
"MIAGCSqGSIb3DQEHA6CAMIACAQAxggGFMIIBgQIBADBpMGQxCzAJBgNVBAYTAlVT",
"MRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRIw",
"EAYDVQQKEwlCT0dVUyBOU1MxFDASBgNVBAMTC05TUyBUZXN0IENBAgEoMA0GCSqG",
"SIb3DQEBAQUABIIBAGgZHxKKXrR3tMqJkkADZoYNqIJJXOXmrmXHHV830/RUW6gU",
"V3NNwsnl4L99kygitGe4X4gnjqPHs0FNxEL1DfxwyySfkcQge5BktBcBk448TUzz",
"WrS19L4UAfJkalu+stezAO0L4hs/kYaSrvFhuQ6vxfixHxGydwX008Ps16aua5zI",
"EYgiSoXxAUajtEh6phqAcC+FMhObZyEZXQKSgs3X0nYTQib8I6L7dWquYoQMVfsp",
"wpERLhEqtTghEW/CT8z6gQajkEgV9tFM0f2gLSH1672LRlHVAbk4ZceBmvxa02sr",
"PHW8gffMVWF6RX05rKzVnxm9IzJjHdWblc7SPJowgAYJKoZIhvcNAQcBMB0GCWCG",
"SAFlAwQBAgQQSSldfdzyN/cUjHJO2EXrGKCABIGglkOJOh25hjmvYeJtxlyih1CC",
"1tlMGVnct6Zuiy1y7jVIsJRSRFXsA4TQyFICPe4aq7ArNzT0Bizj8mzDXmJQNh5v",
"5bwmMwMrvW5p9NMasuFIaIqbvmVnLC5c/DcJoplx1eOG0OOfXevGLrepLzF9Yeya",
"TFli/xvLNSwTA+xSsFCxets7vknAXFBSqnRQP2fk2bnihfHdBh6JYIFKWStJlwQQ",
"Y0jCR94CgCHcP6Yi/0bwKQAAAAAAAAAAAAA=",
].join("\n");

Просмотреть файл

@ -7,13 +7,12 @@ prefs =
mailnews.start_page.url=about:blank
subsuite = thunderbird
support-files = data/**
skip-if = true # TODO
[browser_collectKeys.js]
[browser_editDraftTemplate.js]
[browser_keyWizard.js]
[browser_openPGPDrafts.js]
[browser_perm_decrypt.js]
[browser_viewMessage.js]
[browser_viewMessageSecurity.js]
[browser_viewPartialMessage.js]
[browser_keyWizard.js]

Просмотреть файл

@ -8,7 +8,7 @@
"use strict";
const { open_message_from_file } = ChromeUtils.import(
const { get_about_message, open_message_from_file } = ChromeUtils.import(
"resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
);
const { close_window } = ChromeUtils.import(
@ -51,10 +51,7 @@ async function openpgpProcessed() {
let [subject] = await TestUtils.topicObserved(
"document-element-inserted",
document => {
return (
document.ownerGlobal?.location ==
"chrome://messenger/content/messageWindow.xhtml"
);
return document.ownerGlobal?.location == "about:message";
}
);
@ -102,13 +99,14 @@ add_task(async function testCollectKeyAttachment() {
)
);
await opengpgprocessed;
let aboutMessage = get_about_message(mc.window);
Assert.ok(
OpenPGPTestUtils.hasNoSignedIconState(mc.window.document),
OpenPGPTestUtils.hasNoSignedIconState(aboutMessage.document),
"signed icon is not displayed"
);
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is not displayed"
);
await keycollected;
@ -141,13 +139,14 @@ add_task(async function testSkipFakeOrUnrelatedKeys() {
)
);
await opengpgprocessed;
let aboutMessage = get_about_message(mc.window);
Assert.ok(
OpenPGPTestUtils.hasNoSignedIconState(mc.window.document),
OpenPGPTestUtils.hasNoSignedIconState(aboutMessage.document),
"signed icon is not displayed"
);
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is not displayed"
);
@ -183,13 +182,14 @@ add_task(async function testSkipDuplicateKeys() {
new FileUtils.File(getTestFilePath("data/eml/eve-duplicate.eml"))
);
await opengpgprocessed;
let aboutMessage = get_about_message(mc.window);
Assert.ok(
OpenPGPTestUtils.hasNoSignedIconState(mc.window.document),
OpenPGPTestUtils.hasNoSignedIconState(aboutMessage.document),
"signed icon is not displayed"
);
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is not displayed"
);

Просмотреть файл

@ -13,14 +13,12 @@ var { open_compose_new_mail, setup_msg_contents } = ChromeUtils.import(
"resource://testing-common/mozmill/ComposeHelpers.jsm"
);
var { mailTestUtils } = ChromeUtils.import(
"resource://testing-common/mailnews/MailTestUtils.jsm"
);
var {
be_in_folder,
get_about_3pane,
get_special_folder,
mc,
right_click_on_row,
select_click_row,
} = ChromeUtils.import(
"resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
@ -123,8 +121,8 @@ add_task(async function testDraftSec() {
*/
add_task(async function testTemplSec() {
await be_in_folder(templatesFolder);
await doTestSecState(true, false); // template, not secure
await doTestSecState(true, true); // template, secure
await doTestSecState(false, false); // template, not secure
await doTestSecState(false, true); // template, secure
});
/**
@ -172,12 +170,22 @@ async function doTestSecState(isDraft, secure) {
await be_in_folder(theFolder);
select_click_row(0);
info(`Will double click to open the ${type}`);
info(`Will open the ${type}`);
let draftWindowPromise = waitForComposeWindow();
let threadTree = mc.window.document.getElementById("threadTree");
mailTestUtils.treeClick(EventUtils, mc.window, threadTree, 0, 4, {
clickCount: 2,
});
select_click_row(0);
await right_click_on_row(0);
let about3Pane = get_about_3pane();
let mailContext = about3Pane.document.getElementById("mailContext");
if (isDraft) {
mailContext.activateItem(
about3Pane.document.getElementById("mailContext-editDraftMsg")
);
} else {
mailContext.activateItem(
about3Pane.document.getElementById("mailContext-newMsgFromTemplate")
);
}
// The double click on col 4 (the subject) should bring up compose window
// for editing this draft.

Просмотреть файл

@ -10,6 +10,7 @@ const { save_compose_message } = ChromeUtils.import(
const {
open_message_from_file,
be_in_folder,
get_about_message,
get_special_folder,
select_click_row,
open_selected_message,
@ -126,7 +127,9 @@ add_task(async function testDraftReplyToEncryptedMessageKeepsRePrefix() {
);
let replyWindowPromise = waitForComposeWindow();
mc.window.document.querySelector("#hdrReplyButton").click();
get_about_message(mc.window)
.document.querySelector("#hdrReplyButton")
.click();
close_window(mc);
let replyWindow = await replyWindowPromise;
@ -157,4 +160,5 @@ add_task(async function testDraftReplyToEncryptedMessageKeepsRePrefix() {
registerCleanupFunction(function tearDown() {
aliceIdentity.setUnicharAttribute("openpgp_key_id", initialKeyIdPref);
MailServices.accounts.removeIncomingServer(aliceAcct.incomingServer, true);
MailServices.accounts.removeAccount(aliceAcct);
});

Просмотреть файл

@ -10,6 +10,8 @@
const {
be_in_folder,
get_about_3pane,
get_about_message,
get_special_folder,
mc,
select_click_row,
@ -38,7 +40,7 @@ var { AppConstants } = ChromeUtils.importESModule(
const MSG_TEXT = "Sundays are nothing without callaloo.";
function getMsgBodyTxt(mc) {
let msgPane = mc.window.document.getElementById("messagepane");
let msgPane = get_about_message(mc.window).content;
return msgPane.contentDocument.documentElement.textContent;
}
@ -119,20 +121,22 @@ add_task(async function testPermanentDecrypt() {
// Select the first row.
select_click_row(0);
let aboutMessage = get_about_message();
Assert.equal(
mc.window.document.getElementById("encryptionTechBtn").querySelector("span")
.textContent,
aboutMessage.document
.getElementById("encryptionTechBtn")
.querySelector("span").textContent,
"OpenPGP"
);
Assert.ok(getMsgBodyTxt(mc).includes(MSG_TEXT), "message text is in body");
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is displayed"
);
// Get header of selected message
let hdr = window.gFolderDisplay.selectedMessages[0];
let hdr = get_about_3pane().gDBView.hdrForFirstSelectedMessage;
await EnigmailPersistentCrypto.cryptMessage(hdr, gDecFolder.URI, false, null);
@ -143,18 +147,15 @@ add_task(async function testPermanentDecrypt() {
select_click_row(0);
Assert.ok(getMsgBodyTxt(mc).includes(MSG_TEXT), "message text is in body");
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon NOT displayed"
);
});
registerCleanupFunction(function tearDown() {
registerCleanupFunction(function() {
// Reset the OpenPGP key and delete the account.
aliceIdentity.setUnicharAttribute("openpgp_key_id", initialKeyIdPref);
MailServices.accounts.removeIncomingServer(aliceAcct.incomingServer, true);
MailServices.accounts.removeAccount(aliceAcct);
aliceAcct = null;
// Work around this test timing out at completion because of focus weirdness.
window.gFolderDisplay.tree.focus();
});

Просмотреть файл

@ -9,6 +9,7 @@
"use strict";
const {
get_about_message,
open_message_from_file,
wait_for_message_display_completion,
} = ChromeUtils.import(
@ -42,31 +43,12 @@ const { MailServices } = ChromeUtils.import(
const MSG_TEXT = "Sundays are nothing without callaloo.";
function getMsgBodyTxt(mc) {
let msgPane = mc.window.document.getElementById("messagepane");
let msgPane = get_about_message(mc.window).content;
return msgPane.contentDocument.documentElement.textContent;
}
var aliceAcct;
/**
* When testing a scenario that should automatically process the OpenPGP
* contents (it's not suppressed e.g. because of a partial content),
* then we need to wait for the automatic processing to complete.
*/
async function openpgpProcessed() {
let [subject] = await TestUtils.topicObserved(
"document-element-inserted",
document => {
return (
document.ownerGlobal?.location ==
"chrome://messenger/content/messageWindow.xhtml"
);
}
);
return BrowserTestUtils.waitForEvent(subject, "openpgpprocessed");
}
/**
* Set up the base account, identity and keys needed for the tests.
*/
@ -113,14 +95,15 @@ add_task(async function testOpenNoPGPSecurity() {
getTestFilePath("data/eml/unsigned-unencrypted-from-bob-to-alice.eml")
)
);
let aboutMessage = get_about_message(mc.window);
Assert.ok(getMsgBodyTxt(mc).includes(MSG_TEXT), "message text is in body");
Assert.ok(
OpenPGPTestUtils.hasNoSignedIconState(mc.window.document),
OpenPGPTestUtils.hasNoSignedIconState(aboutMessage.document),
"signed icon is not displayed"
);
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is not displayed"
);
close_window(mc);
@ -137,14 +120,15 @@ add_task(async function testOpenSignedByVerifiedUnencrypted() {
)
)
);
let aboutMessage = get_about_message(mc.window);
Assert.ok(getMsgBodyTxt(mc).includes(MSG_TEXT), "message text is in body");
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(mc.window.document, "verified"),
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "verified"),
"signed verified icon is displayed"
);
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is not displayed"
);
close_window(mc);
@ -160,14 +144,15 @@ add_task(async function testOpenSignedDateMismatch() {
getTestFilePath("data/eml/signed-mismatch-email-date.eml")
)
);
let aboutMessage = get_about_message(mc.window);
Assert.ok(getMsgBodyTxt(mc).includes(MSG_TEXT), "message text is in body");
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(mc.window.document, "mismatch"),
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "mismatch"),
"signed unknown icon is displayed"
);
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is not displayed"
);
close_window(mc);
@ -184,14 +169,15 @@ add_task(async function testOpenVerifiedUnsignedEncrypted() {
)
)
);
let aboutMessage = get_about_message(mc.window);
Assert.ok(getMsgBodyTxt(mc).includes(MSG_TEXT), "message text is in body");
Assert.ok(
OpenPGPTestUtils.hasNoSignedIconState(mc.window.document),
OpenPGPTestUtils.hasNoSignedIconState(aboutMessage.document),
"signed icon is not displayed"
);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is displayed"
);
close_window(mc);
@ -205,6 +191,7 @@ add_task(async function testOpenForwardedEncrypted() {
let mc = await open_message_from_file(
new FileUtils.File(getTestFilePath("data/eml/fwd-unsigned-encrypted.eml"))
);
let aboutMessage = get_about_message(mc.window);
Assert.ok(
getMsgBodyTxt(mc).includes("wrapper message with plain text"),
@ -215,23 +202,24 @@ add_task(async function testOpenForwardedEncrypted() {
"message text should not be shown"
);
Assert.ok(
OpenPGPTestUtils.hasNoSignedIconState(mc.window.document),
OpenPGPTestUtils.hasNoSignedIconState(aboutMessage.document),
"signed icon is not displayed"
);
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is not displayed"
);
let newWindowPromise = async_plan_for_new_window("mail:messageWindow");
EventUtils.synthesizeMouseAtCenter(
mc.e("attachmentName"),
aboutMessage.document.getElementById("attachmentName"),
{ clickCount: 1 },
mc.window
aboutMessage
);
let mc2 = await newWindowPromise;
wait_for_message_display_completion(mc2, true);
wait_for_window_focused(mc2.window);
let aboutMessage2 = get_about_message(mc2.window);
// Check properties of the opened attachment window.
Assert.ok(
@ -239,11 +227,11 @@ add_task(async function testOpenForwardedEncrypted() {
"message text should be shown"
);
Assert.ok(
OpenPGPTestUtils.hasNoSignedIconState(mc2.window.document),
OpenPGPTestUtils.hasNoSignedIconState(aboutMessage2.document),
"signed icon is not displayed"
);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc2.window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage2.document, "ok"),
"encrypted icon is displayed"
);
close_window(mc2);
@ -252,16 +240,16 @@ add_task(async function testOpenForwardedEncrypted() {
// Ensure there were no side effects for the primary window.
Assert.ok(
OpenPGPTestUtils.hasNoSignedIconState(mc.window.document),
OpenPGPTestUtils.hasNoSignedIconState(aboutMessage.document),
"signed icon is still not displayed"
);
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is still not displayed"
);
close_window(mc);
});
}).skip(); // TODO can't open message attachments yet
/**
* Test that opening a message that is signed by a verified key shows as such.
@ -274,14 +262,15 @@ add_task(async function testOpenSignedByVerifiedEncrypted() {
)
)
);
let aboutMessage = get_about_message(mc.window);
Assert.ok(getMsgBodyTxt(mc).includes(MSG_TEXT), "message text is in body");
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(mc.window.document, "verified"),
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "verified"),
"signed verified icon is displayed"
);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is displayed"
);
close_window(mc);
@ -302,14 +291,15 @@ add_task(async function testOpenSignedEncryptedMultiFrom() {
)
)
);
let aboutMessage = get_about_message(mc.window);
Assert.ok(getMsgBodyTxt(mc).includes(MSG_TEXT), "message text is in body");
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(mc.window.document, "mismatch"),
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "mismatch"),
"mismatch icon should be displayed"
);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon should be displayed"
);
close_window(mc);
@ -326,14 +316,15 @@ add_task(async function testOpenSignedByUnverifiedUnencrypted() {
)
)
);
let aboutMessage = get_about_message(mc.window);
Assert.ok(getMsgBodyTxt(mc).includes(MSG_TEXT), "message text is in body");
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(mc.window.document, "unknown"),
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "unknown"),
"signed unknown icon is displayed"
);
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is not displayed"
);
close_window(mc);
@ -349,10 +340,11 @@ add_task(async function testOpenSignedWithOuterLayer() {
getTestFilePath("data/eml/signed-with-mailman-footer.eml")
)
);
let aboutMessage = get_about_message(mc.window);
Assert.ok(getMsgBodyTxt(mc).includes(MSG_TEXT), "message text is in body");
Assert.ok(
OpenPGPTestUtils.hasNoSignedIconState(mc.window.document),
OpenPGPTestUtils.hasNoSignedIconState(aboutMessage.document),
"signed icon is not displayed"
);
close_window(mc);
@ -369,14 +361,15 @@ add_task(async function testOpenUnverifiedUnsignedEncrypted() {
)
)
);
let aboutMessage = get_about_message(mc.window);
Assert.ok(getMsgBodyTxt(mc).includes(MSG_TEXT), "message text is in body");
Assert.ok(
OpenPGPTestUtils.hasNoSignedIconState(mc.window.document),
OpenPGPTestUtils.hasNoSignedIconState(aboutMessage.document),
"signed icon is not displayed"
);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is displayed"
);
close_window(mc);
@ -394,14 +387,15 @@ add_task(async function testOpenSignedByUnverifiedEncrypted() {
)
)
);
let aboutMessage = get_about_message(mc.window);
Assert.ok(getMsgBodyTxt(mc).includes(MSG_TEXT), "message text is in body");
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(mc.window.document, "unknown"),
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "unknown"),
"signed unknown icon is displayed"
);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is displayed"
);
close_window(mc);
@ -420,21 +414,22 @@ add_task(async function testUpdateMessageSignature() {
)
)
);
let aboutMessage = get_about_message(mc.window);
// Verify current signature acceptance.
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(mc.window.document, "verified"),
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "verified"),
"signed verified icon is displayed"
);
let popupshown = BrowserTestUtils.waitForEvent(
mc.e("messageSecurityPanel"),
aboutMessage.document.getElementById("messageSecurityPanel"),
"popupshown"
);
EventUtils.synthesizeMouseAtCenter(
mc.e("encryptionTechBtn"),
aboutMessage.document.getElementById("encryptionTechBtn"),
{ clickCount: 1 },
mc.window
aboutMessage
);
// Wait for the popup panel and signature button to become visible otherwise
// we can't click on it.
@ -470,9 +465,9 @@ add_task(async function testUpdateMessageSignature() {
// This will open the key details, the domWindowOpened handler
// will catch it and execute the changes.
EventUtils.synthesizeMouseAtCenter(
mc.e("viewSignatureKey"),
aboutMessage.document.getElementById("viewSignatureKey"),
{ clickCount: 1 },
mc.window
aboutMessage
);
// Wait until we are done with keyDetailsDlg.
@ -482,11 +477,12 @@ add_task(async function testUpdateMessageSignature() {
// Verify the new acceptance level is correct.
await TestUtils.waitForCondition(
() => OpenPGPTestUtils.hasSignedIconState(mc.window.document, "unverified"),
() =>
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "unverified"),
"signed unverified icon should be displayed"
);
close_window(mc);
});
}).skip(); // TODO
// After test testUpdateMessageSignature acceptance of Bob's key
// has changed from verified to unverified.
@ -496,22 +492,22 @@ add_task(async function testUpdateMessageSignature() {
* can be correctly verified.
*/
add_task(async function testOpenSignedInlineWithUTF8() {
let opengpgprocessed = openpgpProcessed();
let mc = await open_message_from_file(
new FileUtils.File(getTestFilePath("data/eml/alice-utf.eml"))
);
await opengpgprocessed;
let aboutMessage = get_about_message(mc.window);
Assert.ok(
getMsgBodyTxt(mc).includes("£35.00"),
"UTF-8 character found in message"
);
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(mc.window.document, "unverified"),
await TestUtils.waitForCondition(
() =>
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "unverified"),
"signed unverified icon is displayed"
);
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is not displayed"
);
close_window(mc);
@ -522,44 +518,43 @@ add_task(async function testOpenSignedInlineWithUTF8() {
* can be correctly verified.
*/
add_task(async function testOpenSignedInlineWithLeadingWS() {
let opengpgprocessed = openpgpProcessed();
let mc = await open_message_from_file(
new FileUtils.File(getTestFilePath("data/eml/signed-inline-indented.eml"))
);
await opengpgprocessed;
let aboutMessage = get_about_message(mc.window);
Assert.ok(
getMsgBodyTxt(mc).includes("indent test with £"),
"expected text should be found in message"
);
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(mc.window.document, "unverified"),
await TestUtils.waitForCondition(
() =>
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "unverified"),
"signed unverified icon is displayed"
);
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is not displayed"
);
close_window(mc);
});
}).skip(); // TODO
/**
* Test that an encrypted inline message, with nbsp encoded as qp
* in the PGP separator line, is trimmed and decrypted.
*/
add_task(async function testDecryptInlineWithNBSPasQP() {
let opengpgprocessed = openpgpProcessed();
let mc = await open_message_from_file(
new FileUtils.File(getTestFilePath("data/eml/bob-enc-inline-nbsp-qp.eml"))
);
await opengpgprocessed;
let aboutMessage = get_about_message(mc.window);
Assert.ok(
getMsgBodyTxt(mc).includes("My real name is not Bob."),
"Secret text should be contained in message"
);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
await TestUtils.waitForCondition(
() => OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"Encrypted icon should be displayed"
);
close_window(mc);
@ -570,18 +565,17 @@ add_task(async function testDecryptInlineWithNBSPasQP() {
* encoded as qp in the PGP separator line, is trimmed and decrypted.
*/
add_task(async function testDecryptHtmlWithNBSP() {
let opengpgprocessed = openpgpProcessed();
let mc = await open_message_from_file(
new FileUtils.File(getTestFilePath("data/eml/bob-enc-html-nbsp.eml"))
);
await opengpgprocessed;
let aboutMessage = get_about_message(mc.window);
Assert.ok(
getMsgBodyTxt(mc).includes("My real name is not Bob."),
"Secret text should be contained in message"
);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
await TestUtils.waitForCondition(
() => OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"Encrypted icon should be displayed"
);
close_window(mc);

Просмотреть файл

@ -13,6 +13,7 @@ const {
create_encrypted_smime_message,
add_message_to_folder,
be_in_folder,
get_about_message,
get_special_folder,
mc,
select_click_row,
@ -35,20 +36,24 @@ const { OpenPGPTestUtils } = ChromeUtils.import(
const { PromiseTestUtils } = ChromeUtils.import(
"resource://testing-common/mailnews/PromiseTestUtils.jsm"
);
const { SmimeUtils } = ChromeUtils.import(
"resource://testing-common/mailnews/smimeUtils.jsm"
);
const { FileUtils } = ChromeUtils.importESModule(
"resource://gre/modules/FileUtils.sys.mjs"
);
const { MailServices } = ChromeUtils.import(
"resource:///modules/MailServices.jsm"
);
var { AppConstants } = ChromeUtils.importESModule(
const { AppConstants } = ChromeUtils.importESModule(
"resource://gre/modules/AppConstants.sys.mjs"
);
const MSG_TEXT = "Sundays are nothing without callaloo.";
function getMsgBodyTxt(mc) {
let msgPane = mc.window.document.getElementById("messagepane");
let msgPane = get_about_message(mc.window).content;
return msgPane.contentDocument.documentElement.textContent;
}
@ -61,6 +66,11 @@ var gInbox;
* Set up the base account, identity and keys needed for the tests.
*/
add_setup(async function() {
SmimeUtils.ensureNSS();
SmimeUtils.loadCertificateAndKey(
new FileUtils.File(getTestFilePath("data/smime/Bob.p12"))
);
aliceAcct = MailServices.accounts.createAccount();
aliceAcct.incomingServer = MailServices.accounts.createIncomingServer(
"alice",
@ -104,6 +114,9 @@ add_setup(async function() {
* encryption states.
*/
add_task(async function testSmimeOpenPgpSelection() {
let smimeFile = new FileUtils.File(
getTestFilePath("data/smime/alice.env.eml")
);
// Fetch a local OpenPGP message.
let openPgpFile = new FileUtils.File(
getTestFilePath(
@ -111,8 +124,22 @@ add_task(async function testSmimeOpenPgpSelection() {
)
);
// Add the fetched OpenPGP message to the inbox folder.
// Add the fetched S/MIME message to the inbox folder.
let copyListener = new PromiseTestUtils.PromiseCopyListener();
MailServices.copy.copyFileMessage(
smimeFile,
gInbox,
null,
false,
0,
"",
copyListener,
null
);
await copyListener.promise;
// Add the fetched OpenPGP message to the inbox folder.
copyListener = new PromiseTestUtils.PromiseCopyListener();
MailServices.copy.copyFileMessage(
openPgpFile,
gInbox,
@ -125,43 +152,43 @@ add_task(async function testSmimeOpenPgpSelection() {
);
await copyListener.promise;
// Create an S/MIME message and add it to the inbox folder.
await add_message_to_folder([gInbox], create_encrypted_smime_message());
// Select the first row, which should contain the S/MIME message.
select_click_row(0);
// Select the second row, which should contain the S/MIME message.
select_click_row(1);
let aboutMessage = get_about_message();
Assert.equal(
mc.window.document.getElementById("encryptionTechBtn").querySelector("span")
.textContent,
aboutMessage.document
.getElementById("encryptionTechBtn")
.querySelector("span").textContent,
"S/MIME"
);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "notok"),
"S/MIME message cannot be decrypted"
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"S/MIME message should be decrypted"
);
let openpgpprocessed = BrowserTestUtils.waitForEvent(
mc.window.document,
aboutMessage.document,
"openpgpprocessed"
);
// Select the second row, which should contain the OpenPGP message.
select_click_row(1);
// Select the first row, which should contain the OpenPGP message.
select_click_row(0);
await openpgpprocessed;
Assert.equal(
mc.window.document.getElementById("encryptionTechBtn").querySelector("span")
.textContent,
aboutMessage.document
.getElementById("encryptionTechBtn")
.querySelector("span").textContent,
"OpenPGP"
);
Assert.ok(getMsgBodyTxt(mc).includes(MSG_TEXT), "message text is in body");
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(mc.window.document, "verified"),
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "verified"),
"signed verified icon is displayed"
);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is displayed"
);
@ -200,11 +227,16 @@ add_task(async function testBrokenMSExchangeEncryption() {
select_click_row(0);
// Assert the "corrupted by MS-Exchange" notification is visible.
wait_for_notification_to_show(mc, notificationBox, notificationValue);
let aboutMessage = get_about_message();
wait_for_notification_to_show(
aboutMessage,
notificationBox,
notificationValue
);
// Click on the "repair" button.
let repairButton = get_notification_button(
mc,
aboutMessage,
notificationBox,
notificationValue,
{
@ -212,10 +244,14 @@ add_task(async function testBrokenMSExchangeEncryption() {
}
);
plan_for_message_display(mc);
EventUtils.synthesizeMouseAtCenter(repairButton, {}, mc.window);
EventUtils.synthesizeMouseAtCenter(repairButton, {}, aboutMessage);
// Wait for the "fixing in progress" notification to go away.
wait_for_notification_to_stop(mc, notificationBox, "brokenExchangeProgress");
wait_for_notification_to_stop(
aboutMessage,
notificationBox,
"brokenExchangeProgress"
);
// The broken exchange repair process generates a new fixed message body and
// then copies the new message in the same folder. Therefore, we need to wait
@ -223,14 +259,14 @@ add_task(async function testBrokenMSExchangeEncryption() {
wait_for_message_display_completion(mc, true);
// Assert that the message was repaired and decrypted.
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
await TestUtils.waitForCondition(
() => OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is displayed"
);
// Delete the message.
press_delete();
});
}).skip(); // TODO
/**
* Test the working keyboard shortcut event listener for the message header.
@ -243,9 +279,11 @@ add_task(async function testMessageSecurityShortcut() {
// Select the first row, which should contain the S/MIME message.
select_click_row(0);
let aboutMessage = get_about_message();
Assert.equal(
mc.window.document.getElementById("encryptionTechBtn").querySelector("span")
.textContent,
aboutMessage.document
.getElementById("encryptionTechBtn")
.querySelector("span").textContent,
"S/MIME"
);
@ -255,11 +293,11 @@ add_task(async function testMessageSecurityShortcut() {
: { accelKey: true, altKey: true };
let popupshown = BrowserTestUtils.waitForEvent(
mc.e("messageSecurityPanel"),
aboutMessage.document.getElementById("messageSecurityPanel"),
"popupshown"
);
EventUtils.synthesizeKey("s", modifiers, mc.window);
EventUtils.synthesizeKey("s", modifiers, aboutMessage);
// The Message Security popup panel should show up.
await popupshown;
@ -268,7 +306,7 @@ add_task(async function testMessageSecurityShortcut() {
select_click_row(0);
// Delete the message.
press_delete();
});
}).skip(); // TODO
registerCleanupFunction(async function tearDown() {
// Reset the OpenPGP key and delete the account.
@ -276,7 +314,4 @@ registerCleanupFunction(async function tearDown() {
aliceAcct = null;
await OpenPGPTestUtils.removeKeyById("0xf231550c4f47e38e", true);
// Work around this test timing out at completion because of focus weirdness.
window.gFolderDisplay.tree.focus();
});

Просмотреть файл

@ -8,7 +8,7 @@
"use strict";
const { open_message_from_file } = ChromeUtils.import(
const { get_about_message, open_message_from_file } = ChromeUtils.import(
"resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
);
const { close_window } = ChromeUtils.import(
@ -37,7 +37,7 @@ const { MailServices } = ChromeUtils.import(
const MSG_TEXT = "Sundays are nothing without callaloo.";
function getMsgBodyTxt(mc) {
let msgPane = mc.window.document.getElementById("messagepane");
let msgPane = get_about_message(mc.window).content;
return msgPane.contentDocument.documentElement.textContent;
}
@ -147,12 +147,17 @@ add_task(async function testPartialInlinePGPDecrypt() {
let mc = await open_message_from_file(
new FileUtils.File(getTestFilePath("data/eml/" + test.filename))
);
let aboutMessage = get_about_message(mc.window);
let notificationBox = "mail-notification-top";
let notificationValue = "decryptInlinePG";
// Ensure the "partially encrypted notification" is visible.
wait_for_notification_to_show(mc, notificationBox, notificationValue);
wait_for_notification_to_show(
aboutMessage,
notificationBox,
notificationValue
);
let body = getMsgBodyTxt(mc);
@ -166,19 +171,19 @@ add_task(async function testPartialInlinePGPDecrypt() {
// Click on the button to process the message subset.
let processButton = get_notification_button(
mc,
aboutMessage,
notificationBox,
notificationValue,
{
popup: null,
}
);
EventUtils.synthesizeMouseAtCenter(processButton, {}, mc.window);
EventUtils.synthesizeMouseAtCenter(processButton, {}, aboutMessage);
// Assert that the message was processed and the partial content reminder
// notification is visible.
wait_for_notification_to_show(
mc,
aboutMessage,
notificationBox,
"decryptInlinePGReminder"
);
@ -196,7 +201,7 @@ add_task(async function testPartialInlinePGPDecrypt() {
if (test.expectSuccess) {
Assert.ok(containsSecret, "secret decrypted content should be shown");
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"decryption success icon is shown"
);
} else {
@ -205,19 +210,25 @@ add_task(async function testPartialInlinePGPDecrypt() {
"secret decrypted content should not be shown"
);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(mc.window.document, "notok"),
OpenPGPTestUtils.hasEncryptedIconState(
aboutMessage.document,
"notok"
),
"decryption failure icon is shown"
);
}
} else if (test.expectVerification) {
if (test.expectSuccess) {
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(mc.window.document, "verified"),
OpenPGPTestUtils.hasSignedIconState(
aboutMessage.document,
"verified"
),
"ok verification icon is shown for " + test.filename
);
} else {
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(mc.window.document, "unknown"),
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "unknown"),
"unknown verification icon is shown"
);
}

Просмотреть файл

@ -11,10 +11,8 @@ subsuite = thunderbird
support-files = ../data/**
[browser_composeSigned.js]
skip-if = true # TODO
# skip-if = debug # Bug 1673652 - L10NRegistry throws NS_ERROR_FILE_UNRECOGNIZED_PATH
skip-if = debug # Bug 1673652 - L10NRegistry throws NS_ERROR_FILE_UNRECOGNIZED_PATH
[browser_composeEncrypted.js]
skip-if = true # TODO
# skip-if = debug # Bug 1673652 - L10NRegistry throws NS_ERROR_FILE_UNRECOGNIZED_PATH
skip-if = debug # Bug 1673652 - L10NRegistry throws NS_ERROR_FILE_UNRECOGNIZED_PATH
[browser_composeSwitchIdentity.js]
skip-if = debug # Bug 1673652 - L10NRegistry throws NS_ERROR_FILE_UNRECOGNIZED_PATH

Просмотреть файл

@ -11,6 +11,7 @@
const {
open_message_from_file,
be_in_folder,
get_about_message,
get_special_folder,
select_click_row,
} = ChromeUtils.import(
@ -37,6 +38,8 @@ let bobIdentity;
let gOutbox;
let gDrafts;
let aboutMessage = get_about_message();
// Used in some of the tests to verify key status display.
let l10n = new Localization(["messenger/openpgp/composeKeyStatus.ftl"]);
@ -119,18 +122,18 @@ add_task(async function testEncryptedMessageComposition() {
select_click_row(0);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"message should have encrypted icon"
);
Assert.equal(
window.document.querySelector("#attachmentList").itemChildren.length,
aboutMessage.document.querySelector("#attachmentList").itemChildren.length,
0,
"no keys should be attached to message"
);
Assert.ok(
OpenPGPTestUtils.hasNoSignedIconState(window.document),
OpenPGPTestUtils.hasNoSignedIconState(aboutMessage.document),
"message should have signed icon"
);
@ -164,11 +167,11 @@ add_task(async function testEncryptedMessageWithKeyComposition() {
select_click_row(0);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"message should have encrypted icon"
);
let attachmentList = window.document.querySelector("#attachmentList");
let attachmentList = aboutMessage.document.querySelector("#attachmentList");
await TestUtils.waitForCondition(
() => attachmentList.itemChildren.length == 1,
@ -183,7 +186,7 @@ add_task(async function testEncryptedMessageWithKeyComposition() {
);
Assert.ok(
OpenPGPTestUtils.hasNoSignedIconState(window.document),
OpenPGPTestUtils.hasNoSignedIconState(aboutMessage.document),
"message should have no signed icon"
);
@ -312,7 +315,7 @@ add_task(
select_click_row(0);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"message should have encrypted icon"
);
@ -444,7 +447,7 @@ add_task(
select_click_row(0);
await TestUtils.waitForCondition(
() => OpenPGPTestUtils.hasEncryptedIconState(window.document, "ok"),
() => OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"message should have encrypted icon"
);
@ -475,11 +478,16 @@ add_task(async function testEncryptedMessageReplyIsEncrypted() {
);
});
mc.window.document.querySelector("#hdrReplyButton").click();
get_about_message(mc.window)
.document.querySelector("#hdrReplyButton")
.click();
close_window(mc);
let replyWindow = await replyWindowPromise;
await BrowserTestUtils.waitForEvent(replyWindow, "focus", true);
await Promise.all([
BrowserTestUtils.waitForEvent(replyWindow, "focus", true),
BrowserTestUtils.waitForEvent(replyWindow, "compose-editor-ready", true),
]);
replyWindow.document.querySelector("#button-save").click();
await TestUtils.waitForCondition(
@ -488,15 +496,11 @@ add_task(async function testEncryptedMessageReplyIsEncrypted() {
);
replyWindow.close();
if (Services.focus.activeWindow != window) {
await BrowserTestUtils.waitForEvent(window, "focus");
}
await be_in_folder(gDrafts);
select_click_row(0);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon should be displayed"
);
});

Просмотреть файл

@ -11,6 +11,7 @@
const {
assert_selected_and_displayed,
be_in_folder,
get_about_message,
get_special_folder,
select_click_row,
} = ChromeUtils.import(
@ -34,6 +35,8 @@ let bobIdentity;
let initialKeyIdPref = "";
let gOutbox;
let aboutMessage = get_about_message();
/**
* Setup a mail account with a private key and import the public key for the
* receiver.
@ -101,18 +104,18 @@ add_task(async function testSignedMessageComposition() {
assert_selected_and_displayed(0);
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(window.document, "ok"),
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "ok"),
"message has signed icon"
);
Assert.equal(
window.document.querySelector("#attachmentList").itemChildren.length,
aboutMessage.document.querySelector("#attachmentList").itemChildren.length,
0,
"no keys attached to message"
);
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is not displayed"
);
@ -145,11 +148,11 @@ add_task(async function testSignedMessageWithKeyComposition() {
assert_selected_and_displayed(0);
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(window.document, "ok"),
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "ok"),
"message has signed icon"
);
let attachmentList = window.document.querySelector("#attachmentList");
let attachmentList = aboutMessage.document.querySelector("#attachmentList");
Assert.equal(
attachmentList.itemChildren.length,
@ -165,7 +168,7 @@ add_task(async function testSignedMessageWithKeyComposition() {
);
Assert.ok(
!OpenPGPTestUtils.hasEncryptedIconState(window.document, "ok"),
!OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"encrypted icon is not displayed"
);
@ -199,17 +202,17 @@ add_task(async function testSignedEncryptedMessageComposition() {
assert_selected_and_displayed(0);
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(window.document, "ok"),
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "ok"),
"message has signed icon"
);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"message has encrypted icon"
);
Assert.equal(
window.document.querySelector("#attachmentList").itemChildren.length,
aboutMessage.document.querySelector("#attachmentList").itemChildren.length,
0,
"no keys attached to message"
);
@ -243,16 +246,16 @@ add_task(async function testSignedEncryptedMessageWithKeyComposition() {
assert_selected_and_displayed(0);
Assert.ok(
OpenPGPTestUtils.hasSignedIconState(window.document, "ok"),
OpenPGPTestUtils.hasSignedIconState(aboutMessage.document, "ok"),
"message has signed icon"
);
Assert.ok(
OpenPGPTestUtils.hasEncryptedIconState(window.document, "ok"),
OpenPGPTestUtils.hasEncryptedIconState(aboutMessage.document, "ok"),
"message has encrypted icon"
);
let attachmentList = window.document.querySelector("#attachmentList");
let attachmentList = aboutMessage.document.querySelector("#attachmentList");
Assert.equal(
attachmentList.itemChildren.length,

Двоичные данные
mail/test/browser/openpgp/data/smime/Bob.p12 Normal file

Двоичный файл не отображается.

Просмотреть файл

@ -0,0 +1,25 @@
MIME-Version: 1.0
From: Alice@example.com
To: Bob@example.com
Subject: enveloped
Content-Type: application/pkcs7-mime; name=smime.p7m;
smime-type=enveloped-data
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=smime.p7m
Content-Description: S/MIME Encrypted Message
MIAGCSqGSIb3DQEHA6CAMIACAQAxggGFMIIBgQIBADBpMGQxCzAJBgNVBAYTAlVT
MRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRIw
EAYDVQQKEwlCT0dVUyBOU1MxFDASBgNVBAMTC05TUyBUZXN0IENBAgEoMA0GCSqG
SIb3DQEBAQUABIIBAGgZHxKKXrR3tMqJkkADZoYNqIJJXOXmrmXHHV830/RUW6gU
V3NNwsnl4L99kygitGe4X4gnjqPHs0FNxEL1DfxwyySfkcQge5BktBcBk448TUzz
WrS19L4UAfJkalu+stezAO0L4hs/kYaSrvFhuQ6vxfixHxGydwX008Ps16aua5zI
EYgiSoXxAUajtEh6phqAcC+FMhObZyEZXQKSgs3X0nYTQib8I6L7dWquYoQMVfsp
wpERLhEqtTghEW/CT8z6gQajkEgV9tFM0f2gLSH1672LRlHVAbk4ZceBmvxa02sr
PHW8gffMVWF6RX05rKzVnxm9IzJjHdWblc7SPJowgAYJKoZIhvcNAQcBMB0GCWCG
SAFlAwQBAgQQSSldfdzyN/cUjHJO2EXrGKCABIGglkOJOh25hjmvYeJtxlyih1CC
1tlMGVnct6Zuiy1y7jVIsJRSRFXsA4TQyFICPe4aq7ArNzT0Bizj8mzDXmJQNh5v
5bwmMwMrvW5p9NMasuFIaIqbvmVnLC5c/DcJoplx1eOG0OOfXevGLrepLzF9Yeya
TFli/xvLNSwTA+xSsFCxets7vknAXFBSqnRQP2fk2bnihfHdBh6JYIFKWStJlwQQ
Y0jCR94CgCHcP6Yi/0bwKQAAAAAAAAAAAAA=

Просмотреть файл

@ -10,4 +10,3 @@ subsuite = thunderbird
support-files = data/**
[browser_multipartAlternative.js]
skip-if = true # TODO, crashes

Просмотреть файл

@ -2,8 +2,7 @@
* 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/. */
/* globals gDBView, GetNumSelectedMessages */
/* global currentHeaderData: false */
/* import-globals-from ../../../mail/base/content/aboutMessage.js */
var gEncryptionStatus = -1;
var gSignatureStatus = -1;

Просмотреть файл

@ -211,7 +211,13 @@ NS_IMETHODIMP nsMsgFileHdr::GetBccList(char** aBccList) { return NS_OK; }
NS_IMETHODIMP nsMsgFileHdr::SetBccList(const char* aBccList) { return NS_OK; }
NS_IMETHODIMP nsMsgFileHdr::GetAuthor(char** aAuthor) { return NS_OK; }
NS_IMETHODIMP nsMsgFileHdr::GetAuthor(char** aAuthor) {
nsresult rv = ReadFile();
NS_ENSURE_SUCCESS(rv, rv);
*aAuthor = strdup(mAuthor.get());
return NS_OK;
}
NS_IMETHODIMP nsMsgFileHdr::SetAuthor(const char* aAuthor) { return NS_OK; }