Fix handling of "own" S/MIME Mails
authorAndre Heinecke <aheinecke@intevation.de>
Fri, 10 Nov 2017 16:52:01 +0000 (17:52 +0100)
committerAndre Heinecke <aheinecke@intevation.de>
Fri, 10 Nov 2017 16:56:26 +0000 (17:56 +0100)
* src/mimedataprovider.cpp (MimeDataProvider::collect_data):
Expect headers if the first line of the data starts with MIME-Version.

--

This fixes the problem that S/MIME Mails in the sent folder
are not handled.

The problem is that for received S/MIME Mails GpgOL sees
the S/MIME part as the original structure and just needs
to copy this part to gpgol.
But for our own mails in the sent mails folder we get our
MIME Structure that we created for the MAPI to MIME conversion
including headers.

To avoid a big mess with another content type we check the
first bytes of the data we parse if they say "MIME-Version"
in that case we expect MIME headers.

GnuPG-Bug-ID: T3442

src/mimedataprovider.cpp

index 82a84f0..4e825b8 100644 (file)
@@ -752,6 +752,7 @@ MimeDataProvider::collect_data(LPSTREAM stream)
   HRESULT hr;
   char buf[BUFSIZE];
   ULONG bRead;
+  bool first_read = true;
   while ((hr = stream->Read (buf, BUFSIZE, &bRead)) == S_OK ||
          hr == S_FALSE)
     {
@@ -764,6 +765,27 @@ MimeDataProvider::collect_data(LPSTREAM stream)
       log_mime_parser ("%s:%s: Read %lu bytes.",
                        SRCNAME, __func__, bRead);
 
+      if (first_read)
+        {
+          if (bRead > 12 && strncmp ("MIME-Version", buf, 12) == 0)
+            {
+              /* Fun! In case we have exchange or sent messages created by us
+                 we get the mail attachment like it is before the MAPI to MIME
+                 conversion. So it has our MIME structure. In that case
+                 we have to expect MIME data even if the initial data check
+                 suggests that we don't.
+
+                 Checking if the content starts with MIME-Version appears
+                 to be a robust way to check if we try to parse MIME data. */
+              m_collect_everything = false;
+              log_debug ("%s:%s: Found MIME-Version marker."
+                         "Expecting headers even if type suggested not to.",
+                         SRCNAME, __func__);
+
+            }
+        }
+      first_read = false;
+
       if (m_collect_everything)
         {
           /* For S/MIME, Clearsigned, PGP MESSAGES we just pass everything