(no commit message)
authorTimo Schulz <twoaday@freakmail.de>
Fri, 25 Aug 2006 07:31:39 +0000 (07:31 +0000)
committerTimo Schulz <twoaday@freakmail.de>
Fri, 25 Aug 2006 07:31:39 +0000 (07:31 +0000)
src/ChangeLog
src/engine-gpgme.c
src/olflange-dlgs.cpp
src/olflange-rsrcs.rc
src/passphrase-dialog.c
src/recipient-dialog.c

index 21c3850..4f98912 100644 (file)
@@ -1,3 +1,21 @@
+2008-08-21  Timo Schulz  <ts@g10code.de>
+
+       * engine-gpgme.c (op_lookup_keys): Only add useable keys
+       and add all invalid keys to unknown.
+       * recipient-dialog.c (copy_item): Rewritten.
+       (initialize_keybox): Add comment to clarify use of fnd_keys.
+       (recipient_dialog_box): Simplified.
+       (find_item): Support partial search.
+       
+2006-08-19  Timo Schulz  <ts@g10code.de>
+
+       * olflange-rsrcs.rc: Correct some dialog sizes.
+       * passphrase-dialog.c (decrypt_key_dlg_proc): Automatically
+       select the secret key if only one is available.
+       * config-dialog.c (GPGOptionsDlgProc): Passphrase cache
+       time is now requested in minutes but still internally
+       stored as seconds.
+       
 2006-08-15  Timo Schulz  <ts@g10code.de>
 
        * decrypt.bmp, encrypt.bmp: Restore format.
index bef61c2..6cbe3ac 100644 (file)
@@ -1333,9 +1333,22 @@ op_lookup_keys (char **names, gpgme_key_t **keys, char ***unknown)
         }
       gpgme_op_keylist_end (ctx);
 
-      if (k)
+      
+      /* only useable keys will be added otherwise they will be stored
+         in unknown (marked with their status). */
+      if (k && !k->revoked && !k->disabled && !k->expired)
         (*keys)[kpos++] = k;
-      else
+      else if (k)
+       {
+         char *p, *fmt = "%s (%s)";
+         char *warn = k->revoked? "revoked" : k->expired? "expired" : "disabled";
+         
+         p = xcalloc (1, strlen (names[i]) + strlen (warn) + strlen (fmt) +1);
+         sprintf (p, fmt, names[i], warn);
+         (*unknown)[upos++] = p;
+         gpgme_key_release (k);
+       }
+      else if (!k)
         (*unknown)[upos++] = xstrdup (names[i]);
     }
 
index d6fcf32..21d5da6 100644 (file)
@@ -148,8 +148,8 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
                SetDlgItemText (hDlg, IDC_ENCRYPT_TO, opt.default_key);
             else
                SetDlgItemText (hDlg, IDC_ENCRYPT_TO, "");
