[gmime] Decode content of the pgp/mime part before decrypting



commit cd25c36ec35ba982d0d82cdd1e947e3a6bec754f
Author: Jeffrey Stedfast <fejj gnome org>
Date:   Sat Nov 5 15:10:29 2011 -0400

    Decode content of the pgp/mime part before decrypting
    
    2011-11-05  Jeffrey Stedfast  <fejj gnome org>
    
    	* gmime/gmime-multipart-encrypted.c
    	(g_mime_multipart_encrypted_decrypt): Need to decode the content
    	of the application/octet-stream part containing the encrypted
    	payload as it may have a non-7bit Content-Transfer-Encoding.

 ChangeLog                         |    7 +++++++
 gmime/gmime-multipart-encrypted.c |   34 ++++++++++++++++++++++++++++++++--
 2 files changed, 39 insertions(+), 2 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 4328f82..5585d9c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2011-11-05  Jeffrey Stedfast  <fejj gnome org>
 
+	* gmime/gmime-multipart-encrypted.c
+	(g_mime_multipart_encrypted_decrypt): Need to decode the content
+	of the application/octet-stream part containing the encrypted
+	payload as it may have a non-7bit Content-Transfer-Encoding.
+
+2011-11-05  Jeffrey Stedfast  <fejj gnome org>
+
 	* gmime/gmime.c (g_mime_init): Register all GObject-based types
 	to prevent race conditions in multi-threaded apps.
 
diff --git a/gmime/gmime-multipart-encrypted.c b/gmime/gmime-multipart-encrypted.c
index 04b6c82..2ccd8a9 100644
--- a/gmime/gmime-multipart-encrypted.c
+++ b/gmime/gmime-multipart-encrypted.c
@@ -28,7 +28,7 @@
 
 #include "gmime-multipart-encrypted.h"
 #include "gmime-stream-filter.h"
-#include "gmime-filter-crlf.h"
+#include "gmime-filter-basic.h"
 #include "gmime-filter-from.h"
 #include "gmime-filter-crlf.h"
 #include "gmime-stream-mem.h"
@@ -242,6 +242,33 @@ g_mime_multipart_encrypted_encrypt (GMimeMultipartEncrypted *mpe, GMimeObject *c
 }
 
 
+static GMimeStream *
+g_mime_data_wrapper_get_decoded_stream (GMimeDataWrapper *wrapper)
+{
+	GMimeStream *decoded_stream;
+	GMimeFilter *decoder;
+	
+	g_mime_stream_reset (wrapper->stream);
+	
+	switch (wrapper->encoding) {
+	case GMIME_CONTENT_ENCODING_BASE64:
+	case GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE:
+	case GMIME_CONTENT_ENCODING_UUENCODE:
+		decoder = g_mime_filter_basic_new (wrapper->encoding, FALSE);
+		decoded_stream = g_mime_stream_filter_new (wrapper->stream);
+		g_mime_stream_filter_add (GMIME_STREAM_FILTER (decoded_stream), decoder);
+		g_object_unref (decoder);
+		break;
+	default:
+		decoded_stream = wrapper->stream;
+		g_object_ref (wrapper->stream);
+		break;
+	}
+	
+	return decoded_stream;
+}
+
+
 /**
  * g_mime_multipart_encrypted_decrypt:
  * @mpe: multipart/encrypted object
@@ -273,6 +300,7 @@ g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *mpe, GMimeCryptoCon
 	GMimeDataWrapper *wrapper;
 	GMimeFilter *crlf_filter;
 	GMimeDecryptResult *res;
+	GMimeFilter *decoder;
 	GMimeParser *parser;
 	char *content_type;
 	
@@ -330,7 +358,7 @@ g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *mpe, GMimeCryptoCon
 	
 	/* get the ciphertext stream */
 	wrapper = g_mime_part_get_content_object (GMIME_PART (encrypted));
-	ciphertext = g_mime_data_wrapper_get_stream (wrapper);
+	ciphertext = g_mime_data_wrapper_get_decoded_stream (wrapper);
 	g_mime_stream_reset (ciphertext);
 	
 	stream = g_mime_stream_mem_new ();
@@ -342,6 +370,7 @@ g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *mpe, GMimeCryptoCon
 	/* get the cleartext */
 	if (!(res = g_mime_crypto_context_decrypt (ctx, ciphertext, filtered_stream, err))) {
 		g_object_unref (filtered_stream);
+		g_object_unref (ciphertext);
 		g_object_unref (stream);
 		
 		return NULL;
@@ -349,6 +378,7 @@ g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *mpe, GMimeCryptoCon
 	
 	g_mime_stream_flush (filtered_stream);
 	g_object_unref (filtered_stream);
+	g_object_unref (ciphertext);
 	
 	g_mime_stream_reset (stream);
 	parser = g_mime_parser_new ();



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