[evolution] Bug #630375 - Character encoding of GPG encrypted message not honored



commit 26b7d1f342e19ed828c4d3a3b99b15987fddeb94
Author: Milan Crha <mcrha redhat com>
Date:   Wed Oct 13 16:28:43 2010 +0200

    Bug #630375 - Character encoding of GPG encrypted message not honored

 em-format/em-format.c   |   19 +++++++++++++++++++
 mail/em-format-html.c   |   10 ++++++++++
 mail/em-inline-filter.c |    6 ++++--
 3 files changed, 33 insertions(+), 2 deletions(-)
---
diff --git a/em-format/em-format.c b/em-format/em-format.c
index 9574530..dc20ac5 100644
--- a/em-format/em-format.c
+++ b/em-format/em-format.c
@@ -1487,6 +1487,22 @@ add_validity_found (EMFormat *emf,
 
 /* ********************************************************************** */
 
+static void
+preserve_charset_in_content_type (CamelMimePart *ipart, CamelMimePart *opart)
+{
+	CamelContentType *ict;
+
+	g_return_if_fail (ipart != NULL);
+	g_return_if_fail (opart != NULL);
+
+	ict = camel_data_wrapper_get_mime_type_field (camel_medium_get_content (CAMEL_MEDIUM (ipart)));
+	if (!ict || !camel_content_type_param (ict, "charset") || !*camel_content_type_param (ict, "charset"))
+		return;
+
+	camel_content_type_set_param (camel_data_wrapper_get_mime_type_field (camel_medium_get_content (CAMEL_MEDIUM (opart))),
+		"charset", camel_content_type_param (ict, "charset"));
+}
+
 #ifdef ENABLE_SMIME
 static void
 emf_application_xpkcs7mime (EMFormat *emf,
@@ -1521,6 +1537,7 @@ emf_application_xpkcs7mime (EMFormat *emf,
 	opart = camel_mime_part_new ();
 	valid = camel_cipher_context_decrypt_sync (
 		context, part, opart, cancellable, &local_error);
+	preserve_charset_in_content_type (part, opart);
 	if (valid == NULL) {
 		em_format_format_error (
 			emf, stream, "%s",
@@ -1733,6 +1750,7 @@ emf_multipart_encrypted (EMFormat *emf,
 	opart = camel_mime_part_new ();
 	valid = camel_cipher_context_decrypt_sync (
 		context, part, opart, cancellable, &local_error);
+	preserve_charset_in_content_type (part, opart);
 	if (valid == NULL) {
 		em_format_format_error (
 			emf, stream, local_error->message ?
@@ -2233,6 +2251,7 @@ emf_inlinepgp_encrypted (EMFormat *emf,
 			camel_data_wrapper_set_mime_type (dw, snoop);
 	}
 
+	preserve_charset_in_content_type (ipart, opart);
 	g_free (mime_type);
 
 	add_validity_found (emf, valid);
diff --git a/mail/em-format-html.c b/mail/em-format-html.c
index 42edac3..2e9bad7 100644
--- a/mail/em-format-html.c
+++ b/mail/em-format-html.c
@@ -1738,6 +1738,7 @@ efh_text_plain (EMFormat *emf,
 		EMInlineFilter *inline_filter;
 		CamelStream *null;
 		CamelContentType *ct;
+		gboolean charset_added = FALSE;
 
 		/* if we had to snoop the part type to get here, then
 		 * use that as the base type, yuck */
@@ -1747,6 +1748,11 @@ efh_text_plain (EMFormat *emf,
 			camel_content_type_ref (ct);
 		}
 
+		if (dw->mime_type && ct != dw->mime_type && camel_content_type_param (dw->mime_type, "charset")) {
+			camel_content_type_set_param (ct, "charset", camel_content_type_param (dw->mime_type, "charset"));
+			charset_added = TRUE;
+		}
+
 		null = camel_stream_null_new ();
 		filtered_stream = camel_stream_filter_new (null);
 		g_object_unref (null);
@@ -1764,6 +1770,10 @@ efh_text_plain (EMFormat *emf,
 			efhc = efh_insert_cache (efh, emf->part_id->str);
 		efhc->textmp = mp;
 
+		if (charset_added) {
+			camel_content_type_set_param (ct, "charset", NULL);
+		}
+
 		g_object_unref (inline_filter);
 		camel_content_type_unref (ct);
 	}
diff --git a/mail/em-inline-filter.c b/mail/em-inline-filter.c
index 7aeb36c..7222c03 100644
--- a/mail/em-inline-filter.c
+++ b/mail/em-inline-filter.c
@@ -102,8 +102,10 @@ inline_filter_add_part (EMInlineFilter *emif, const gchar *data, gint len)
 	g_object_unref (mem);
 
 	if (emif_types[emif->state].plain && emif->base_type) {
-		camel_content_type_ref (emif->base_type);
-		content_type = emif->base_type;
+		/* create a copy */
+		type = camel_content_type_format (emif->base_type);
+		content_type = camel_content_type_decode (type);
+		g_free (type);
 	} else {
 		/* we want to preserve all params */
 		type = camel_content_type_format (emif->base_type);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]