-           wsprintf(s, "%d", opt.passwd_ttl);
-           SendDlgItemMessage(hDlg, IDC_TIME_PHRASES, WM_SETTEXT,
+           wsprintf (s, "%d", opt.passwd_ttl/60);
+           SendDlgItemMessage (hDlg, IDC_TIME_PHRASES, WM_SETTEXT,
                                0, (LPARAM) s);
            hWndPage = pnmhdr->hwndFrom;   // to be used in WM_COMMAND
            SendDlgItemMessage (hDlg, IDC_ENCRYPT_DEFAULT, BM_SETCHECK, 
@@ -191,7 +191,7 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  
            SendDlgItemMessage (hDlg, IDC_TIME_PHRASES, WM_GETTEXT,
                                 20, (LPARAM)s);                
-           opt.passwd_ttl = (int)atol (s);
+           opt.passwd_ttl = (int)atol (s)*60;
                
            opt.encrypt_default = !!SendDlgItemMessage
               (hDlg, IDC_ENCRYPT_DEFAULT, BM_GETCHECK, 0, 0L);
index 1fcdabd..52fe683 100644 (file)
@@ -51,7 +51,7 @@ IDB_BANNER              BITMAP  DISCARDABLE     "logo.bmp"
 // Dialog
 //
 
-IDD_GPG_OPTIONS_DE DIALOG DISCARDABLE  0, 0, 266, 201
+IDD_GPG_OPTIONS_DE DIALOG DISCARDABLE  0, 0, 266, 274
 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "GnuPG"
 FONT 8, "MS Sans Serif"
@@ -77,18 +77,18 @@ BEGIN
                     IDC_PREVIEW_DECRYPT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
                     24,95,162,10
 
-    CONTROL         "Wenn möglich, HTML Darstellung anzeigen",
+    CONTROL         "HTML Darstellung anzeigen wenn möglich",
                     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
+    LTEXT           "Minuten",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
-    LTEXT           "Version x ",IDC_VERSION_INFO,150,185,200,9
+    LTEXT           "Version x ",IDC_VERSION_INFO,150,185,109,9                                                  
     CONTROL         IDB_BANNER,IDC_BITMAP,"Static",
                     SS_BITMAP | SS_REALSIZEIMAGE,8,200,150,64
 END
@@ -131,7 +131,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 // Dialog
 //
 
-IDD_GPG_OPTIONS DIALOG DISCARDABLE  0, 0, 266, 201
+IDD_GPG_OPTIONS DIALOG DISCARDABLE  0, 0, 266, 271
 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
 CAPTION "GnuPG"
 FONT 8, "MS Sans Serif"
@@ -155,7 +155,7 @@ BEGIN
                     IDC_PREVIEW_DECRYPT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
                     24,95,162,10
 
-    CONTROL         "Show HTML View if possible",
+    CONTROL         "Show HTML view if possible",
                     IDC_PREFER_HTML,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
                     24,107,162,10
 
@@ -163,12 +163,12 @@ BEGIN
     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
+    LTEXT           "minutes",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
+    LTEXT           "Version x ",IDC_VERSION_INFO,150,183,109,9
     CONTROL         IDB_BANNER,IDC_BITMAP,"Static",
                     SS_BITMAP | SS_REALSIZEIMAGE,8,200,150,64
 END
index 03c13d0..ec5e2d6 100644 (file)
@@ -202,17 +202,16 @@ get_pubkey_algo_str (gpgme_pubkey_algo_t alg)
 }
 
 
-/* Fill a combo box with all keys and return an error with those
-   keys. */
-static gpgme_key_t *
-load_secbox (HWND dlg, int ctlid)
+/* Fill a combo box with all keys and return an error with those keys. 
+   set *R_NKEYS to the amount of keys if requested. */
+static gpgme_key_t*
+load_secbox (HWND dlg, int ctlid, size_t *r_nkeys)
 {
   gpg_error_t err;
   gpgme_ctx_t ctx;
   gpgme_key_t key;
-  int pos;
   gpgme_key_t *keyarray;
-  size_t keyarray_size;
+  size_t pos, keyarray_size;
 
   err = gpgme_new (&ctx);
   if (err)
@@ -298,6 +297,8 @@ load_secbox (HWND dlg, int ctlid)
 
   gpgme_op_keylist_end (ctx);
   gpgme_release (ctx);
+  if (r_nkeys)
+    *r_nkeys = pos;
   return keyarray;
 }
 
@@ -328,8 +329,18 @@ decrypt_key_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
                         (dec && dec->last_was_bad)?
                         _("Invalid passphrase; please try again..."):"");
 
-      if (dec && !context->use_as_cb)
-       context->keyarray = load_secbox (dlg, IDC_DEC_KEYLIST);
+      if (dec && !context->use_as_cb) {
+       context->keyarray = load_secbox (dlg, IDC_DEC_KEYLIST, &n);
+       /* if only one secret key is availble, it makes no sense to
+          ask the user to select one. */
+       if (n == 1) 
+         {
+           dec->signer = context->keyarray[0];
+           gpgme_key_ref (context->keyarray[0]);
+           EndDialog (dlg, TRUE);
+           return FALSE;
+         }
+      }
 
       CheckDlgButton (dlg, IDC_DEC_HIDE, BST_CHECKED);
       center_window (dlg, NULL);
index 09c6879..94dae40 100644 (file)
@@ -48,12 +48,7 @@ struct recipient_cb_s
   char **unknown_keys;  /* A string array with the names of the
                            unknown recipients. */
 
-  char **fnd_keys;      /* A string array with the user IDs of already
-                           found keys.  I am not sure why they are
-                           needed here at all - they won't get
-                           displayed for unknown reasons. */
-  gpgme_key_t *fnd_keys_key; /* Same as above but the actual gpgme object. */
-  
+  gpgme_key_t *fnd_keys; /* email address to key mapping list. */  
 
   /* A bit vector used to return selected options. */
   unsigned int opts;
@@ -68,17 +63,21 @@ struct recipient_cb_s
   size_t      selected_keys_count;
 };
 
-struct key_item_s 
+
+/* Symbolic column IDs. */
+enum klist_col_t 
 {
-  char name [150];
-  char e_mail[100];
-  char key_info[64];
-  char keyid[32];
-  char validity[32];
-  char idx[20];
+  KL_COL_NAME = 0,
+  KL_COL_EMAIL = 1,
+  KL_COL_INFO = 2,
+  KL_COL_KEYID = 3,
+  KL_COL_VALID = 4,
+  KL_COL_INDEX = 5,
+  /* number of columns. */
+  KL_COL_N = 6
 };
 
