I#1436 - Mail: Correct conversion of UTF-16 encoded text files

Closes https://gitlab.gnome.org/GNOME/evolution/-/issues/1436
This commit is contained in:
Milan Crha
2023-09-15 10:44:35 +02:00
parent c37968b146
commit 4f2121cdcf
2 changed files with 48 additions and 5 deletions

View File

@ -1222,7 +1222,7 @@ e_attachment_add_to_multipart (EAttachment *attachment,
stream = camel_stream_null_new ();
filtered_stream = camel_stream_filter_new (stream);
filter = camel_mime_filter_bestenc_new (
CAMEL_BESTENC_GET_ENCODING);
CAMEL_BESTENC_GET_ENCODING | CAMEL_BESTENC_GET_CHARSET);
camel_stream_filter_add (
CAMEL_STREAM_FILTER (filtered_stream),
CAMEL_MIME_FILTER (filter));
@ -1236,7 +1236,6 @@ e_attachment_add_to_multipart (EAttachment *attachment,
CAMEL_MIME_FILTER_BESTENC (filter),
CAMEL_BESTENC_8BIT);
camel_mime_part_set_encoding (mime_part, encoding);
g_object_unref (filter);
if (encoding == CAMEL_TRANSFER_ENCODING_7BIT) {
/* The text fits within us-ascii, so this is safe.
@ -1254,13 +1253,22 @@ e_attachment_add_to_multipart (EAttachment *attachment,
if (charset == NULL) {
gchar *type;
camel_content_type_set_param (
content_type, "charset", default_charset);
if (encoding != CAMEL_TRANSFER_ENCODING_7BIT) {
charset = camel_mime_filter_bestenc_get_best_charset (CAMEL_MIME_FILTER_BESTENC (filter));
if (charset)
camel_content_type_set_param (content_type, "charset", charset);
}
if (!charset)
camel_content_type_set_param (content_type, "charset", default_charset);
type = camel_content_type_format (content_type);
camel_mime_part_set_content_type (mime_part, type);
g_free (type);
}
g_object_unref (filter);
/* Otherwise, unless it's a message/rfc822, Base64 encode it. */
} else if (!CAMEL_IS_MIME_MESSAGE (wrapper))
camel_mime_part_set_encoding (

View File

@ -1061,6 +1061,35 @@ e_mail_formatter_format_as (EMailFormatter *formatter,
return ok;
}
static gboolean
emf_data_is_utf16 (CamelMimePart *part,
gboolean *out_be_variant)
{
CamelStream *filtered_stream;
CamelMimeFilter *filter;
CamelStream *stream;
const gchar *charset;
gboolean is_utf16;
g_return_val_if_fail (CAMEL_IS_MIME_PART (part), FALSE);
stream = camel_stream_null_new ();
filtered_stream = camel_stream_filter_new (stream);
filter = camel_mime_filter_bestenc_new (CAMEL_BESTENC_GET_CHARSET);
camel_stream_filter_add (CAMEL_STREAM_FILTER (filtered_stream), CAMEL_MIME_FILTER (filter));
camel_data_wrapper_decode_to_stream_sync (camel_medium_get_content (CAMEL_MEDIUM (part)), filtered_stream, NULL, NULL);
g_object_unref (filtered_stream);
g_object_unref (stream);
charset = camel_mime_filter_bestenc_get_best_charset (CAMEL_MIME_FILTER_BESTENC (filter));
*out_be_variant = g_strcmp0 (charset, "UTF-16BE") == 0;
is_utf16 = *out_be_variant || g_strcmp0 (charset, "UTF-16LE") == 0;
g_object_unref (filter);
return is_utf16;
}
/**
* em_format_format_text:
* @part: an #EMailPart to decode
@ -1081,6 +1110,7 @@ e_mail_formatter_format_text (EMailFormatter *formatter,
CamelMimeFilter *windows = NULL;
CamelMimePart *mime_part;
CamelContentType *mime_type;
gboolean utf16_be_variant = FALSE;
if (g_cancellable_is_cancelled (cancellable))
return;
@ -1088,7 +1118,12 @@ e_mail_formatter_format_text (EMailFormatter *formatter,
mime_part = e_mail_part_ref_mime_part (part);
mime_type = camel_data_wrapper_get_mime_type_field (CAMEL_DATA_WRAPPER (mime_part));
if (formatter->priv->charset != NULL) {
if (emf_data_is_utf16 (mime_part, &utf16_be_variant)) {
if (utf16_be_variant)
charset = "UTF-16BE";
else
charset = "UTF-16LE";
} else if (formatter->priv->charset != NULL) {
charset = formatter->priv->charset;
} else if (mime_type != NULL
&& (charset = camel_content_type_param (mime_type, "charset"))