[gmime] Decode content of the pgp/mime part before decrypting
- From: Jeffrey Stedfast <fejj src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gmime] Decode content of the pgp/mime part before decrypting
- Date: Sat, 5 Nov 2011 19:11:05 +0000 (UTC)
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]