More debug messages.
authorWerner Koch <wk@gnupg.org>
Thu, 3 Jan 2008 11:33:34 +0000 (11:33 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 3 Jan 2008 11:33:34 +0000 (11:33 +0000)
Try coping with CrytoEx processed messages.

15 files changed:
NEWS
configure.ac
po/de.po
po/sv.po
src/ChangeLog
src/engine-assuan.c
src/engine.c
src/ext-commands.cpp
src/mapihelp.cpp
src/mapihelp.h
src/message-events.cpp
src/message.cpp
src/msgcache.c
src/olflange.cpp
src/user-events.cpp

diff --git a/NEWS b/NEWS
index 7889172..b6a24da 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,10 +1,13 @@
-Noteworthy changes for version 0.10.3 (2007-12-10)
+Noteworthy changes for version 0.10.4
 ==================================================
 
  UNDER HEAVY DEVELOPMENT - DO NOT USE FOR PRODUCTION!
-
     - Under OL2007 some menu entries are missing.
 
+
+Noteworthy changes for version 0.10.3 (2007-12-10)
+==================================================
+
  * Minor fixes.
 
 
index d9dcb5d..52ff688 100644 (file)
@@ -16,8 +16,8 @@ min_automake_version="1.9.4"
 # Remember to change the version number immediately *after* a release.
 # Set my_issvn to "yes" for non-released code.  Remember to run an
 # "svn up" and "autogen.sh" right before creating a distribution.
-m4_define([my_version], [0.10.3])
-m4_define([my_issvn], [no])
+m4_define([my_version], [0.10.4])
+m4_define([my_issvn], [yes])
 
 m4_define([svn_revision], m4_esyscmd([echo -n $( (svn info 2>/dev/null \
             || echo 'Revision: 0')|sed -n '/^Revision:/ {s/[^0-9]//gp;q;}')]))
index f746e76..3ab5a9a 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GpgOL 0.10.0\n"
 "Report-Msgid-Bugs-To: bug-gpgol@g10code.com\n"
-"POT-Creation-Date: 2007-12-07 08:44+0100\n"
+"POT-Creation-Date: 2007-12-10 10:44+0100\n"
 "PO-Revision-Date: 2007-12-07 08:44+0100\n"
 "Last-Translator: Werner Koch <wk@gnupg.org>\n"
 "Language-Team: de\n"
@@ -70,7 +70,7 @@ msgstr ""
 "Diese ist allerdings sehr vereinfacht und kann z.B. keine S/MIME "
 "verschlüsselten Nachrichten entschlüsseln."
 
-#: src/engine.c:367 src/ext-commands.cpp:663 src/main.c:603 src/main.c:609
+#: src/engine.c:367 src/ext-commands.cpp:659 src/main.c:603 src/main.c:609
 msgid "GpgOL"
 msgstr "GpgOL"
 
@@ -220,103 +220,99 @@ msgstr "&Unterschrift prüfen"
 msgid "&Display crypto information"
 msgstr "~Krypto Informationen anzeigen"
 
-#: src/ext-commands.cpp:440 src/ext-commands.cpp:791
-msgid "Decrypt message and verify signature"
-msgstr "Nachricht entschlüsseln und Unterschrift prüfen"
-
-#: src/ext-commands.cpp:447
+#: src/ext-commands.cpp:443
 msgid ">GnuPG protocol"
 msgstr ">GnuPG Protokoll"
 
-#: src/ext-commands.cpp:448
+#: src/ext-commands.cpp:444
 msgid "auto"
 msgstr "automatisch"
 
-#: src/ext-commands.cpp:449
+#: src/ext-commands.cpp:445
 msgid "PGP/MIME"
 msgstr "PGP/MIME"
 
-#: src/ext-commands.cpp:450
+#: src/ext-commands.cpp:446
 msgid "S/MIME"
 msgstr "S/MIME"
 
-#: src/ext-commands.cpp:452
+#: src/ext-commands.cpp:448
 msgid "&encrypt message with GnuPG"
 msgstr "Nachricht mit GnuPG verschlüsseln"
 
-#: src/ext-commands.cpp:453
+#: src/ext-commands.cpp:449
 msgid "&sign message with GnuPG"
 msgstr "Nachricht mit GnuPG unterschreiben"
 
-#: src/ext-commands.cpp:457 src/ext-commands.cpp:830
+#: src/ext-commands.cpp:453 src/ext-commands.cpp:817
 msgid "Encrypt message with GnuPG"
 msgstr "Nachricht mit GnuPG verschlüsseln"
 
-#: src/ext-commands.cpp:458 src/ext-commands.cpp:840
+#: src/ext-commands.cpp:454 src/ext-commands.cpp:827
 msgid "Sign message with GnuPG"
 msgstr "Nachricht mit GnuPG unterschreiben"
 
-#: src/ext-commands.cpp:493
+#: src/ext-commands.cpp:489
 msgid "GnuPG Certificate &Manager"
 msgstr "GnuPG Zertifikats&verwaltung"
 
-#: src/ext-commands.cpp:497
+#: src/ext-commands.cpp:493
 msgid "Open the certificate manager"
 msgstr "Die Zertifikatsverwaltung öffnen"
 
-#: src/ext-commands.cpp:662
+#: src/ext-commands.cpp:658
 msgid "Could not start certificate manager"
 msgstr "Die Zertifikatsverwaltung konnte nicht aufgerufen werden"
 
-#: src/ext-commands.cpp:705
+#: src/ext-commands.cpp:701
 msgid "Select this option to decrypt and verify the message."
 msgstr ""
 "Wählen Sie diese Option um die Nachricht zu entschlüsseln bzw. zu "
 "verifizieren."
 
-#: src/ext-commands.cpp:712
+#: src/ext-commands.cpp:708
 msgid "Select this option to show information on the crypto status"
 msgstr ""
 "Wählen Sie diese Option um Informationen über den Krypto-Status der "
 "Nachricht anzuzeigen."
 
-#: src/ext-commands.cpp:720 src/ext-commands.cpp:810
+#: src/ext-commands.cpp:716 src/ext-commands.cpp:797
 msgid "Check the signature now and display the result"
 msgstr "Die digitale Unterschrift jetzt prüfen und das Resultat anzeigen"
 
-#: src/ext-commands.cpp:727
+#: src/ext-commands.cpp:723
 msgid "Select this option to automatically select the protocol."
 msgstr "Wählen Sie diese Option zum das Protokoll automatisch auszuwählen."
 
-#: src/ext-commands.cpp:734
+#: src/ext-commands.cpp:730
 msgid "Select this option to select the PGP/MIME protocol."
 msgstr "Wählen Sie diese Option zum das PGP/MIME Protokoll auszuwählen."
 
-#: src/ext-commands.cpp:741
+#: src/ext-commands.cpp:737
 msgid "Select this option to select the S/MIME protocol."
 msgstr "Wählen Sie diese Option zum das S/MIME Protokoll auszuwählen."
 
-#: src/ext-commands.cpp:748
+#: src/ext-commands.cpp:744
 msgid "Select this option to encrypt the message."
 msgstr "Wählen Sie diese Option zum Verschlüsseln der Nachricht."
 
-#: src/ext-commands.cpp:755
+#: src/ext-commands.cpp:751
 msgid "Select this option to sign the message."
 msgstr "Wählen Sie diese Option zum Unterschreiben der Nachricht."
 
-#: src/ext-commands.cpp:762
+#: src/ext-commands.cpp:758
 msgid "Select this option to open the certificate manager"
 msgstr "Wählen Sie diese Option zum die Zertifikatsverwaltung zu öffenen."
 
-#: src/ext-commands.cpp:800
+#: src/ext-commands.cpp:787
 msgid "Show S/MIME status info"
 msgstr "S/MIME Status Informationen anzeigen"
 
-#: src/ext-commands.cpp:820
+#: src/ext-commands.cpp:807
 msgid "Use S/MIME for sign/encrypt"
 msgstr "S/MIME zum signieren/verschlüsseln verwenden"
 
-#: src/ext-commands.cpp:850
+#: src/ext-commands.cpp:837
 msgid "Open the GpgOL certificate manager"
 msgstr "Zertifikatsverwaltung von GpgOL öffnen"
 
@@ -673,6 +669,9 @@ msgstr "PGP/MIME Prüfungsresultat"
 msgid "S/MIME Verification Result"
 msgstr "S/MIME Prüfungsresultat"
 
+#~ msgid "Decrypt message and verify signature"
+#~ msgstr "Nachricht entschlüsseln und Unterschrift prüfen"
+
 #~ msgid "Select GPG Key Manager"
 #~ msgstr "Das Schlüsselverwaltungsprogramm festlegen"
 
index fd87493..ae9b57e 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GPGol\n"
 "Report-Msgid-Bugs-To: bug-gpgol@g10code.com\n"
-"POT-Creation-Date: 2007-12-07 08:44+0100\n"
+"POT-Creation-Date: 2007-12-10 10:44+0100\n"
 "PO-Revision-Date: 2006-12-12 23:52+0100\n"
 "Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -66,7 +66,7 @@ msgid ""
 "are not readable."
 msgstr ""
 
-#: src/engine.c:367 src/ext-commands.cpp:663 src/main.c:603 src/main.c:609
+#: src/engine.c:367 src/ext-commands.cpp:659 src/main.c:603 src/main.c:609
 msgid "GpgOL"
 msgstr ""
 
@@ -220,112 +220,108 @@ msgstr "FELAKTIG signatur!"
 msgid "&Display crypto information"
 msgstr ""
 
-#: src/ext-commands.cpp:440 src/ext-commands.cpp:791
-msgid "Decrypt message and verify signature"
-msgstr "Dekryptera meddelandet och validera signaturen"
-
-#: src/ext-commands.cpp:447
+#: src/ext-commands.cpp:443
 msgid ">GnuPG protocol"
 msgstr ""
 
-#: src/ext-commands.cpp:448
+#: src/ext-commands.cpp:444
 msgid "auto"
 msgstr ""
 
-#: src/ext-commands.cpp:449
+#: src/ext-commands.cpp:445
 #, fuzzy
 msgid "PGP/MIME"
 msgstr "[PGP/MIME-meddelande]"
 
-#: src/ext-commands.cpp:450
+#: src/ext-commands.cpp:446
 msgid "S/MIME"
 msgstr ""
 
-#: src/ext-commands.cpp:452
+#: src/ext-commands.cpp:448
 #, fuzzy
 msgid "&encrypt message with GnuPG"
 msgstr "Signera meddelandet med GPG"
 
-#: src/ext-commands.cpp:453
+#: src/ext-commands.cpp:449
 #, fuzzy
 msgid "&sign message with GnuPG"
 msgstr "Signera meddelandet med GPG"
 
-#: src/ext-commands.cpp:457 src/ext-commands.cpp:830
+#: src/ext-commands.cpp:453 src/ext-commands.cpp:817
 #, fuzzy
 msgid "Encrypt message with GnuPG"
 msgstr "Signera meddelandet med GPG"
 
-#: src/ext-commands.cpp:458 src/ext-commands.cpp:840
+#: src/ext-commands.cpp:454 src/ext-commands.cpp:827
 #, fuzzy
 msgid "Sign message with GnuPG"
 msgstr "Signera meddelandet med GPG"
 
-#: src/ext-commands.cpp:493
+#: src/ext-commands.cpp:489
 #, fuzzy
 msgid "GnuPG Certificate &Manager"
 msgstr "GPG-nyckel&hanterare"
 
-#: src/ext-commands.cpp:497
+#: src/ext-commands.cpp:493
 msgid "Open the certificate manager"
 msgstr ""
 
-#: src/ext-commands.cpp:662
+#: src/ext-commands.cpp:658
 #, fuzzy
 msgid "Could not start certificate manager"
 msgstr "Kunde inte starta nyckelhanteraren"
 
-#: src/ext-commands.cpp:705
+#: src/ext-commands.cpp:701
 #, fuzzy
 msgid "Select this option to decrypt and verify the message."
 msgstr "Välj det här alternativet för att kryptera meddelandet."
 
-#: src/ext-commands.cpp:712
+#: src/ext-commands.cpp:708
 #, fuzzy
 msgid "Select this option to show information on the crypto status"
 msgstr "Välj det här alternativet för att signera meddelandet."
 
-#: src/ext-commands.cpp:720 src/ext-commands.cpp:810
+#: src/ext-commands.cpp:716 src/ext-commands.cpp:797
 msgid "Check the signature now and display the result"
 msgstr ""
 
-#: src/ext-commands.cpp:727
+#: src/ext-commands.cpp:723
 #, fuzzy
 msgid "Select this option to automatically select the protocol."
 msgstr "Välj det här alternativet för att kryptera meddelandet."
 
-#: src/ext-commands.cpp:734
+#: src/ext-commands.cpp:730
 #, fuzzy
 msgid "Select this option to select the PGP/MIME protocol."
 msgstr "Välj det här alternativet för att kryptera meddelandet."
 
-#: src/ext-commands.cpp:741
+#: src/ext-commands.cpp:737
 #, fuzzy
 msgid "Select this option to select the S/MIME protocol."
 msgstr "Välj det här alternativet för att kryptera meddelandet."
 
-#: src/ext-commands.cpp:748
+#: src/ext-commands.cpp:744
 msgid "Select this option to encrypt the message."
 msgstr "Välj det här alternativet för att kryptera meddelandet."
 
-#: src/ext-commands.cpp:755
+#: src/ext-commands.cpp:751
 msgid "Select this option to sign the message."
 msgstr "Välj det här alternativet för att signera meddelandet."
 
-#: src/ext-commands.cpp:762
+#: src/ext-commands.cpp:758
 #, fuzzy
 msgid "Select this option to open the certificate manager"
 msgstr "Välj det här alternativet för att kryptera meddelandet."
 
-#: src/ext-commands.cpp:800
+#: src/ext-commands.cpp:787
 msgid "Show S/MIME status info"
 msgstr ""
 
-#: src/ext-commands.cpp:820
+#: src/ext-commands.cpp:807
 msgid "Use S/MIME for sign/encrypt"
 msgstr ""
 
-#: src/ext-commands.cpp:850
+#: src/ext-commands.cpp:837
 msgid "Open the GpgOL certificate manager"
 msgstr ""
 
@@ -648,6 +644,9 @@ msgstr "Resultat från validering"
 msgid "S/MIME Verification Result"
 msgstr "Resultat från validering"
 
+#~ msgid "Decrypt message and verify signature"
+#~ msgstr "Dekryptera meddelandet och validera signaturen"
+
 #~ msgid "Select GPG Key Manager"
 #~ msgstr "Välj GPG-nyckelhanterare"
 
index dadfae1..ecb0bcd 100644 (file)
@@ -1,3 +1,14 @@
+2007-12-18  Werner Koch  <wk@g10code.com>
+
+       * mapihelp.cpp (get_msgcls_from_pgp_lines): Limit check to the
+       first 1 k and stop testing after the first PGP armor line.
+       (mapi_get_message_type): Return MSGTYPE_SMIME.
+       (mapi_change_message_class): Take care of CryptoEx signatures.
+       * mapihelp.h (MSGTYPE_SMIME): New.
+       * message.cpp (message_incoming_handler): Check message class for
+       unknown and unchecked messages.  Take care MSGTYPE_SMIME.
+       * ext-commands.cpp (DoCommand): Add debug command change message class.
+
 2007-12-07  Werner Koch  <wk@g10code.com>
 
        * ext-commands.cpp (InstallCommands): Removed toolbar button fro
index e691f00..7225725 100644 (file)
@@ -589,7 +589,7 @@ op_assuan_init (void)
   /* Fire up the pipe worker thread. */
   {
     HANDLE th;
-    DWORD tid;
+    DWORD  mytid, tid;
 
     InitializeCriticalSection (&work_queue_lock);
     work_queue_event = CreateEvent (NULL, FALSE, FALSE, NULL);
@@ -598,7 +598,9 @@ op_assuan_init (void)
         log_error_w32 (-1, "%s:%s: CreateEvent failed", SRCNAME, __func__);
         return gpg_error (GPG_ERR_GENERAL);
       }
-    th = CreateThread (NULL, 256*1024, async_worker_thread, NULL, 0, &tid);
+    mytid = GetCurrentThreadId ();
+    th = CreateThread (NULL, 256*1024, async_worker_thread, (void*)mytid,
+                       0, &tid);
     if (th == INVALID_HANDLE_VALUE)
       log_error ("failed to launch the async_worker_thread");
     else
@@ -609,6 +611,52 @@ op_assuan_init (void)
   return 0;
 }
 
