Page Menu
Home
GnuPG
Search
Configure Global Search
Log In
Files
F35134718
enigmailMessengerOverlay.js
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Size
29 KB
Subscribers
None
enigmailMessengerOverlay.js
View Options
// Uses: chrome://enigmail/content/enigmailCommon.js
// Initialize enigmailCommon
EnigInitCommon
(
"enigmailMessengerOverlay"
);
var
gEnigCreatedURIs
=
[];
var
gEnigDecryptedMessage
;
var
gEnigSecurityInfo
=
null
;
var
gEnigLastSaveDir
=
""
;
var
gEnigMessagePane
=
null
;
var
gEnigNoShowReload
=
false
;
var
gEnigHeadersList
=
[
"content-type"
,
"x-enigmail-version"
];
var
gEnigSavedHeaders
=
null
;
var
gShowHeadersObj
=
{
"viewallheaders"
:
2
,
"viewnormalheaders"
:
1
,
"viewbriefheaders"
:
0
};
window
.
addEventListener
(
"load"
,
enigMessengerStartup
,
false
);
window
.
addEventListener
(
"unload"
,
enigMessengerFinish
,
false
);
function
enigMessengerStartup
()
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: Startup\n"
);
enigUpdateOptionsDisplay
();
// Override SMIME ui
var
smimeStatusElement
=
document
.
getElementById
(
"cmd_viewSecurityStatus"
);
if
(
smimeStatusElement
)
{
smimeStatusElement
.
setAttribute
(
"oncommand"
,
"enigViewSecurityInfo();"
);
}
// Override print command
var
printElementIds
=
[
"cmd_print"
,
"key_print"
,
"button-print"
,
"threadPaneContext-print"
,
"messagePaneContext-print"
];
EnigOverrideAttribute
(
printElementIds
,
"oncommand"
,
"enigMsgPrint('"
,
"');"
);
// Override forward command
var
forwardCmdElementIds
=
[
"cmd_forward"
,
"cmd_forwardInline"
,
"cmd_forwardAttachment"
,
"key_forward"
];
EnigOverrideAttribute
(
forwardCmdElementIds
,
"oncommand"
,
"enigMsgForward('"
,
"', null);"
);
var
forwardEventElementIds
=
[
"button-forward"
,
"threadPaneContext-forward"
,
"threadPaneContext-forwardAsAttachment"
,
"messagePaneContext-forward"
];
EnigOverrideAttribute
(
forwardEventElementIds
,
"oncommand"
,
"enigMsgForward('"
,
"', event);"
);
// Override message headers view
var
element
=
document
.
getElementById
(
"viewallheaders"
);
if
(
element
)
{
var
parentElement
=
element
.
parentNode
;
if
(
parentElement
)
{
parentElement
.
setAttribute
(
"onpopupshowing"
,
"enigInitViewHeadersMenu();"
);
}
}
var
viewElementIds
=
[
"viewallheaders"
,
"viewnormalheaders"
,
"viewbriefheaders"
];
EnigOverrideAttribute
(
viewElementIds
,
"oncommand"
,
"enigMsgViewHeaders('"
,
"');"
);
EnigShowHeadersAll
(
true
);
gEnigSavedHeaders
=
null
;
// Commented out; clean-up now handled by HdrView and Unload
//var tree = GetThreadTree();
//tree.addEventListener("click", enigThreadPaneOnClick, true);
}
function
enigMessengerFinish
()
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: Finish\n"
);
}
function
enigViewSecurityInfo
()
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigViewSecurityInfo\n"
);
if
(
gEnigSecurityInfo
)
{
// Display OpenPGP security info
var
keyserver
=
EnigGetPref
(
"keyserver"
);
if
(
keyserver
&&
gEnigSecurityInfo
.
keyId
&&
(
gEnigSecurityInfo
.
statusFlags
&
nsIEnigmail
.
RECEIVED_PGP_MIME
)
&&
(
gEnigSecurityInfo
.
statusFlags
&
nsIEnigmail
.
UNVERIFIED_SIGNATURE
)
)
{
var
pubKeyId
=
"0x"
+
gEnigSecurityInfo
.
keyId
.
substr
(
8
,
8
);
var
mesg
=
"Click OK button to import public key "
+
pubKeyId
+
" from keyserver.\n\n"
+
gEnigSecurityInfo
.
statusInfo
;
if
(
EnigConfirm
(
mesg
))
{
var
recvErrorMsgObj
=
new
Object
();
var
recvFlags
=
nsIEnigmail
.
UI_INTERACTIVE
;
var
enigmailSvc
=
GetEnigmailSvc
();
var
exitStatus
=
enigmailSvc
.
receiveKey
(
window
,
recvFlags
,
pubKeyId
,
recvErrorMsgObj
);
if
(
exitStatus
==
0
)
enigMessageReload
(
false
);
}
}
else
{
EnigAlert
(
"OpenPGP Security Info\n\n"
+
gEnigSecurityInfo
.
statusInfo
);
}
}
else
{
// Display SMIME security info
showMessageReadSecurityInfo
();
}
}
function
enigInitViewHeadersMenu
()
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigInitViewHeadersMenu\n"
);
var
id
;
var
pref
=
1
;
if
(
EnigGetPref
(
"parseAllHeaders"
))
{
pref
=
EnigGetPref
(
"show_headers"
);
}
else
try
{
pref
=
gEnigPrefRoot
.
getIntPref
(
"mail.show_headers"
);
}
catch
(
ex
)
{}
switch
(
pref
)
{
case
2
:
id
=
"viewallheaders"
;
break
;
case
1
:
default
:
id
=
"viewnormalheaders"
;
break
;
}
var
menuitem
=
document
.
getElementById
(
id
);
if
(
menuitem
)
menuitem
.
setAttribute
(
"checked"
,
"true"
);
}
function
enigMsgViewHeaders
(
elementId
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMsgViewHeaders:"
+
elementId
+
"\n"
);
var
value
=
gShowHeadersObj
[
elementId
];
if
(
!
value
)
value
=
0
;
EnigSetPref
(
"show_headers"
,
value
);
if
(
!
EnigGetPref
(
"parseAllHeaders"
))
{
gEnigPrefRoot
.
setIntPref
(
"mail.show_headers"
,
value
);
}
enigMessageReload
(
false
);
return
true
;
}
function
enigMessageReload
(
noShowReload
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: MessageReload: "
+
noShowReload
+
"\n"
);
gEnigNoShowReload
=
noShowReload
;
if
(
noShowReload
)
{
EnigShowHeadersAll
(
false
);
}
MsgReload
();
}
function
enigMessageUnload
()
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: MessageUnload\n"
);
var
enigmailBox
=
document
.
getElementById
(
"expandedEnigmailBox"
);
if
(
enigmailBox
&&
!
enigmailBox
.
collapsed
)
{
enigmailBox
.
setAttribute
(
"collapsed"
,
"true"
);
var
statusText
=
document
.
getElementById
(
"expandedEnigmailStatusText"
);
if
(
statusText
)
statusText
.
setAttribute
(
"value"
,
""
);
}
if
(
gEnigCreatedURIs
.
length
)
{
// Cleanup messages belonging to this window (just in case)
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
enigmailSvc
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: Unload: Deleting messages\n"
);
for
(
var
index
=
0
;
index
<
gEnigCreatedURIs
.
length
;
index
++
)
{
enigmailSvc
.
deleteMessageURI
(
gEnigCreatedURIs
[
index
]);
}
gEnigCreatedURIs
=
[];
}
}
gEnigDecryptedMessage
=
null
;
gEnigSecurityInfo
=
null
;
if
(
gEnigNoShowReload
)
{
EnigShowHeadersAll
(
false
);
gEnigNoShowReload
=
false
;
}
else
{
EnigShowHeadersAll
(
true
);
gEnigSavedHeaders
=
null
;
}
}
function
enigMimeInit
()
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: *****enigMimeInit\n"
);
try
{
const
ENIG_ENIGCONTENTHANDLER_CID
=
Components
.
ID
(
"{847b3a51-7ab1-11d4-8f02-006008948af5}"
);
const
ENIG_ENIGENCRYPTEDHANDLER_CONTRACTID
=
"@mozilla.org/mimecth;1?type=multipart/encrypted"
;
var
compMgr
=
Components
.
manager
.
QueryInterface
(
Components
.
interfaces
.
nsIComponentRegistrar
);
var
enigContentHandlerCID
=
compMgr
.
contractIDToCID
(
ENIG_ENIGENCRYPTEDHANDLER_CONTRACTID
);
var
handlePGPMime
=
(
enigContentHandlerCID
.
toString
()
==
ENIG_ENIGCONTENTHANDLER_CID
);
DEBUG_LOG
(
"enigmailMessengerOverlay.js: *****enigMimeInit: handlePGPMime="
+
handlePGPMime
+
"\n"
);
}
catch
(
ex
)
{}
if
(
gEnigMessagePane
)
{
gEnigMessagePane
.
removeEventListener
(
"load"
,
enigMimeInit
,
true
);
gEnigMessagePane
=
null
;
}
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
if
(
enigmailSvc
.
mimeInitialized
())
{
// Reload message ONLY if enigMimeService has been initialized;
// enigMimeInit is only called if enigMimeService was not initialized;
// this prevents looping.
DEBUG_LOG
(
"enigmailMessengerOverlay.js: *****enigMimeInit: RELOADING MESSAGE\n"
);
enigMessageReload
(
false
);
}
else
{
// Error in MIME initialization; forget saved headers (to avoid looping)
gEnigSavedHeaders
=
null
;
ERROR_LOG
(
"enigmailMessengerOverlay.js: *****enigMimeInit: Error in MIME initialization\n"
);
}
}
function
enigMessageFrameLoad
()
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMessageFrameLoad\n"
);
}
function
enigMessageFrameUnload
()
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMessageFrameUnload\n"
);
}
function
enigThreadPaneOnClick
()
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigThreadPaneOnClick\n"
);
}
function
enigGetCurrentMsgUriSpec
()
{
try
{
if
(
GetNumSelectedMessages
()
!=
1
)
return
""
;
var
uriSpec
=
GetFirstSelectedMessage
();
//DEBUG_LOG("enigmailMessengerOverlay.js: enigGetCurrentMsgUrl: uriSpec="+uriSpec+"\n");
return
uriSpec
;
}
catch
(
ex
)
{
return
""
;
}
}
function
enigGetCurrentMsgUrl
()
{
try
{
var
uriSpec
=
enigGetCurrentMsgUriSpec
();
if
(
!
uriSpec
)
return
null
;
var
msgService
=
messenger
.
messageServiceFromURI
(
uriSpec
);
var
urlObj
=
new
Object
();
msgService
.
GetUrlForUri
(
uriSpec
,
urlObj
,
msgWindow
);
var
url
=
urlObj
.
value
;
var
mailNewsUrl
=
url
.
QueryInterface
(
Components
.
interfaces
.
nsIMsgMailNewsUrl
);
//DEBUG_LOG("enigmailMessengerOverlay.js: enigGetCurrentMsgUrl: mailNewsUrl.spec="+mailNewsUrl.spec+"\n");
return
mailNewsUrl
;
}
catch
(
ex
)
{
return
null
;
}
}
function
enigUpdateOptionsDisplay
()
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigUpdateOptionsDisplay: \n"
);
var
optList
=
[
"autoDecrypt"
];
for
(
var
j
=
0
;
j
<
optList
.
length
;
j
++
)
{
var
menuElement
=
document
.
getElementById
(
"enigmail_"
+
optList
[
j
]);
menuElement
.
setAttribute
(
"checked"
,
EnigGetPref
(
optList
[
j
])
?
"true"
:
"false"
);
}
}
function
enigToggleAttribute
(
attrName
)
{
DEBUG_LOG
(
"enigmailMsgessengerOverlay.js: enigToggleAttribute('"
+
attrName
+
"')\n"
);
var
menuElement
=
document
.
getElementById
(
"enigmail_"
+
attrName
);
var
oldValue
=
EnigGetPref
(
attrName
);
EnigSetPref
(
attrName
,
!
oldValue
);
enigUpdateOptionsDisplay
();
if
(
attrName
==
"autoDecrypt"
)
enigMessageReload
(
false
);
}
function
enigMessageImport
(
event
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMessageImport: "
+
event
+
"\n"
);
return
enigMessageParse
(
!
event
,
true
);
}
function
enigMessageDecrypt
(
event
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMessageDecrypt: "
+
event
+
"\n"
);
if
(
EnigGetPref
(
"parseAllHeaders"
))
{
var
showHeaders
=
1
;
try
{
showHeaders
=
gEnigPrefRoot
.
getIntPref
(
"mail.show_headers"
);
}
catch
(
ex
)
{
}
DEBUG_LOG
(
"enigmailMessengerOverlay.js: mail.show_headers="
+
showHeaders
+
"\n"
);
if
(
showHeaders
==
2
)
{
// Copy selected headers
gEnigSavedHeaders
=
{};
for
(
var
index
=
0
;
index
<
gEnigHeadersList
.
length
;
index
++
)
{
var
headerName
=
gEnigHeadersList
[
index
];
var
headerValue
=
""
;
if
(
currentHeaderData
[
headerName
])
{
headerValue
=
currentHeaderData
[
headerName
].
headerValue
;
}
gEnigSavedHeaders
[
headerName
]
=
headerValue
;
DEBUG_LOG
(
"enigmailMessengerOverlay.js: "
+
headerName
+
": "
+
headerValue
+
"\n"
);
}
var
emailAttachment
=
false
;
for
(
var
indexb
in
currentAttachments
)
{
var
attachment
=
currentAttachments
[
indexb
];
if
(
attachment
.
contentType
.
search
(
/^message\/rfc822(;|$)/i
)
==
0
)
{
emailAttachment
=
true
;
}
DEBUG_LOG
(
"enigmailMessengerOverlay.js: "
+
indexb
+
": "
+
attachment
.
contentType
+
"\n"
);
//DEBUG_LOG("enigmailMessengerOverlay.js: "+indexb+": "+attachment.url+"\n");
}
if
(
emailAttachment
&&
(
EnigGetPref
(
"show_headers"
)
!=
2
))
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: Email attachment; reloading to hide headers\n"
);
enigMessageReload
(
true
);
return
;
}
}
else
if
(
!
gEnigSavedHeaders
)
{
ERROR_LOG
(
"enigmailMessengerOverlay.js: enigMessageDecrypt: ERROR mail.show_headers="
+
showHeaders
+
" while parseAllHeaders is true\n"
);
}
}
EnigShowHeadersAll
(
false
);
var
contentType
=
""
;
var
xEnigmailVersion
=
""
;
if
(
gEnigSavedHeaders
)
{
contentType
=
gEnigSavedHeaders
[
"content-type"
];
xEnigmailVersion
=
gEnigSavedHeaders
[
"x-enigmail-version"
];
}
if
(
contentType
.
search
(
/^multipart\/encrypted(;|$)/i
)
==
0
)
{
// multipart/encrypted
DEBUG_LOG
(
"enigmailMessengerOverlay.js: multipart/encrypted\n"
);
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
if
(
!
enigmailSvc
.
mimeInitialized
())
{
// Display enigmail:dummy URL in message pane to initialize
gEnigMessagePane
=
document
.
getElementById
(
"messagepane"
);
// Need to add event listener to gEnigMessagePane to make it work
// Adding to msgFrame doesn't seem to work
gEnigMessagePane
.
addEventListener
(
"load"
,
enigMimeInit
,
true
);
//gEnigMessagePane.addEventListener("unload", enigMessageFrameUnload, true);
DEBUG_LOG
(
"enigmailMessengerOverlay.js: loading enigmail:dummy ...\n"
);
gEnigNoShowReload
=
true
;
var
msgFrame
=
window
.
frames
[
"messagepane"
];
msgFrame
.
location
=
"enigmail:dummy"
;
return
;
}
}
if
(
(
contentType
.
search
(
/^multipart\/signed(;|$)/i
)
==
0
)
&&
(
contentType
.
search
(
/application\/pgp-signature/i
)
>=
0
)
)
{
// multipart/signed
DEBUG_LOG
(
"enigmailMessengerOverlay.js: multipart/signed\n"
);
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
msgUriSpec
=
enigGetCurrentMsgUriSpec
();
var
mailNewsUrl
=
enigGetCurrentMsgUrl
();
if
(
mailNewsUrl
)
{
dump
(
"mailNewsUrl.spec="
+
mailNewsUrl
.
spec
+
"\n"
);
const
ENIG_ENIGMIMEVERIFY_CONTRACTID
=
"@mozilla.org/enigmail/mime-verify;1"
;
var
verifier
=
Components
.
classes
[
ENIG_ENIGMIMEVERIFY_CONTRACTID
].
createInstance
(
Components
.
interfaces
.
nsIEnigMimeVerify
);
dump
(
"verifier="
+
verifier
+
"\n"
);
verifier
.
init
(
mailNewsUrl
,
msgWindow
,
msgUriSpec
,
true
);
return
;
}
}
return
enigMessageParse
(
!
event
,
false
);
}
function
enigMessageParse
(
interactive
,
importOnly
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMessageParse: "
+
interactive
+
"\n"
);
var
msgFrame
=
window
.
frames
[
"messagepane"
];
DEBUG_LOG
(
"enigmailMessengerOverlay.js: msgFrame="
+
msgFrame
+
"\n"
);
///EnigDumpHTML(msgFrame.document.documentElement);
var
bodyElement
=
msgFrame
.
document
.
getElementsByTagName
(
"body"
)[
0
];
DEBUG_LOG
(
"enigmailMessengerOverlay.js: bodyElement="
+
bodyElement
+
"\n"
);
var
findStr
=
interactive
?
""
:
"-----BEGIN PGP"
;
var
msgText
=
EnigGetDeepText
(
bodyElement
,
findStr
);
if
(
!
msgText
)
{
// No PGP content
return
;
}
var
charset
=
msgWindow
?
msgWindow
.
mailCharacterSet
:
""
;
// Encode ciphertext to charset from unicode
msgText
=
EnigConvertFromUnicode
(
msgText
,
charset
);
//DEBUG_LOG("enigmailMessengerOverlay.js: msgText='"+msgText+"'\n");
var
mailNewsUrl
=
enigGetCurrentMsgUrl
();
var
urlSpec
=
mailNewsUrl
?
mailNewsUrl
.
spec
:
""
;
enigMessageParseCallback
(
msgText
,
charset
,
interactive
,
importOnly
,
urlSpec
,
""
,
true
);
}
function
enigMessageParseCallback
(
msgText
,
charset
,
interactive
,
importOnly
,
messageUrl
,
signature
,
retry
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMessageParseCallback: "
+
interactive
+
", "
+
interactive
+
", importOnly="
+
importOnly
+
", charset="
+
charset
+
", msgUrl="
+
messageUrl
+
", retry="
+
retry
+
", signature='"
+
signature
+
"'\n"
);
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
;
var
plainText
;
var
exitCode
;
var
newSignature
=
""
;
var
statusFlags
=
0
;
var
errorMsgObj
=
new
Object
();
var
keyIdObj
=
new
Object
();
if
(
importOnly
)
{
// Import public key
var
importFlags
=
nsIEnigmail
.
UI_INTERACTIVE
;
exitCode
=
enigmailSvc
.
importKey
(
window
,
importFlags
,
msgText
,
""
,
errorMsgObj
);
}
else
{
var
exitCodeObj
=
new
Object
();
var
statusFlagsObj
=
new
Object
();
var
userIdObj
=
new
Object
();
var
signatureObj
=
new
Object
();
signatureObj
.
value
=
signature
;
var
uiFlags
=
interactive
?
(
nsIEnigmail
.
UI_INTERACTIVE
|
nsIEnigmail
.
UI_ALLOW_KEY_IMPORT
|
nsIEnigmail
.
UI_UNVERIFIED_ENC_OK
)
:
0
;
plainText
=
enigmailSvc
.
decryptMessage
(
window
,
uiFlags
,
msgText
,
signatureObj
,
exitCodeObj
,
statusFlagsObj
,
keyIdObj
,
userIdObj
,
errorMsgObj
);
//DEBUG_LOG("enigmailMessengerOverlay.js: enigMessageParseCallback: plainText='"+plainText+"'\n");
exitCode
=
exitCodeObj
.
value
;
newSignature
=
signatureObj
.
value
;
statusFlags
=
statusFlagsObj
.
value
;
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMessageParseCallback: newSignature='"
+
newSignature
+
"'\n"
);
// Decode plaintext to unicode
plainText
=
EnigConvertToUnicode
(
plainText
,
charset
);
}
var
errorMsg
=
errorMsgObj
.
value
;
if
(
importOnly
)
{
if
(
interactive
&&
errorMsg
)
EnigAlert
(
errorMsg
);
return
;
}
enigUpdateHdrIcons
(
statusFlags
,
keyIdObj
.
value
,
userIdObj
.
value
,
errorMsg
,
""
);
if
(
statusFlags
&
(
nsIEnigmail
.
BAD_SIGNATURE
|
nsIEnigmail
.
BAD_ARMOR
))
{
// Bad signature/armor
if
(
retry
)
{
// Try to verify signature by accessing raw message text directly
// (avoid recursion by setting retry parameter to false on callback)
enigMsgDirect
(
interactive
,
importOnly
,
charset
,
newSignature
);
return
;
}
}
if
(
!
plainText
)
{
if
(
interactive
&&
gEnigSecurityInfo
&&
gEnigSecurityInfo
.
statusInfo
)
EnigAlert
(
gEnigSecurityInfo
.
statusInfo
);
return
;
}
var
hasAttachments
=
currentAttachments
&&
currentAttachments
.
length
;
var
msgFrame
=
window
.
frames
[
"messagepane"
];
var
bodyElement
=
msgFrame
.
document
.
getElementsByTagName
(
"body"
)[
0
];
try
{
// Display plain text with hyperlinks
// Get selection range for inserting HTML
var
domSelection
=
msgFrame
.
_content
.
getSelection
();
var
privateSelection
=
domSelection
.
QueryInterface
(
Components
.
interfaces
.
nsISelectionPrivate
);
var
selection
=
privateSelection
.
QueryInterface
(
Components
.
interfaces
.
nsISelection
);
selection
.
collapse
(
bodyElement
,
0
);
var
selRange
=
selection
.
getRangeAt
(
0
);
var
htmlText
=
"<pre>"
+
enigEscapeTextForHTML
(
plainText
,
true
)
+
"</pre>"
;
var
docFrag
=
selRange
.
createContextualFragment
(
htmlText
);
// Clear HTML body
while
(
bodyElement
.
hasChildNodes
())
bodyElement
.
removeChild
(
bodyElement
.
childNodes
[
0
]);
if
(
hasAttachments
)
{
var
newTextNode
=
msgFrame
.
document
.
createTextNode
(
"Note from Enigmail: Attachments to this message have not been signed or encrypted."
);
var
newEmElement
=
msgFrame
.
document
.
createElement
(
"em"
);
newEmElement
.
appendChild
(
newTextNode
);
bodyElement
.
appendChild
(
newEmElement
);
bodyElement
.
appendChild
(
msgFrame
.
document
.
createElement
(
"p"
));
}
bodyElement
.
appendChild
(
docFrag
.
firstChild
);
}
catch
(
ex
)
{
// Display raw text
// Clear HTML body
while
(
bodyElement
.
hasChildNodes
())
bodyElement
.
removeChild
(
bodyElement
.
childNodes
[
0
]);
var
nodeText
=
plainText
;
if
(
hasAttachments
)
{
nodeText
=
"Note from Enigmail: Attachments to this message have not been signed or encrypted.\n\n"
+
nodeText
;
}
var
newPlainTextNode
=
msgFrame
.
document
.
createTextNode
(
nodeText
);
var
newPreElement
=
msgFrame
.
document
.
createElement
(
"pre"
);
newPreElement
.
appendChild
(
newPlainTextNode
);
var
newDivElement
=
msgFrame
.
document
.
createElement
(
"div"
);
newDivElement
.
appendChild
(
newPreElement
);
bodyElement
.
appendChild
(
newDivElement
);
}
// Save decrypted message status, headers, and content
var
headerList
=
{
"subject"
:
""
,
"from"
:
""
,
"date"
:
""
,
"to"
:
""
,
"cc"
:
""
};
var
index
,
headerName
;
if
(
!
gViewAllHeaders
)
{
for
(
index
=
0
;
index
<
gCollapsedHeaderList
.
length
;
index
++
)
{
headerList
[
gCollapsedHeaderList
[
index
].
name
]
=
""
;
}
}
else
{
for
(
index
=
0
;
index
<
gExpandedHeaderList
.
length
;
index
++
)
{
headerList
[
gExpandedHeaderList
[
index
].
name
]
=
""
;
}
for
(
headerName
in
currentHeaderData
)
{
headerList
[
headerName
]
=
""
;
}
}
for
(
headerName
in
headerList
)
{
if
(
currentHeaderData
[
headerName
])
headerList
[
headerName
]
=
currentHeaderData
[
headerName
].
headerValue
;
}
// WORKAROUND
if
(
headerList
[
"cc"
]
==
headerList
[
"to"
])
headerList
[
"cc"
]
=
""
;
gEnigDecryptedMessage
=
{
url
:
messageUrl
,
headerList
:
headerList
,
charset
:
charset
,
hasAttachments
:
hasAttachments
,
plainText
:
plainText
};
return
;
}
function
enigEscapeTextForHTML
(
text
,
hyperlink
)
{
// Escape special characters
if
(
text
.
indexOf
(
"&"
)
>
-
1
)
text
=
text
.
replace
(
/&/g
,
"&"
)
if
(
text
.
indexOf
(
"<"
)
>
-
1
)
text
=
text
.
replace
(
/</g
,
"<"
)
if
(
text
.
indexOf
(
">"
)
>
-
1
)
text
=
text
.
replace
(
/>/g
,
">"
)
if
(
text
.
indexOf
(
"\""
)
>
-
1
)
text
=
text
.
replace
(
/"/g
,
"""
)
if
(
!
hyperlink
)
return
text
;
// Hyperlink email addresses
var
addrs
=
text
.
match
(
/\b[A-Za-z0-9_+\-\.]+@[A-Za-z0-9\-\.]+\b/g
);
var
newText
,
offset
,
loc
;
if
(
addrs
&&
addrs
.
length
)
{
newText
=
""
;
offset
=
0
;
for
(
var
j
=
0
;
j
<
addrs
.
length
;
j
++
)
{
var
addr
=
addrs
[
j
];
loc
=
text
.
indexOf
(
addr
,
offset
);
if
(
loc
<
offset
)
break
;
if
(
loc
>
offset
)
newText
+=
text
.
substr
(
offset
,
loc
-
offset
);
// Strip any period off the end of address
addr
=
addr
.
replace
(
/[\.]$/
,
""
);
if
(
!
addr
.
length
)
continue
;
newText
+=
"<a href=\"mailto:"
+
addr
+
"\">"
+
addr
+
"</a>"
;
offset
=
loc
+
addr
.
length
;
}
newText
+=
text
.
substr
(
offset
,
text
.
length
-
offset
);
text
=
newText
;
}
// Hyperlink URLs
var
urls
=
text
.
match
(
/\b(http|https|ftp):\S+\s/g
);
if
(
urls
&&
urls
.
length
)
{
newText
=
""
;
offset
=
0
;
for
(
var
k
=
0
;
k
<
urls
.
length
;
k
++
)
{
var
url
=
urls
[
k
];
loc
=
text
.
indexOf
(
url
,
offset
);
if
(
loc
<
offset
)
break
;
if
(
loc
>
offset
)
newText
+=
text
.
substr
(
offset
,
loc
-
offset
);
// Strip delimiters off the end of URL
url
=
url
.
replace
(
/\s$/
,
""
);
url
=
url
.
replace
(
/([\),\.']|>|")$/
,
""
);
if
(
!
url
.
length
)
continue
;
newText
+=
"<a href=\""
+
url
+
"\">"
+
url
+
"</a>"
;
offset
=
loc
+
url
.
length
;
}
newText
+=
text
.
substr
(
offset
,
text
.
length
-
offset
);
text
=
newText
;
}
return
text
;
}
function
enigGetDecryptedMessage
(
contentType
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigGetDecryptedMessage: "
+
contentType
+
"\n"
);
if
(
!
gEnigDecryptedMessage
)
return
"No decrypted message found!\n"
;
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
return
""
;
var
headerList
=
gEnigDecryptedMessage
.
headerList
;
var
statusLine
=
gEnigSecurityInfo
?
gEnigSecurityInfo
.
statusLine
:
""
;
var
contentData
=
""
;
if
(
contentType
==
"text/html"
)
contentData
+=
"<html><head></head><body>\r\n"
;
if
(
statusLine
)
{
if
(
contentType
==
"text/html"
)
{
contentData
+=
"<b>Enigmail:</b> "
+
enigEscapeTextForHTML
(
statusLine
,
false
)
+
"<br>\r\n<hr>\r\n"
;
}
else
{
contentData
+=
"Enigmail: "
+
statusLine
+
"\r\n\r\n"
;
}
}
for
(
var
headerName
in
headerList
)
{
var
headerValue
=
headerList
[
headerName
];
if
(
headerValue
)
{
if
(
contentType
==
"text/html"
)
{
contentData
+=
"<b>"
+
enigEscapeTextForHTML
(
headerName
,
false
)
+
":</b> "
+
enigEscapeTextForHTML
(
headerValue
,
false
)
+
"<br>\r\n"
;
}
else
{
contentData
+=
headerName
+
": "
+
headerValue
+
"\r\n"
;
}
}
}
if
(
contentType
==
"text/html"
)
{
contentData
+=
"<pre>"
+
enigEscapeTextForHTML
(
gEnigDecryptedMessage
.
plainText
,
false
)
+
"</pre>\r\n"
;
}
else
{
contentData
+=
"\r\n"
+
gEnigDecryptedMessage
.
plainText
;
}
if
(
contentType
==
"text/html"
)
contentData
+=
"</body></html>\r\n"
;
if
(
!
(
enigmailSvc
.
isWin32
))
{
contentData
=
contentData
.
replace
(
/\r\n/g
,
"\n"
);
}
return
contentData
;
}
function
enigMsgDefaultPrint
(
contextMenu
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMsgDefaultPrint: "
+
contextMenu
+
"\n"
);
// Reset mail.show_headers pref to "original" value
EnigShowHeadersAll
(
false
);
if
(
contextMenu
)
PrintEnginePrint
();
else
goDoCommand
(
'cmd_print'
);
}
function
enigMsgForward
(
elementId
,
event
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMsgForward: "
+
elementId
+
", "
+
event
+
"\n"
);
// Reset mail.show_headers pref to "original" value
EnigShowHeadersAll
(
false
);
if
((
elementId
==
"cmd_forwardAttachment"
)
||
(
elementId
==
"threadPaneContext-forwardAsAttachment"
))
{
MsgForwardAsAttachment
(
event
);
}
else
if
(
elementId
==
"cmd_forwardInline"
)
{
MsgForwardAsInline
(
event
);
}
else
{
MsgForwardMessage
(
event
);
}
}
function
enigMsgPrint
(
elementId
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMsgPrint: "
+
elementId
+
"\n"
);
var
contextMenu
=
(
elementId
.
search
(
"Context"
)
>
-
1
);
if
(
!
gEnigDecryptedMessage
)
enigMsgDefaultPrint
(
contextMenu
);
var
mailNewsUrl
=
enigGetCurrentMsgUrl
();
if
(
!
mailNewsUrl
)
enigMsgDefaultPrint
(
contextMenu
);
if
(
gEnigDecryptedMessage
.
url
!=
mailNewsUrl
.
spec
)
{
gEnigDecryptedMessage
=
null
;
enigMsgDefaultPrint
(
contextMenu
);
}
var
enigmailSvc
=
GetEnigmailSvc
();
if
(
!
enigmailSvc
)
enigMsgDefaultPrint
(
contextMenu
);
var
htmlContent
=
enigGetDecryptedMessage
(
"text/html"
);
var
uri
=
enigmailSvc
.
createMessageURI
(
gEnigDecryptedMessage
.
url
,
"text/html"
,
gEnigDecryptedMessage
.
charset
,
htmlContent
,
false
);
gEnigCreatedURIs
.
push
(
uri
);
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMsgPrint: uri="
+
uri
+
"\n"
);
var
messageList
=
[
uri
];
var
numMessages
=
messageList
.
length
;
if
(
gPrintSettings
==
null
)
{
gPrintSettings
=
GetPrintSettings
();
}
var
printEngineWindow
=
window
.
openDialog
(
"chrome://messenger/content/msgPrintEngine.xul"
,
""
,
"chrome,dialog=no,all"
,
numMessages
,
messageList
,
statusFeedback
,
gPrintSettings
);
return
true
;
}
function
enigMessageSave
()
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMessageSave: \n"
);
if
(
!
gEnigDecryptedMessage
)
{
EnigAlert
(
"No decrypted message to save!\nUse Save command from File menu"
);
return
;
}
var
mailNewsUrl
=
enigGetCurrentMsgUrl
();
if
(
!
mailNewsUrl
)
{
EnigAlert
(
"No message to save!"
);
return
;
}
if
(
gEnigDecryptedMessage
.
url
!=
mailNewsUrl
.
spec
)
{
gEnigDecryptedMessage
=
null
;
EnigAlert
(
"Please click Decypt button to decrypt message"
);
return
;
}
var
saveFile
=
EnigFilePicker
(
"Enigmail: Save decrypted message"
,
gEnigLastSaveDir
,
true
,
"txt"
,
[
"Text files"
,
"*.txt"
]);
if
(
!
saveFile
)
return
;
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMessageSave: path="
+
saveFile
.
path
+
"\n"
);
if
(
saveFile
.
parent
)
gEnigLastSaveDir
=
saveFile
.
parent
.
path
;
var
textContent
=
enigGetDecryptedMessage
(
"text/plain"
);
if
(
!
EnigWriteFileContents
(
saveFile
.
path
,
textContent
,
null
))
{
EnigAlert
(
"Error in saving to file "
+
saveFile
.
path
);
return
;
}
return
;
}
function
EnigFilePicker
(
title
,
displayDir
,
save
,
defaultExtension
,
filterPairs
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: EnigFilePicker: "
+
save
+
"\n"
);
const
nsIFilePicker
=
Components
.
interfaces
.
nsIFilePicker
;
var
filePicker
=
Components
.
classes
[
"@mozilla.org/filepicker;1"
].
createInstance
();
filePicker
=
filePicker
.
QueryInterface
(
nsIFilePicker
);
var
mode
=
save
?
nsIFilePicker
.
modeSave
:
nsIFilePicker
.
modeOpen
;
filePicker
.
init
(
window
,
title
,
mode
);
if
(
displayDir
)
{
var
localFile
=
Components
.
classes
[
ENIG_LOCAL_FILE_CONTRACTID
].
createInstance
(
Components
.
interfaces
.
nsILocalFile
);
try
{
localFile
.
initWithPath
(
displayDir
);
filePicker
.
displayDirectory
=
localFile
;
}
catch
(
ex
)
{
}
}
if
(
defaultExtension
)
filePicker
.
defaultExtension
=
defaultExtension
;
var
nfilters
=
0
;
if
(
filterPairs
&&
filterPairs
.
length
)
nfilters
=
filterPairs
.
length
/
2
;
for
(
var
index
=
0
;
index
<
nfilters
;
index
++
)
{
filePicker
.
appendFilter
(
filterPairs
[
2
*
index
],
filterPairs
[
2
*
index
+
1
]);
}
filePicker
.
appendFilters
(
nsIFilePicker
.
filterAll
);
if
(
filePicker
.
show
()
==
nsIFilePicker
.
returnCancel
)
return
null
;
var
file
=
filePicker
.
file
.
QueryInterface
(
Components
.
interfaces
.
nsILocalFile
);
return
file
;
}
function
enigMsgDirect
(
interactive
,
importOnly
,
charset
,
signature
)
{
WRITE_LOG
(
"enigmailMessengerOverlay.js: enigMsgDirect: signature="
+
signature
+
"\n"
);
var
mailNewsUrl
=
enigGetCurrentMsgUrl
();
if
(
!
mailNewsUrl
)
return
;
var
ipcBuffer
=
Components
.
classes
[
ENIG_IPCBUFFER_CONTRACTID
].
createInstance
(
Components
.
interfaces
.
nsIIPCBuffer
);
var
callbackArg
=
{
interactive
:
interactive
,
importOnly
:
importOnly
,
charset
:
charset
,
messageUrl
:
mailNewsUrl
.
spec
,
signature
:
signature
,
ipcBuffer
:
ipcBuffer
};
var
requestObserver
=
new
EnigRequestObserver
(
enigMsgDirectCallback
,
callbackArg
);
ipcBuffer
.
openURI
(
mailNewsUrl
,
ENIG_MSG_BUFFER_SIZE
,
false
,
requestObserver
,
mailNewsUrl
);
}
function
enigMsgDirectCallback
(
callbackArg
,
ctxt
)
{
DEBUG_LOG
(
"enigmailMessengerOverlay.js: enigMsgDirectCallback: "
+
ctxt
+
"\n"
);
var
mailNewsUrl
=
enigGetCurrentMsgUrl
();
var
urlSpec
=
mailNewsUrl
?
mailNewsUrl
.
spec
:
""
;
if
(
urlSpec
!=
callbackArg
.
messageUrl
)
{
ERROR_LOG
(
"enigmailMessengerOverlay.js: enigMsgDirectCallback: Message URL mismatch "
+
mailNewsUrl
.
spec
+
" vs. "
+
callbackArg
.
messageUrl
+
"\n"
);
return
;
}
if
(
callbackArg
.
ipcBuffer
.
overflowed
)
{
WARNING_LOG
(
"enigmailMessengerOverlay.js: enigMsgDirectCallback: MESSAGE BUFFER OVERFLOW\n"
);
}
var
msgText
=
callbackArg
.
ipcBuffer
.
getData
();
callbackArg
.
ipcBuffer
.
shutdown
();
//DEBUG_LOG("enigmailMessengerOverlay.js: enigMsgDirectCallback: msgText='"+msgText+"'\n");
enigMessageParseCallback
(
msgText
,
callbackArg
.
charset
,
callbackArg
.
interactive
,
callbackArg
.
importOnly
,
callbackArg
.
messageUrl
,
callbackArg
.
signature
,
false
);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Feb 1, 7:54 PM (12 h, 9 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
1f/e8/a559b92a32c776c3ee57ba7edd60
Attached To
rENIG Enigmail
Event Timeline
Log In to Comment