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:
Родитель
fb1a38e661
Коммит
86caf49bef
|
@ -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,
|
||||
|
|
Двоичный файл не отображается.
|
@ -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; }
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче