in mail/extensions/openpgp/content/ui/enigmailMsgComposeOverlay.js [1706:1980]
async decryptQuote(interactive) {
if (gWindowLocked || this.processed) {
return;
}
EnigmailCore.init();
var encoderFlags =
Ci.nsIDocumentEncoder.OutputFormatted |
Ci.nsIDocumentEncoder.OutputLFLineBreak;
var docText = this.editorGetContentAs("text/plain", encoderFlags);
var blockBegin = docText.indexOf("-----BEGIN PGP ");
if (blockBegin < 0) {
return;
}
// Determine indentation string
var indentBegin = docText.substr(0, blockBegin).lastIndexOf("\n");
var indentStr = docText.substring(indentBegin + 1, blockBegin);
var beginIndexObj = {};
var endIndexObj = {};
var indentStrObj = {};
var blockType = EnigmailArmor.locateArmoredBlock(
docText,
0,
indentStr,
beginIndexObj,
endIndexObj,
indentStrObj
);
if (blockType != "MESSAGE" && blockType != "SIGNED MESSAGE") {
return;
}
var beginIndex = beginIndexObj.value;
var endIndex = endIndexObj.value;
var head = docText.substr(0, beginIndex);
var tail = docText.substr(endIndex + 1);
var pgpBlock = docText.substr(beginIndex, endIndex - beginIndex + 1);
var indentRegexp;
if (indentStr) {
if (indentStr == "> ") {
// replace ">> " with "> > " to allow correct quoting
pgpBlock = pgpBlock.replace(/^>>/gm, "> >");
}
// Escape regex chars.
const escapedIndent1 = indentStr.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&");
// Delete indentation
indentRegexp = new RegExp("^" + escapedIndent1, "gm");
pgpBlock = pgpBlock.replace(indentRegexp, "");
//tail = tail.replace(indentRegexp, "");
if (indentStr.match(/[ \t]*$/)) {
indentStr = indentStr.replace(/[ \t]*$/gm, "");
// Escape regex chars.
const escapedIndent2 = indentStr.replace(
/[.*+\-?^${}()|[\]\\]/g,
"\\$&"
);
indentRegexp = new RegExp("^" + escapedIndent2 + "$", "gm");
pgpBlock = pgpBlock.replace(indentRegexp, "");
}
// Handle blank indented lines
pgpBlock = pgpBlock.replace(/^[ \t]*>[ \t]*$/gm, "");
//tail = tail.replace(/^[ \t]*>[ \t]*$/g, "");
// Trim leading space in tail
tail = tail.replace(/^\s*\n/m, "\n");
}
if (tail.search(/\S/) < 0) {
// No non-space characters in tail; delete it
tail = "";
}
// Encode ciphertext from unicode to utf-8
var cipherText = MailStringUtils.stringToByteString(pgpBlock);
// Decrypt message
var signatureObj = {};
signatureObj.value = "";
var exitCodeObj = {};
var statusFlagsObj = {};
var userIdObj = {};
var keyIdObj = {};
var sigDetailsObj = {};
var errorMsgObj = {};
var blockSeparationObj = {};
var encToDetailsObj = {};
var uiFlags = EnigmailConstants.UI_UNVERIFIED_ENC_OK;
var plainText = "";
plainText = await EnigmailDecryption.decryptMessage(
window,
uiFlags,
cipherText,
null, // date
signatureObj,
exitCodeObj,
statusFlagsObj,
keyIdObj,
userIdObj,
sigDetailsObj,
errorMsgObj,
blockSeparationObj,
encToDetailsObj
);
// Decode plaintext from "utf-8" to unicode
plainText = MailStringUtils.byteStringToString(plainText).replace(
/\r\n/g,
"\n"
);
if (statusFlagsObj.value & EnigmailConstants.DECRYPTION_OKAY) {
//this.setSendMode('encrypt');
// TODO : Check, when is this code reached?
// automatic enabling encryption currently depends on
// adjustSignEncryptAfterIdentityChanged to be always reached
gIsRelatedToEncryptedOriginal = true;
gSendEncrypted = true;
updateEncryptionDependencies();
}
var exitCode = exitCodeObj.value;
if (exitCode !== 0) {
// Error processing
var errorMsg = errorMsgObj.value;
var statusLines = errorMsg ? errorMsg.split(/\r?\n/) : [];
var displayMsg;
if (statusLines && statusLines.length) {
// Display only first ten lines of error message
while (statusLines.length > 10) {
statusLines.pop();
}
displayMsg = statusLines.join("\n");
if (interactive) {
Services.prompt.alert(window, null, displayMsg);
}
}
}
if (blockType == "MESSAGE" && exitCode === 0 && plainText.length === 0) {
plainText = " ";
}
if (!plainText) {
if (blockType != "SIGNED MESSAGE") {
return;
}
// Extract text portion of clearsign block
plainText = EnigmailArmor.extractSignaturePart(
pgpBlock,
EnigmailConstants.SIGNATURE_TEXT
);
}
var doubleDashSeparator = Services.prefs.getBoolPref(
"temp.openpgp.doubleDashSeparator"
);
if (
gMsgCompose.type != Ci.nsIMsgCompType.Template &&
gMsgCompose.type != Ci.nsIMsgCompType.Draft &&
doubleDashSeparator
) {
var signOffset = plainText.search(/[\r\n]-- +[\r\n]/);
if (signOffset < 0 && blockType == "SIGNED MESSAGE") {
signOffset = plainText.search(/[\r\n]--[\r\n]/);
}
if (signOffset > 0) {
// Strip signature portion of quoted message
plainText = plainText.substr(0, signOffset + 1);
}
}
this.editorSelectAll();
if (head) {
this.editorInsertText(head);
}
var quoteElement;
if (indentStr) {
quoteElement = this.editorInsertAsQuotation(plainText);
} else {
this.editorInsertText(plainText);
}
if (tail) {
this.editorInsertText(tail);
}
if (statusFlagsObj.value & EnigmailConstants.DECRYPTION_OKAY) {
this.checkInlinePgpReply(head, tail);
}
if (interactive) {
return;
}
// Position cursor
var replyOnTop = gCurrentIdentity.replyOnTop;
if (!indentStr || !quoteElement) {
replyOnTop = 1;
}
if (this.editor.selectionController) {
var selection = this.editor.selectionController;
selection.completeMove(false, false); // go to start;
switch (replyOnTop) {
case 0:
// Position after quote
this.editor.endOfDocument();
if (tail) {
for (let cPos = 0; cPos < tail.length; cPos++) {
selection.characterMove(false, false); // move backwards
}
}
break;
case 2:
// Select quote
if (head) {
for (let cPos = 0; cPos < head.length; cPos++) {
selection.characterMove(true, false);
}
}
selection.completeMove(true, true);
if (tail) {
for (let cPos = 0; cPos < tail.length; cPos++) {
selection.characterMove(false, true); // move backwards
}
}
break;
default:
// Position at beginning of document
if (this.editor) {
this.editor.beginningOfDocument();
}
}
this.editor.selectionController.scrollSelectionIntoView(
Ci.nsISelectionController.SELECTION_NORMAL,
Ci.nsISelectionController.SELECTION_ANCHOR_REGION,
Ci.nsISelectionController.SCROLL_SYNCHRONOUS
);
}
},