+#if 0 /* Not used. */
+/* Dummy window procedure.  */
+static LRESULT CALLBACK 
+attach_thread_input_wndw_proc (HWND hwnd, UINT msg, 
+                               WPARAM wparam, LPARAM lparam)
+{              
+  return DefWindowProc (hwnd, msg, wparam, lparam);
+}
+
+
+/* Our helper thread needs to attach its input events to the main
+   message queue.  To do this we need to create a the message queue
+   first by creating an hidden window within this thread.  */
+static void
+attach_thread_input (DWORD other_tid)
+{
+  WNDCLASS wndwclass = {0, attach_thread_input_wndw_proc, 0, 0, glob_hinst,
+                        0, 0, 0, 0, "gpgol-assuan-engine"};
+  HWND hwnd;
+
+  /* First create a window to make sure that a message queue exists
+     for this thread.  */
+  if (!RegisterClass (&wndwclass))
+    {
+      log_error_w32 (-1, "%s:%s: error registering window class",
+                     SRCNAME, __func__);
+      return;
+    }
+  hwnd = CreateWindow ("gpgol-assuan-engine", "gpgol-assuan-engine",
+                       0, 0, 0, 0, 0, NULL, NULL, glob_hinst, NULL);
+  if (!hwnd)
+    {
+      log_error_w32 (-1, "%s:%s: error creating main window",
+                     SRCNAME, __func__);
+      return;
+    }
+
+  /* Now attach it to the main thread.  */
+  if (!AttachThreadInput (GetCurrentThreadId (), other_tid,  TRUE))
+    log_error_w32 (-1, "%s:%s: AttachThreadInput failed",
+                   SRCNAME, __func__);
+  log_debug ("%s:%s: attached thread %lu to %lu", SRCNAME, __func__,
+             GetCurrentThreadId (), other_tid);
+}
+#endif /* not used.  */
+
 
 \f
 /* Helper for async_worker_thread.  Returns true if the item's handle
@@ -819,7 +867,8 @@ async_worker_thread (void *dummy)
   DWORD nbytes;
   HANDLE hdarray[MAXIMUM_WAIT_OBJECTS];
   int count, addit, any_ready, hdarraylen;
-
+  
+/*   attach_thread_input ( (DWORD)dummy ); */
   (void)dummy;
 
   for (;;)