-
+/* Insert the columns, needed to display keys, into the list view HWND. */
 static void
 initialize_rsetbox (HWND hwnd)
 {
@@ -88,39 +87,41 @@ initialize_rsetbox (HWND hwnd)
     col.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
     col.pszText = "Name";
     col.cx = 100;
-    col.iSubItem = 0;
-    ListView_InsertColumn (hwnd, 0, &col);
+    col.iSubItem = KL_COL_NAME;
+    ListView_InsertColumn (hwnd, KL_COL_NAME, &col);
 
     col.pszText = "E-Mail";
     col.cx = 100;
-    col.iSubItem = 1;
-    ListView_InsertColumn (hwnd, 1, &col);
+    col.iSubItem = KL_COL_EMAIL;
+    ListView_InsertColumn (hwnd, KL_COL_EMAIL, &col);
 
     col.pszText = "Key-Info";
     col.cx = 100;
-    col.iSubItem = 2;
-    ListView_InsertColumn (hwnd, 2, &col);
+    col.iSubItem = KL_COL_INFO;
+    ListView_InsertColumn (hwnd, KL_COL_INFO, &col);
 
     col.pszText = "Key ID";
     col.cx = 80;
-    col.iSubItem = 3;
-    ListView_InsertColumn (hwnd, 3, &col);
+    col.iSubItem = KL_COL_KEYID;
+    ListView_InsertColumn (hwnd, KL_COL_KEYID, &col);
 
     col.pszText = "Validity";
     col.cx = 70;
-    col.iSubItem = 4;
-    ListView_InsertColumn (hwnd, 4, &col);
+    col.iSubItem = KL_COL_VALID;
+    ListView_InsertColumn (hwnd, KL_COL_VALID, &col);
 
     col.pszText = "Index";
     col.cx = 0;  /* Hide it. */
-    col.iSubItem = 5;
-    ListView_InsertColumn (hwnd, 5, &col);
+    col.iSubItem = KL_COL_INDEX;
+    ListView_InsertColumn (hwnd, KL_COL_INDEX, &col);
 
     ListView_SetExtendedListViewStyleEx (hwnd, 0, LVS_EX_FULLROWSELECT);
 }
 
 
-static gpgme_key_t *
+/* Load the key list view control HWND with all useable keys 
+   for encryption. Return the array size in *R_ARRAYSIZE. */
+static gpgme_key_t*
 load_rsetbox (HWND hwnd, size_t *r_arraysize)
 {
   LVITEM lvi;
@@ -275,14 +276,16 @@ release_keyarray (gpgme_key_t *array, size_t count)
 }
 
 
+#define ITEMSIZE 200
 
+/* Copy one list view item from one view to another. */
 static void
 copy_item (HWND dlg, int id_from, int pos)
 {
   HWND src, dst;
   LVITEM lvi;
-  struct key_item_s from;
-  int idx = pos;
+  char item[KL_COL_N][ITEMSIZE];
+  int idx = pos, i;
   
   src = GetDlgItem (dlg, id_from);
   dst = GetDlgItem (dlg, id_from==IDC_ENC_RSET1 ?
@@ -295,27 +298,19 @@ copy_item (HWND dlg, int id_from, int pos)
         return;
     }
   
-  memset (&from, 0, sizeof (from));
-  ListView_GetItemText (src, idx, 0, from.name, sizeof (from.name)-1);
-  ListView_GetItemText (src, idx, 1, from.e_mail, sizeof (from.e_mail)-1);
-  ListView_GetItemText (src, idx, 2, from.key_info, sizeof (from.key_info)-1);
-  ListView_GetItemText (src, idx, 3, from.keyid, sizeof (from.keyid)-1);
-  ListView_GetItemText (src, idx, 4, from.validity, sizeof (from.validity)-1);
-  ListView_GetItemText (src, idx, 5, from.idx, sizeof (from.idx)-1);
-
+  for (i=0; i < KL_COL_N; i++)
+    ListView_GetItemText (src, idx, i, item[i], ITEMSIZE-1);
   ListView_DeleteItem (src, idx);
   
   memset (&lvi, 0, sizeof (lvi));
   ListView_InsertItem (dst, &lvi);
-  ListView_SetItemText (dst, 0, 0, from.name);
-  ListView_SetItemText (dst, 0, 1, from.e_mail);
-  ListView_SetItemText (dst, 0, 2, from.key_info);
-  ListView_SetItemText (dst, 0, 3, from.keyid);
-  ListView_SetItemText (dst, 0, 4, from.validity);
-  ListView_SetItemText (dst, 0, 5, from.idx);
+  for (i=0; i < KL_COL_N; i++)
+    ListView_SetItemText (dst, 0, i, item[i]);
 }
 
 
