summaryrefslogtreecommitdiffstats
path: root/mailnews/mime
diff options
context:
space:
mode:
Diffstat (limited to 'mailnews/mime')
-rw-r--r--mailnews/mime/public/MimeHeaderParser.h5
-rw-r--r--mailnews/mime/public/nsIMsgHeaderParser.idl15
-rw-r--r--mailnews/mime/src/MimeHeaderParser.cpp18
-rw-r--r--mailnews/mime/src/mimeJSComponents.js17
4 files changed, 45 insertions, 10 deletions
diff --git a/mailnews/mime/public/MimeHeaderParser.h b/mailnews/mime/public/MimeHeaderParser.h
index fe9bf59d3..d8cd3705a 100644
--- a/mailnews/mime/public/MimeHeaderParser.h
+++ b/mailnews/mime/public/MimeHeaderParser.h
@@ -31,6 +31,11 @@ nsCOMArray<msgIAddressObject> DecodedHeader(const nsAString &aHeader);
nsCOMArray<msgIAddressObject> EncodedHeader(const nsACString &aHeader,
const char *aCharset = nullptr);
+/**
+ * Same deal, but we're starting with an nsAString.
+ */
+nsCOMArray<msgIAddressObject> EncodedHeaderW(const nsAString &aHeader);
+
namespace detail {
void DoConversion(const nsTArray<nsString> &aUTF16, nsTArray<nsCString> &aUTF8);
};
diff --git a/mailnews/mime/public/nsIMsgHeaderParser.idl b/mailnews/mime/public/nsIMsgHeaderParser.idl
index 2512623d8..fd582b64c 100644
--- a/mailnews/mime/public/nsIMsgHeaderParser.idl
+++ b/mailnews/mime/public/nsIMsgHeaderParser.idl
@@ -97,6 +97,18 @@ interface nsIMsgHeaderParser : nsISupports {
out msgIAddressObject addresses);
/**
+ * Parse an address-based header that has not yet been 2047-decoded and does not
+ * contain raw octets but instead wide (UTF-16) characters.
+ *
+ * @param aEncodedHeader The RFC 2047-encoded header to parse.
+ * @return An array corresponding to the header description.
+ */
+ void parseEncodedHeaderW(in AString aEncodedHeader,
+ [optional] out unsigned long length,
+ [retval, array, size_is(length)]
+ out msgIAddressObject addresses);
+
+/**
* Parse an address-based header that has been 2047-decoded.
*
* The result of this method is an array of objects described in the above
@@ -178,9 +190,6 @@ interface nsIMsgHeaderParser : nsISupports {
* "Bond, James <agent007@mi5.invalid>" would produce one address object,
* while the string "webmaster@nowhere.invalid, child@nowhere.invalid" would
* produce two address objects.
- *
- * Note that the input string is RFC 2231 and RFC 2047 decoded but no UTF-8
- * decoding takes place.
*/
void makeFromDisplayAddress(in AString aDisplayAddresses,
[optional] out unsigned long count,
diff --git a/mailnews/mime/src/MimeHeaderParser.cpp b/mailnews/mime/src/MimeHeaderParser.cpp
index 4fd7bc982..15341de46 100644
--- a/mailnews/mime/src/MimeHeaderParser.cpp
+++ b/mailnews/mime/src/MimeHeaderParser.cpp
@@ -107,6 +107,24 @@ nsCOMArray<msgIAddressObject> EncodedHeader(const nsACString &aHeader,
return retval;
}
+nsCOMArray<msgIAddressObject> EncodedHeaderW(const nsAString &aHeader)
+{
+ nsCOMArray<msgIAddressObject> retval;
+ if (aHeader.IsEmpty()) {
+ return retval;
+ }
+ nsCOMPtr<nsIMsgHeaderParser> headerParser(services::GetHeaderParser());
+ NS_ENSURE_TRUE(headerParser, retval);
+ msgIAddressObject **addresses = nullptr;
+ uint32_t length;
+ nsresult rv = headerParser->ParseEncodedHeaderW(aHeader, &length, &addresses);
+ MOZ_ASSERT(NS_SUCCEEDED(rv), "This should never fail!");
+ if (NS_SUCCEEDED(rv) && length > 0 && addresses) {
+ retval.Adopt(addresses, length);
+ }
+ return retval;
+}
+
void ExtractAllAddresses(const nsCOMArray<msgIAddressObject> &aHeader,
nsTArray<nsString> &names, nsTArray<nsString> &emails)
{
diff --git a/mailnews/mime/src/mimeJSComponents.js b/mailnews/mime/src/mimeJSComponents.js
index 5ba7ff084..8e9d0684a 100644
--- a/mailnews/mime/src/mimeJSComponents.js
+++ b/mailnews/mime/src/mimeJSComponents.js
@@ -269,6 +269,15 @@ MimeAddressParser.prototype = {
MimeParser.HEADER_ADDRESS | MimeParser.HEADER_OPTION_ALL_I18N, aCharset);
return fixArray(value, aPreserveGroups, count);
},
+ parseEncodedHeaderW: function (aHeader, count) {
+ aHeader = aHeader || "";
+ let value = MimeParser.parseHeaderField(aHeader,
+ MimeParser.HEADER_ADDRESS |
+ MimeParser.HEADER_OPTION_DECODE_2231 |
+ MimeParser.HEADER_OPTION_DECODE_2047,
+ undefined);
+ return fixArray(value, false, count);
+ },
parseDecodedHeader: function (aHeader, aPreserveGroups, count) {
aHeader = aHeader || "";
let value = MimeParser.parseHeaderField(aHeader, MimeParser.HEADER_ADDRESS);
@@ -390,13 +399,7 @@ MimeAddressParser.prototype = {
parseHeadersWithArray: function (aHeader, aAddrs, aNames, aFullNames) {
let addrs = [], names = [], fullNames = [];
- // Parse header, but without HEADER_OPTION_ALLOW_RAW.
- let value = MimeParser.parseHeaderField(aHeader || "",
- MimeParser.HEADER_ADDRESS |
- MimeParser.HEADER_OPTION_DECODE_2231 |
- MimeParser.HEADER_OPTION_DECODE_2047,
- undefined);
- let allAddresses = fixArray(value, false);
+ let allAddresses = this.parseEncodedHeader(aHeader, undefined, false);
// Don't index the dummy empty address.
if (aHeader.trim() == "")