Released 0.9.3 gpgol-0.9.3
authorWerner Koch <wk@gnupg.org>
Thu, 29 Sep 2005 10:47:06 +0000 (10:47 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 29 Sep 2005 10:47:06 +0000 (10:47 +0000)
ChangeLog
NEWS
configure.ac
src/ChangeLog
src/engine-gpgme.c
src/gpgmsg.cpp
src/intern.h
src/passphrase-dialog.c

index 8b52f21..3e54464 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2005-09-29  Werner Koch  <wk@g10code.com>
+
+       Released 0.9.3.
+
 2005-09-22  Werner Koch  <wk@g10code.com>
 
        Released 0.9.2.
diff --git a/NEWS b/NEWS
index 3ed38e4..78a6c37 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,16 @@
+Noteworthy changes for version 0.9.3 (2005-09-29)
+=================================================
+
+* Fixed bugs introduced with the last release.
+
+* PGP/MIME decryption works now correctly with Latin-1 and utf-8.
+
+* No more pop-ups to ask whether to save changes after just decrypting
+  a message.
+
+* Fixed a couple of bugs possibly leading to crashes.
+
+
 Noteworthy changes for version 0.9.2 (2005-09-22)
 =================================================
 
index 28e85ff..4f4ddeb 100644 (file)
@@ -15,7 +15,7 @@ min_automake_version="1.9.4"
 
 # Version number: Remember to change it immediately *after* a release.
 #                 Add a "-cvs" prefix for non-released code.
-AC_INIT(gpgol, 0.9.3-cvs, bug-gpgol@g10code.com)
+AC_INIT(gpgol, 0.9.3, bug-gpgol@g10code.com)
 
 NEED_GPGME_API=1
 NEED_GPGME_VERSION=1.1.0
index a0a2ccb..538ef83 100644 (file)
@@ -1,3 +1,14 @@
+2005-09-29  Werner Koch  <wk@g10code.com>
+
+       * gpgmsg.cpp (encrypt_and_sign): Pass signing key to encryption
+       function.
+
+       * passphrase-dialog.c (signer_dialog_box): New arg encrypting. 
+
+       * gpgmsg.cpp (encrypt_and_sign): Set content type.
+
+       * engine-gpgme.c (op_lookup_keys): Fixed multiple key detection.
+
 2005-09-28  Werner Koch  <wk@g10code.com>
 
        * olflange.cpp (DoCommand): Catch close command and resend to
index f1900ba..6cbfa49 100644 (file)
@@ -1181,8 +1181,8 @@ add_verify_attestation (gpgme_data_t a, gpgme_ctx_t ctx,
 
 
 \f
-/* Try to find a key for each item in array NAMES. Item not found are
-   stored as malloced strings in tghe newly allocated array UNKNOWN.
+/* Try to find a key for each item in array NAMES. Items not found are
+   stored as malloced strings in the newly allocated array UNKNOWN.
    Found keys are stored in the newly allocated array KEYS.  Both
    arrays are terminated by a NULL entry.  Caller needs to releade
    KEYS and UNKNOWN.
@@ -1219,7 +1219,7 @@ op_lookup_keys (char **names, gpgme_key_t **keys, char ***unknown)
       if (!err)
         {
           err = gpgme_op_keylist_next (ctx, &k);
-          if (!err && gpgme_op_keylist_next (ctx, &k2))
+          if (!err && !gpgme_op_keylist_next (ctx, &k2))
             {
               /* More than one matching key available.  Take this one
                  as unknown. */
index 37854d0..584dd26 100644 (file)
@@ -1144,7 +1144,7 @@ GpgMsgImpl::sign (HWND hwnd)
     }
 
   /* Pop up a dialog box to ask for the signer of the message. */
-  if (signer_dialog_box (&sign_key, NULL) == -1)
+  if (signer_dialog_box (&sign_key, NULL, 0) == -1)
     {
       log_debug ("%s.%s: leave (dialog failed)\n", __FILE__, __func__);
       return gpg_error (GPG_ERR_CANCELED);  
@@ -1214,6 +1214,7 @@ GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
   char **unknown = NULL;
   int err = 0;
   size_t n_keys, n_unknown, n_recp;
+  SPropValue prop;
     
   
   if (!*(plaintext = getOrigText ()) && !hasAttachments ()) 
@@ -1225,7 +1226,7 @@ GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
   /* Pop up a dialog box to ask for the signer of the message. */
   if (sign_flag)
     {
-      if (signer_dialog_box (&sign_key, NULL) == -1)
+      if (signer_dialog_box (&sign_key, NULL, 1) == -1)
         {
           log_debug ("%s.%s: leave (dialog failed)\n", __FILE__, __func__);
           return gpg_error (GPG_ERR_CANCELED);  
@@ -1279,7 +1280,8 @@ GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
     {
       is_html = is_html_body (plaintext);
 
-      err = op_encrypt (plaintext, &ciphertext, keys, NULL, 0);
+      err = op_encrypt (plaintext, &ciphertext, 
+                        keys, sign_key, opt.passwd_ttl);
       if (err)
         {
           MessageBox (hwnd, op_strerror (err),
@@ -1296,7 +1298,6 @@ GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
 
 //       {
 //         SPropValue prop;
-
 //         prop.ulPropTag=PR_MESSAGE_CLASS_A;
 //         prop.Value.lpszA="IPM.Note.OPENPGP";
 //         hr = HrSetOneProp (message, &prop);
@@ -1305,15 +1306,6 @@ GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
 //             log_error ("%s:%s: can't set message class: hr=%#lx\n",
 //                        __FILE__, __func__, hr); 
 //           }
-
-//         prop.ulPropTag=PR_CONTENT_TYPE_A;
-//         prop.Value.lpszA="application/encrypted;foo=bar;type=mytype";
-//         hr = HrSetOneProp (message, &prop);
-//         if (hr != S_OK)
-//           {
-//             log_error ("%s:%s: can't set content type: hr=%#lx\n",
-//                        __FILE__, __func__, hr); 
-//           }
 //       }
 
     }
@@ -1334,7 +1326,7 @@ GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
         }
     }
 
-  set_x_header (message, "Gpgol-Version", PACKAGE_VERSION);
+  set_x_header (message, "GPGOL-VERSION", PACKAGE_VERSION);
 
   /* Now that we successfully processed the attachments, we can save
      the changes to the body.  For unknown reasons we need to set it
@@ -1346,6 +1338,20 @@ GpgMsgImpl::encrypt_and_sign (HWND hwnd, bool sign_flag)
         err = set_message_body (message, ciphertext);
       if (err)
         goto leave;
+
+      /* In case we don't have attachments, Outlook will really insert
+         the following content type into the header.  We use this to
+         declare that the encrypted content of the message is utf-8
+         encoded. */
+      prop.ulPropTag=PR_CONTENT_TYPE_A;
+      prop.Value.lpszA="text/plain; charset=utf-8"; 
+      hr = HrSetOneProp (message, &prop);
+      if (hr != S_OK)
+        {
+          log_error ("%s:%s: can't set content type: hr=%#lx\n",
+                     __FILE__, __func__, hr);
+        }
+
       hr = message->SaveChanges (KEEP_OPEN_READWRITE|FORCE_SAVE);
       if (hr != S_OK)
         {
index 5a20225..7afcb8e 100644 (file)
@@ -133,7 +133,7 @@ unsigned int recipient_dialog_box2 (gpgme_key_t *fnd, char **unknown,
                                     gpgme_key_t **ret_rset);
 
 /*-- passphrase-dialog.c --*/
-int signer_dialog_box (gpgme_key_t *r_key, char **r_passwd);
+int signer_dialog_box (gpgme_key_t *r_key, char **r_passwd, int encrypting);
 gpgme_error_t passphrase_callback_box (void *opaque, const char *uid_hint, 
                             const char *pass_info,
                             int prev_was_bad, int fd);
index 254d9fb..e623874 100644 (file)
@@ -45,6 +45,8 @@ struct dialog_context_s
   int hide_state;            /* Flag indicating that some stuff is hidden. */
 
   unsigned int use_as_cb;    /* This is used by the passphrase callback. */
+
+  int no_encrypt_warning;    /* Print a warning after cancel. */
 };
 
 
@@ -227,6 +229,7 @@ load_secbox (HWND dlg, int ctlid)
     {
       const char *name, *email, *keyid, *algo;
       char *p;
+      long idx;
       
       if (key->revoked || key->expired || key->disabled || key->invalid)
         {
@@ -258,11 +261,16 @@ load_secbox (HWND dlg, int ctlid)
        sprintf (p, "%s <%s> (0x%s, %s)", name, email, keyid+8, algo);
       else
        sprintf (p, "%s (0x%s, %s)", name, keyid+8, algo);
-      SendDlgItemMessage (dlg, ctlid, CB_ADDSTRING, 0, 
+      idx = SendDlgItemMessage (dlg, ctlid, CB_ADDSTRING, 0, 
                          (LPARAM)(const char *) p);
       xfree (p);
-
-      SendDlgItemMessage (dlg, ctlid, CB_SETITEMDATA, pos, (LPARAM)pos);
+      if (idx < 0) /* Error. */
+        {
+          gpgme_key_release (key);
+          continue;
+        }
+      
+      SendDlgItemMessage (dlg, ctlid, CB_SETITEMDATA, idx, (LPARAM)pos);
 
       if (pos >= keyarray_size)
         {
@@ -278,6 +286,7 @@ load_secbox (HWND dlg, int ctlid)
         }
       keyarray[pos++] = key;
     }
+  SendDlgItemMessage (dlg, ctlid, CB_SETCURSEL, 0, 0);
 
   gpgme_op_keylist_end (ctx);
   gpgme_release (ctx);
@@ -293,6 +302,7 @@ decrypt_key_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
   static struct dialog_context_s *context; 
   struct decrypt_key_s *dec;
   size_t n;
+  const char *warn;
 
   if (msg == WM_INITDIALOG)
     {
@@ -389,11 +399,23 @@ decrypt_key_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
           break;
           
        case IDCANCEL:
-          if (dec && context->use_as_cb && (dec->flags & 0x01)) 
+          if (context->no_encrypt_warning)
+            {
+              warn = _("If you cancel this dialog, the message will be sent"
+                       " in cleartext!\n\n"
+                       "Do you really want to cancel?");
+            }
+          else if (dec && context->use_as_cb && (dec->flags & 0x01)) 
+            {
+              warn = _("If you cancel this dialog, the message"
+                       " will be sent without signing.\n\n"
+                       "Do you really want to cancel?");
+            }
+          else
+            warn = NULL;
+
+          if (warn)
             {
-              const char *warn = _("If you cancel this dialog, the message"
-                                   " will be sent without signing.\n\n"
-                                   "Do you really want to cancel?");
               n = MessageBox (dlg, warn, "Secret Key Dialog",
                               MB_ICONWARNING|MB_YESNO);
               if (n == IDNO)
@@ -422,6 +444,7 @@ decrypt_key_ext_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
   static struct dialog_context_s *context; 
   struct decrypt_key_s * dec;
   size_t n;
+  const char *warn;
 
   if (msg == WM_INITDIALOG)
     {
@@ -495,11 +518,23 @@ decrypt_key_ext_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
           break;
 
        case IDCANCEL:
-          if (dec && context->use_as_cb && (dec->flags & 0x01)) 
+          if (context->no_encrypt_warning)
+            {
+              warn = _("If you cancel this dialog, the message will be sent"
+                       " in cleartext!\n\n"
+                       "Do you really want to cancel?");
+            }
+          else if (dec && context->use_as_cb && (dec->flags & 0x01)) 
+            {
+              warn = _("If you cancel this dialog, the message"
+                       " will be sent without signing.\n"
+                       "Do you really want to cancel?");
+            }
+          else
+            warn = NULL;
+
+          if (warn)
             {
-              const char *warn = _("If you cancel this dialog, the message"
-                                   " will be sent without signing.\n"
-                                  "Do you really want to cancel?");
               n = MessageBox (dlg, warn, "Secret Key Dialog",
                               MB_ICONWARNING|MB_YESNO);
               if (n == IDNO)
@@ -521,9 +556,10 @@ decrypt_key_ext_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
 
 /* Display a signer dialog which contains all secret keys, useable for
    signing data.  The key is returned in R_KEY.  The passprase in
-   r_passwd. */
+   r_passwd.  IF Encrypting is true, the message will get encrypted
+   later. */
 int 
-signer_dialog_box (gpgme_key_t *r_key, char **r_passwd)
+signer_dialog_box (gpgme_key_t *r_key, char **r_passwd, int encrypting)
 {
   struct dialog_context_s context; 
   struct decrypt_key_s dec;
@@ -532,7 +568,8 @@ signer_dialog_box (gpgme_key_t *r_key, char **r_passwd)
   memset (&dec, 0, sizeof dec);
   dec.hide_pwd = 1;
   context.dec = &dec;
-  
+  context.no_encrypt_warning = encrypting;
+
   DialogBoxParam (glob_hinst, (LPCTSTR)IDD_DEC, GetDesktopWindow (),
                   decrypt_key_dlg_proc, (LPARAM)&context);