@@ -874,6 +923,23 @@ async_worker_thread (void *dummy)
                    SRCNAME, __func__, count);
       else
         {
+          /* First process any window messages of this thread.  Do
+             this before wating so that the message queue is cleared
+             before waiting and we don't get stucked due to messages
+             not removed.  We need to process the message queue also
+             after the wait becuase we will only get to here if there
+             is actual ui-server work to be done but some messages
+             might still be in the queue.  */
+/*           { */
+/*             MSG msg; */
+
+/*             while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) */
+/*               { */
+/*                 TranslateMessage (&msg); */
+/*                 DispatchMessage (&msg); */
+/*               } */
+/*           } */
+
 /*           log_debug ("%s:%s: %d items in queue; waiting for %d items:",  */
 /*                      SRCNAME, __func__, count, hdarraylen-1); */
 /*           for (item = work_queue; item; item = item->next) */
@@ -883,6 +949,8 @@ async_worker_thread (void *dummy)
 /*                            SRCNAME, __func__, item->name, item->hd); */
 /*             } */
           n = WaitForMultipleObjects (hdarraylen, hdarray, FALSE, INFINITE);
+/*           n = MsgWaitForMultipleObjects (hdarraylen, hdarray, FALSE, */
+/*                                          INFINITE, QS_ALLEVENTS); */
           if (n == WAIT_FAILED)
             {
               log_error_w32 (-1, "%s:%s: WFMO failed", SRCNAME, __func__);
@@ -892,13 +960,28 @@ async_worker_thread (void *dummy)
             {
 /*               log_debug ("%s:%s: WFMO succeeded (res=%d)",SRCNAME,__func__, n); */
             }
+          else if (n == hdarraylen)
+            ; /* Message event.  */
           else
             {
               log_error ("%s:%s: WFMO returned: %d", SRCNAME, __func__, n);
               Sleep (1000);
             }
+
+          /* Try to process the message queue.  */
+/*           { */
+/*             MSG msg; */
+            
+/*             while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) */
+/*               { */
+/*                 TranslateMessage (&msg); */
+/*                 DispatchMessage (&msg); */
+/*               } */
+/*           } */
+
         }
 
+
       /* Handle completion status.  */
       EnterCriticalSection (&work_queue_lock);
 /*       log_debug ("%s:%s: checking completion states", SRCNAME, __func__); */
@@ -1227,7 +1310,7 @@ status_in_cb (void *opaque, const void *buffer, size_t size)
 
 
 
-/* Start an asynchronous command.  Caller gives up owenership of
+/* Start an asynchronous command.  Caller gives up ownership of
    CLD.  */
 static gpg_error_t
 start_command (assuan_context_t ctx, closure_data_t cld,
index ac733c4..81afa42 100644 (file)
@@ -41,7 +41,7 @@
                                        SRCNAME, __func__, __LINE__); \
                         } while (0)
 
