[Patch] fix broken decryption of s/mime messages loaded from imap

Hi all,

at work, I use Balsa with IMAP, and many of our messages are s/mime encrypted, using the RFC 5751 
application/pkcs7-mime “enveloped-data” media type.  In this case, the top-level content type of the message 
is application/pkcs7-mime, and the body is just a single part containing the encrypted matter.

With messages on IMAP (with caching enabled), I saw the following effect:

1. select a not too small encrypted message, and click decrypt: decryption fails.  The Gpgme debug log shows 
that no data is fed into gpgsm;
2. select “Message ▶ View Source…”: shows the base64 encoded encrypted body of the message.  Feeding the data 
from the dialogue through base64 and gpgsm decrypts properly;
3. again click decrypt on the message: fails again;
4. select an other message in the same IMAP mailbox, and then again the one from step 1: now decryption is 
successful (data loaded from the cache?);
5. terminate Balsa, erase the cache ( ~/.balsa/imap-cache/*), start balsa again, and select the message from 
step 1: decryption fails.

Apparently, Balsa does not properly load the message content if the message is a single-part 
application/pkcs7-mime message.  Afaict, all multipart messages, including multipart/encrypted and 
multipart/signed, are loaded properly.

After digging through the code, I /think/ the problem is in libbalsa_mailbox_imap_fetch_structure() which 
loads only text/* and short messages completely (to be honest, I don't understand why multipart/* is working, 
though…).  At least, the attached trivial patch, just loading single-part S/MIME messages just as text/*, 
solves the issue for me.

Any insight would be highly appreciated!

diff --git a/libbalsa/mailbox_imap.c b/libbalsa/mailbox_imap.c
index d85e377c1..1abaa12a0 100644
--- a/libbalsa/mailbox_imap.c
+++ b/libbalsa/mailbox_imap.c
@@ -2247,7 +2247,8 @@ libbalsa_mailbox_imap_fetch_structure(LibBalsaMailbox *mailbox,
        LIBBALSA_MESSAGE_GET_LENGTH(message)<8192 ||
        (message->headers &&
         (!message->headers->content_type ||
-         g_mime_content_type_is_type(message->headers->content_type, "text", "*"))) ){
+         g_mime_content_type_is_type(message->headers->content_type, "text", "*") ||
+                g_mime_content_type_is_type(message->headers->content_type, "application", "pkcs7-mime")))) {
         /* we could optimize this part a little bit: we do not need to
          * keep reopening the stream. */
         GMimeStream *stream = 

Attachment: pgpkYG_g7rtXj.pgp
Description: PGP signature

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