+/* Try to find an item with STR as the text in the first column.
+   Return the index of the item or -1 if no item was found. */
 static int
 find_item (HWND hwnd, const char *str)
 {
@@ -323,7 +318,7 @@ find_item (HWND hwnd, const char *str)
     int pos;
 
     memset (&fnd, 0, sizeof (fnd));
-    fnd.flags = LVFI_STRING;
+    fnd.flags = LVFI_STRING|LVFI_PARTIAL;;
     fnd.psz = str;
     pos = ListView_FindItem (hwnd, -1, &fnd);
     if (pos != -1)
@@ -347,13 +342,19 @@ initialize_keybox (HWND dlg, struct recipient_cb_s *cb)
                      (LPARAM)(const char *)cb->unknown_keys[i]);
     }
 
+  /* copy all requested keys into the second recipient listview
+     to indicate that these key were automatically picked via
+     the 'From' mailing header. */
   if (cb->fnd_keys)
     {
       for (i=0; cb->fnd_keys[i]; i++) 
         {
-          n = find_item (rset, cb->fnd_keys[i]);
+         char *uid = utf8_to_native (cb->fnd_keys[i]->uids->name);
+
+          n = find_item (rset, uid);
           if (n != -1)
             copy_item (dlg, IDC_ENC_RSET1, n);
+         xfree (uid);
         }
     }
 }
@@ -376,7 +377,6 @@ recipient_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
       initialize_rsetbox (GetDlgItem (dlg, IDC_ENC_RSET1));
       rset_cb->keyarray = load_rsetbox (GetDlgItem (dlg, IDC_ENC_RSET1),
                                         &rset_cb->keyarray_count);
-
       initialize_rsetbox (GetDlgItem (dlg, IDC_ENC_RSET2));
 
       if (rset_cb->unknown_keys)
@@ -412,7 +412,7 @@ recipient_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
               return FALSE;
            }
 
-          for (j=0; rset_cb->fnd_keys_key && rset_cb->fnd_keys_key[j]; j++)
+          for (j=0; rset_cb->fnd_keys && rset_cb->fnd_keys[j]; j++)
             ;
           rset_cb->selected_keys_count = ListView_GetItemCount (hrset);
           rset_cb->selected_keys = xcalloc (rset_cb->selected_keys_count
@@ -455,10 +455,10 @@ recipient_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
                 log_debug ("List item not correctly initialized - ignored\n");
             }
           /* Add the already found keys. */
-          for (i=0; rset_cb->fnd_keys_key && rset_cb->fnd_keys_key[i]; i++)
+          for (i=0; rset_cb->fnd_keys && rset_cb->fnd_keys[i]; i++)
             {
-              gpgme_key_ref (rset_cb->fnd_keys_key[i]);
-              rset_cb->selected_keys[pos++] = rset_cb->fnd_keys_key[i];
+              gpgme_key_ref (rset_cb->fnd_keys[i]);
+              rset_cb->selected_keys[pos++] = rset_cb->fnd_keys[i];
             }
 
           rset_cb->selected_keys_count = pos;
@@ -521,27 +521,12 @@ recipient_dialog_box2 (gpgme_key_t *fnd, char **unknown,
                       gpgme_key_t **ret_rset)
 {
   struct recipient_cb_s cb;
-  int i;
-  size_t n;
   int resid;
-
+  
   *ret_rset = NULL;
 
   memset (&cb, 0, sizeof (cb));
-
-  for (n=0; fnd[n]; n++)
-    ;
-  cb.fnd_keys = xcalloc (n+1, sizeof *cb.fnd_keys);
-
-  for (i = 0; i < n; i++) 
-    {
-      if (fnd[i] && fnd[i]->uids && fnd[i]->uids->uid)
-        cb.fnd_keys[i] = xstrdup (fnd[i]->uids->uid);
-      else
-       cb.fnd_keys[i] = xstrdup (_("User-ID not found"));
-    }
-
-  cb.fnd_keys_key = fnd;
+  cb.fnd_keys = fnd;
   cb.unknown_keys = unknown;
 
   if (!strncmp (gettext_localename (), "de", 2))
@@ -557,8 +542,6 @@ recipient_dialog_box2 (gpgme_key_t *fnd, char **unknown,
     *ret_rset = cb.selected_keys;
 
   release_keyarray (cb.keyarray, cb.keyarray_count);
-  for (i = 0; i < n; i++) 
-    xfree (cb.fnd_keys[i]);
   xfree (cb.fnd_keys);
   return cb.opts;
 }