Fixes.
authorWerner Koch <wk@gnupg.org>
Mon, 12 Nov 2007 14:19:00 +0000 (14:19 +0000)
committerWerner Koch <wk@gnupg.org>
Mon, 12 Nov 2007 14:19:00 +0000 (14:19 +0000)
25 files changed:
AUTHORS
ChangeLog
NEWS
TODO
configure.ac
doc/gpgol.texi
src/ChangeLog
src/Makefile.am
src/common.h
src/dialogs.h
src/dialogs.rc
src/ext-commands.cpp
src/ext-commands.h
src/item-events.cpp
src/main.c
src/mapihelp.cpp
src/mapihelp.h
src/message-events.cpp
src/message.cpp
src/message.h
src/mimeparser.c
src/olflange-dlgs.cpp
src/olflange.cpp
src/olflange.h
src/util.h

diff --git a/AUTHORS b/AUTHORS
index 990eb3d..42fd3a6 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,6 +1,7 @@
 Package: gpgol\r
 Contact: info-gpgol@g10code.com\r
 Bugs:    bug-gpgol@g10code.com\r
+License: LGPLv2.1+\r
 \r
 \r
 g10 Code GmbH \r
index a348290..70d5ccf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2007-10-22  Werner Koch  <wk@g10code.com>
+
+       Released 0.10.1 development version.
+
 2007-10-12  Werner Koch  <wk@g10code.com>
 
        * po/POTFILES.in: Add more files.
diff --git a/NEWS b/NEWS
index 1c9efc6..d1e9c5d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,11 +1,16 @@
-Noteworthy changes for version 0.10.1 (2007-10-22)
+Noteworthy changes for version 0.10.2
 ==================================================
 
  UNDER HEAVY DEVELOPMENT - DO NOT USE FOR PRODUCTION!
 
-    - Signed and encrypt has not yet been implemented
     - Under OL2007 some menu entries are missing.
 
+ * New menu items to select the default protocol.
+
+
+Noteworthy changes for version 0.10.1 (2007-10-22)
+==================================================
+
  * Auto start the server.
 
  * Code cleanups. 
diff --git a/TODO b/TODO
index 682054b..aca8fd1 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,6 +1,3 @@
-* inline PGG versenden wir als UTF-8. Andere aber wohl als Latin-1.
-  Heuristic implementieren. 
-
 * Show more details in case of some errors.
   For example 'No Secret Key' should contain the key-ID
   and if possible the primary user-ID.
 
 * Allow for symmetric encryption.
 
-* Please consider adding a few more options like key singing rules
+* Please consider adding a few more options like key signing rules
   like Enigmail has.
 
-* We should not rite a decrupted file without user content.  A
-  possible solution in attach-file-events.c is to keep tarck of
-  prensented file names and decrypt them only on OpenSzFile.  Need to
+* We should not write a decrypted file without user consent.  A
+  possible solution in attach-file-events.c is to keep track of
+  presented file names and decrypt them only on OpenSzFile.  Need to
   get some documentaion first.
 
index f5c1ba3..aee2fe3 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.1])
-m4_define([my_issvn], [no])
+m4_define([my_version], [0.10.2])
+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 cd6ed36..33826f7 100644 (file)
@@ -113,7 +113,11 @@ Indices
 @c
 @node Introduction
 @chapter Introduction
-Bla bla
+
+To debug GpgOL you should set the Registry entry
+@code{HKCU\Software\Gnu\GnuPG:enableDebug} to the string value @code{1}.
+This allows easy setting of a debug file by using the extended options
+menu and enables a few extra menu items.
 
 
 @c
@@ -585,6 +589,12 @@ This binary property is used to store the initialization vector of an
 re-encrypted attachment.  The existence of this property indicates that
 the attachment has been encrypted under the non-permanent session key.
 
+@item GpgOL Last Decrypted
+This binary property is used on the message to save a session marker to
+tell GpgOL whether the message as already been decrypted.  If this
+property does not exists or the session marker does not macth the one of
+the current session, GpgOL needs to decrypt it again.
+
 @item GpgOL MIME Info
 This property is of type STRING8 and used to store the MIME structure of
 the orginal message.  The content are lines of colon delimited fields.
@@ -626,6 +636,30 @@ it is required that all verbatim dollar are too be doubled.  If the
 actual program name contains spaces the program name nees to be enclosed
 in quotes.
 
+@item HKCU\Software\Gnu\GnuPG:enableDebug
+Setting this key to the string @code{1} enables a few extra features in
+the UI, useful only for debugging.
+
+@itemx HKCU\Software\Gnu\GnuPG:logFile
+If the value is not empty, GpgOL takes this as a log file and appends
+debug information to this file.  The file may get very large.
+
+@itemx HKCU\Software\Gnu\GnuPG:compatFlags
+This is a string consisting of @code{0} and @code{1} to enable certain
+compatibility flags.  Not generally useful; use the source for a
+description.
+
+@item HKCU\Software\Gnu\GnuPG:enableSmime   
+@itemx HKCU\Software\Gnu\GnuPG:defaultProtocol
+@itemx HKCU\Software\Gnu\GnuPG:encryptDefault
+@itemx HKCU\Software\Gnu\GnuPG:signDefault   
+@itemx HKCU\Software\Gnu\GnuPG:previewDecrypt
+@itemx HKCU\Software\Gnu\GnuPG:storePasswdTime
+@itemx HKCU\Software\Gnu\GnuPG:encodingFormat 
+@itemx HKCU\Software\Gnu\GnuPG:defaultKey   
+@itemx HKCU\Software\Gnu\GnuPG:enableDefaultKey
+@itemx HKCU\Software\Gnu\GnuPG:preferHtml 
+These registry keys store the values from the configuration dialog.
 
 @end table
 
index c98a3a7..938f1bc 100644 (file)
@@ -1,3 +1,37 @@
+2007-11-12  Werner Koch  <wk@g10code.com>
+
+       * olflange.h (class GpgolExt): Rename m_gpgSelectSmime to
+       m_protoSelection.
+       * message-events.cpp (OnWriteComplete): Use it accordingly.
+       * main.c (write_options, read_options): Load and save it.
+       * dialogs.rc: Add new check box for OpenPGP default protocol.
+       * olflange-dlgs.cpp (GPGOptionsDlgProc): Adjust for above chnages.
+
+2007-11-09  Werner Koch  <wk@g10code.com>
+
+       * main.c (read_options): New option ENABLE_DEBUG to be enabled
+       only using the Registry.
+       (read_options): Show warning for certain option combinations.
+       * olflange-dlgs.cpp (GPGOptionsDlgProc): Hide the Advanced options
+       button unless in debug mode.
+
+       * mapihelp.cpp (get_gpgollastdecrypted_tag): New.
+       (mapi_test_last_decrypted): New.
+       (mapi_has_last_decrypted): new.
+       * mimeparser.c (finish_message): Update the Last Decrypted property.
+       * message.cpp (message_decrypt): Use it here.
+       (message_wipe_body_cruft): New.
+
+       * main.c (do_log_window_hierarchy): Factor some code out to ..
+       (do_log_window_info): .. this.
+       (log_window_hierarchy): Log parent window info.
+       (get_64bit_session_marker): New.
+       (initialize_session_key): Init session marker.
+
+       * Makefile.am (gpgol_SOURCES): Remove item-events.cpp 
+       * olflange.cpp (GpgolExt): Disable the GpgOLItemEvents as they can
+       only be used with the undocumented ECF file.
+
 2007-10-29  Werner Koch  <wk@g10code.com>
 
        * mimemaker.c (create_top_signing_header): Add arg FIRST.
index 641f72b..af004ad 100644 (file)
 
 ## Process this file with automake to produce Makefile.in
 
