[evolution/webkit: 36/171] Merge info about mail signature and encryption into one button



commit bf3301be890d7df6b2e9ac3944c5043df55d2e9b
Author: Dan VrÃtil <dvratil redhat com>
Date:   Wed Oct 5 19:39:40 2011 +0200

    Merge info about mail signature and encryption into one button
    
    Parsers for secured parts first merge info about part security they
    received from caller with theirs and then pass this merged information
    to next parser.

 em-format/em-format.c |  123 +++++++++++++++++++++++++++++++++++-------------
 1 files changed, 89 insertions(+), 34 deletions(-)
---
diff --git a/em-format/em-format.c b/em-format/em-format.c
index b4d2dc9..6ae8c21 100644
--- a/em-format/em-format.c
+++ b/em-format/em-format.c
@@ -91,6 +91,19 @@ static void emf_source				(EMFormat *emf, CamelStream *stream, GCancellable *can
 
 /**************************************************************************/
 
+static gboolean
+is_secured (CamelMimePart *part)
+{
+	CamelContentType *ct = camel_mime_part_get_content_type (part);
+
+	return (camel_content_type_is (ct, "multipart", "signed") ||
+		camel_content_type_is (ct, "multipart", "encrypted") ||
+		camel_content_type_is (ct, "application", "x-inlinepgp-signed") ||
+		camel_content_type_is (ct, "application", "x-inlinepgp-encrypted") ||
+		camel_content_type_is (ct, "application", "x-pkcs7-mime") ||
+		camel_content_type_is (ct, "application", "pkcs7-mime"));
+}
+
 static void
 preserve_charset_in_content_type (CamelMimePart *ipart,
                                   CamelMimePart *opart)
@@ -219,7 +232,7 @@ emf_parse_application_xpkcs7mime (EMFormat *emf,
 	} else {
 		EMFormatParserInfo encinfo = {
 				info->handler,
-				EM_FORMAT_VALIDITY_FOUND_ENCRYPTED | EM_FORMAT_VALIDITY_FOUND_SMIME,
+				info->validity_type | EM_FORMAT_VALIDITY_FOUND_ENCRYPTED | EM_FORMAT_VALIDITY_FOUND_SMIME,
 				valid
 		};
 		gint len = part_id->len;
@@ -228,11 +241,15 @@ emf_parse_application_xpkcs7mime (EMFormat *emf,
 		em_format_parse_part (emf, opart, part_id, &encinfo, cancellable);
 		g_string_truncate (part_id, len);
 
-		/* Add a widget with details about the encryption */
-		g_string_append (part_id, ".encrypted.button");
-		em_format_parse_part_as (emf, part, part_id, &encinfo,
-			"x-evolution/message/x-secure-button", cancellable);
-		g_string_truncate (part_id, len);
+		/* Add a widget with details about the encryption, but only when
+		   the encrypted isn't itself secured, in that case it has created
+		   the button itself */
+		if (!is_secured (opart)) {
+			g_string_append (part_id, ".encrypted.button");
+			em_format_parse_part_as (emf, part, part_id, &encinfo,
+				"x-evolution/message/x-secure-button", cancellable);
+			g_string_truncate (part_id, len);
+		}
 
 		camel_cipher_validity_free (valid);
 	}
@@ -508,21 +525,30 @@ emf_parse_multipart_encrypted (EMFormat *emf,
 		g_clear_error (&local_error);
 		emf_parse_multipart_mixed (emf, part, part_id, info, cancellable);
 	} else {
+		gint len = part_id->len;
+
 		EMFormatParserInfo encinfo = {
 				info->handler,
-				EM_FORMAT_VALIDITY_FOUND_ENCRYPTED | EM_FORMAT_VALIDITY_FOUND_PGP,
-				camel_cipher_validity_clone (valid), };
-		gint len = part_id->len;
+				info->validity_type | EM_FORMAT_VALIDITY_FOUND_ENCRYPTED | EM_FORMAT_VALIDITY_FOUND_PGP,
+		};
+
+		if (info->validity)
+			camel_cipher_validity_envelope (valid, info->validity);
+		encinfo.validity = valid;
 
 		g_string_append (part_id, ".encrypted");
 		em_format_parse_part (emf, opart, part_id, &encinfo, cancellable);
 		g_string_truncate (part_id, len);
 
-		/* Add a widget with details about the encryption */
-		g_string_append (part_id, ".encrypted.button");
-		em_format_parse_part_as (emf, part, part_id, &encinfo,
-			"x-evolution/message/x-secure-button", cancellable);
-		g_string_truncate (part_id, len);
+		/* Add a widget with details about the encryption, but only when
+		   the encrypted isn't itself secured, in that case it has created
+		   the button itself */
+		if (!is_secured (opart)) {
+			g_string_append (part_id, ".encrypted.button");
+			em_format_parse_part_as (emf, part, part_id, &encinfo,
+				"x-evolution/message/x-secure-button", cancellable);
+			g_string_truncate (part_id, len);
+		}
 
 		camel_cipher_validity_free (valid);
 	}
@@ -641,14 +667,20 @@ emf_parse_multipart_signed (EMFormat *emf,
 			g_clear_error (&local_error);
 			emf_parse_multipart_mixed (emf, part, part_id,info,  cancellable);
 		} else {
+			gint i, nparts, len = part_id->len;
+			gboolean secured;
+
 			EMFormatParserInfo signinfo = {
 					info->handler,
-					validity_type | EM_FORMAT_VALIDITY_FOUND_SIGNED,
-					valid
+					info->validity_type | validity_type | EM_FORMAT_VALIDITY_FOUND_SIGNED,
 			};
 
-			gint i, nparts, len = part_id->len;
+			if (info->validity)
+				camel_cipher_validity_envelope (valid, info->validity);
+			signinfo.validity = valid;
+
 			nparts = camel_multipart_get_number (CAMEL_MULTIPART (mps));
+			secured = FALSE;
 			for (i = 0; i < nparts; i++) {
 				CamelMimePart *subpart;
 				subpart = camel_multipart_get_part (CAMEL_MULTIPART (mps), i);
@@ -656,13 +688,20 @@ emf_parse_multipart_signed (EMFormat *emf,
 				g_string_append_printf(part_id, ".signed.%d", i);
 				em_format_parse_part (emf, subpart, part_id, &signinfo, cancellable);
 				g_string_truncate (part_id, len);
+
+				if (!secured)
+					secured = is_secured (subpart);
 			}
 
-			/* Add a widget with details about the encryption */
-			g_string_append (part_id, ".signed.button");
-			em_format_parse_part_as (emf, part, part_id, &signinfo,
-			"x-evolution/message/x-secure-button", cancellable);
-			g_string_truncate (part_id, len);
+			/* Add a widget with details about the encryption, but only when
+			   the encrypted isn't itself secured, in that case it has created
+			   the button itself */
+			if (!secured) {
+				g_string_append (part_id, ".signed.button");
+				em_format_parse_part_as (emf, part, part_id, &signinfo,
+				"x-evolution/message/x-secure-button", cancellable);
+				g_string_truncate (part_id, len);
+			}
 
 			camel_cipher_validity_free (valid);
 		}
@@ -886,20 +925,27 @@ emf_parse_inlinepgp_signed (EMFormat *emf,
 	camel_mime_part_set_content (opart, (gchar *) ba->data, ba->len, type);
 	g_free (type);
 
+	if (info->validity)
+		camel_cipher_validity_envelope (valid, info->validity);
+
 	/* Pass it off to the real formatter */
 	len = part_id->len;
 	g_string_append (part_id, ".inlinepgp_signed");
 	signinfo.handler = info->handler;
-	signinfo.validity_type = EM_FORMAT_VALIDITY_FOUND_SIGNED | EM_FORMAT_VALIDITY_FOUND_PGP;
+	signinfo.validity_type = info->validity_type | EM_FORMAT_VALIDITY_FOUND_SIGNED | EM_FORMAT_VALIDITY_FOUND_PGP;
 	signinfo.validity = valid;
 	em_format_parse_part (emf, opart, part_id, &signinfo, cancellable);
 	g_string_truncate (part_id, len);
 
-	/* Add a widget with details about the encryption */
-	g_string_append (part_id, ".inlinepgp_signed.button");
-	em_format_parse_part_as (emf, opart, part_id, &signinfo,
-		"x-evolution/message/x-secure-button", cancellable);
-	g_string_truncate (part_id, len);
+	/* Add a widget with details about the encryption, but only when
+	   the encrypted isn't itself secured, in that case it has created
+	   the button itself */
+	if (!is_secured (opart)) {
+		g_string_append (part_id, ".inlinepgp_signed.button");
+		em_format_parse_part_as (emf, opart, part_id, &signinfo,
+			"x-evolution/message/x-secure-button", cancellable);
+		g_string_truncate (part_id, len);
+	}
 
 	/* Clean Up */
 	camel_cipher_validity_free (valid);
@@ -968,20 +1014,27 @@ emf_parse_inlinepgp_encrypted (EMFormat *emf,
 	preserve_charset_in_content_type (ipart, opart);
 	g_free (mime_type);
 
+	if (info->validity)
+		camel_cipher_validity_envelope (valid, info->validity);
+
 	/* Pass it off to the real formatter */
 	len = part_id->len;
 	g_string_append (part_id, ".inlinepgp_encrypted");
 	encinfo.handler = info->handler;
-	encinfo.validity_type = EM_FORMAT_VALIDITY_FOUND_ENCRYPTED | EM_FORMAT_VALIDITY_FOUND_PGP;
+	encinfo.validity_type = info->validity_type | EM_FORMAT_VALIDITY_FOUND_ENCRYPTED | EM_FORMAT_VALIDITY_FOUND_PGP;
 	encinfo.validity = valid;
 	em_format_parse_part (emf, opart, part_id, &encinfo, cancellable);
 	g_string_truncate (part_id, len);
 
-	/* Add a widget with details about the encryption */
-	g_string_append (part_id, ".inlinepgp_encrypted.button");
-	em_format_parse_part_as (emf, opart, part_id, &encinfo,
-		"x-evolution/message/x-secure-button", cancellable);
-	g_string_truncate (part_id, len);
+	/* Add a widget with details about the encryption, but only when
+	   the encrypted isn't itself secured, in that case it has created
+	   the button itself */
+	if (!is_secured (opart)) {
+		g_string_append (part_id, ".inlinepgp_encrypted.button");
+		em_format_parse_part_as (emf, opart, part_id, &encinfo,
+			"x-evolution/message/x-secure-button", cancellable);
+		g_string_truncate (part_id, len);
+	}
 
 	/* Clean Up */
 	camel_cipher_validity_free (valid);
@@ -1624,6 +1677,8 @@ em_format_add_puri (EMFormat *emf,
 
 	g_hash_table_insert (emf->mail_part_table,
 			puri->uri, puri);
+
+	d(printf("Added PURI %s\n", puri->uri));
 }
 
 EMFormatPURI*



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