-static int debug_filter = 0;
+static int debug_filter = 1;
 
 /* This variable indicates whether the assuan engine is used.  */
 static int use_assuan;
@@ -216,7 +216,7 @@ filter_gpgme_read_cb (void *handle, void *buffer, size_t size)
       if (filter->in.got_eof || filter->in.ready)
         {
           release_in_lock (filter, __func__);
-          if (debug_filter)
+         if (debug_filter)
             log_debug ("%s:%s: returning EOF\n", SRCNAME, __func__);
           return 0; /* Return EOF. */
         }
@@ -226,6 +226,7 @@ filter_gpgme_read_cb (void *handle, void *buffer, size_t size)
           errno = EAGAIN;
           if (debug_filter > 1)
             log_debug ("%s:%s: leave; result=EAGAIN\n", SRCNAME, __func__);
+          SwitchToThread ();
           return -1;
         }
       if (debug_filter)
index 98b87a9..54adbed 100644 (file)
@@ -75,16 +75,16 @@ static void add_menu (LPEXCHEXTCALLBACK eecb,
 
 
 /* Wrapper around UlRelease with error checking. */
-/* FIXME: Duplicated code.  */
 static void 
-ul_release (LPVOID punk)
+ul_release (LPVOID punk, const char *func, int lnr)
 {
   ULONG res;
   
   if (!punk)
     return;
   res = UlRelease (punk);
-//   log_debug ("%s UlRelease(%p) had %lu references\n", __func__, punk, res);
+  log_debug ("%s:%s:%d: UlRelease(%p) had %lu references\n", 
+             SRCNAME, func, lnr, punk, res);
 }
 
 
@@ -404,8 +404,8 @@ GpgolExtCommands::InstallCommands (
           xfree (key);
         }
       
-      ul_release (message);
-      ul_release (mdb);
+      ul_release (message, __func__, __LINE__);
+      ul_release (mdb, __func__, __LINE__);
     }
 
   /* Now install menu and toolbar items.  */