+unused_sources = item-events.cpp 
+
 bin_PROGRAMS = gpgol 
-EXTRA_DIST = versioninfo.rc.in mapi32.def \
+EXTRA_DIST = versioninfo.rc.in mapi32.def $(unused_sources) \
             logo.bmp decrypt.bmp encrypt.bmp sign.bmp key_mana.bmp 
 
 EXEEXT = .dll
@@ -55,7 +57,7 @@ gpgol_SOURCES = \
        message-events.cpp  message-events.h  \
        attached-file-events.cpp attached-file-events.h \
        property-sheets.cpp property-sheets.h \
-       item-events.cpp item-events.h         \
+       item-events.h         \
        ol-ext-callback.cpp ol-ext-callback.h \
        w32-gettext.c w32-gettext.h 
 
index 5357b21..1f921e4 100644 (file)
@@ -105,11 +105,12 @@ extern
 #endif
 struct 
 {
+  int enable_debug;         /* Enable extra debug options. */
+  int enable_smime;         /* Enable S/MIME support. */
   int passwd_ttl;            /* Time in seconds the passphrase is stored. */
-  int smime_default;         /* Use S/MIME by default. */
+  protocol_t default_protocol;/* The default protocol. */
   int encrypt_default;       /* Encrypt by default. */
   int sign_default;          /* Sign by default. */
-  int enable_smime;         /* Enable S/MIME support. */
   int enc_format;            /* Encryption format for attachments. */
   char *default_key;         /* The key we want to always encrypt to. */
   int enable_default_key;    /* Enable the use of DEFAULT_KEY. */
index 1d3865b..b9e8a7c 100644 (file)
 #define IDC_ENCRYPT_DEFAULT             4011
 #define IDC_SIGN_DEFAULT                4012
 #define IDC_ENCRYPT_WITH_STANDARD_KEY   4013
-#define IDC_SMIME_DEFAULT               4014
-#define IDC_GPG_OPTIONS                 4015
-#define IDC_BITMAP                      4016
-#define IDC_VERSION_INFO                4017
-#define IDC_ENCRYPT_TO                  4018
-#define IDC_ENABLE_SMIME                4019
-#define IDC_PREVIEW_DECRYPT             4020
-#define IDC_PREFER_HTML                 4021
-#define IDC_G_OPTIONS                   4022
-#define IDC_G_PASSPHRASE                4023
-#define IDC_T_PASSPHRASE_TTL            4024
-#define IDC_T_PASSPHRASE_MIN            4025
+#define IDC_OPENPGP_DEFAULT             4014
+#define IDC_SMIME_DEFAULT               4015
+#define IDC_GPG_OPTIONS                 4016
+#define IDC_BITMAP                      4017
+#define IDC_VERSION_INFO                4018
+#define IDC_ENCRYPT_TO                  4019
+#define IDC_ENABLE_SMIME                4020
+#define IDC_PREVIEW_DECRYPT             4021
+#define IDC_PREFER_HTML                 4022
+#define IDC_G_OPTIONS                   4023
+#define IDC_G_PASSPHRASE                4024
+#define IDC_T_PASSPHRASE_TTL            4025
+#define IDC_T_PASSPHRASE_MIN            4026
 
 
 /* Ids for the extended options dialog.  */
index 7ae965b..93877dd 100644 (file)
@@ -37,7 +37,7 @@ FONT 8, "MS Sans Serif"
 BEGIN
     /* Options box.  */
     GROUPBOX        "options", IDC_G_OPTIONS,
-                    9, 9, 242, 112
+                    9, 9, 242, 124
 
     CONTROL         "encrypt-by-default", IDC_ENCRYPT_DEFAULT,
                     "Button", BS_AUTOCHECKBOX | WS_TABSTOP,
@@ -47,61 +47,65 @@ BEGIN
                     "Button", BS_AUTOCHECKBOX | WS_TABSTOP,
                     24, 30, 215, 10
 
-    CONTROL         "smime-by-default", IDC_SMIME_DEFAULT,
+    CONTROL         "openpgp-by-default", IDC_OPENPGP_DEFAULT,
                     "Button", BS_AUTOCHECKBOX | WS_TABSTOP,
                     24, 42, 215, 10
 
-    CONTROL         "enable-smime", IDC_ENABLE_SMIME,
+    CONTROL         "smime-by-default", IDC_SMIME_DEFAULT,
                     "Button", BS_AUTOCHECKBOX | WS_TABSTOP,
                     24, 54, 215, 10
 
+    CONTROL         "enable-smime", IDC_ENABLE_SMIME,
+                    "Button", BS_AUTOCHECKBOX | WS_TABSTOP,
+                    24, 66, 215, 10
+
     CONTROL         "encrypt-to", IDC_ENCRYPT_WITH_STANDARD_KEY,
                     "Button", BS_AUTOCHECKBOX | WS_TABSTOP,
-                    24, 67, 215, 10
+                    24, 79, 215, 10
 
     EDITTEXT        IDC_ENCRYPT_TO, 
-                    36, 79, 133, 12, ES_AUTOHSCROLL
+                    36, 91, 133, 12, ES_AUTOHSCROLL
 
     CONTROL         "preview-decrypt", IDC_PREVIEW_DECRYPT,
                     "Button", BS_AUTOCHECKBOX | WS_TABSTOP,
-                    24, 95, 215, 10
+                    24, 107, 215, 10
 
     CONTROL         "prefer-html", IDC_PREFER_HTML,
                     "Button", BS_AUTOCHECKBOX | WS_TABSTOP,
-                    24, 107, 215, 10
+                    24, 119, 215, 10
  
     /* Passphrase option box.  */
     GROUPBOX        "Passphrase", IDC_G_PASSPHRASE,
-                    9, 124, 242, 31
+                    9, 136, 242, 31
 
     LTEXT           "passphrase-ttl", IDC_T_PASSPHRASE_TTL,
-                     24, 136, 80, 8
+                     24, 148, 80, 8
 
     EDITTEXT        IDC_TIME_PHRASES,
-                    107, 135, 39, 14, ES_AUTOHSCROLL
+                    107, 147, 39, 14, ES_AUTOHSCROLL
 
     LTEXT           "minutes", IDC_T_PASSPHRASE_MIN,
-                    151, 137, 50, 8
+                    151, 149, 50, 8
 
     /* Stuff below the group boxes.  */
     PUSHBUTTON      "advanced", IDC_GPG_OPTIONS,
-                    202, 166, 50, 14
+                    202, 178, 50, 14
 
     LTEXT           "GpgOL by g10 Code GmbH", IDC_STATIC, 
-                      8, 185, 100, 8
+                      8, 197, 100, 8
     LTEXT           "Version x ", IDC_VERSION_INFO,
-                    150, 185, 109, 9
+                    150, 197, 109, 9
 
     CONTROL         IDB_BANNER, IDC_BITMAP,
                     "Static", SS_BITMAP | SS_REALSIZEIMAGE,
-                      8, 200, 150, 64
+                      8, 212, 150, 64
 END
 
 
 
 IDD_EXT_OPTIONS DIALOG DISCARDABLE  0, 0, 167, 119
 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
-CAPTION "GpgOL - Extended Options"
+CAPTION "GpgOL - Extended Options (debug only!)"
 FONT 8, "MS Sans Serif"
 BEGIN
     LTEXT           "keyman", IDC_T_OPT_KEYMAN_PATH,
index 43b9575..926887f 100644 (file)
@@ -64,7 +64,7 @@ static HBITMAP my_check_bitmap, my_uncheck_bitmap;
 
 
 
-static void add_menu (LPEXCHEXTCALLBACK pEECB
+static void add_menu (LPEXCHEXTCALLBACK eecb
                       UINT FAR *pnCommandIDBase, ...)
 #if __GNUC__ >= 4 
                                __attribute__ ((sentinel))
@@ -97,7 +97,9 @@ GpgolExtCommands::GpgolExtCommands (GpgolExt* pParentInterface)
   m_pExchExt = pParentInterface; 
   m_lRef = 0; 
   m_lContext = 0; 
-  m_nCmdSelectSmime = 0;
+  m_nCmdProtoAuto = 0;
+  m_nCmdProtoPgpmime = 0;
+  m_nCmdProtoSmime = 0;
   m_nCmdEncrypt = 0;  
   m_nCmdDecrypt = 0;  
   m_nCmdSign = 0; 
@@ -144,20 +146,23 @@ GpgolExtCommands::QueryInterface (REFIID riid, LPVOID FAR * ppvObj)
 
 
 /* Add a new menu.  The variable entries are made up of pairs of
-   strings and UINT *.  A NULL is used to terminate this list. An empty
-   string is translated to a separator menu item. */
+   strings and UINT *.  A NULL is used to terminate this list.  An
+   empty string is translated to a separator menu item.  One level of
+   submenus are supported. */
 static void
-add_menu (LPEXCHEXTCALLBACK pEECB, UINT FAR *pnCommandIDBase, ...)
+add_menu (LPEXCHEXTCALLBACK eecb, UINT FAR *pnCommandIDBase, ...)
 {
   va_list arg_ptr;
-  HMENU menu;
+  HMENU mainmenu, submenu, menu;
   const char *string;
   UINT *cmdptr;
   
   va_start (arg_ptr, pnCommandIDBase);
   /* We put all new entries into the tools menu.  To make this work we
      need to pass the id of an existing item from that menu.  */
-  pEECB->GetMenuPos (EECMDID_ToolsCustomizeToolbar, &menu, NULL, NULL, 0);
+  eecb->GetMenuPos (EECMDID_ToolsCustomizeToolbar, &mainmenu, NULL, NULL, 0);
+  menu = mainmenu;
+  submenu = NULL;
   while ( (string = va_arg (arg_ptr, const char *)) )
     {
       cmdptr = va_arg (arg_ptr, UINT*);
@@ -166,11 +171,23 @@ add_menu (LPEXCHEXTCALLBACK pEECB, UINT FAR *pnCommandIDBase, ...)
         ; /* Ignore this entry.  */
       else if (*string == '@' && !string[1])
         AppendMenu (menu, MF_SEPARATOR, 0, NULL);
+      else if (*string == '>')
+        {
+          submenu = CreatePopupMenu ();
+          AppendMenu (menu, MF_STRING|MF_POPUP, (UINT_PTR)submenu, string+1);
+          menu = submenu;
+        }
+      else if (*string == '<')
+        {
+          menu = mainmenu;
+          submenu = NULL;
+        }
       else
        {
           AppendMenu (menu, MF_STRING, *pnCommandIDBase, string);
-//           SetMenuItemBitmaps (menu, *pnCommandIDBase, MF_BYCOMMAND,
-//                                    my_uncheck_bitmap, my_check_bitmap);
+          if (menu == submenu)
+            SetMenuItemBitmaps (menu, *pnCommandIDBase, MF_BYCOMMAND,
+                                my_uncheck_bitmap, my_check_bitmap);
           if (cmdptr)
             *cmdptr = *pnCommandIDBase;
           (*pnCommandIDBase)++;
@@ -181,11 +198,13 @@ add_menu (LPEXCHEXTCALLBACK pEECB, UINT FAR *pnCommandIDBase, ...)
 
 
 static void
-check_menu (LPEXCHEXTCALLBACK pEECB, UINT menu_id, int checked)
+check_menu (LPEXCHEXTCALLBACK eecb, UINT menu_id, int checked)
 {
   HMENU menu;
-  
-  pEECB->GetMenuPos (EECMDID_ToolsCustomizeToolbar, &menu, NULL, NULL, 0);
+
+  eecb->GetMenuPos (EECMDID_ToolsCustomizeToolbar, &menu, NULL, NULL, 0);
+  log_debug ("check_menu: eecb=%p menu_id=%u checked=%d -> menu=%p\n", 
+             eecb, menu_id, checked, menu);
   CheckMenuItem (menu, menu_id, 
                  MF_BYCOMMAND | (checked?MF_CHECKED:MF_UNCHECKED));
 }
@@ -255,7 +274,7 @@ GpgolExtCommands::add_toolbar (LPTBENTRY tbearr, UINT n_tbearr, ...)
    S_FALSE to signal Exchange to continue calling extensions. */
 STDMETHODIMP 
 GpgolExtCommands::InstallCommands (
-       LPEXCHEXTCALLBACK pEECB, // The Exchange Callback Interface.
+       LPEXCHEXTCALLBACK eecb, // The Exchange Callback Interface.
        HWND hWnd,               // The window handle to the main window
                                  // of context.
        HMENU hMenu,             // The menu handle to main menu of context.
@@ -304,7 +323,7 @@ GpgolExtCommands::InstallCommands (
       /*  Note that for read and send the object returned by the
           outlook extension callback is of class 43 (MailItem) so we
           only need to ask for Body then. */
-      hr = pEECB->GetObject (&mdb, (LPMAPIPROP *)&message);
+      hr = eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
       if (FAILED(hr))
         log_debug ("%s:%s: getObject failed: hr=%#lx\n", SRCNAME,__func__,hr);
       else if (!opt.compat.no_msgcache)
@@ -314,7 +333,7 @@ GpgolExtCommands::InstallCommands (
           size_t keylen = 0;
           void *refhandle = NULL;
      
-          pDisp = find_outlook_property (pEECB, "ConversationIndex", &dispid);
+          pDisp = find_outlook_property (eecb, "ConversationIndex", &dispid);
           if (pDisp)
             {
               DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
@@ -349,7 +368,7 @@ GpgolExtCommands::InstallCommands (
           
           if (key && keylen
               && (body = msgcache_get (key, keylen, &refhandle)) 
-              && (pDisp = find_outlook_property (pEECB, "Body", &dispid)))
+              && (pDisp = find_outlook_property (eecb, "Body", &dispid)))
             {
 #if 1
               dispparams.cNamedArgs = 1;
@@ -390,7 +409,7 @@ GpgolExtCommands::InstallCommands (
     {
       int need_dvm = 0;
 
-      switch (m_pExchExt->getMsgtype (pEECB))
+      switch (m_pExchExt->getMsgtype (eecb))
         {
         case MSGTYPE_GPGOL_MULTIPART_ENCRYPTED:
         case MSGTYPE_GPGOL_OPAQUE_ENCRYPTED:
@@ -403,15 +422,15 @@ GpgolExtCommands::InstallCommands (
 
       /* We always enable the verify button as it might be useful on
          an already decrypted message. */
-      add_menu (pEECB, pnCommandIDBase,
+      add_menu (eecb, pnCommandIDBase,
         "@", NULL,
         need_dvm? _("&Decrypt and verify message"):"", &m_nCmdDecrypt,
         _("&Verify signature"), &m_nCmdCheckSig,
         _("&Display crypto information"), &m_nCmdShowInfo,
-        "@", NULL,
-        "Debug-1 (open_inspector)", &m_nCmdDebug1,
-        "Debug-2 (n/a)", &m_nCmdDebug2,
-         NULL);
+                "@", NULL,
+        opt.enable_debug? "Debug-1 (open_inspector)":"", &m_nCmdDebug1,
+        opt.enable_debug? "Debug-2 (n/a)":"", &m_nCmdDebug2,
+        NULL);
       
       add_toolbar (pTBEArray, nTBECnt,
         _("Decrypt message and verify signature"), IDB_DECRYPT, m_nCmdDecrypt,
@@ -419,9 +438,13 @@ GpgolExtCommands::InstallCommands (
     }
   else if (m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
     {
-      add_menu (pEECB, pnCommandIDBase,
+      add_menu (eecb, pnCommandIDBase,
         "@", NULL,
-        opt.enable_smime? _("use S/MIME protocol"):"", &m_nCmdSelectSmime,
+        _(">GnuPG protocol"), NULL,
+        _("auto"),   &m_nCmdProtoAuto,        
+        _("OpenPGP"),&m_nCmdProtoPgpmime,        
+        _("S/MIME"), &m_nCmdProtoSmime,        
+          "<", NULL,
         _("&encrypt message with GnuPG"), &m_nCmdEncrypt,
         _("&sign message with GnuPG"), &m_nCmdSign,
         NULL );
@@ -431,15 +454,37 @@ GpgolExtCommands::InstallCommands (
         _("Sign message with GnuPG"),    IDB_SIGN,    m_nCmdSign,
         NULL, 0, 0);
 
-      m_pExchExt->m_gpgSelectSmime = opt.enable_smime && opt.smime_default;
+      m_pExchExt->m_protoSelection = opt.default_protocol;
+      switch (opt.default_protocol)
+        {
+        case PROTOCOL_OPENPGP:
+          check_menu (eecb, m_nCmdProtoAuto, FALSE);
+          check_menu (eecb, m_nCmdProtoPgpmime, TRUE);
+          check_menu (eecb, m_nCmdProtoSmime, FALSE);
+          break;
+        case PROTOCOL_SMIME:
+          check_menu (eecb, m_nCmdProtoAuto, FALSE);
+          check_menu (eecb, m_nCmdProtoPgpmime, FALSE);
+          check_menu (eecb, m_nCmdProtoSmime, TRUE);
+          break;
+        default:
+          check_menu (eecb, m_nCmdProtoAuto, TRUE);
+          check_menu (eecb, m_nCmdProtoPgpmime, FALSE);
+          check_menu (eecb, m_nCmdProtoSmime, FALSE);
+          break;
+        }
+
       m_pExchExt->m_gpgEncrypt = opt.encrypt_default;
+
       m_pExchExt->m_gpgSign    = opt.sign_default;
       if (force_encrypt)
         m_pExchExt->m_gpgEncrypt = true;
+      check_menu (eecb, m_nCmdEncrypt, m_pExchExt->m_gpgEncrypt);
+      check_menu (eecb, m_nCmdSign, m_pExchExt->m_gpgSign);
     }
   else if (m_lContext == EECONTEXT_VIEWER) 
     {
-      add_menu (pEECB, pnCommandIDBase, 
+      add_menu (eecb, pnCommandIDBase, 
         "@", NULL,
         _("GnuPG Certificate &Manager"), &m_nCmdKeyManager,
         NULL);
@@ -499,6 +544,7 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
           if (hr == S_OK)
             {
               log_debug ("%s:%s: invoking Close succeeded", SRCNAME,__func__);
+              message_wipe_body_cruft (eecb);
               return S_OK; /* We handled the close command. */
             }
 
@@ -506,6 +552,8 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
                      SRCNAME, __func__, hr);
         }
 
+      message_wipe_body_cruft (eecb);
+
       /* Closing on our own failed - pass it on. */
       return S_FALSE; 
     }
@@ -563,11 +611,32 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
       ul_release (message);
       ul_release (mdb);
     }
-  else if (nCommandID == m_nCmdSelectSmime
+  else if (nCommandID == m_nCmdProtoAuto
+           && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
+    {
+      check_menu (eecb, m_nCmdProtoAuto, TRUE);
+      check_menu (eecb, m_nCmdProtoPgpmime, FALSE);
+      check_menu (eecb, m_nCmdProtoSmime, FALSE);
+      m_pExchExt->m_protoSelection = PROTOCOL_UNKNOWN;
+    }
+  else if (nCommandID == m_nCmdProtoPgpmime
+           && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
+    {
+      check_menu (eecb, m_nCmdProtoAuto, FALSE);
+      check_menu (eecb, m_nCmdProtoPgpmime, TRUE);
+      check_menu (eecb, m_nCmdProtoSmime, FALSE);
+      m_pExchExt->m_protoSelection = PROTOCOL_OPENPGP;
+    }
+  else if (nCommandID == m_nCmdProtoSmime
            && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
     {
       if (opt.enable_smime)
-        m_pExchExt->m_gpgSelectSmime = !m_pExchExt->m_gpgSelectSmime;
+        {
+          check_menu (eecb, m_nCmdProtoAuto, FALSE);
+          check_menu (eecb, m_nCmdProtoPgpmime, FALSE);
+          check_menu (eecb, m_nCmdProtoSmime, TRUE);
+          m_pExchExt->m_protoSelection = PROTOCOL_SMIME;
+        }
     }
   else if (nCommandID == m_nCmdEncrypt
            && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
@@ -587,9 +656,9 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
       if (engine_start_keymanager ())
         if (start_key_manager ())
           MessageBox (NULL, _("Could not start certificate manager"),
-                      "GpgOL", MB_ICONERROR|MB_OK);
+                      _("GpgOL"), MB_ICONERROR|MB_OK);
     }
-  else if (nCommandID == m_nCmdDebug1
+  else if (opt.enable_debug && nCommandID == m_nCmdDebug1
            && m_lContext == EECONTEXT_READNOTEMESSAGE)
     {
       hr = eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
@@ -615,14 +684,6 @@ GpgolExtCommands::DoCommand (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
 STDMETHODIMP_(VOID) 
 GpgolExtCommands::InitMenu(LPEXCHEXTCALLBACK eecb) 
 {
-  HRESULT hr;
-  HMENU menu;
-  
-  hr = eecb->GetMenu (&menu);
-  if (FAILED(hr))
-      return; /* Ooops.  */
-  CheckMenuItem (menu, m_nCmdEncrypt, MF_BYCOMMAND 
-                 | (m_pExchExt->m_gpgSign?MF_CHECKED:MF_UNCHECKED));
 }
 
 
@@ -655,7 +716,21 @@ GpgolExtCommands::Help (LPEXCHEXTCALLBACK eecb, UINT nCommandID)
                   _("Check the signature now and display the result"),
                   "GpgOL", MB_OK);
     }
-  else if (nCommandID == m_nCmdSelectSmime
+  else if (nCommandID == m_nCmdProtoAuto
+           && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
+    {
+      MessageBox (m_hWnd,
+                  _("Select this option to automatically select the protocol."),
+                  "GpgOL", MB_OK);     
+    } 
+  else if (nCommandID == m_nCmdProtoPgpmime
+           && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
+    {
+      MessageBox (m_hWnd,
+                  _("Select this option to select the OpenPGP protocol."),
+                  "GpgOL", MB_OK);     
+    } 
+  else if (nCommandID == m_nCmdProtoSmime
            && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
     {
       MessageBox (m_hWnd,
@@ -731,7 +806,7 @@ GpgolExtCommands::QueryHelpText(UINT nCommandID, ULONG lFlags,
                   _("Check the signature now and display the result"),
                   nCharCnt);
     }
-  else if (nCommandID == m_nCmdSelectSmime
+  else if (nCommandID == m_nCmdProtoSmime
            && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
     {
       if (lFlags == EECQHT_STATUS)
@@ -822,10 +897,22 @@ GpgolExtCommands::QueryButtonInfo (ULONG toolbarid, UINT buttonid,
       if (m_pExchExt->m_gpgSign)
         pTBB->fsState |= TBSTATE_CHECKED;
     }
-  else if (tb_info->cmd_id == m_nCmdSelectSmime)
+  else if (tb_info->cmd_id == m_nCmdProtoAuto)
+    {
+      pTBB->fsStyle |= TBSTYLE_CHECK;
+      if (m_pExchExt->m_protoSelection == PROTOCOL_UNKNOWN)
+        pTBB->fsState |= TBSTATE_CHECKED;
+    }
+  else if (tb_info->cmd_id == m_nCmdProtoPgpmime)
+    {
+      pTBB->fsStyle |= TBSTYLE_CHECK;
+      if (m_pExchExt->m_protoSelection == PROTOCOL_OPENPGP)
+        pTBB->fsState |= TBSTATE_CHECKED;
+    }
+  else if (tb_info->cmd_id == m_nCmdProtoSmime)
     {
       pTBB->fsStyle |= TBSTYLE_CHECK;
-      if (m_pExchExt->m_gpgSelectSmime)
+      if (m_pExchExt->m_protoSelection == PROTOCOL_SMIME)
         pTBB->fsState |= TBSTATE_CHECKED;
     }
 
index dbf3e3e..1ada54d 100644 (file)
@@ -40,7 +40,9 @@ private:
   ULONG m_lRef;
   ULONG m_lContext;
   
-  UINT  m_nCmdSelectSmime;
+  UINT  m_nCmdProtoAuto;
+  UINT  m_nCmdProtoPgpmime;
+  UINT  m_nCmdProtoSmime;
   UINT  m_nCmdEncrypt;
   UINT  m_nCmdDecrypt;
   UINT  m_nCmdSign;
index c81b479..5eaa5c4 100644 (file)
@@ -17,6 +17,8 @@
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
+#error not used becuase it requires an ECF
+
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
index 2ba0b38..63765f5 100644 (file)
@@ -44,6 +44,10 @@ static HANDLE log_mutex;
    initialized at startup.  */
 static char *the_session_key;
 
+/* The session marker to identify this session.  Its value is not
+  confidential.  It is initialized at startup.  */
+static char *the_session_marker;
+
 /* Local function prototypes. */
 static char *get_locale_dir (void);
 static void drop_locale_dir (char *locale_dir);
@@ -102,10 +106,11 @@ get_crypt_random (size_t nbytes)
 }
 
 
+/* Initialize the session key and the session marker.  */
 static int
 initialize_session_key (void)
 {
-  the_session_key = get_crypt_random (16+sizeof (unsigned int));
+  the_session_key = get_crypt_random (16+sizeof (unsigned int)+8);
   if (the_session_key)
     {
       /* We use rand() in generate_boundary so we need to seed it. */
@@ -113,6 +118,9 @@ initialize_session_key (void)
 
       memcpy (&tmp, the_session_key+16, sizeof (unsigned int));
       srand (tmp);
+
+      /* And save the session marker. */
+      the_session_marker = the_session_key + 16 + sizeof (unsigned int);
     }
   return !the_session_key;
 }
@@ -185,6 +193,13 @@ get_128bit_session_key (void)
 }
 
 
+const void *
+get_64bit_session_marker (void)
+{
+  return the_session_marker;
+}
+
+
 /* Return a new allocated IV of size NBYTES.  Caller must free it.  On
    error NULL is returned. */
 void *
@@ -330,6 +345,32 @@ log_hexdump (const void *buf, size_t buflen, const char *fmt, ...)
 }
 
 
+static void
+do_log_window_info (HWND window, int level)
+{
+  char buf[1024+1];
+  char name[200];
+  int nname;
+  char *pname;
+
+  if (!window)
+    return;
+      
+  memset (buf, 0, sizeof (buf));
+  GetWindowText (window, buf, sizeof (buf)-1);
+  nname = GetClassName (window, name, sizeof (name)-1);
+  if (nname)
+    pname = name;
+  else
+    pname = NULL;
+  if (level == -1)
+    log_debug ("  parent=%p (%s) `%s'", window, pname? pname:"", buf);
+  else
+    log_debug ("    %*shwnd=%p (%s) `%s'", level*2, "", window,
+               pname? pname:"", buf);
+}
+
+
 /* Helper to log_window_hierarchy.  */
 static HWND
 do_log_window_hierarchy (HWND parent, int level)
@@ -339,20 +380,7 @@ do_log_window_hierarchy (HWND parent, int level)
   child = GetWindow (parent, GW_CHILD);
   while (child)
     {
-      char buf[1024+1];
-      char name[200];
-      int nname;
-      char *pname;
-      
-      memset (buf, 0, sizeof (buf));
-      GetWindowText (child, buf, sizeof (buf)-1);
-      nname = GetClassName (child, name, sizeof (name)-1);
-      if (nname)
-        pname = name;
-      else
-        pname = NULL;
-      log_debug ("    %*shwnd=%p (%s) `%s'", level*2, "", child,
-                 pname? pname:"", buf);
+      do_log_window_info (child, level);
       do_log_window_hierarchy (child, level+1);
       child = GetNextWindow (child, GW_HWNDNEXT);      
     }
@@ -371,7 +399,11 @@ log_window_hierarchy (HWND window, const char *fmt, ...)
   va_start (a, fmt);
   do_log (fmt, a, 0, 0, NULL, 0);
   va_end (a);
-  do_log_window_hierarchy (window, 0);
+  if (window)
+    {
+      do_log_window_info (window, -1);
+      do_log_window_hierarchy (window, 0);
+    }
 }
 
 
@@ -473,14 +505,25 @@ drop_locale_dir (char *locale_dir)
 void
 read_options (void)
 {
+  static int warnings_shown;
   char *val = NULL;
  
+  load_extension_value ("enableDebug", &val);
+  opt.enable_debug = val == NULL || *val != '1' ? 0 : 1;
+  xfree (val); val = NULL;
+
   load_extension_value ("enableSmime", &val);
   opt.enable_smime = val == NULL || *val != '1' ? 0 : 1;
   xfree (val); val = NULL;
   
-  load_extension_value ("smimeDefault", &val);
-  opt.smime_default = val == NULL || *val != '1'? 0 : 1;
+  load_extension_value ("defaultProtocol", &val);
+  switch ((!val || *val == '0')? 0 : atol (val))
+    {
+    case 1: opt.default_protocol = PROTOCOL_OPENPGP; break;
+    case 2: opt.default_protocol = PROTOCOL_SMIME; break;
+    case 0:
+    default: opt.default_protocol = PROTOCOL_UNKNOWN /*(auto*)*/; break;
+    }
   xfree (val); val = NULL;
 
   load_extension_value ("encryptDefault", &val);
@@ -547,7 +590,27 @@ read_options (void)
         }
       log_debug ("Note: using compatibility flags: %s", val);
     }
+
+  if (!warnings_shown)
+    {
+      char tmpbuf[512];
+          
+      warnings_shown = 1;
+      if (val && *val)
+        {
+          snprintf (tmpbuf, sizeof tmpbuf,
+                    _("Note: Using compatibility flags: %s"), val);
+          MessageBox (NULL, tmpbuf, _("GpgOL"), MB_ICONWARNING|MB_OK);
+        }
+      if (logfile && !opt.enable_debug)
+        {
+          snprintf (tmpbuf, sizeof tmpbuf,
+                    _("Note: Writing debug logs to\n\n\"%s\""), logfile);
+          MessageBox (NULL, tmpbuf, _("GpgOL"), MB_ICONWARNING|MB_OK);
+        }
+    }
   xfree (val); val = NULL;
+
 }
 
 
@@ -562,10 +625,10 @@ write_options (void)
     int  value;
     char *s_val;
   } table[] = {
-    {"smimeDefault",             0, opt.smime_default},
+    {"enableSmime",              0, opt.enable_smime},
+    {"defaultProtocol",          3, opt.default_protocol},
     {"encryptDefault",           0, opt.encrypt_default},
     {"signDefault",              0, opt.sign_default},
-    {"enableSmime",              0, opt.enable_smime},
     {"previewDecrypt",           0, opt.preview_decrypt},
     {"storePasswdTime",          1, opt.passwd_ttl},
     {"encodingFormat",           1, opt.enc_format},
@@ -594,6 +657,18 @@ write_options (void)
           rc = store_extension_value (table[i].name,
                                       table[i].s_val? table[i].s_val : "");
           break;
+        case 3:
+          buf[0] = '0';
+          buf[1] = 0;
+          switch (opt.default_protocol)
+            {
+            case PROTOCOL_UNKNOWN: buf[0] = '0'; /* auto */ break;
+            case PROTOCOL_OPENPGP: buf[0] = '1'; break;
+            case PROTOCOL_SMIME:   buf[0] = '2'; break;
+            }
+          rc = store_extension_value (table[i].name, buf);
+          break;  
+
         default:
           rc = -1;
           break;
index d48bf51..b84bf7f 100644 (file)
@@ -153,6 +153,16 @@ get_gpgolprotectiv_tag (LPMESSAGE message, ULONG *r_tag)
   return 0;
 }
 
+/* Return the property tag for GpgOL Last Decrypted. */
+int 
+get_gpgollastdecrypted_tag (LPMESSAGE message, ULONG *r_tag)
+{
+  if (!(*r_tag = create_gpgol_tag (message, L"GpgOL Last Decrypted",__func__)))
+    return -1;
+  *r_tag |= PT_BINARY;
+  return 0;
+}
+
 
 /* Return the property tag for GpgOL MIME structure. */
 int 
@@ -1547,6 +1557,57 @@ mapi_get_message_content_type (LPMESSAGE message,
 }
 
 
+/* Returns True if MESSAGE has a GpgOL Last Decrypted property with any value.
+   This indicates that there sghould be no PR_BODY tag.  */
+int
+mapi_has_last_decrypted (LPMESSAGE message)
+{
+  HRESULT hr;
+  LPSPropValue propval = NULL;
+  ULONG tag;
+  int yes = 0;
+  
+  if (get_gpgollastdecrypted_tag (message, &tag) )
+    return 0; /* No.  */
+  hr = HrGetOneProp ((LPMAPIPROP)message, tag, &propval);
+  if (FAILED (hr))
+    return 0; /* No.  */  
+  
+  if (PROP_TYPE (propval->ulPropTag) == PT_BINARY)
+    yes = 1;
+
+  MAPIFreeBuffer (propval);
+  return yes;
+}
+
+
+/* Returns True if MESSAGE has a GpgOL Last Decrypted property and
+   that matches the curren sessiobn. */
+int
+mapi_test_last_decrypted (LPMESSAGE message)
+{
+  HRESULT hr;
+  LPSPropValue propval = NULL;
+  ULONG tag;
+  int yes = 0;
+
+  if (get_gpgollastdecrypted_tag (message, &tag) )
+    return 0; /* No.  */
+  hr = HrGetOneProp ((LPMAPIPROP)message, tag, &propval);
+  if (FAILED (hr))
+    return 0; /* No.  */  
+
+  if (PROP_TYPE (propval->ulPropTag) == PT_BINARY
+      && propval->Value.bin.cb == 8
+      && !memcmp (propval->Value.bin.lpb, get_64bit_session_marker (), 8) )
+    yes = 1;
+
+  MAPIFreeBuffer (propval);
+  return yes;
+}
+
+
+
 /* Helper for mapi_get_gpgol_body_attachment.  */
 static int
 has_gpgol_body_name (LPATTACH obj)
@@ -1682,4 +1743,3 @@ mapi_get_gpgol_body_attachment (LPMESSAGE message, size_t *r_nbytes,
   return body;
 }
 
-
index 24474ae..858276b 100644 (file)
@@ -85,7 +85,8 @@ void log_mapi_property (LPMESSAGE message, ULONG prop, const char *propname);
 int get_gpgolattachtype_tag (LPMESSAGE message, ULONG *r_tag);
 int get_gpgolsigstatus_tag (LPMESSAGE message, ULONG *r_tag);
 int get_gpgolprotectiv_tag (LPMESSAGE message, ULONG *r_tag);
-int  get_gpgolmimeinfo_tag (LPMESSAGE message, ULONG *r_tag);
+int get_gpgollastdecrypted_tag (LPMESSAGE message, ULONG *r_tag);
+int get_gpgolmimeinfo_tag (LPMESSAGE message, ULONG *r_tag);
 
 int mapi_set_header (LPMESSAGE msg, const char *name, const char *val);
 
@@ -117,6 +118,8 @@ char *mapi_get_mime_info (LPMESSAGE msg);
 char *mapi_get_message_content_type (LPMESSAGE message, 
                                      char **r_protocol, char **r_smtype);
 
+int   mapi_has_last_decrypted (LPMESSAGE message);
+int   mapi_test_last_decrypted (LPMESSAGE message);
 char *mapi_get_gpgol_body_attachment (LPMESSAGE message, size_t *r_nbytes,
                                       int *r_ishtml, int *r_protected);
 
index 5e3b15e..1ae3a83 100644 (file)
@@ -109,7 +109,7 @@ GpgolMessageEvents::OnRead (LPEXCHEXTCALLBACK eecb)
   log_debug ("%s:%s: received\n", SRCNAME, __func__);
 
   m_wasencrypted = false;
-  if (opt.preview_decrypt)
+  if (1 /*opt.preview_decrypt*/)
     {
       eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
       if (message_incoming_handler (message, m_pExchExt->getMsgtype (eecb)))
@@ -270,9 +270,7 @@ GpgolMessageEvents::OnWriteComplete (LPEXCHEXTCALLBACK eecb, ULONG flags)
   HRESULT hr = eecb->GetObject (&pMDB, (LPMAPIPROP *)&msg);
   if (SUCCEEDED (hr))
     {
-      protocol_t proto = (m_pExchExt->m_gpgSelectSmime
-                          ? PROTOCOL_SMIME
-                          : PROTOCOL_OPENPGP);
+      protocol_t proto = m_pExchExt->m_protoSelection;
       
       if (m_pExchExt->m_gpgEncrypt && m_pExchExt->m_gpgSign)
         rc = message_sign_encrypt (msg, proto, hWnd);
index 9343c65..adf75ad 100644 (file)
@@ -119,12 +119,13 @@ message_display_handler (LPEXCHEXTCALLBACK eecb, HWND hwnd)
   hr = eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
   if (SUCCEEDED (hr))
     {
-      /* If the message was protected we don't allow a fallback to the
-         OOM display methods.  */
+      /* (old: If the message was protected we don't allow a fallback to the
+         OOM display methods.)  Now: As it is difficult to find the
+         actual winodw we now use the OOM display always.  */
       body = mapi_get_gpgol_body_attachment (message, NULL, 
                                              &ishtml, &wasprotected);
       if (body)
-        update_display (hwnd, wasprotected? NULL: eecb, ishtml, body);
+        update_display (hwnd, /*wasprotected? NULL:*/ eecb, ishtml, body);
       else
         update_display (hwnd, NULL, 0, 
                         _("[Crypto operation failed - "
@@ -143,6 +144,66 @@ message_display_handler (LPEXCHEXTCALLBACK eecb, HWND hwnd)
 }
 
 
+/* If the current message is an encrypted one remove the body
+   properties which might have come up due to OL internal
+   syncronization and a failing olDiscard feature.  */
+void
+message_wipe_body_cruft (LPEXCHEXTCALLBACK eecb)
+{
+  
+  HRESULT hr;
+  LPMESSAGE message = NULL;
+  LPMDB mdb = NULL;
+      
+  log_debug ("%s:%s: enter", SRCNAME, __func__);
+  hr = eecb->GetObject (&mdb, (LPMAPIPROP *)&message);
+  if (SUCCEEDED (hr))
+    {
+      if (mapi_has_last_decrypted (message))
+        {
+          SPropTagArray proparray;
+          int anyokay = 0;
+          
+          proparray.cValues = 1;
+          proparray.aulPropTag[0] = PR_BODY;
+          hr = message->DeleteProps (&proparray, NULL);
+          if (hr)
+            log_debug_w32 (hr, "%s:%s: deleting PR_BODY failed",
+                           SRCNAME, __func__);
+          else
+            anyokay++;
+          
+          proparray.cValues = 1;
+          proparray.aulPropTag[0] = PR_BODY_HTML;
+          message->DeleteProps (&proparray, NULL);
+          if (hr)
+            log_debug_w32 (hr, "%s:%s: deleting PR_BODY_HTML failed", 
+                           SRCNAME, __func__);
+          else
+            anyokay++;
+
+          if (anyokay)
+            {
+              hr = message->SaveChanges (KEEP_OPEN_READWRITE);
+              if (hr)
+                log_error_w32 (hr, "%s:%s: SaveChanges failed",
+                               SRCNAME, __func__); 
+              else
+                log_debug ("%s:%s: SaveChanges succeded; body cruft removed",
+                           SRCNAME, __func__); 
+            }
+        }  
+      else
+        log_debug_w32 (hr, "%s:%s: error getting message", 
+                       SRCNAME, __func__);
+     
+      ul_release (message);
+      ul_release (mdb);
+    }
+}
+
+
+
 /* Display some information about MESSAGE.  */
 void
 message_show_info (LPMESSAGE message, HWND hwnd)
@@ -476,9 +537,8 @@ message_verify (LPMESSAGE message, msgtype_t msgtype, int force)
 
 /* Decrypt MESSAGE, check signature and update the attachments as
    required.  MSGTYPE should be the type of the message so that the
-   function can decide what to do.  With FORCE set the verification is
-   done regardlessless of a cached signature result - hmmm, should we
-   such a thing for an encrypted message? */
+   function can decide what to do.  With FORCE set the decryption is
+   done regardless whether it has already been done.  */
 int
 message_decrypt (LPMESSAGE message, msgtype_t msgtype, int force)
 {
@@ -508,6 +568,10 @@ message_decrypt (LPMESSAGE message, msgtype_t msgtype, int force)
       break;
     }
   
+  if (!force && mapi_test_last_decrypted (message))
+    return 0; /* Already decrypted this message once during this
+                 session.  No need to do it again. */
+
   if (msgtype == MSGTYPE_GPGOL_PGP_MESSAGE)
     {
       /* PGP messages are special:  All is contained in the body and thus
index 1888efd..28426c9 100644 (file)
@@ -23,6 +23,7 @@
 
 bool message_incoming_handler (LPMESSAGE message, msgtype_t msgtype);
 bool message_display_handler (LPEXCHEXTCALLBACK eecb, HWND hwnd);
+void message_wipe_body_cruft (LPEXCHEXTCALLBACK eecb);
 void message_show_info (LPMESSAGE message, HWND hwnd);
 
 
index 4b0c96a..1c62d44 100644 (file)
@@ -559,12 +559,39 @@ build_mimeinfo (mimestruct_item_t mimestruct)
 
 
 static int
-finish_message (LPMESSAGE message, gpg_error_t err, 
+finish_message (LPMESSAGE message, gpg_error_t err, int protect_mode, 
                 mimestruct_item_t mimestruct)
 {
   HRESULT hr;
   SPropValue prop;
 
+  /* If this was an encrypted message we save the session marker in a
+     specila property so that we now that we already decrypted that
+     message within this session.  This is pretty useful when
+     scrolling through messages and preview decryption has been
+     enabled.  */
+  if (protect_mode)
+    {
+      char sesmrk[8];
+
+      if (get_gpgollastdecrypted_tag (message, &prop.ulPropTag) )
+        return -1;
+      if (err)
+        memset (sesmrk, 0, 8);
+      else
+        memcpy (sesmrk, get_64bit_session_marker (), 8);
+      prop.Value.bin.cb = 8;
+      prop.Value.bin.lpb = sesmrk;
+      hr = IMessage_SetProps (message, 1, &prop, NULL);
+      if (hr)
+        {
+          log_error ("%s:%s: can't set %s property: hr=%#lx\n",
+                     SRCNAME, __func__, "GpgOL Last Decrypted", hr); 
+          return -1;
+        }
+    }
+
+  /* Store the MIME structure away.  */
   if (get_gpgolmimeinfo_tag (message, &prop.ulPropTag) )
     return -1;
   prop.Value.lpszA = build_mimeinfo (mimestruct);
@@ -1077,7 +1104,7 @@ mime_verify (protocol_t protocol, const char *message, size_t messagelen,
       rfc822parse_close (ctx->msg);
       gpgme_data_release (ctx->signed_data);
       gpgme_data_release (ctx->sig_data);
-      finish_message (mapi_message, err, ctx->mimestruct);
+      finish_message (mapi_message, err, ctx->protect_mode, ctx->mimestruct);
       while (ctx->mimestruct)
         {
           mimestruct_item_t tmp = ctx->mimestruct->next;
@@ -1193,7 +1220,7 @@ mime_decrypt (protocol_t protocol, LPSTREAM instream, LPMESSAGE mapi_message,
         gpgme_data_release (ctx->signed_data);
       if (ctx->sig_data)
         gpgme_data_release (ctx->sig_data);
-      finish_message (mapi_message, err, ctx->mimestruct);
+      finish_message (mapi_message, err, ctx->protect_mode, ctx->mimestruct);
       while (ctx->mimestruct)
         {
           mimestruct_item_t tmp = ctx->mimestruct->next;
index 9de36fd..071a371 100644 (file)
@@ -44,6 +44,7 @@ set_labels (HWND dlg)
   static struct { int itemid; const char *label; } labels[] = {
     { IDC_ENCRYPT_DEFAULT,  N_("&Encrypt new messages by default")},
     { IDC_SIGN_DEFAULT,     N_("&Sign new messages by default")},
+    { IDC_OPENPGP_DEFAULT,  N_("Use OPENPGP by default")},
     { IDC_SMIME_DEFAULT,    N_("Use S/MIME by default")},
     { IDC_ENABLE_SMIME,     N_("Enable the S/MIME support")},
     { IDC_ENCRYPT_WITH_STANDARD_KEY, 
@@ -75,6 +76,8 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
   BOOL bMsgResult = FALSE;    
   static LPNMHDR pnmhdr;
   static HWND hWndPage;
+  static BOOL openpgp_state = FALSE;
+  static BOOL smime_state = FALSE;
     
   switch (uMsg) 
     {
@@ -106,6 +109,9 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 /*             ReleaseDC (hDlg, hdc);   */
 /*           } */
         
+        openpgp_state = opt.default_protocol = PROTOCOL_OPENPGP;
+        smime_state = opt.default_protocol = PROTOCOL_SMIME;
+
        EnableWindow (GetDlgItem (hDlg, IDC_ENCRYPT_TO),
                       !!opt.enable_default_key);
         EnableWindow (GetDlgItem (hDlg, IDC_SMIME_DEFAULT), 
@@ -113,6 +119,8 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
        if (opt.enable_default_key)
           CheckDlgButton (hDlg, IDC_ENCRYPT_WITH_STANDARD_KEY, BST_CHECKED);
         set_labels (hDlg);
+        ShowWindow (GetDlgItem (hDlg, IDC_GPG_OPTIONS), 
+                    opt.enable_debug? SW_SHOW : SW_HIDE);
       }
       return TRUE;
 
@@ -153,6 +161,7 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
            case IDC_ENCRYPT_WITH_STANDARD_KEY:
            case IDC_PREFER_HTML:
            case IDC_SIGN_DEFAULT:
+           case IDC_OPENPGP_DEFAULT:
            case IDC_SMIME_DEFAULT:
            case IDC_PREVIEW_DECRYPT:
            case IDC_ENABLE_SMIME:
@@ -174,7 +183,27 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
          EnableWindow (GetDlgItem (hDlg, IDC_SMIME_DEFAULT), 
                         opt.enable_smime);
        }
-      if (LOWORD (wParam) == IDC_GPG_OPTIONS)
+      if (HIWORD (wParam) == BN_CLICKED &&
+         LOWORD (wParam) == IDC_OPENPGP_DEFAULT) 
+       {
+         openpgp_state = !openpgp_state;
+          if (openpgp_state)
+            {
+              smime_state = 0;
+              SendDlgItemMessage (hDlg, IDC_SMIME_DEFAULT, BM_SETCHECK,0,0L);
+            }
+       }
+      if (HIWORD (wParam) == BN_CLICKED &&
+         LOWORD (wParam) == IDC_SMIME_DEFAULT) 
+       {
+         smime_state = !smime_state;
+          if (smime_state)
+            {
+              openpgp_state = 0;
+              SendDlgItemMessage (hDlg, IDC_OPENPGP_DEFAULT, BM_SETCHECK,0,0L);
+            }
+       }
+      if (opt.enable_debug && LOWORD (wParam) == IDC_GPG_OPTIONS)
        config_dialog_box (hDlg);
       break;
        
@@ -189,7 +218,7 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
            TCHAR s[30];
            
            if (opt.default_key && *opt.default_key)            
-               SetDlgItemText (hDlg, IDC_ENCRYPT_TO, opt.default_key);
+                SetDlgItemText (hDlg, IDC_ENCRYPT_TO, opt.default_key);
             else
                SetDlgItemText (hDlg, IDC_ENCRYPT_TO, "");
            wsprintf (s, "%d", opt.passwd_ttl/60);
@@ -202,8 +231,10 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
                                !!opt.sign_default, 0L);
            SendDlgItemMessage (hDlg, IDC_ENCRYPT_WITH_STANDARD_KEY,
                                 BM_SETCHECK, opt.enable_default_key, 0L);
-           SendDlgItemMessage (hDlg, IDC_SMIME_DEFAULT, BM_SETCHECK, 
-                               !!opt.smime_default, 0L);
+            SendDlgItemMessage (hDlg, IDC_OPENPGP_DEFAULT, BM_SETCHECK, 
+                                openpgp_state, 0L);
+            SendDlgItemMessage (hDlg, IDC_SMIME_DEFAULT, BM_SETCHECK, 
+                                smime_state, 0L);
            SendDlgItemMessage (hDlg, IDC_ENABLE_SMIME, BM_SETCHECK,
                                !!opt.enable_smime, 0L);
            SendDlgItemMessage (hDlg, IDC_PREVIEW_DECRYPT, BM_SETCHECK,
@@ -254,8 +285,14 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
             "provided when GpgOL arrives at production quality status."),
                             "GpgOL", MB_ICONWARNING|MB_OK);
               }
-           opt.smime_default = !!SendDlgItemMessage
-              (hDlg, IDC_SMIME_DEFAULT, BM_GETCHECK, 0, 0L);
+
+           if (openpgp_state)
+              opt.default_protocol = PROTOCOL_OPENPGP;
+           else if (smime_state && opt.enable_smime)
+              opt.default_protocol = PROTOCOL_SMIME;
+            else
+              opt.default_protocol = PROTOCOL_UNKNOWN;
+            
             opt.preview_decrypt = !!SendDlgItemMessage
               (hDlg, IDC_PREVIEW_DECRYPT, BM_GETCHECK, 0, 0L);
             opt.prefer_html = !!SendDlgItemMessage
index 523e71d..7d567e1 100644 (file)
@@ -287,7 +287,7 @@ GpgolExt::GpgolExt (void)
   m_lRef = 1;
   m_lContext = 0;
   m_hWndExchange = 0;
-  m_gpgSelectSmime = FALSE;
+  m_protoSelection = PROTOCOL_UNKNOWN;
   m_gpgEncrypt = FALSE;
   m_gpgSign = FALSE;
   msgtype = MSGTYPE_UNKNOWN;
@@ -299,19 +299,19 @@ GpgolExt::GpgolExt (void)
   m_pExchExtMessageEvents      = new GpgolMessageEvents (this);
   m_pExchExtAttachedFileEvents = new GpgolAttachedFileEvents (this);
   m_pExchExtPropertySheets     = new GpgolPropertySheets (this);
-  m_pOutlookExtItemEvents      = new GpgolItemEvents (this);
+//   m_pOutlookExtItemEvents      = new GpgolItemEvents (this);
   if (!m_pExchExtCommands
       || !m_pExchExtUserEvents
       || !m_pExchExtSessionEvents
       || !m_pExchExtMessageEvents
       || !m_pExchExtAttachedFileEvents
       || !m_pExchExtPropertySheets
-      || !m_pOutlookExtItemEvents)
+      /*|| !m_pOutlookExtItemEvents*/)
     out_of_core ();
 
   /* For this class we need to bump the reference counter intially.
      The question is why it works at all with the other stuff.  */
-  m_pOutlookExtItemEvents->AddRef ();
+//   m_pOutlookExtItemEvents->AddRef ();
 
   if (!g_initdll)
     {
@@ -330,8 +330,8 @@ GpgolExt::~GpgolExt (void)
   log_debug ("%s:%s: cleaning up GpgolExt object; context=%s\n",
              SRCNAME, __func__, ext_context_name (m_lContext));
     
-  if (m_pOutlookExtItemEvents)
-    m_pOutlookExtItemEvents->Release ();
+//   if (m_pOutlookExtItemEvents)
+//     m_pOutlookExtItemEvents->Release ();
 
   if (m_lContext == EECONTEXT_SESSION)
     {
@@ -394,10 +394,10 @@ GpgolExt::QueryInterface(REFIID riid, LPVOID *ppvObj)
        return E_NOINTERFACE;
       *ppvObj = (LPUNKNOWN) m_pExchExtPropertySheets;
     }
-  else if (riid == IID_IOutlookExtItemEvents)
-    {
-      *ppvObj = (LPUNKNOWN)m_pOutlookExtItemEvents;
-    }  
+//   else if (riid == IID_IOutlookExtItemEvents)
+//     {
+//       *ppvObj = (LPUNKNOWN)m_pOutlookExtItemEvents;
+//     }  
   else
     hr = E_NOINTERFACE;
   
index 7ff9813..4e0eed8 100644 (file)
@@ -39,7 +39,7 @@ public:
   HWND m_hWndExchange;  /* Handle of the exchange window. */
 
   /* Parameters for sending mails.  */
-  BOOL  m_gpgSelectSmime;
+  protocol_t  m_protoSelection;
   BOOL  m_gpgEncrypt;
   BOOL  m_gpgSign;
   
index 57e351c..387a354 100644 (file)
@@ -69,6 +69,7 @@ char *read_w32_registry_string (const char *root, const char *dir,
 
 /*-- main.c --*/
 const void *get_128bit_session_key (void);
+const void *get_64bit_session_marker (void);
 void *create_initialization_vector (size_t nbytes);
 
 void log_debug (const char *fmt, ...) __attribute__ ((format (printf,1,2)));