Preparing for 0.9.8 gpgol-0.9.8
authorWerner Koch <wk@gnupg.org>
Tue, 28 Mar 2006 10:06:51 +0000 (10:06 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 28 Mar 2006 10:06:51 +0000 (10:06 +0000)
ChangeLog
NEWS
configure.ac
src/ChangeLog
src/display.cpp
src/gpgmsg.cpp
src/olflange-dlgs.cpp
src/olflange-ids.h
src/olflange-rsrcs.rc

index fa1efb2..86a6601 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2006-03-28  Werner Koch  <wk@g10code.com>
+
+       Released 0.9.8.
+
 2006-03-21  Werner Koch  <wk@g10code.com>
 
        Released 0.9.7.
diff --git a/NEWS b/NEWS
index 494b4eb..0633462 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,8 +1,10 @@
-Noteworthy changes for version 0.9.8
+Noteworthy changes for version 0.9.8 (2006-03-28)
 =================================================
 
 * PGP/MIME signature verification may now work in some cases.
 
+* New option to prefer displaying of the HTML part.
+
 
 Noteworthy changes for version 0.9.7 (2006-03-21)
 =================================================
index 92a653b..9fbfcc0 100644 (file)
@@ -16,7 +16,7 @@ min_automake_version="1.9.4"
 # Version number: Remember to change it immediately *after* a release.
 #                 Make sure to run  "svn up" before a "make dist".
 #                 Add a "-cvs" prefix for non-released code.
-AC_INIT(gpgol, 0.9.8-cvs, bug-gpgol@g10code.com)
+AC_INIT(gpgol, 0.9.8, bug-gpgol@g10code.com)
 
 NEED_GPGME_API=1
 NEED_GPGME_VERSION=1.1.0
index 85e171b..5599acd 100644 (file)
@@ -1,3 +1,11 @@
+2006-03-28  Werner Koch  <wk@g10code.com>
+
+       * olflange-rsrcs.rc (IDD_GPG_OPTIONS_DE): Add new control box.
+       (IDD_GPG_OPTIONS): Updated to match German version.
+       * olflange-dlgs.cpp (GPGOptionsDlgProc): Ditto.
+       * gpgmsg.cpp (decrypt): Implemented PREFER_HTML option.
+       (get_long_attach_data): New.
+
 2006-03-27  Werner Koch  <wk@g10code.com>
 
        * engine-gpgme.c (op_verify_detached_sig_gpgme): New.
index a3a1f75..947c88c 100644 (file)
@@ -161,7 +161,7 @@ update_display (HWND hwnd, GpgMsg *msg, void *exchange_cb,
     }
   else if (exchange_cb && !opt.compat.no_oom_write)
     {
-      log_debug ("updating display using OOM to `%s'", text);
+      log_debug ("updating display using OOM\n");
       /* Bug in OL 2002 and 2003 - as a workaround set the body first
          to empty. */
       if (is_html)
index fa6f4f8..dd1fb02 100644 (file)
@@ -87,6 +87,7 @@ typedef struct attach_info *attach_info_t;
 
 static int get_attach_method (LPATTACH obj);
 static char *get_short_attach_data (LPATTACH obj);
+static char *get_long_attach_data (LPMESSAGE msg, attach_info_t table,int pos);
 static bool set_x_header (LPMESSAGE msg, const char *name, const char *val);
 
 
@@ -392,7 +393,6 @@ GpgMsgImpl::loadBody (bool want_html)
   HRESULT hr;
   LPSPropValue lpspvFEID = NULL;
   LPSTREAM stream;
-//   SPropValue prop;
   STATSTG statInfo;
   ULONG nread;
   char *body = NULL;
@@ -491,8 +491,8 @@ GpgMsgImpl::loadBody (bool want_html)
 
  ready:
   if (body)
-    log_debug ("%s:%s: loaded body `%s' at %p\n",
-               SRCNAME, __func__, body, body);
+    log_debug ("%s:%s: loaded body %d bytes of body at %p\n",
+               SRCNAME, __func__, strlen (body), body);
   
 
 //   prop.ulPropTag = PR_ACCESS;
@@ -1082,6 +1082,7 @@ GpgMsgImpl::decrypt (HWND hwnd)
   int have_pgphtml_sig = 0;
   int have_pgphtml_enc = 0;
   unsigned int pgphtml_pos = 0;
+  unsigned int pgphtml_pos_sig = 0;
   HRESULT hr;
   int pgpmime_succeeded = 0;
   int is_html = 0;
@@ -1135,13 +1136,14 @@ GpgMsgImpl::decrypt (HWND hwnd)
           {
             if (!have_pgphtml_sig && !have_pgphtml_enc
                 && table[pos].filename
-                && !strcmp (table[pos].filename, "PGPexch.htm.asc")
+                && !strcmp (table[pos].filename, "PGPexch.htm")
                 && table[pos].content_type  
-                && !strcmp (table[pos].content_type,
-                            "application/pgp-signature"))
+                && !strcmp (table[pos].content_type, "text/html")
+                && table[pos].sig_pos != pos)
               {
                 have_pgphtml_sig = 1;
                 pgphtml_pos = pos;
+                pgphtml_pos_sig = table[pos].sig_pos;
               }
             else
               n_signed++;
@@ -1151,6 +1153,13 @@ GpgMsgImpl::decrypt (HWND hwnd)
   log_debug ("%s:%s: message has %u attachments with "
              "%u signed and %d encrypted\n",
              SRCNAME, __func__, n_attach, n_signed, n_encrypted);
+  if (have_pgphtml_enc)
+    log_debug ("%s:%s: pgphtml encrypted attachment found at pos %d\n",
+               SRCNAME, __func__, pgphtml_pos);
+  if (have_pgphtml_sig)
+    log_debug ("%s:%s: pgphtml signature attachment found at pos %d\n",
+               SRCNAME, __func__, pgphtml_pos);
+  
 
   if (mtype == OPENPGP_NONE && !n_encrypted && !n_signed
       && !have_pgphtml_enc && !have_pgphtml_sig && !is_pgpmime_sig) 
@@ -1200,6 +1209,7 @@ GpgMsgImpl::decrypt (HWND hwnd)
     {
       if (attestation)
         gpgme_data_release (attestation);
+      attestation = NULL;
       log_debug ("%s:%s: we already have an attestation\n",
                  SRCNAME, __func__);
     }
@@ -1313,39 +1323,51 @@ GpgMsgImpl::decrypt (HWND hwnd)
       if (!err)
         pgpmime_succeeded = 1;
     }
-  else if (mtype == OPENPGP_CLEARSIG )
+  else if (mtype == OPENPGP_CLEARSIG && !(have_pgphtml_sig && opt.prefer_html))
     {
+      /* Cleartext signature.  */
+
       assert (body);
       err = preview? 0 : op_verify (body, NULL, NULL, attestation);
     }
-  else if (body && *body)
+  else if ( (body && *body)
+            && !((have_pgphtml_enc||have_pgphtml_sig) && opt.prefer_html))
     {
+      /* Standard encrypted body.  We do not enter this if we also
+         have an pgphtml encrypted attachment and the prefer_html
+         option is activ.  */
+
       err = op_decrypt (body, &plaintext, opt.passwd_ttl, NULL,
                         attestation, preview);
-      if (!err && have_pgphtml_enc)
-        is_html = 1;
     }
-  else if (mtype == OPENPGP_NONE && have_pgphtml_sig)
+  else if ((mtype == OPENPGP_NONE || opt.prefer_html) && have_pgphtml_sig)
     {
+      /* There is no body but a pgphtml signed attachment - decrypt
+         that one. */
       if (preview)
         err = 0;
       else
         {
+          /* Note that we don't access the HTML body.  It seems that
+             Outlooks creates that one on the fly and it will break
+             the signature.  It is better to use the attachment
+             directly. */
           LPATTACH att;
-          char *htmlbody = loadBody (true);
 
-          if (htmlbody && *htmlbody)
+          plaintext = get_long_attach_data (message, table, pgphtml_pos);
+          
+          if (plaintext && *plaintext)
             {
               is_html = 1;
-              hr = message->OpenAttach (pgphtml_pos, NULL,
+              hr = message->OpenAttach (pgphtml_pos_sig, NULL,
                                         MAPI_BEST_ACCESS, &att);       
               if (FAILED (hr))
                 {
                   log_error ("%s:%s: can't open attachment %d (sig): hr=%#lx",
-                             SRCNAME, __func__, pgphtml_pos, hr);
+                             SRCNAME, __func__, pgphtml_pos_sig, hr);
                   err = gpg_error (GPG_ERR_GENERAL);
                 }
-              else if (table[pgphtml_pos].method != ATTACH_BY_VALUE)
+              else if (table[pgphtml_pos_sig].method != ATTACH_BY_VALUE)
                 {
                   log_error ("%s:%s: HTML attachment: method not supported",
                              SRCNAME, __func__);
@@ -1360,7 +1382,7 @@ GpgMsgImpl::decrypt (HWND hwnd)
                     err = gpg_error (GPG_ERR_GENERAL);
                   else
                     {
-                      err = op_verify_detached_sig_mem (htmlbody, sigpart,
+                      err = op_verify_detached_sig_mem (plaintext, sigpart,
                                                         NULL, attestation);
                       xfree (sigpart);
                     }
@@ -1368,11 +1390,12 @@ GpgMsgImpl::decrypt (HWND hwnd)
             }
           else
             err = gpg_error (GPG_ERR_NO_DATA);
-          xfree (htmlbody);
         }
     }
-  else if (mtype == OPENPGP_NONE && have_pgphtml_enc)
+  else if ((mtype == OPENPGP_NONE || opt.prefer_html) && have_pgphtml_enc)
     {
+      /* There is no body but a pgphtml encrypted attachment - decrypt
+         that one. */
       LPATTACH att;
       LPSTREAM from;
 
@@ -2059,8 +2082,8 @@ get_short_attach_data (LPATTACH obj)
   switch ( PROP_TYPE (propval->ulPropTag) )
     {
     case PT_BINARY:
-      /* This is a binary obnject but we know that it must be plain
-         ASCII due to the armoed format.  */
+      /* This is a binary object but we know that it must be plain
+         ASCII due to the armored format.  */
       data = (char*)xmalloc (propval->Value.bin.cb + 1);
       memcpy (data, propval->Value.bin.lpb, propval->Value.bin.cb);
       data[propval->Value.bin.cb] = 0;
@@ -2077,6 +2100,77 @@ get_short_attach_data (LPATTACH obj)
 }
 
 
+/* Get an statchment as one long C string.  We assume that there are
+   no binary nuls in it.  Returns NULL on failure. */
+static char *
+get_long_attach_data (LPMESSAGE msg, attach_info_t table, int pos)
+{
+  HRESULT hr;
+  LPATTACH att;
+  LPSTREAM stream;
+  STATSTG statInfo;
+  ULONG nread;
+  char *buffer;
+
+  hr = msg->OpenAttach (pos, NULL, MAPI_BEST_ACCESS, &att);    
+  if (FAILED (hr))
+    {
+      log_error ("%s:%s: can't open attachment %d: hr=%#lx",
+                 SRCNAME, __func__, pos, hr);
+      return NULL;
+    }
+  if (table[pos].method != ATTACH_BY_VALUE)
+    {
+      log_error ("%s:%s: attachment: method not supported", SRCNAME, __func__);
+      att->Release ();
+      return NULL;
+    }
+
+  hr = att->OpenProperty (PR_ATTACH_DATA_BIN, &IID_IStream, 
+                          0, 0, (LPUNKNOWN*) &stream);
+  if (FAILED (hr))
+    {
+      log_error ("%s:%s: can't open data stream of attachment: hr=%#lx",
+                 SRCNAME, __func__, hr);
+      att->Release ();
+      return NULL;
+    }
+
+  hr = stream->Stat (&statInfo, STATFLAG_NONAME);
+  if ( hr != S_OK )
+    {
+      log_error ("%s:%s: Stat failed: hr=%#lx", SRCNAME, __func__, hr);
+      stream->Release ();
+      att->Release ();
+      return NULL;
+    }
+      
+  buffer = (char*)xmalloc ((size_t)statInfo.cbSize.QuadPart + 2);
+  hr = stream->Read (buffer, (size_t)statInfo.cbSize.QuadPart, &nread);
+  if ( hr != S_OK )
+    {
+      log_error ("%s:%s: Read failed: hr=%#lx", SRCNAME, __func__, hr);
+      xfree (buffer);
+      stream->Release ();
+      att->Release ();
+      return NULL;
+    }
+  buffer[nread] = 0;
+  buffer[nread+1] = 0;
+  if (nread != statInfo.cbSize.QuadPart)
+    {
+      log_error ("%s:%s: not enough bytes returned\n", SRCNAME, __func__);
+      xfree (buffer);
+      buffer = NULL;
+    }
+  stream->Release ();
+  att->Release ();
+      
+  return buffer;
+}
+
+
+
 /* Check whether the attachment at position POS in the attachment
    table is the first part of a PGP/MIME message.  This routine should
    only be called if it has already been checked that the content-type
@@ -2378,7 +2472,7 @@ GpgMsgImpl::gatherAttachmentInfo (void)
       if (table[pos].invalid)
         continue;
       if (table[pos].filename && (s = strrchr (table[pos].filename, '.'))
-          &&  !stricmp (s, ".asc")
+          && !stricmp (s, ".asc")
           && table[pos].content_type  
           && !stricmp (table[pos].content_type, "application/pgp-signature"))
         {
index 7405916..c9eba58 100644 (file)
@@ -1,6 +1,6 @@
 /* olflange-dlgs.cpp - New dialogs for Outlook.
  *     Copyright (C) 2001 G Data Software AG, http://www.gdata.de
- *     Copyright (C) 2004, 2005 g10 Code GmbH
+ *     Copyright (C) 2004, 2005, 2006 g10 Code GmbH
  * 
  * This file is part of GPGol.
  * 
@@ -148,6 +148,8 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
                                !!opt.auto_sign_attach, 0L);
            SendDlgItemMessage (hDlg, IDC_PREVIEW_DECRYPT, BM_SETCHECK,
                                !!opt.preview_decrypt, 0L);
+           SendDlgItemMessage (hDlg, IDC_PREFER_HTML, BM_SETCHECK,
+                               !!opt.prefer_html, 0L);
            bMsgResult = FALSE;  /* accepts activation */
            break; }
                
@@ -185,6 +187,8 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
               (hDlg, IDC_SIGN_ATTACHMENTS, BM_GETCHECK, 0, 0L);
             opt.preview_decrypt = !!SendDlgItemMessage
               (hDlg, IDC_PREVIEW_DECRYPT, BM_GETCHECK, 0, 0L);
+            opt.prefer_html = !!SendDlgItemMessage
+              (hDlg, IDC_PREFER_HTML, BM_GETCHECK, 0, 0L);
 
            write_options ();
            bMsgResult = PSNRET_NOERROR;
index 5fafc95..d88ee0f 100644 (file)
@@ -26,5 +26,6 @@
 #define IDC_SIGN_ATTACHMENTS            4011
 #define IDD_GPG_OPTIONS_DE              4012
 #define IDC_PREVIEW_DECRYPT             4013
+#define IDC_PREFER_HTML                 4014
 
 #endif /*OLFLANGE_IDS_H*/
index 1d6b7e0..5353716 100644 (file)
@@ -1,5 +1,5 @@
 /* olflange-rsrcs.rc - Olflange specific resource.         -*- c -*-
- *     Copyright (C) 2004, 2005 g10 Code GmbH
+ *     Copyright (C) 2004, 2005, 2006 g10 Code GmbH
  * 
  * This file is part of GPGol.
  * 
@@ -56,7 +56,7 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "GnuPG"
 FONT 8, "MS Sans Serif"
 BEGIN
-    GROUPBOX        "Optionen",IDC_STATIC,9,9,242,100
+    GROUPBOX        "Optionen",IDC_STATIC,9,9,242,112
     CONTROL         "Neue Nachrichten per Voreinstellung verschlüsseln",
                     IDC_ENCRYPT_DEFAULT,"Button",BS_AUTOCHECKBOX | 
                     WS_TABSTOP,24,19,177,10
@@ -77,10 +77,14 @@ BEGIN
                     IDC_PREVIEW_DECRYPT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
                     24,95,162,10
 
-    GROUPBOX        "Passphrase",IDC_STATIC,9,110,242,31
-    LTEXT           "Passphrase speichern für",IDC_STATIC,24,124,80,8
-    EDITTEXT        IDC_TIME_PHRASES,107,123,39,14,ES_AUTOHSCROLL
-    LTEXT           "Sekunden",IDC_STATIC,151,125,34,8
+    CONTROL         "Wenn möglich, HTML Version anzeigen",
+                    IDC_PREFER_HTML,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    24,107,162,10
+
+    GROUPBOX        "Passphrase",IDC_STATIC,9,124,242,31
+    LTEXT           "Passphrase speichern für",IDC_STATIC,24,136,80,8
+    EDITTEXT        IDC_TIME_PHRASES,107,135,39,14,ES_AUTOHSCROLL
+    LTEXT           "Sekunden",IDC_STATIC,151,137,34,8
 
     PUSHBUTTON      "&Erweitert...",IDC_GPG_OPTIONS,202,166,50,14
     LTEXT           "GPGol by g10 Code GmbH", IDC_STATIC,8,185,100,8
@@ -132,7 +136,7 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "GnuPG"
 FONT 8, "MS Sans Serif"
 BEGIN
-    GROUPBOX        "Options",IDC_STATIC,9,9,242,87
+    GROUPBOX        "Options",IDC_STATIC,9,9,242,112
     CONTROL         "&Encrypt new messages by default",IDC_ENCRYPT_DEFAULT,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,19,121,10
     CONTROL         "&Sign new messages by default",IDC_SIGN_DEFAULT,"Button",
@@ -146,10 +150,22 @@ BEGIN
                     IDC_ENCRYPT_WITH_STANDARD_KEY,"Button",BS_AUTOCHECKBOX | 
                     WS_TABSTOP,24,67,148,10
     EDITTEXT        IDC_ENCRYPT_TO,36,79,133,12,ES_AUTOHSCROLL
-    GROUPBOX        "Passphrase",IDC_STATIC,9,100,242,31
-    LTEXT           "Cache &passphrase for",IDC_STATIC,24,114,70,8
-    EDITTEXT        IDC_TIME_PHRASES,107,113,39,14,ES_AUTOHSCROLL
-    LTEXT           "seconds",IDC_STATIC,151,115,28,8
+
+    CONTROL         "Also decrypt in preview window",
+                    IDC_PREVIEW_DECRYPT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    24,95,162,10
+
+    CONTROL         "Show HTML Version is possible",
+                    IDC_PREFER_HTML,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    24,107,162,10
+
+
+    GROUPBOX        "Passphrase",IDC_STATIC,9,124,242,31
+    LTEXT           "Cache &passphrase for",IDC_STATIC,24,136,70,8
+    EDITTEXT        IDC_TIME_PHRASES,107,135,39,14,ES_AUTOHSCROLL
+    LTEXT           "seconds",IDC_STATIC,151,137,28,8
+
+
     PUSHBUTTON      "Ad&vanced..",IDC_GPG_OPTIONS,202,166,50,14
     LTEXT           "GPGol by g10 Code GmbH", IDC_STATIC,8,185,100,8
     LTEXT           "Version x ",IDC_VERSION_INFO,150,185,200,9