@@ -433,7 +433,7 @@ GpgolExtCommands::InstallCommands (
         _("&Display crypto information"), &m_nCmdShowInfo,
                 "@", NULL,
         opt.enable_debug? "Debug-1 (open_inspector)":"", &m_nCmdDebug1,
-        opt.enable_debug? "Debug-2 (n/a)":"", &m_nCmdDebug2,
+        opt.enable_debug? "Debug-2 (change msg class)":"", &m_nCmdDebug2,
         NULL);
     }
   else if (m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
@@ -525,6 +525,7 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
       DISPPARAMS dispparams;
       VARIANT aVariant;
       
+      log_debug ("%s:%s: command Close called\n", SRCNAME, __func__);
       pDisp = find_outlook_property (eecb, "Close", &dispid);
       if (pDisp)
         {
@@ -551,6 +552,9 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
           log_debug ("%s:%s: invoking Close failed: %#lx",
                      SRCNAME, __func__, hr);
         }
+      else
+        log_debug ("%s:%s: invoking Close failed: no Close method)",
+                   SRCNAME, __func__);
 
       message_wipe_body_cruft (eecb);
 
@@ -578,18 +582,20 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
   else if (nCommandID == m_nCmdDecrypt
            && m_lContext == EECONTEXT_READNOTEMESSAGE)
     {
+      log_debug ("%s:%s: command Decrypt called\n", SRCNAME, __func__);
       hr = eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
       if (SUCCEEDED (hr))
         {
           message_decrypt (message, m_pExchExt->getMsgtype (eecb), 1);
           message_display_handler (eecb, hwnd);
        }
-      ul_release (message);
-      ul_release (mdb);
+      ul_release (message, __func__, __LINE__);
+      ul_release (mdb, __func__, __LINE__);
     }
   else if (nCommandID == m_nCmdCheckSig
            && m_lContext == EECONTEXT_READNOTEMESSAGE)
     {
+      log_debug ("%s:%s: command CheckSig called\n", SRCNAME, __func__);
       hr = eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
       if (SUCCEEDED (hr))
         {
@@ -597,23 +603,25 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
        }
       else
         log_debug_w32 (hr, "%s:%s: CmdCheckSig failed", SRCNAME, __func__);
-      ul_release (message);
-      ul_release (mdb);
+      ul_release (message, __func__, __LINE__);
+      ul_release (mdb, __func__, __LINE__);
     }
   else if (nCommandID == m_nCmdShowInfo
            && m_lContext == EECONTEXT_READNOTEMESSAGE)
     {
+      log_debug ("%s:%s: command ShowInfo called\n", SRCNAME, __func__);
       hr = eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
       if (SUCCEEDED (hr))
         {
           message_show_info (message, hwnd);
        }
-      ul_release (message);
-      ul_release (mdb);
+      ul_release (message, __func__, __LINE__);
+      ul_release (mdb, __func__, __LINE__);
     }
   else if (nCommandID == m_nCmdProtoAuto
            && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
     {
+      log_debug ("%s:%s: command ProtoAuto called\n", SRCNAME, __func__);
       check_menu (eecb, m_nCmdProtoAuto, TRUE);
       check_menu (eecb, m_nCmdProtoPgpmime, FALSE);
       check_menu (eecb, m_nCmdProtoSmime, FALSE);
@@ -622,6 +630,7 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
   else if (nCommandID == m_nCmdProtoPgpmime
            && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
     {
+      log_debug ("%s:%s: command ProroPggmime called\n", SRCNAME, __func__);
       check_menu (eecb, m_nCmdProtoAuto, FALSE);
       check_menu (eecb, m_nCmdProtoPgpmime, TRUE);
       check_menu (eecb, m_nCmdProtoSmime, FALSE);
@@ -630,6 +639,7 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
   else if (nCommandID == m_nCmdProtoSmime
            && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
     {
+      log_debug ("%s:%s: command ProtoSmime called\n", SRCNAME, __func__);
       if (opt.enable_smime)
         {
           check_menu (eecb, m_nCmdProtoAuto, FALSE);
@@ -641,18 +651,21 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
   else if (nCommandID == m_nCmdEncrypt
            && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
     {
+      log_debug ("%s:%s: command Encrypt called\n", SRCNAME, __func__);
       m_pExchExt->m_gpgEncrypt = !m_pExchExt->m_gpgEncrypt;
       check_menu (eecb, m_nCmdEncrypt, m_pExchExt->m_gpgEncrypt);
     }
-    else if (nCommandID == m_nCmdSign
+  else if (nCommandID == m_nCmdSign
            && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
     {
+      log_debug ("%s:%s: command Sign called\n", SRCNAME, __func__);
       m_pExchExt->m_gpgSign = !m_pExchExt->m_gpgSign;
       check_menu (eecb, m_nCmdSign, m_pExchExt->m_gpgSign);
     }
   else if (nCommandID == m_nCmdKeyManager
            && m_lContext == EECONTEXT_VIEWER)
     {
+      log_debug ("%s:%s: command KeyManager called\n", SRCNAME, __func__);
       if (engine_start_keymanager ())
         if (start_key_manager ())
           MessageBox (NULL, _("Could not start certificate manager"),
@@ -661,17 +674,36 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
   else if (opt.enable_debug && nCommandID == m_nCmdDebug1
            && m_lContext == EECONTEXT_READNOTEMESSAGE)
     {
+      log_debug ("%s:%s: command Debug1 (open inspector) called\n",
+                 SRCNAME, __func__);
       hr = eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
       if (SUCCEEDED (hr))
         {
           open_inspector (eecb, message);
        }
-      ul_release (message);
-      ul_release (mdb);
+      ul_release (message, __func__, __LINE__);
+      ul_release (mdb, __func__, __LINE__);
 
     }
+  else if (opt.enable_debug && nCommandID == m_nCmdDebug2
+           && m_lContext == EECONTEXT_READNOTEMESSAGE)
+    {
+      log_debug ("%s:%s: command Debug2 (change message class) called\n", 
+                 SRCNAME, __func__);
+      hr = eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
+      if (SUCCEEDED (hr))
+        {
+          mapi_change_message_class (message);
+       }
+      ul_release (message, __func__, __LINE__);
+      ul_release (mdb, __func__, __LINE__);
+    }
   else
-    return S_FALSE; /* Pass on unknown command. */
+    {
+      log_debug ("%s:%s: command passed on\n", SRCNAME, __func__);
+      return S_FALSE; /* Pass on unknown command. */
+    }
+  
 
   return S_OK; 
 }
index b84bf7f..af87d00 100644 (file)
@@ -360,6 +360,7 @@ get_msgcls_from_pgp_lines (LPMESSAGE message)
   LPSTREAM stream;
   STATSTG statInfo;
   ULONG nread;
+  size_t nbytes;
   char *body = NULL;
   char *p;
   char *msgcls = NULL;
@@ -405,11 +406,13 @@ get_msgcls_from_pgp_lines (LPMESSAGE message)
           return NULL;
         }
       
-      /* Fixme: We might want to read only the first 1k to decide
-         whether this is actually an OpenPGP message and only then
-         continue reading.  */
-      body = (char*)xmalloc ((size_t)statInfo.cbSize.QuadPart + 2);
-      hr = stream->Read (body, (size_t)statInfo.cbSize.QuadPart, &nread);
+      /* We read only the first 1k to decide whether this is actually
+         an OpenPGP armored message .  */
+      nbytes = (size_t)statInfo.cbSize.QuadPart;
+      if (nbytes > 1024*2)
+        nbytes = 1024*2;
+      body = (char*)xmalloc (nbytes + 2);
+      hr = stream->Read (body, nbytes, &nread);
       if (hr)
         {
           log_debug ("%s:%s: Read failed: hr=%#lx", SRCNAME, __func__, hr);
@@ -428,8 +431,6 @@ get_msgcls_from_pgp_lines (LPMESSAGE message)
         }
       stream->Release ();
       
-      /* FIXME: We might want to avoid this by directly comparing
-         against wchar_t.  */
       {
         char *tmp;
         tmp = wchar_to_utf8 ((wchar_t*)body);
@@ -443,27 +444,22 @@ get_msgcls_from_pgp_lines (LPMESSAGE message)
       }
     }
 
-  /* The entire body of the message is now availble in the utf-8
-     string BODY.  Walk over it to figure out its type.  */
-  /* FiXME: We should use a state machine to check whether this is
-     really a valid PGP MIME message and possible even check that
-     there there is no other text before or after the signed text.  */
+  /* The first ~1k of the body of the message is now availble in the
+     utf-8 string BODY.  Walk over it to figure out its type.  */
   for (p=body; p && *p; p = (p=strchr (p+1, '\n')? (p+1):NULL))
     if (!strncmp (p, "-----BEGIN PGP ", 15))
       {
         if (!strncmp (p+15, "SIGNED MESSAGE-----", 19)
             && trailing_ws_p (p+15+19))
-          {
-            msgcls = xstrdup ("IPM.Note.GpgOL.ClearSigned");
-            break;
-          }
+          msgcls = xstrdup ("IPM.Note.GpgOL.ClearSigned");
         else if (!strncmp (p+15, "MESSAGE-----", 12)
                  && trailing_ws_p (p+15+12))
-          {
-            msgcls = xstrdup ("IPM.Note.GpgOL.PGPMessage");
-            break;
-          }
+          msgcls = xstrdup ("IPM.Note.GpgOL.PGPMessage");
+        break;
       }
+    else if (!trailing_ws_p (p))
+      break;  /* Text before the PGP message - don't take this as a
+                 proper message.  */
          
   xfree (body);
   return msgcls;
@@ -570,13 +566,50 @@ mapi_change_message_class (LPMESSAGE message)
         {
           /* This is "IPM.Note.SMIME.foo" (where ".foo" is optional
              but the previous condition has already taken care of
-             this.  Note that we can't just insert a new part and keep
-             the SMIME; we need to change the SMIME part of the class
-             name so that Outlook does not proxcess it as an SMIME
-             message. */
+             this).  Note that we can't just insert a new part and
+             keep the SMIME; we need to change the SMIME part of the
+             class name so that Outlook does not process it as an
+             SMIME message. */
           newvalue = (char*)xmalloc (strlen (s) + 1);
           strcpy (stpcpy (newvalue, "IPM.Note.GpgOL"), s+14);
         }
+      else if (opt.enable_smime && !strcmp (s, "IPM.Note.Secure.CexSig"))
+        {
+          /* This is a CryptoEx generated signature. */
+          char *ct, *smtype;
+
+          ct = mapi_get_message_content_type (message, NULL, &smtype);
+          if (!ct)
+            log_debug ("%s:%s: message has no content type", 
+                       SRCNAME, __func__);
+          else
+            {
+              log_debug ("%s:%s: content type is '%s'", 
+                         SRCNAME, __func__, ct);
+              if (smtype)
+                {
+                  log_debug ("%s:%s:   smime-type is '%s'", 
+                             SRCNAME, __func__, smtype);
+              
+                  if (!strcmp (ct, "application/pkcs7-mime")
+                      || !strcmp (ct, "application/x-pkcs7-mime"))
+                    {
+                      if (!strcmp (smtype, "signed-data"))
+                        newvalue = xstrdup ("IPM.Note.GpgOL.OpaqueSigned");
+                      else if (!strcmp (smtype, "enveloped-data"))
+                        newvalue = xstrdup ("IPM.Note.GpgOL.OpaqueEncrypted");
+                    }
+                  else if (!strcmp (ct, "application/pkcs7-signature"))
+                    {
+                      newvalue = xstrdup ("IPM.Note.GpgOL.MultipartSigned");
+                    }
+                  xfree (smtype);
+                }
+              xfree (ct);
+            }
+          if (!newvalue)
+            newvalue = xstrdup ("IPM.Note.GpgOL");
+        }
     }
   MAPIFreeBuffer (propval);
   if (!newvalue)
@@ -691,6 +724,8 @@ mapi_get_message_type (LPMESSAGE message)
             log_debug ("%s:%s: message class `%s' not supported",
                        SRCNAME, __func__, s-14);
         }
+      else if (!strncmp (s, "IPM.Note.SMIME", 14) && (!s[14] || s[14] =='.'))
+        msgtype = MSGTYPE_SMIME;
     }
   MAPIFreeBuffer (propval);
   return msgtype;
index 858276b..abf6789 100644 (file)
@@ -31,6 +31,7 @@ extern "C" {
 typedef enum 
   {
     MSGTYPE_UNKNOWN = 0,
+    MSGTYPE_SMIME,         /* Original SMIME class. */
     MSGTYPE_GPGOL,
     MSGTYPE_GPGOL_MULTIPART_SIGNED,
     MSGTYPE_GPGOL_MULTIPART_ENCRYPTED,
index 1ae3a83..cd5028a 100644 (file)
 
 
 /* Wrapper around UlRelease with error checking. */
-/* FIXME: Duplicated code.  */
 static void 
-ul_release (LPVOID punk)
+ul_release (LPVOID punk, const char *func, int lnr)
 {
   ULONG res;
   
   if (!punk)
     return;
   res = UlRelease (punk);
-//   log_debug ("%s UlRelease(%p) had %lu references\n", __func__, punk, res);
+  log_debug ("%s:%s:%d: UlRelease(%p) had %lu references\n", 
+             SRCNAME, func, lnr, punk, res);
 }
 
 
@@ -114,8 +114,8 @@ GpgolMessageEvents::OnRead (LPEXCHEXTCALLBACK eecb)
       eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
       if (message_incoming_handler (message, m_pExchExt->getMsgtype (eecb)))
         m_processed = true;
-      ul_release (message);
-      ul_release (mdb);
+      ul_release (message, __func__, __LINE__);
+      ul_release (mdb, __func__, __LINE__);
     }
   
   return S_FALSE;
@@ -131,7 +131,7 @@ GpgolMessageEvents::OnReadComplete (LPEXCHEXTCALLBACK eecb, ULONG flags)
   log_debug ("%s:%s: received; flags=%#lx m_processed=%d\n",
              SRCNAME, __func__, flags, m_processed);
 
-  /* If the message has been processed by is (i.e. in OnRead), we now
+  /* If the message has been processed by us (i.e. in OnRead), we now
      use our own display code.  */
   if (!flags && m_processed)
     {
@@ -288,8 +288,8 @@ GpgolMessageEvents::OnWriteComplete (LPEXCHEXTCALLBACK eecb, ULONG flags)
         }
     }
   
-  ul_release (msg);
-  ul_release (pMDB);
+  ul_release (msg, __func__, __LINE__);
+  ul_release (pMDB, __func__, __LINE__);
   
   return hrReturn;
 }
@@ -334,8 +334,7 @@ GpgolMessageEvents::OnSubmit (LPEXCHEXTCALLBACK eecb)
 /* Called by Exchange after the message has been submitted to MAPI.
    EECB is a pointer to the IExchExtCallback interface. */
 STDMETHODIMP_ (VOID) 
-GpgolMessageEvents::OnSubmitComplete (LPEXCHEXTCALLBACK eecb,
-                                            ULONG flags)
+GpgolMessageEvents::OnSubmitComplete (LPEXCHEXTCALLBACK eecb, ULONG flags)
 {
   log_debug ("%s:%s: received\n", SRCNAME, __func__);
   m_bOnSubmitActive = FALSE; 
index adf75ad..a6eae5d 100644 (file)
 
 
 static void 
-ul_release (LPVOID punk)
+ul_release (LPVOID punk, const char *func)
 {
   ULONG res;
   
   if (!punk)
     return;
   res = UlRelease (punk);
-//   log_debug ("%s UlRelease(%p) had %lu references\n", __func__, punk, res);
+  log_debug ("%s:%s: UlRelease(%p) had %lu references\n", 
+             SRCNAME, func, punk, res);
 }
 
 
@@ -59,6 +60,26 @@ message_incoming_handler (LPMESSAGE message, msgtype_t msgtype)
   switch (msgtype)
     {
     case MSGTYPE_UNKNOWN: 
+      /* If this message has never passed our change message class
+         code it won't have an unknown msgtype _and_ no sig status
+         flag.  Thus we look at the message class now and change it if
+         required.  It won't get displayed correctly right away but a
+         latter decrypt command or when viewd a second time all has
+         been set.  */
+      if (!mapi_has_sig_status (message))
+        {
+          log_debug ("%s:%s: message class not yet checked - doing now\n",
+                     SRCNAME, __func__);
+          mapi_change_message_class (message);
+        }
+      break;
+    case MSGTYPE_SMIME:
+      if (opt.enable_smime)
+        {
+          log_debug ("%s:%s: message class not checked with smime enabled "
+                     "- doing now\n", SRCNAME, __func__);
+          mapi_change_message_class (message);
+        }
       break;
     case MSGTYPE_GPGOL:
       log_debug ("%s:%s: ignoring unknown message of original SMIME class\n",
@@ -137,8 +158,8 @@ message_display_handler (LPEXCHEXTCALLBACK eecb, HWND hwnd)
   else
     log_debug_w32 (hr, "%s:%s: error getting message", SRCNAME, __func__);
 
-  ul_release (message);
-  ul_release (mdb);
+  ul_release (message, __func__);
+  ul_release (mdb, __func__);
 
   return !!wasprotected;
 }
@@ -197,8 +218,8 @@ message_wipe_body_cruft (LPEXCHEXTCALLBACK eecb)
         log_debug_w32 (hr, "%s:%s: error getting message", 
                        SRCNAME, __func__);
      
-      ul_release (message);
-      ul_release (mdb);
+      ul_release (message, __func__);
+      ul_release (mdb, __func__);
     }
 }
 
@@ -444,6 +465,7 @@ message_verify (LPMESSAGE message, msgtype_t msgtype, int force)
     case MSGTYPE_GPGOL_PGP_MESSAGE:
       return -1; /* Should not be called for such a message.  */
     case MSGTYPE_UNKNOWN:
+    case MSGTYPE_SMIME:
     case MSGTYPE_GPGOL:
       return 0; /* Nothing to do.  */
     }
@@ -554,6 +576,7 @@ message_decrypt (LPMESSAGE message, msgtype_t msgtype, int force)
   switch (msgtype)
     {
     case MSGTYPE_UNKNOWN:
+    case MSGTYPE_SMIME:
     case MSGTYPE_GPGOL:
     case MSGTYPE_GPGOL_OPAQUE_SIGNED:
     case MSGTYPE_GPGOL_MULTIPART_SIGNED:
index cfd5eed..252f5cd 100644 (file)
@@ -19,7 +19,7 @@
 
 /* Due to some peculiarities of Outlook 2003 and possible also earlier
    versions we need fixup the text of a reply before editing starts.
-   This is done using the Echache extension mechanism and this module
+   This is done using the Exchange extension mechanism and this module
    provides the means of caching and locating messages.  To be exact,
    we don't cache entire messages but just the plaintext after
    decryption.
index 7d567e1..1dc952c 100644 (file)
@@ -95,16 +95,16 @@ ext_context_name (unsigned long no)
 
 
 /* Wrapper around UlRelease with error checking. */
-/* FIXME: Duplicated code.  */
 static void 
-ul_release (LPVOID punk)
+ul_release (LPVOID punk, const char *func)
 {
   ULONG res;
   
   if (!punk)
     return;
   res = UlRelease (punk);
-//   log_debug ("%s UlRelease(%p) had %lu references\n", __func__, punk, res);
+  log_debug ("%s:%s: UlRelease(%p) had %lu references\n", 
+             SRCNAME, func, punk, res);
 }
 
 
@@ -332,7 +332,7 @@ GpgolExt::~GpgolExt (void)
     
 //   if (m_pOutlookExtItemEvents)
 //     m_pOutlookExtItemEvents->Release ();
-
+  
   if (m_lContext == EECONTEXT_SESSION)
     {
       if (g_initdll)
@@ -536,8 +536,8 @@ GpgolExt::getMsgtype (LPEXCHEXTCALLBACK eecb)
   log_debug ("%s:%s: found msgtype %d\n", SRCNAME, __func__, msgtype);
   msgtype_valid = TRUE;
 
-  ul_release (message);
-  ul_release (mdb);
+  ul_release (message, __func__);
+  ul_release (mdb, __func__);
 
   return msgtype;
 }
index b52d0ff..ef6b8a5 100644 (file)
@@ -110,7 +110,12 @@ GpgolUserEvents::OnSelectionChange (LPEXCHEXTCALLBACK eecb)
       if (SUCCEEDED(hr) && objtype == MAPI_MESSAGE)
         {
           log_debug ("%s:%s: message class: %s\n",
-            SRCNAME, __func__, msgclass);
+                     SRCNAME, __func__, msgclass);
+        }
+      else if (SUCCEEDED(hr) && objtype == MAPI_FOLDER)
+        {
+          log_debug ("%s:%s: objtype: %lu\n",
+                     SRCNAME, __func__, objtype);
         }
     }