/[winpt]/trunk/Src/wptKeyManagerDlg.cpp
ViewVC logotype

Diff of /trunk/Src/wptKeyManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 119 by twoaday, Fri Dec 9 08:04:51 2005 UTC revision 150 by twoaday, Wed Jan 18 11:52:45 2006 UTC
# Line 1  Line 1 
1  /* wptKeyManagerDlg.cpp - WinPT Key Manager  /* wptKeyManagerDlg.cpp - WinPT Key Manager
2   *      Copyright (C) 2000-2005 Timo Schulz   *      Copyright (C) 2000-2006 Timo Schulz
3   *      Copyright (C) 2004 Andreas Jobs   *      Copyright (C) 2004 Andreas Jobs
4   *   *
5   * This file is part of WinPT.   * This file is part of WinPT.
# Line 18  Line 18 
18   * along with WinPT; if not, write to the Free Software Foundation,   * along with WinPT; if not, write to the Free Software Foundation,
19   * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA   * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20   */   */
   
21  #ifdef HAVE_CONFIG_H  #ifdef HAVE_CONFIG_H
22  #include <config.h>  #include <config.h>
23  #endif  #endif
# Line 42  Line 41 
41  #include "wptKeyserver.h"  #include "wptKeyserver.h"
42  #include "wptKeyEdit.h"  #include "wptKeyEdit.h"
43  #include "wptRegistry.h"  #include "wptRegistry.h"
44    #include "wptUTF8.h"
45    
46  #define KM_SEPARATOR_ID                10000  /* Name and ID of the separator window. */
47  #define WINDOWCLASS_SEPARATOR_CHILD "WINPT_SEP_CHILD"  #define KM_SEPARATOR_ID                 10000
48  //#define KM_SEPARATOR_HEIGHT            5  #define WINDOWCLASS_SEPARATOR_CHILD     "WINPT_SEP_CHILD"
49    
50    /* Virtual key codes. */
51    #ifndef VK_F
52    #define VK_F 70
53    #endif
54    #ifndef VK_A
55    #define VK_A 65
56    #endif
57    #ifndef VK_C
58    #define VK_C 67
59    #endif
60    #ifndef VK_P
61    #define VK_P 80
62    #endif
63    
64  static subclass_s keylist_proc;  static subclass_s keylist_proc;
 static int km_index = -1;  
65    
66  HIMAGELIST glob_imagelist;  HIMAGELIST glob_imagelist;
67    
68  struct km_info {  struct km_info_s {
69      /* Window positions */      /* Window positions */
70      int pos_x, pos_y;      int pos_x, pos_y;
71      int ypos_sep;      int ypos_sep;
# Line 64  struct km_info { Line 76  struct km_info {
76      HWND statbar;      HWND statbar;
77    
78      listview_ctrl_t lv;      listview_ctrl_t lv;
79        int             lv_idx;
80      int keylist_sortby;      int keylist_sortby;
81  };  };
82    
83    /* Toolbar button structure. */
84  struct mybuttons {  struct mybuttons {
85      long icon;      long icon;
86      long command;      long command;
# Line 82  struct mybuttons myb[] = { Line 96  struct mybuttons myb[] = {
96  };  };
97    
98    
99  #ifndef VK_F  /* Subclass the keylist listview control to allow extended commands. */
 #define VK_F 70  
 #endif  
 #ifndef VK_A  
 #define VK_A 65  
 #endif  
 #ifndef VK_C  
 #define VK_C 67  
 #endif  
 #ifndef VK_P  
 #define VK_P 80  
 #endif  
   
100  static BOOL CALLBACK  static BOOL CALLBACK
101  keylist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keylist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
102  {  {
# Line 109  keylist_subclass_proc (HWND dlg, UINT ms Line 111  keylist_subclass_proc (HWND dlg, UINT ms
111          int virt_key = (int)wparam;          int virt_key = (int)wparam;
112          switch (virt_key) {          switch (virt_key) {
113          case VK_SPACE:          case VK_SPACE:
114              send_cmd_id( keylist_proc.dlg, ID_KEYMISC_PROPS );              send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PROPS);
115              break;              break;
116                    
117          case VK_DELETE:          case VK_DELETE:
118              send_cmd_id( keylist_proc.dlg, ID_KEYMISC_DELETE );              send_cmd_id (keylist_proc.dlg, ID_KEYMISC_DELETE);
119              break;              break;
120                    
121          case VK_INSERT:          case VK_INSERT:
# Line 130  keylist_subclass_proc (HWND dlg, UINT ms Line 132  keylist_subclass_proc (HWND dlg, UINT ms
132          case VK_C:          case VK_C:
133              if (GetAsyncKeyState (VK_CONTROL)) {              if (GetAsyncKeyState (VK_CONTROL)) {
134                  lv.ctrl = GetDlgItem (keylist_proc.dlg, IDC_KEYMISC_KEYLIST);                  lv.ctrl = GetDlgItem (keylist_proc.dlg, IDC_KEYMISC_KEYLIST);
                 km_index = listview_get_curr_pos (&lv);  
135                  km_clip_export (keylist_proc.dlg, &lv);                  km_clip_export (keylist_proc.dlg, &lv);
136              }              }
137              break;              break;
138    
139          case VK_P:          case VK_P:
140              if (GetAsyncKeyState (VK_CONTROL)) {              if (GetAsyncKeyState (VK_CONTROL))
141                  km_index = -1;                  send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PASTE);
                 km_clip_import (keylist_proc.dlg);  
             }  
142              break;              break;
143    
144          case VK_F:          case VK_F:
# Line 152  keylist_subclass_proc (HWND dlg, UINT ms Line 151  keylist_subclass_proc (HWND dlg, UINT ms
151          break;          break;
152      }      }
153            
154      return CallWindowProc( keylist_proc.old, dlg, msg, wparam, lparam );      return CallWindowProc (keylist_proc.old, dlg, msg, wparam, lparam);
155  } /* keylist_subclass_proc */  }
156    
157    
158    #define ico2idx(ico) imagelist_getindex((ico))
159    
160  static HWND  static HWND
161  load_toolbar (HWND dlg, struct km_info * kmi)  load_toolbar (HWND dlg, struct km_info_s *kmi)
162  {  {
163      HWND tbwnd;      HWND tbwnd;
164      TBSAVEPARAMS tbsp;      TBSAVEPARAMS tbsp;
165      TBBUTTON tb_buttons[] = {      TBBUTTON tb_buttons[] = {
166          /*{imagelist_getindex(IMI_EXIT),       ID_KEYMISC_QUIT,   TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0L, 0},*/          {ico2idx (IMI_KEY_NEW),    ID_KEYMISC_KEYWIZARD, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L},
167          {imagelist_getindex(IMI_KEY_DELETE), ID_KEYMISC_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},          {ico2idx (IMI_KEY_DELETE), ID_KEYMISC_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
168          {imagelist_getindex(IMI_KEY_PROPS),  ID_KEYMISC_PROPS,  TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},          {ico2idx (IMI_KEY_PROPS),  ID_KEYMISC_PROPS,  TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
169          {imagelist_getindex(IMI_KEY_SIGN),   ID_KEYMISC_SIGN,   TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},          {ico2idx (IMI_KEY_SIGN),   ID_KEYMISC_SIGN,   TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
170            {ico2idx (IMI_KEY_SEARCH), ID_KEYMISC_SENDRECV, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
171          {0,                                  0,                 0,               TBSTYLE_SEP,    {0}, 0L, 0},          {0,                                  0,                 0,               TBSTYLE_SEP,    {0}, 0L, 0},
172          {imagelist_getindex(IMI_KEY_IMPORT), ID_KEYMISC_IMPORT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},          {ico2idx (IMI_KEY_FILE_IMPORT), ID_KEYMISC_IMPORT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
173          {imagelist_getindex(IMI_KEY_EXPORT), ID_KEYMISC_EXPORT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},          {ico2idx (IMI_KEY_FILE_EXPORT), ID_KEYMISC_EXPORT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
174            {ico2idx (IMI_KEY_IMPORT), ID_KEYCTX_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
175            {ico2idx (IMI_KEY_EXPORT), ID_KEYCTX_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
176       };       };
177            
178      tbwnd = CreateWindowEx (0, TOOLBARCLASSNAME, NULL,      tbwnd = CreateWindowEx (0, TOOLBARCLASSNAME, NULL,
179                              WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|CCS_ADJUSTABLE,                              WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|CCS_ADJUSTABLE,
180                              0, 0, 0, 0, dlg, (HMENU)IDR_WINPT_KMTB, glob_hinst, NULL);                              0, 0, 0, 0, dlg, (HMENU)IDR_WINPT_KMTB, glob_hinst, NULL);
181      if (tbwnd) {      if (tbwnd) {
182          SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);          SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
183          SendMessage (tbwnd, TB_SETIMAGELIST, 0, (LPARAM)glob_imagelist);          SendMessage (tbwnd, TB_SETIMAGELIST, 0, (LPARAM)glob_imagelist);
184                  SendMessage (tbwnd, TB_AUTOSIZE, 0, 0);                  SendMessage (tbwnd, TB_AUTOSIZE, 0, 0);
185          ShowWindow (tbwnd, SW_SHOW);          ShowWindow (tbwnd, SW_SHOW);
# Line 185  load_toolbar (HWND dlg, struct km_info * Line 189  load_toolbar (HWND dlg, struct km_info *
189          tbsp.pszSubKey = "Software\\WinPT";          tbsp.pszSubKey = "Software\\WinPT";
190          tbsp.pszValueName = "KM_toolbar";          tbsp.pszValueName = "KM_toolbar";
191          if (SendMessage(tbwnd, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp ) == 0)          if (SendMessage(tbwnd, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp ) == 0)
192              SendMessage (tbwnd, TB_ADDBUTTONS, sizeof(tb_buttons) / sizeof(tb_buttons[0]), (LONG)&tb_buttons[0]);              SendMessage (tbwnd, TB_ADDBUTTONS, sizeof(tb_buttons) / sizeof(tb_buttons[0]),
193                             (LONG)&tb_buttons[0]);
194       }       }
195       return tbwnd;       return tbwnd;
196  } /* load_toolbar */  }
197    
198    
199    /* Restore the width of the columns from the registry.
200       If no bitstring was found, the default size is used. */
201    int
202    restore_column_info (listview_ctrl_t hd)
203    {
204        WORD *buf;
205        HKEY root;
206        DWORD type;
207        DWORD size = hd->cols*sizeof (WORD), i;
208        LONG ec;
209    
210        ec = RegOpenKeyEx (HKEY_CURRENT_USER, "Software\\WinPT", 0,
211                           KEY_ALL_ACCESS, &root);
212        if (ec != ERROR_SUCCESS)
213            return -1;
214    
215        buf = new WORD[size/2];
216        if (!buf)
217            BUG (NULL);
218        ec = RegQueryValueEx (root, "KMColumnSize", NULL, &type,
219                              (BYTE*)buf, &size);
220        RegCloseKey (root);
221        if (ec != ERROR_SUCCESS) {
222            free_if_alloc (buf);
223            return -1;
224        }
225    
226        /* check for garbled values. */
227        for (i=0; i < size/2; i++) {
228            if (buf[i] == 0 || buf[i] > 512) {
229                free_if_alloc (buf);
230                return -1;
231            }
232        }
233        for (i=0; i < size/2; i++) {
234            LVCOLUMN lvc;
235    
236            memset (&lvc, 0, sizeof (lvc));
237            lvc.mask = LVCF_WIDTH;
238            lvc.cx = buf[i];
239            ListView_SetColumn (hd->ctrl, i, &lvc);
240        }
241        free_if_alloc (buf);
242        return 0;
243    }
244    
245    
246    /* Save the current column width to the registry. */
247    int
248    save_column_info (listview_ctrl_t hd)
249    {
250        WORD *buf;
251        HKEY root;
252        LONG ec;
253        int i;
254    
255        buf = new WORD[hd->cols];
256        if (!buf)
257            BUG (NULL);
258        for (i=0; i < hd->cols; i++) {
259            LVCOLUMN lvc;
260    
261            memset (&lvc, 0, sizeof (lvc));
262            lvc.mask = LVCF_WIDTH;
263            ListView_GetColumn (hd->ctrl, i, &lvc);
264            buf[i] = lvc.cx;
265        }
266    
267        ec = RegOpenKeyEx (HKEY_CURRENT_USER, "Software\\WinPT", 0,
268                           KEY_ALL_ACCESS, &root);
269        if (ec != ERROR_SUCCESS) {
270            free_if_alloc (buf);
271            return -1;
272        }
273    
274        ec = RegSetValueEx (root, "KMColumnSize", 0, REG_BINARY,
275                            (const BYTE*)buf, 2*hd->cols);
276        RegCloseKey (root);
277        free_if_alloc (buf);
278        return ec == ERROR_SUCCESS? 0 : -1;
279    }
280    
281    
282  /* Center window @dlg. */  /* Center window @dlg. */
283  static void  static void
284  do_center_window (HWND dlg, struct km_info * kmi)  do_center_window (HWND dlg, struct km_info_s *kmi)
285  {  {
286      RECT rect;      RECT rect;
287      char * p;      char *p;
288      int pos_x = 0, pos_y = 0;      int pos_x = 0;
289        int pos_y = 0;
290                    
291      /* Find bottom of keylist */      /* Find bottom of keylist */
292      GetWindowRect (GetDlgItem(dlg, IDC_KEYMISC_KEYLIST), &rect);      GetWindowRect (GetDlgItem(dlg, IDC_KEYMISC_KEYLIST), &rect);
# Line 207  do_center_window (HWND dlg, struct km_in Line 296  do_center_window (HWND dlg, struct km_in
296    
297      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X");      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X");
298      if (p && !strcmp (p, " ")) {      if (p && !strcmp (p, " ")) {
299          free_if_alloc (p);          free_if_alloc (p);      
300          center_window (dlg, NULL);          center_window (dlg, NULL);
301          return;          return;
302      }      }
# Line 217  do_center_window (HWND dlg, struct km_in Line 306  do_center_window (HWND dlg, struct km_in
306      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");
307      if (p && !strcmp (p, " ")) {      if (p && !strcmp (p, " ")) {
308          free_if_alloc (p);          free_if_alloc (p);
309          center_window(dlg, NULL);          center_window (dlg, NULL);
310          return;          return;
311      }      }
312      else if (p)      else if (p)
# Line 230  do_center_window (HWND dlg, struct km_in Line 319  do_center_window (HWND dlg, struct km_in
319            
320      if (pos_x < 0 || pos_y < 0)      if (pos_x < 0 || pos_y < 0)
321          pos_x = pos_y = 0;          pos_x = pos_y = 0;
322      if (pos_x > GetSystemMetrics (SM_CXSCREEN)      if (pos_x > GetSystemMetrics (SM_CXSCREEN)
323          || pos_y > GetSystemMetrics (SM_CYSCREEN)) {          || pos_y > GetSystemMetrics (SM_CYSCREEN)) {
324          pos_x = pos_y = 0;          pos_x = pos_y = 0;
325      }      }
# Line 239  do_center_window (HWND dlg, struct km_in Line 328  do_center_window (HWND dlg, struct km_in
328  }  }
329    
330    
331    /* Resize the key manager window with the information from @kmi. */
332  static void  static void
333  do_resize_window( HWND dlg, struct km_info *kmi)  do_resize_window (HWND dlg, struct km_info_s *kmi)
334  {  {
335      HWND h;      HWND h;
336      RECT rclient, rect;      RECT rclient, rect;
337      BOOL bRepaint = FALSE;      BOOL bRepaint = FALSE;
338    
339      /* Get rect of client area and make life easier */      /* Get rect of client area and make life easier */
340      GetClientRect( dlg, &rclient );      GetClientRect (dlg, &rclient);
341    
342      /* Move toolbar to the top of the window */      /* Move toolbar to the top of the window */
343      if (kmi->toolbar) {      if (kmi->toolbar) {
344          GetWindowRect(kmi->toolbar, &rect);          GetWindowRect (kmi->toolbar, &rect);
345          ScreenToClient(dlg, (POINT*)&rect);          ScreenToClient (dlg, (POINT*)&rect);
346          ScreenToClient(dlg, (POINT*)&(rect.right));          ScreenToClient (dlg, (POINT*)&(rect.right));
347    
348          rclient.top += rect.bottom - rect.top;          rclient.top += rect.bottom - rect.top;
349          MoveWindow (kmi->toolbar, 0, 0, rclient.right - rclient.left,          MoveWindow (kmi->toolbar, 0, 0, rclient.right - rclient.left,
# Line 262  do_resize_window( HWND dlg, struct km_in Line 352  do_resize_window( HWND dlg, struct km_in
352    
353      /* Move statusbar to the bottom of the window */      /* Move statusbar to the bottom of the window */
354      if (kmi->statbar) {      if (kmi->statbar) {
355          GetWindowRect( kmi->statbar, &rect );          GetWindowRect (kmi->statbar, &rect);
356          ScreenToClient(dlg, (POINT*)&rect);          ScreenToClient (dlg, (POINT*)&rect);
357          ScreenToClient(dlg, (POINT*)&(rect.right));          ScreenToClient (dlg, (POINT*)&(rect.right));
358    
359          rclient.bottom -= rect.bottom - rect.top;          rclient.bottom -= rect.bottom - rect.top;
360          MoveWindow (kmi->statbar, 0, rclient.bottom, rclient.right - rclient.left,          MoveWindow (kmi->statbar, 0, rclient.bottom,
361                        rclient.right - rclient.left,
362                      rect.bottom - rect.top, bRepaint);                      rect.bottom - rect.top, bRepaint);
363      }      }
364    
365      // Obtain separator information and move it to the desired posistion      /* Obtain separator information and move it to the desired posistion */
366      if (kmi->ypercent_sep)      if (kmi->ypercent_sep)
367          kmi->ypos_sep = (rclient.bottom - rclient.top) * kmi->ypercent_sep / 100;          kmi->ypos_sep = (rclient.bottom - rclient.top) * kmi->ypercent_sep / 100;
368      else      else
369          kmi->ypercent_sep = kmi->ypos_sep * 100 / (rclient.bottom - rclient.top);          kmi->ypercent_sep = kmi->ypos_sep * 100 / (rclient.bottom - rclient.top);
370                    
371      // Don't move away      /* Don't move away */
372      if (kmi->ypos_sep+5 > rclient.bottom)      if (kmi->ypos_sep+5 > rclient.bottom)
373          kmi->ypos_sep = rclient.bottom - 5;          kmi->ypos_sep = rclient.bottom - 5;
374      if (kmi->ypos_sep < rclient.top)      if (kmi->ypos_sep < rclient.top)
375          kmi->ypos_sep = rclient.top;          kmi->ypos_sep = rclient.top;
376      MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep, (rclient.right - rclient.left), 5, bRepaint);      MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep,
377                    (rclient.right - rclient.left), 5, bRepaint);
378                    
379      // Place the keylist above the separator      /* Place the keylist above the separator */
380      h = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );      h = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
381      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
382                  kmi->ypos_sep - rclient.top, bRepaint);                  kmi->ypos_sep - rclient.top, bRepaint);
383      rclient.top = kmi->ypos_sep + 5 + 8;      rclient.top = kmi->ypos_sep + 5 + 8;
384    
385    #if 0 /* Disable the code until we support groups again. */
386      /* Place the group text and the group box below the separator */      /* Place the group text and the group box below the separator */
387      h = GetDlgItem( dlg, IDC_KEYMISC_GTEXT );      h = GetDlgItem (dlg, IDC_KEYMISC_GTEXT);
388      MoveWindow( h, rclient.left, rclient.top, 100, 14, bRepaint);      MoveWindow (h, rclient.left, rclient.top, 100, 14, bRepaint);
389      rclient.top += 18;      rclient.top += 18;
390    
391      h = GetDlgItem( dlg, IDC_KEYMISC_GROUP );      h = GetDlgItem (dlg, IDC_KEYMISC_GROUP);
392      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
393                  (rclient.bottom < rclient.top) ? 0 : rclient.bottom - rclient.top, bRepaint);                  (rclient.bottom < rclient.top) ?
394                    0 : rclient.bottom - rclient.top, bRepaint);
395    #endif
396            
397      /* Repaint the whole thing */      /* Repaint the whole thing */
398      InvalidateRect (dlg, NULL, TRUE);      InvalidateRect (dlg, NULL, TRUE);
399  } /* do_resize_window */  }
400    
401    
402    /* Return true if the clipboard contains an OpenPGP key. */
403    static bool
404    clip_contains_pgpkey (void)
405    {
406        char *ctxt;
407        bool val = false;
408    
409        ctxt = get_clip_text (NULL);
410        if (!ctxt || strlen (ctxt) < 512)
411            val = false;
412        else if (strstr (ctxt, "BEGIN PGP") && strstr (ctxt, "KEY BLOCK") &&
413                 strstr (ctxt, "END PGP"))
414            val = true;
415        free_if_alloc (ctxt);
416        return val;
417    }
418    
419    
420    /* Show a mini popup menu to import keys. */
421  static void  static void
422  do_create_minpopup (HWND dlg)  do_create_minpopup (HWND dlg)
423  {  {
# Line 312  do_create_minpopup (HWND dlg) Line 426  do_create_minpopup (HWND dlg)
426      char * s;      char * s;
427      POINT p;      POINT p;
428            
429      if (gpg_read_only)      if (gpg_read_only || !clip_contains_pgpkey ())
430          return;          return;
431      hm = CreatePopupMenu ();      hm = CreatePopupMenu ();
432      if (!hm)      if (!hm)
# Line 329  do_create_minpopup (HWND dlg) Line 443  do_create_minpopup (HWND dlg)
443      GetCursorPos (&p);      GetCursorPos (&p);
444      TrackPopupMenu (hm, 0, p.x, p.y, 0, dlg, NULL);      TrackPopupMenu (hm, 0, p.x, p.y, 0, dlg, NULL);
445      DestroyMenu (hm);      DestroyMenu (hm);
446  } /* do_create_minpopup */  }
447    
448    
449  static void  /* Update the default key entry in the status bar for dialog @dlg. */
450  do_check_cache (listview_ctrl_t lv, HWND dlg, HWND sb)  void
451    update_default_key_str (HWND dlg)
452  {  {
453      gpg_keycache_t cache;      const char *fmt;
454        char *keyid;
455        char defkeyinf[128];
456        
457        /* XXX: also show the name? */
458        keyid = get_gnupg_default_key ();
459        if (!keyid)
460            return;
461        if ((keyid[0] >= 'A' && keyid[0] <= 'Z') ||
462            (keyid[0] >= 'a' && keyid[0] <= 'z') ||
463            (keyid[0] == '0' && keyid[1] == 'x'))
464            fmt = _("Default Key: %s");
465        else
466            fmt = _("Default Key: 0x%s");
467        _snprintf (defkeyinf, sizeof (defkeyinf) - 1, fmt, keyid);
468        SendMessage (dlg, SB_SETTEXT, 0, (LPARAM)defkeyinf);
469        free_if_alloc (keyid);
470    }
471    
472      if( keycache_get_reload( ) ) {  
473          keycache_reload( dlg );  /* Count all keys and show from @lv results in the status bar @sb. */
474          keycache_set_reload( 0 );  void
475          cache = keycache_get_ctx( 1 );  update_status_bar (HWND sb, listview_ctrl_t lv)
476          if( !cache )  {
477              BUG( dlg );      char txt_sec[128], txt_pub[128];
478          keylist_reload( lv, cache, KEYLIST_LIST, KEY_SORT_USERID );      int nkeys = 0, nsec = 0;
479          km_complete_status_bar (sb, lv);      int i;
480    
481        nkeys = listview_count_items (lv, 0);
482        for (i = 0; i < nkeys; i++) {
483            if (km_check_for_seckey (lv, i, NULL))
484                nsec++;
485      }      }
486  } /* do_check_cache */      _snprintf (txt_sec, sizeof (txt_sec)-1, _("%d secret keys"), nsec);
487        _snprintf (txt_pub, sizeof (txt_pub)-1, _("%d keys"), nkeys);
488        SendMessage (sb, SB_SETTEXT, 1, (LPARAM)txt_sec);
489        SendMessage (sb, SB_SETTEXT, 2, (LPARAM)txt_pub);
490    }
491    
492    
493  long CALLBACK  long CALLBACK
494  separator_wnd_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )  separator_wnd_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
495  {  {
496      static POINT last_mouse_pos;      static POINT last_mouse_pos;
497      RECT rect;  
       
498      if (msg == WM_CREATE)      if (msg == WM_CREATE)
499          SetWindowLong (hwnd, GWL_USERDATA, (long)(((CREATESTRUCT*)lparam)->lpCreateParams));          SetWindowLong (hwnd, GWL_USERDATA,
500                           (long)(((CREATESTRUCT*)lparam)->lpCreateParams));
501    
502      switch (msg) {      switch (msg) {
503      case WM_PAINT:      case WM_PAINT:
504          PAINTSTRUCT ps;          PAINTSTRUCT ps;
505            RECT rect;
506          HPEN hpen;          HPEN hpen;
507    
508          GetClientRect (hwnd, &rect);          GetClientRect (hwnd, &rect);
509          BeginPaint (hwnd, &ps);          BeginPaint (hwnd, &ps);
510    
511          // Background          /* Background */
512          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));
513    
514          // The lines from the light into the dark          /* The lines from the light into the dark */
515          MoveToEx(ps.hdc, 0,0, NULL);          MoveToEx(ps.hdc, 0,0, NULL);
516          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT))) != NULL) {
517              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
518              LineTo(ps.hdc, rect.right, 0);              LineTo (ps.hdc, rect.right, 0);
519              DeleteObject(hpen);              DeleteObject (hpen);
520          }          }
521          MoveToEx(ps.hdc, 0, 1, NULL);          MoveToEx(ps.hdc, 0, 1, NULL);
522          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT))) != NULL) {
523               SelectObject(ps.hdc, (LPVOID)hpen);               SelectObject (ps.hdc, (LPVOID)hpen);
524               LineTo(ps.hdc, rect.right, rect.bottom);               LineTo (ps.hdc, rect.right, rect.bottom);
525               DeleteObject(hpen);               DeleteObject (hpen);
526           }           }
527    
528          MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);          MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);
529          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW))) != NULL) {          if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW))) != NULL) {
530              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
531              LineTo(ps.hdc, rect.right, rect.bottom-1);              LineTo (ps.hdc, rect.right, rect.bottom-1);
532              DeleteObject(hpen);              DeleteObject (hpen);
533          }          }
534          MoveToEx(ps.hdc, 0, rect.bottom, NULL);          MoveToEx(ps.hdc, 0, rect.bottom, NULL);
535          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {
536              SelectObject(ps.hdc, (LPVOID)hpen);              SelectObject (ps.hdc, (LPVOID)hpen);
537              LineTo(ps.hdc, rect.right, rect.bottom);              LineTo (ps.hdc, rect.right, rect.bottom);
538              DeleteObject(hpen);              DeleteObject (hpen);
539          }          }
540    
541          EndPaint (hwnd, &ps);          EndPaint (hwnd, &ps);
542          return 0;          return 0;
543    
544      case WM_LBUTTONDOWN:      case WM_LBUTTONDOWN:
545          last_mouse_pos.x = LOWORD(lparam);          last_mouse_pos.x = LOWORD (lparam);
546          last_mouse_pos.y = HIWORD(lparam);          last_mouse_pos.y = HIWORD (lparam);
547          ClientToScreen (hwnd, &last_mouse_pos);          ClientToScreen (hwnd, &last_mouse_pos);
548          SetCapture (hwnd);          SetCapture (hwnd);
549          return 0;          return 0;
# Line 412  separator_wnd_proc( HWND hwnd, UINT msg, Line 554  separator_wnd_proc( HWND hwnd, UINT msg,
554    
555      case WM_MOUSEMOVE:      case WM_MOUSEMOVE:
556          if (wparam == MK_LBUTTON) {          if (wparam == MK_LBUTTON) {
557              struct km_info *kmi;              struct km_info_s *kmi;
558              POINT p;              POINT p;
559                RECT r;
560    
561              if ((kmi = (struct km_info *)GetWindowLong (hwnd, GWL_USERDATA)) == NULL)              kmi = (struct km_info_s *)GetWindowLong (hwnd, GWL_USERDATA);
562                if (kmi == NULL)
563                  break;                  break;
564    
565              // Calculate mouse movement              /* Calculate mouse movement */
566              p.x = LOWORD(lparam);              p.x = LOWORD(lparam);
567              p.y = HIWORD(lparam);              p.y = HIWORD(lparam);
568              ClientToScreen (hwnd, &p);              ClientToScreen (hwnd, &p);
569    
570              GetWindowRect (hwnd, &rect);              GetWindowRect (hwnd, &r);
571              rect.top += (short)(p.y - last_mouse_pos.y);              r.top += (short)(p.y - last_mouse_pos.y);
572              rect.bottom += (short)(p.y - last_mouse_pos.y);              r.bottom += (short)(p.y - last_mouse_pos.y);
573    
574              last_mouse_pos.y = p.y;              last_mouse_pos.y = p.y;
575    
576              // Apply mouse movement to window. Beware the MoveWindow is relaive              /* Apply mouse movement to window. Beware the MoveWindow is relaive
577              // to parent NOT screen                 to parent NOT screen */
578              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&rect, 2);              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&r, 2);
579              kmi->ypos_sep = rect.top;              kmi->ypos_sep = r.top;
580              kmi->ypercent_sep = 0; // This forces do_resize_window to use abs. position              kmi->ypercent_sep = 0; /* This forces do_resize_window to use abs. position */
581              do_resize_window (GetParent(hwnd), kmi);              do_resize_window (GetParent(hwnd), kmi);
582              return 0;              return 0;
583          }          }
# Line 443  separator_wnd_proc( HWND hwnd, UINT msg, Line 587  separator_wnd_proc( HWND hwnd, UINT msg,
587  }  }
588    
589    
590    /* Register the separator window with @dlg as the parent window. */
591  static HWND  static HWND
592  regist_sep_wnd (HWND dlg, struct km_info * kmi)  regist_sep_wnd (HWND dlg, struct km_info_s *kmi)
593  {  {
594      WNDCLASS wndclass;      WNDCLASS wndclass;
595      HWND h;      HWND h;
# Line 466  regist_sep_wnd (HWND dlg, struct km_info Line 611  regist_sep_wnd (HWND dlg, struct km_info
611                          0, 400, 2000, 5, dlg, (HMENU) 0, glob_hinst, kmi);                              0, 400, 2000, 5, dlg, (HMENU) 0, glob_hinst, kmi);    
612      ShowWindow (h, SW_SHOW);      ShowWindow (h, SW_SHOW);
613      return h;      return h;
614  } /* regist_sep_wnd */  }
   
615    
616    
617  #define enable_button(hwnd, cid) \  #define enable_button(hwnd, cid, item_selected) \
618      SendMessage ((hwnd), TB_ENABLEBUTTON, (cid), MAKELONG (key_selected, 0))      SendMessage ((hwnd), TB_ENABLEBUTTON, (cid), MAKELONG ((item_selected), 0))
619    
620    
621  /* Interactive modification of the dialog item which depend if an item  /* Interactive modification of the dialog item which depend if an item
# Line 480  regist_sep_wnd (HWND dlg, struct km_info Line 624  regist_sep_wnd (HWND dlg, struct km_info
624  void  void
625  update_ui_items (HWND hwnd, listview_ctrl_t lv)  update_ui_items (HWND hwnd, listview_ctrl_t lv)
626  {  {
627      int key_selected = 0, key_has_sec = 0;      HWND tb_hwnd;
     int i, key_inv = 0;  
     HWND hwnd_child;  
628      HMENU hmenu;      HMENU hmenu;
629            int mult_resids[] = {ID_KEYMISC_PROPS, ID_KEYMISC_SIGN, ID_KEYMISC_EDITKEY,
630                             ID_KEYMISC_CHECKSIGS, ID_KEYMISC_REVCERT, 0};
631        int key_selected = 0;
632        int key_has_sec = 0;
633        int key_inv = 0;
634        int i, state=0;
635    
636      /* Get some states */      /* Get some states */
637      key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST),      key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST),
638                                             LVM_GETSELECTEDCOUNT, 0, 0)                                             LVM_GETSELECTEDCOUNT, 0, 0)
# Line 493  update_ui_items (HWND hwnd, listview_ctr Line 641  update_ui_items (HWND hwnd, listview_ctr
641      if (key_selected) {      if (key_selected) {
642          i = listview_get_curr_pos (lv);          i = listview_get_curr_pos (lv);
643          key_has_sec = km_check_for_seckey (lv, i, NULL) ? TRUE : FALSE;          key_has_sec = km_check_for_seckey (lv, i, NULL) ? TRUE : FALSE;
644          key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED;          key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED ||
645                      km_get_key_status (lv, i) & KM_FLAG_EXPIRED;
646      }      }
647    
648      /* Enable / disable toolbar buttons */      /* Enable / disable toolbar buttons */
649      hwnd_child = GetDlgItem (hwnd, IDR_WINPT_KMTB);      tb_hwnd = GetDlgItem (hwnd, IDR_WINPT_KMTB);
650      enable_button (hwnd_child, ID_KEYMISC_DELETE);      enable_button (tb_hwnd, ID_KEYMISC_DELETE, key_selected);
651      enable_button (hwnd_child, ID_KEYMISC_PROPS);      enable_button (tb_hwnd, ID_KEYMISC_PROPS, key_selected);
652      enable_button (hwnd_child, ID_KEYMISC_SIGN);      enable_button (tb_hwnd, ID_KEYMISC_SIGN, key_selected && !key_inv);
653      enable_button (hwnd_child, ID_KEYMISC_EXPORT);      enable_button (tb_hwnd, ID_KEYMISC_EXPORT, key_selected);
654        enable_button (tb_hwnd, ID_KEYCTX_COPY, key_selected);
655        enable_button (tb_hwnd, ID_KEYCTX_PASTE, clip_contains_pgpkey ());
656    
657      /* Enable / disable menu items */      /* Enable / disable menu items */
658        state = key_selected? MF_ENABLED : MF_DISABLED|MF_GRAYED;
659      hmenu = GetMenu (hwnd);      hmenu = GetMenu (hwnd);
660      set_menu_state (hmenu, ID_KEYMISC_EXPORT, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EXPORT, state);
661      set_menu_state (hmenu, ID_KEYMISC_EXPORT_PRIVKEY, key_has_sec ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_DELETE, state);
662      set_menu_state (hmenu, ID_KEYMISC_REVCERT, key_has_sec ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_PROPS, state);
663      set_menu_state (hmenu, ID_KEYMISC_DELETE, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EDITKEY, state);
664      set_menu_state (hmenu, ID_KEYMISC_PROPS, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_CHECKSIGS, state);
665      set_menu_state (hmenu, ID_KEYMISC_SIGN, key_selected && !key_inv ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_SIGN,
666      set_menu_state (hmenu, ID_KEYMISC_EDITKEY, key_selected? MF_ENABLED : MF_GRAYED);                      key_selected && !key_inv ? MF_ENABLED : MF_GRAYED);
667      set_menu_state (hmenu, ID_KEYMISC_CHECKSIGS, key_selected? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EXPORT_PRIVKEY,
668                        key_selected && key_has_sec? MF_ENABLED : MF_GRAYED);
669        set_menu_state (hmenu, ID_KEYMISC_REVCERT,
670                        key_selected && key_has_sec? MF_ENABLED : MF_GRAYED);
671    
672        /* Disable some menu items when multiple keys are selected. */
673        if (listview_count_items (lv, 1) > 1) {
674            for (i=0; mult_resids[i] != 0; i++)
675                set_menu_state (hmenu, mult_resids[i], MF_GRAYED);
676        }
677    
678        /* Disable all secret-key functions when no secret key is available. */
679        {
680            gpg_keycache_t sec = keycache_get_ctx (0);
681            if (gpg_keycache_get_size (sec) == 0) {
682                enable_button (tb_hwnd, ID_KEYMISC_SIGN, FALSE);
683                set_menu_state (hmenu, ID_KEYMISC_SIGN, MF_GRAYED);
684            }
685        }
686    }
687    
688    
689    /* Disable some context menu items when multiple keys are selected. */
690    static void
691    popup_multiple (HWND dlg, HMENU hm)
692    {
693        int resids[] = {
694            ID_KEYCTX_EDIT,
695            ID_KEYCTX_SIGN,
696            ID_KEYCTX_REV,
697            ID_KEYCTX_ENABLE,
698            ID_KEYCTX_DISABLE,
699            ID_KEYCTX_ADDKEY,
700            ID_KEYCTX_ADDPHOTO,
701            ID_KEYCTX_ADDUID,
702            ID_KEYCTX_ADDREV,
703            ID_KEYCTX_LISTSIGS,
704            ID_KEYCTX_MAXTRUST,
705            ID_KEYCTX_PROPS,
706            ID_KEYCTX_SENDMAIL,
707            0};
708        int i;
709        for (i=0; i < resids[i] != 0; i++)
710            set_menu_state (hm, resids[i], MF_GRAYED);
711  }  }
712    
713    
# Line 544  popup_gpg_readonly (HWND dlg, HMENU hm) Line 739  popup_gpg_readonly (HWND dlg, HMENU hm)
739  }  }
740    
741    
742    /* Change the 'Edit' menu based on the current state. */
743  static void  static void
744  menu_gpg_readonly (HWND dlg, HMENU hm, int id)  change_edit_menu (listview_ctrl_t lv, HMENU hm, int id)
745    {
746        enum item { EDIT_MENU = 1 };
747        int no_sel;
748    
749        if (id != EDIT_MENU)
750            return;
751    
752        if (!clip_contains_pgpkey ())
753            set_menu_state (hm, ID_KEYMISC_PASTE, MF_GRAYED);
754        else
755            set_menu_state (hm, ID_KEYMISC_PASTE, MF_ENABLED);
756        no_sel = listview_get_curr_pos (lv) == -1? 1 : 0;
757        set_menu_state (hm, ID_KEYMISC_DELETE2, no_sel? MF_GRAYED: MF_ENABLED);
758        set_menu_state (hm, ID_KEYMISC_COPY, no_sel? MF_GRAYED : MF_ENABLED);
759    }
760    
761    
762    
763    /* Show limited key menu entries when GPG is in read-only mode. */
764    static void
765    change_key_menu (HMENU hm, int id)
766  {  {
767      int key_resids[] = {      int key_resids[] = {
768          ID_KEYMISC_SIGN,          ID_KEYMISC_SIGN,
# Line 576  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 793  menu_gpg_readonly (HWND dlg, HMENU hm, i
793      case 0: return;      case 0: return;
794      case 3: resids = key_resids; break;      case 3: resids = key_resids; break;
795      case 1: resids = edit_resids;break;      case 1: resids = edit_resids;break;
796      default: resids = edit_resids; return;      default:resids = edit_resids; break;
797      }      }
798    
799      for (i=0; resids[i] != 0; i++)      for (i=0; resids[i] != 0; i++)
# Line 584  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 801  menu_gpg_readonly (HWND dlg, HMENU hm, i
801  }  }
802    
803    
804  static char*  /* Reload a single key in the cache. */
 gen_export_filename (const char *keyid, int is_secret)  
 {  
     gpgme_key_t key;  
     const char *s;  
     char *p;  
   
     if (get_pubkey (keyid, &key))  
         return m_strdup (keyid);  
     s = key->uids->name;  
     if (!s)  
         return m_strdup (keyid);  
     p = new char[strlen (s) + 8 + 16];  
     if (!p)  
         BUG (0);  
     sprintf (p, "%s%s.asc", s, is_secret? "_sec" : "");  
     for (size_t i=0; i < strlen (p); i++) {  
         if (p[i] == ' ' || p[i] == ':' || p[i] == '?' || p[i] == '|')  
             p[i] = '_';  
     }  
     return p;  
 }  
   
   
805  static void  static void
806  update_key (listview_ctrl_t lv, int pos, const char *keyid, int keypair)  update_key (listview_ctrl_t lv, int pos, const char *keyid, int keypair)
807  {  {
# Line 628  update_key (listview_ctrl_t lv, int pos, Line 822  update_key (listview_ctrl_t lv, int pos,
822  static HWND  static HWND
823  setup_status_bar (HWND dlg, listview_ctrl_t lv)  setup_status_bar (HWND dlg, listview_ctrl_t lv)
824  {        {      
825      HWND statbar;          HWND statbar;
826      RECT r;      RECT r;
827      int partpos[3];      int partpos[3];
828      int i;      int i;
# Line 642  setup_status_bar (HWND dlg, listview_ctr Line 836  setup_status_bar (HWND dlg, listview_ctr
836      ShowWindow (statbar, SW_SHOW);      ShowWindow (statbar, SW_SHOW);
837      SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);      SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);
838    
839      km_update_default_key_str (statbar);      update_default_key_str (statbar);
840      km_complete_status_bar (statbar, lv);      update_status_bar (statbar, lv);
841    
842      return statbar;      return statbar;
843  }  }
844    
845    
846    /* Remove or add columns which depends on the state of @checked. */
847    void
848    modify_listview_columns (km_info_s *kmi, UINT m_uid, BOOL checked)
849    {
850        UINT resids[] = {
851            0,
852            ID_KEYMISC_VIEWKEYID,
853            ID_KEYMISC_VIEWTYPE,
854            0,
855            ID_KEYMISC_VIEWCIPHER,
856            0,
857            0,
858            ID_KEYMISC_VIEWCREAT,
859            -1
860        };
861        listview_column_s cols[] = {
862        {0, 240, (char *)_("User ID")},
863        {1, 78, (char *)_("Key ID")},
864        {2, 52, (char *)_("Type")},    
865        {3, 66, (char *)_("Size")},
866        {4, 60, (char *)_("Cipher")},
867        {5, 66, (char *)_("Validity")},
868        {6, 58, (char *)_("Trust")},
869        {7, 72, (char *)_("Creation")},
870        {0, 0, NULL}
871        };
872        UINT pos;
873    
874        for (pos=0; resids[pos] != -1; pos++) {
875            if (m_uid == resids[pos])
876                break;
877        }
878        if (!checked)
879            listview_del_column (kmi->lv, (int)pos);
880        else {      
881            listview_add_column (kmi->lv, &cols[pos]);
882            keylist_upd_col (kmi->lv, pos);
883        }
884    }
885    
886    
887    /* Helper to handle the help file. If @check is 1
888       the existence of the file is checked.
889       Otherwise the help file will be loaded. */
890    static bool
891    start_help (HWND dlg, int check)
892    {
893        DWORD n;
894        char path[MAX_PATH+1+32];
895    
896        n = GetModuleFileName (NULL, path, sizeof (path)-1-32);
897        if (!n)
898            return false;
899        path[n] = 0;
900        while (n-- && path[n] != '\\')
901            ;
902        path[n+1] = 0;
903        strcat (path, "winpt.chm");
904        if (!check)
905            ShellExecute (dlg, "open", path, NULL, NULL, SW_SHOW);
906        return file_exist_check (path) == 0? true : false;
907    }
908    
909    /* Translate all menu strings. */
910    static void
911    translate_menu_strings (HWND dlg)
912    {
913        HMENU menu;
914    
915        menu = LoadMenu (glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC);
916        set_menu_text_bypos (menu, 0, _("File"));
917        set_menu_text_bypos (menu, 1, _("Edit"));
918        set_menu_text_bypos (menu, 2, _("View"));
919        set_menu_text_bypos (menu, 3, _("Key"));
920        set_menu_text_bypos (menu, 4, _("Groups"));
921    
922        set_menu_text (menu, ID_KEYMISC_EDITKEY, _("Edit"));
923        set_menu_text (menu, ID_KEYMISC_MAIL, _("Send Mail..."));
924        set_menu_text (menu, ID_KEYMISC_OT, _("Ownertrust")); /* XXX */
925        set_menu_text (menu, ID_KEYMISC_COPY, _("&Copy\tCtrl+C"));
926        set_menu_text (menu, ID_KEYMISC_PASTE, _("&Paste\tCtrl+V"));
927        set_menu_text (menu, ID_KEYMISC_FIND, _("Search...\tCtrl+F"));
928        set_menu_text (menu, ID_KEYMISC_SELALL, _("Select All\tCtrl+A"));
929        set_menu_text (menu, ID_KEYMISC_QUIT, _("&Quit"));
930        set_menu_text (menu, ID_KEYMISC_UID, _("User ID"));
931        set_menu_text (menu, ID_KEYMISC_NEWKEY, _("&Expert"));
932        set_menu_text (menu, ID_KEYMISC_KEYWIZARD, _("&Normal"));
933        set_menu_text (menu, ID_KEYMISC_EDIT, _("Edit"));
934        set_menu_text (menu, ID_KEYMISC_SIGN, _("&Sign"));
935        set_menu_text (menu, ID_KEYMISC_DELETE, _("&Delete"));
936        set_menu_text (menu, ID_KEYMISC_DELETE2, _("&Delete"));
937        set_menu_text (menu, ID_KEYMISC_REVCERT, _("&Revoke Cert"));
938        set_menu_text (menu, ID_KEYMISC_CHECKSIGS, _("&List Signatures"));
939        set_menu_text (menu, ID_KEYMISC_TRUSTPATH, _("List Trust Path"));
940        set_menu_text (menu, ID_KEYMISC_EXPORT, _("&Export..."));
941        set_menu_text (menu, ID_KEYMISC_IMPORT, _("&Import..."));
942        set_menu_text (menu, ID_KEYMISC_PROPS, _("&Properties"));
943        set_menu_text (menu, ID_KEYMISC_GPGOPT, _("Options"));
944        set_menu_text (menu, ID_KEYMISC_GPGPREFS, _("Preferences"));
945        set_menu_text (menu, ID_KEYMISC_SENDRECV, _("Keyserver") );
946        set_menu_text (menu, ID_KEYMISC_EXPORT_PRIVKEY, _("E&xport Secret Key"));
947        set_menu_text (menu, ID_KEYMISC_RECACHE, _("Re&load Key Cache"));
948        set_menu_text (menu, ID_KEYMISC_REBUILD, _("R&everify Signatures"));
949        set_menu_text (menu, ID_KEYMISC_REFRESH_KEYS, _("Refresh &Keys (Keyserver)"));
950        set_menu_text (menu, ID_KEYMISC_INFO, _("Info") );
951        set_menu_text (menu, ID_KEYMISC_HELP, _("&Help"));
952    
953        set_menu_text (menu, ID_KEYMISC_VIEWKEYID, _("Key ID"));
954        set_menu_text (menu, ID_KEYMISC_VIEWCIPHER, _("Cipher"));
955        set_menu_text (menu, ID_KEYMISC_VIEWTYPE, _("Type"));
956        set_menu_text (menu, ID_KEYMISC_VIEWCREAT, _("Creation"));
957    
958        if (!start_help (NULL, 1))
959            set_menu_state (menu, ID_KEYMISC_HELP, MF_GRAYED);
960    
961        SetMenu (dlg, menu);
962    }
963    
964    
965    /* Translate popup menu strings. */
966    static void
967    translate_popupmenu_strings (HMENU popup)
968    {
969        set_menu_text (popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard"));
970        set_menu_text (popup, ID_KEYCTX_KEYID_COPY, _("Copy Key ID to Clipboard"));
971        set_menu_text (popup, ID_KEYCTX_FPR_COPY, _("Copy Fingerprint to Clipboard"));
972        set_menu_text (popup, ID_KEYCTX_KINFO_COPY, _("Copy Key Info to Clipboard"));
973        set_menu_text (popup, ID_KEYCTX_COPY, _("Copy Key to Clipboard"));
974        set_menu_text (popup, ID_KEYCTX_PASTE, _("Paste Key from Clipboard"));
975        set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Refresh from Keyserver"));
976        set_menu_text (popup, ID_KEYCTX_MAXTRUST, _("Set Implicit &Trust"));
977        set_menu_text (popup, ID_KEYCTX_LISTSIGS, _("&List Signatures"));
978        set_menu_text (popup, ID_KEYCTX_PROPS, _("&Properties"));
979        set_menu_text (popup, ID_KEYCTX_EDIT, _("Key Edit"));
980        set_menu_text (popup, ID_KEYCTX_DEL, _("&Delete"));
981        set_menu_text (popup, ID_KEYCTX_REV, _("&Revoke Cert"));
982        set_menu_text (popup, ID_KEYCTX_SIGN, _("&Sign"));
983        set_menu_text (popup, ID_KEYCTX_ENABLE, _("&Enable"));
984        set_menu_text (popup, ID_KEYCTX_DISABLE, _("&Disable"));
985        set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Re&fresh from Keyserver"));
986        set_menu_text (popup, ID_KEYCTX_SETPREFKS, _("Set preferred Keyserver URL"));
987        set_menu_text (popup, ID_KEYCTX_SENDMAIL, _("Send Key to Mail Recipient"));
988        set_menu_text (popup, ID_KEYCTX_SETDEFKEY, _("Set as Default Key"));
989    
990        set_menu_text (popup, ID_KEYCTX_ADDKEY, _("Key..."));
991        set_menu_text (popup, ID_KEYCTX_ADDUID, _("User ID..."));
992        set_menu_text (popup, ID_KEYCTX_ADDPHOTO, _("Photo ID..."));
993        set_menu_text (popup, ID_KEYCTX_ADDREV, _("Revoker..."));
994    
995        /* change popup texts */
996        set_menu_text_bypos (popup, 0, _("Key Attributes"));
997        set_menu_text_bypos (popup, 6, _("Add"));
998        set_menu_text_bypos (popup, 19, _("Send to Keyserver"));
999    }
1000    
1001    
1002    /* Return true if the cache contain marked keys. */
1003    static bool
1004    updated_keys_avail (void)
1005    {
1006        gpg_keycache_t kc = keycache_get_ctx (1);
1007        struct keycache_s *k;
1008    
1009        for (k = kc->item; k; k = k->next) {
1010            if (k->flags)
1011                return true;
1012        }
1013        return false;
1014    }
1015    
1016    
1017    /* Find the index of the key identified by @key. */
1018    static int
1019    find_keypos (listview_ctrl_t lv, gpgme_key_t key)
1020    {
1021        gpgme_key_t src;
1022        int i;
1023    
1024        for (i=0; i < listview_count_items (lv, 0); i++) {
1025            src = (gpgme_key_t)listview_get_item2 (lv, i);
1026            if (src && src->subkeys->keyid == key->subkeys->keyid)
1027                return i;
1028        }
1029        return -1;
1030    }
1031    
1032    
1033    /* Add all recently updated keys in the cache to the list
1034       and refresh all GUI elements. */
1035    static void
1036    refresh_keylist (struct km_info_s *kmi)
1037    {
1038        struct keycache_s *ctx;
1039        gpg_keycache_t kc;
1040        int status=0;
1041    
1042        kc = keycache_get_ctx (1);
1043        while (!gpg_keycache_next_updated_key (kc, &ctx, &status)) {
1044            if (status == KC_FLAG_ADD)
1045                keylist_add_key (kmi->lv, KEYLIST_LIST, ctx->key);
1046            else
1047                keylist_upd_key (kmi->lv, find_keypos (kmi->lv, ctx->key), ctx->key);
1048            /*log_box ("debug", 0, "(%d) %s", status, ctx->key->uids->name);*/
1049        }
1050        keylist_sort (kmi->lv, KEY_SORT_USERID);
1051        update_status_bar (kmi->statbar, kmi->lv);
1052    }
1053    
1054    
1055    /* Dialog box procedure for the Key Manager. */
1056  BOOL CALLBACK  BOOL CALLBACK
1057  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
1058  {  {
1059      struct km_info *kmi;      struct km_info_s *kmi;
     /*static km_group_s *gc = NULL;*/  
     static HMENU menu = NULL;  
     static int refresh_keys = 0;      
1060      INITCOMMONCONTROLSEX icex;      INITCOMMONCONTROLSEX icex;
1061      HWND kl;      HWND kl;
1062      HMENU hm;      HMENU hm;
1063      gpg_keycache_t c;      gpg_keycache_t c;
1064      gpgme_key_t key;      gpgme_key_t key;
     /*km_group_cb_s gcb; XXX */  
1065      struct genkey_s genkey;      struct genkey_s genkey;
1066      struct winpt_key_s k = {0};      struct winpt_key_s k = {0};
1067      struct URL_ctx_s *url;      struct URL_ctx_s *url;
1068      refresh_cache_s rcs = {0};      refresh_cache_s rcs = {0};
1069      char keyid[48], uid[128], type[32], *name;      char type[32], *name;
1070      const char *t, * host;      const char *t, *host;
1071      u16 port = 0;      WORD port = 0;
1072      int idx = 0, i=0, rc;      int l_idx = 0, i=0, rc;
1073    
1074      if ((msg != WM_INITDIALOG)      if ((msg != WM_INITDIALOG)
1075          && ((kmi = (struct km_info*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))          && ((kmi = (struct km_info_s*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))
1076          return FALSE;          return FALSE;
1077    
1078      switch (msg) {      switch (msg) {
1079      case WM_INITDIALOG:      case WM_INITDIALOG:
1080          kmi = new struct km_info;          kmi = new struct km_info_s;
1081          memset (kmi, 0, sizeof (struct km_info));          memset (kmi, 0, sizeof (struct km_info_s));
1082            kmi->lv_idx = -1;
1083          icex.dwSize = sizeof (INITCOMMONCONTROLSEX);          icex.dwSize = sizeof (INITCOMMONCONTROLSEX);
1084          icex.dwICC  = ICC_BAR_CLASSES;          icex.dwICC  = ICC_BAR_CLASSES;
1085          InitCommonControlsEx (&icex);          InitCommonControlsEx (&icex);
1086          kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);          kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);
1087          imagelist_load (dlg);          imagelist_load (dlg);
1088            translate_menu_strings (dlg);
1089            SetWindowText (dlg, _("Key Manager"));
1090    
1091          SetWindowText( dlg, _("Key Manager") );          c = keycache_get_ctx (KEYCACHE_PUB);
1092          menu = LoadMenu( glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC );          if (!c)
1093          set_menu_text_bypos (menu, 0, _("File"));              BUG (NULL);
1094          set_menu_text_bypos (menu, 1, _("Edit"));          kl = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
         set_menu_text_bypos (menu, 2, _("View"));  
         set_menu_text_bypos (menu, 3, _("Key"));  
         set_menu_text_bypos (menu, 4, _("Groups"));  
           
         set_menu_text (menu, ID_KEYMISC_EDITKEY, _("Edit"));  
         set_menu_text (menu, ID_KEYMISC_MAIL, _("Send Mail..."));  
         set_menu_text (menu, ID_KEYMISC_OT, _("Ownertrust")); /* XXX */  
         set_menu_text (menu, ID_KEYMISC_COPY, _("&Copy\tCtrl+C"));  
         set_menu_text (menu, ID_KEYMISC_PASTE, _("&Paste\tCtrl+V"));  
         set_menu_text (menu, ID_KEYMISC_FIND, _("Search...\tCtrl+F"));  
         set_menu_text (menu, ID_KEYMISC_SELALL, _("Select All\tCtrl+A"));  
         set_menu_text (menu, ID_KEYMISC_QUIT, _("&Quit"));  
         set_menu_text (menu, ID_KEYMISC_UID, _("User ID"));  
         set_menu_text (menu, ID_KEYMISC_NEWKEY, _("&Expert"));  
         set_menu_text (menu, ID_KEYMISC_KEYWIZARD, _("&Normal"));  
         set_menu_text (menu, ID_KEYMISC_EDIT, _("Edit"));  
         set_menu_text (menu, ID_KEYMISC_SIGN, _("&Sign"));  
         set_menu_text (menu, ID_KEYMISC_DELETE, _("&Delete"));  
         set_menu_text (menu, ID_KEYMISC_REVCERT, _("&Revoke"));  
         set_menu_text (menu, ID_KEYMISC_CHECKSIGS, _("&List Signatures"));  
         set_menu_text (menu, ID_KEYMISC_TRUSTPATH, _("List Trust Path"));  
         set_menu_text (menu, ID_KEYMISC_EXPORT, _("&Export..."));  
         set_menu_text (menu, ID_KEYMISC_IMPORT, _("&Import..."));  
         set_menu_text (menu, ID_KEYMISC_PROPS, _("&Properties"));  
         set_menu_text (menu, ID_KEYMISC_GPGOPT, _("Options"));  
         set_menu_text (menu, ID_KEYMISC_GPGPREFS, _("Preferences"));  
         set_menu_text (menu, ID_KEYMISC_SENDRECV, _("Keyserver") );  
         set_menu_text (menu, ID_KEYMISC_EXPORT_PRIVKEY, _("E&xport Secret Key"));  
         set_menu_text (menu, ID_KEYMISC_RECACHE, _("Re&load Key Cache"));  
         set_menu_text (menu, ID_KEYMISC_REBUILD, _("R&everify Signatures"));  
         set_menu_text (menu, ID_KEYMISC_REFRESH_KEYS, _("Refresh &Keys (Keyserver)"));  
         set_menu_text (menu, ID_KEYMISC_INFO, _("Info") );  
         set_menu_text (menu, ID_KEYMISC_HELP, _("&Help"));  
   
         SetMenu (dlg, menu);  
         if( keyring_check_last_access() )  
             keycache_set_reload( 1 );  
         if( keycache_get_reload( ) )  
             keycache_reload( dlg );  
         c = keycache_get_ctx( KEYCACHE_PUB );  
         if( !c )  
             BUG( NULL );  
1095          kmi->keylist_sortby = KEY_SORT_USERID;          kmi->keylist_sortby = KEY_SORT_USERID;
1096          Header_SetImageList(ListView_GetHeader(GetDlgItem( dlg, IDC_KEYMISC_KEYLIST )),          Header_SetImageList(ListView_GetHeader (kl), glob_imagelist);
1097                              glob_imagelist);          kmi->lv = keylist_load (GetDlgItem (dlg, IDC_KEYMISC_KEYLIST), c,
1098          kmi->lv = keylist_load( GetDlgItem( dlg, IDC_KEYMISC_KEYLIST ), c,                                  NULL, KEYLIST_LIST, kmi->keylist_sortby);
                                 NULL, KEYLIST_LIST, kmi->keylist_sortby );  
1099          /* init subclassing for the listview */          /* init subclassing for the listview */
         kl = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );  
1100          keylist_proc.dlg = dlg;          keylist_proc.dlg = dlg;
1101          keylist_proc.current = (WNDPROC)keylist_subclass_proc;          keylist_proc.current = (WNDPROC)keylist_subclass_proc;
1102          keylist_proc.old = (WNDPROC)GetWindowLong( kl, GWL_WNDPROC );          keylist_proc.old = (WNDPROC)GetWindowLong(kl, GWL_WNDPROC);
1103          if( keylist_proc.old ) {          if (keylist_proc.old) {
1104              if( !SetWindowLong( kl, GWL_WNDPROC, (LONG)keylist_proc.current) ) {              if( !SetWindowLong (kl, GWL_WNDPROC, (LONG)keylist_proc.current)) {
1105                  msg_box( dlg, _("Could not set keylist window procedure."), _("Key Manager"), MB_ERR );                  msg_box (dlg, _("Could not set keylist window procedure."),
1106                  BUG( NULL );                           _("Key Manager"), MB_ERR);
1107                    BUG (NULL);
1108              }              }
1109          }          }
         #if 0  
         km_groups_new( &gc, GetDlgItem( dlg, IDC_KEYMISC_GROUP ) );  
         km_groups_load( gc );  
         #endif  
         SetClassLong (dlg, GCL_HICON, (LONG)LoadIcon (glob_hinst, (LPCTSTR)IDI_WINPT));  
   
1110          kmi->statbar = setup_status_bar (dlg, kmi->lv);          kmi->statbar = setup_status_bar (dlg, kmi->lv);
1111          SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);          SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);
1112          kmi->toolbar = load_toolbar (dlg, kmi);          kmi->toolbar = load_toolbar (dlg, kmi);
# Line 760  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1114  keymanager_dlg_proc (HWND dlg, UINT msg,
1114          do_center_window (dlg, kmi);          do_center_window (dlg, kmi);
1115          do_resize_window (dlg, kmi);          do_resize_window (dlg, kmi);
1116          update_ui_items (dlg, kmi->lv);          update_ui_items (dlg, kmi->lv);
1117                    restore_column_info (kmi->lv);
1118    
1119          SetDlgItemText (dlg, IDC_KEYMISC_GTEXT, _("Groups"));          SetDlgItemText (dlg, IDC_KEYMISC_GTEXT, _("Groups"));
1120            SetClassLong (dlg, GCL_HICON, (LONG)LoadIcon (glob_hinst,
1121                          (LPCTSTR)IDI_WINPT));
1122          SetForegroundWindow (dlg);          SetForegroundWindow (dlg);
1123            force_foreground_window (dlg, 1000);
1124          return TRUE;          return TRUE;
1125                    
1126      case WM_DESTROY:      case WM_DESTROY:
1127            save_column_info (kmi->lv);
1128          if (kmi->lv) {          if (kmi->lv) {
1129              keylist_delete (kmi->lv);              keylist_delete (kmi->lv);
1130              kmi->lv = NULL;                    kmi->lv = NULL;      
1131                    }
1132           /*          imagelist_destroy ();
1133           if (gc) {  
1134              km_groups_release (gc);          ltoa (kmi->pos_x, type, 10);
1135              gc = NULL;          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", type);
1136          }*/          ltoa (kmi->pos_y, type, 10);
1137         imagelist_destroy ();          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", type);
1138            
1139         char buf[32];          /* Remove runtime information. This should be the last action taken here. */
1140         ltoa (kmi->pos_x, buf, 10);          delete kmi; kmi = NULL;
1141         set_reg_entry( HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", buf );          SetWindowLong (dlg, GWL_USERDATA, 0);
1142         ltoa (kmi->pos_y, buf, 10);          return FALSE;
1143         set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", buf);  
1144         /* Remove runtime information. This should be the last action taken here. */      case WM_SHOWWINDOW:
1145         delete kmi; kmi = NULL;          /*refresh_keylist (kmi);*/
1146         SetWindowLong (dlg, GWL_USERDATA, 0);          break;
1147         keycache_set_reload (refresh_keys);  
1148         return FALSE;      case WM_MOVE:
   
     case WM_MOVE:        
         /* kmi->pos_x = (int)(short)LOWORD(lparam);  
            kmi->pos_y = (int)(short)HIWORD(lparam); */  
1149          RECT r;          RECT r;
1150          GetWindowRect (dlg, &r);          GetWindowRect (dlg, &r);
1151          kmi->pos_x = r.left;          kmi->pos_x = r.left;
# Line 803  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1158  keymanager_dlg_proc (HWND dlg, UINT msg,
1158          break;          break;
1159    
1160      case WM_NOTIFY:                  case WM_NOTIFY:            
1161          NMHDR * notify;          NMHDR *notify;
1162          POINT p;          POINT p;
1163          HMENU popup;          HMENU popup;
1164                    
1165          notify = (NMHDR *)lparam;          notify = (NMHDR *)lparam;
1166          if (notify == NULL)          if (!notify)
1167              break;              break;
1168          switch (notify->code)          switch (notify->code) {
         {  
1169          case TBN_QUERYDELETE:          case TBN_QUERYDELETE:
1170              SetWindowLong(dlg, DWL_MSGRESULT, TRUE);              SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
1171              return TRUE;              return TRUE;
1172                    
1173          case TBN_QUERYINSERT:          case TBN_QUERYINSERT:
1174              SetWindowLong(dlg, DWL_MSGRESULT, TRUE);              SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
1175              return TRUE;              return TRUE;
1176    
1177          case TBN_GETBUTTONINFO:          case TBN_GETBUTTONINFO:
1178              LPTBNOTIFY lpTbNotify;              LPTBNOTIFY lpTbNotify;
1179              lpTbNotify = (LPTBNOTIFY)lparam;              lpTbNotify = (LPTBNOTIFY)lparam;
1180              if (lpTbNotify->iItem < (sizeof(myb) / sizeof(mybuttons))) {              if (lpTbNotify->iItem < (sizeof(myb) / sizeof(mybuttons))) {
1181                  lpTbNotify->tbButton.iBitmap = imagelist_getindex(myb[lpTbNotify->iItem].icon);                  lpTbNotify->tbButton.iBitmap = imagelist_getindex (myb[lpTbNotify->iItem].icon);
1182                  lpTbNotify->tbButton.idCommand = myb[lpTbNotify->iItem].command;                  lpTbNotify->tbButton.idCommand = myb[lpTbNotify->iItem].command;
1183                  lpTbNotify->tbButton.fsState = TBSTATE_ENABLED;                  lpTbNotify->tbButton.fsState = TBSTATE_ENABLED;
1184                  lpTbNotify->tbButton.fsStyle = TBSTYLE_BUTTON;                  lpTbNotify->tbButton.fsStyle = TBSTYLE_BUTTON;
# Line 863  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1217  keymanager_dlg_proc (HWND dlg, UINT msg,
1217    
1218              lpttt->hinst = NULL;              lpttt->hinst = NULL;
1219              switch (lpttt->hdr.idFrom) {              switch (lpttt->hdr.idFrom) {
1220                case ID_KEYMISC_KEYWIZARD:
1221                    lpttt->lpszText = (char*)_("Generate new key pair");
1222                    break;
1223    
1224                case ID_KEYMISC_SENDRECV:
1225                    lpttt->lpszText = (char*)_("Search for a specific key");
1226                    break;
1227    
1228              case ID_KEYMISC_DELETE:              case ID_KEYMISC_DELETE:
1229                  lpttt->lpszText = (char *)_("Delete key from keyring");                  lpttt->lpszText = (char *)_("Delete key from keyring");
1230                  break;                  break;
# Line 875  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1237  keymanager_dlg_proc (HWND dlg, UINT msg,
1237                  lpttt->lpszText = (char *)_("Sign key");                  lpttt->lpszText = (char *)_("Sign key");
1238                  break;                  break;
1239    
1240                case ID_KEYCTX_COPY:
1241                    lpttt->lpszText = (char *)_("Copy key to clipboard");
1242                    break;
1243    
1244                case ID_KEYCTX_PASTE:
1245                    lpttt->lpszText = (char*)_("Paste key from clipboard");
1246                    break;
1247    
1248              case ID_KEYMISC_IMPORT:              case ID_KEYMISC_IMPORT:
1249                  lpttt->lpszText = (char *)_("Import key to keyring");                  lpttt->lpszText = (char *)_("Import key to keyring");
1250                  break;                  break;
# Line 886  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1256  keymanager_dlg_proc (HWND dlg, UINT msg,
1256              return TRUE;              return TRUE;
1257                            
1258          case LVN_ITEMCHANGED:          case LVN_ITEMCHANGED:
1259              if (((LPNMLISTVIEW)lparam)->uNewState) /* item selected? */              if (((LPNMLISTVIEW)lparam)->uNewState) { /* item selected? */
1260              {                  kmi->lv_idx = listview_get_curr_pos (kmi->lv);
1261                  update_ui_items (dlg, kmi->lv);                  update_ui_items (dlg, kmi->lv);
1262                  return TRUE;                  return TRUE;
1263              }              }
# Line 895  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1265  keymanager_dlg_proc (HWND dlg, UINT msg,
1265    
1266          case NM_RCLICK:          case NM_RCLICK:
1267              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
1268                  if (listview_get_curr_pos (kmi->lv) == -1)                  l_idx =listview_get_curr_pos (kmi->lv);
1269                      return TRUE; /* Popup only when a item was selected */                  if (l_idx == -1)
1270                  do_check_cache (kmi->lv, dlg, kmi->statbar);                      return TRUE; /* Popup only when a item was selected */              
1271                  GetCursorPos (&p);                  GetCursorPos (&p);
1272                  hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));                  hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));
1273                  popup = GetSubMenu (hm, 0);                  popup = GetSubMenu (hm, 0);
1274                    translate_popupmenu_strings (popup);
1275    
1276                  set_menu_text (popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard"));                  if (km_check_for_seckey (kmi->lv, l_idx, &i))
                 set_menu_text (popup, ID_KEYCTX_KEYID_COPY, _("Copy Key ID to Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_FPR_COPY, _("Copy Fingerprint to Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_KINFO_COPY, _("Copy Key Info to Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_COPY, _("Copy Key to Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_PASTE, _("Paste Key from Clipboard"));  
                 set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Refresh from Keyserver"));  
                 set_menu_text (popup, ID_KEYCTX_MAXTRUST, _("Set Implicit &Trust"));  
                 set_menu_text (popup, ID_KEYCTX_LISTSIGS, _("&List Signatures"));  
                 set_menu_text (popup, ID_KEYCTX_PROPS, _("&Key Properties"));  
                 set_menu_text (popup, ID_KEYCTX_EDIT, _("Key Edit"));  
                 set_menu_text (popup, ID_KEYCTX_DEL, _("&Delete"));  
                 set_menu_text (popup, ID_KEYCTX_REV, _("&Revoke"));  
                 set_menu_text (popup, ID_KEYCTX_SIGN, _("&Sign"));  
                 set_menu_text (popup, ID_KEYCTX_ENABLE, _("&Enable"));  
                 set_menu_text (popup, ID_KEYCTX_DISABLE, _("&Disable"));  
                 set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Re&fresh from Keyserver"));  
                 set_menu_text (popup, ID_KEYCTX_SETPREFKS, _("Set preferred Keyserver URL"));  
                 set_menu_text (popup, ID_KEYCTX_SENDMAIL, _("Send Key to Mail Recipient"));  
                 set_menu_text (popup, ID_KEYCTX_SETDEFKEY, _("Set as Default Key"));  
                 /* change popup texts */  
                 set_menu_text_bypos (popup, 0, _("Key Attributes"));  
                 set_menu_text_bypos (popup, 6, _("Add"));  
                 set_menu_text_bypos (popup, 19, _("Send to Keyserver"));  
                   
                 set_menu_text (popup, ID_KEYCTX_ADDKEY, _("Key..."));  
                 set_menu_text (popup, ID_KEYCTX_ADDUID, _("User ID..."));  
                 set_menu_text (popup, ID_KEYCTX_ADDPHOTO, _("Photo ID..."));  
                 set_menu_text (popup, ID_KEYCTX_ADDREV, _("Revoker..."));  
                   
                 idx = listview_get_curr_pos (kmi->lv);  
                 if (km_check_for_seckey (kmi->lv, idx, &i))  
1277                      set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);                      set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);
1278                  if (i == 0)                  if (i == 0)
1279                      set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);                      set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);
1280                  if (!km_check_for_seckey (kmi->lv, idx, NULL)) {                  if (!km_check_for_seckey (kmi->lv, l_idx, NULL) ||
1281                      set_menu_state( popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED );                      (km_get_key_status (kmi->lv, l_idx) & KM_FLAG_REVOKED)) {
1282                      set_menu_state( popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED);
1283                      set_menu_state( popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1284                      set_menu_state( popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED);
1285                      set_menu_state( popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1286                        set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );
1287                      set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);
1288                  }                  }
1289                  else if( km_check_for_seckey (kmi->lv, idx, NULL)                  else if (km_check_for_seckey (kmi->lv, l_idx, NULL) &&
1290                        && km_key_is_v3 (kmi->lv, idx)) {                           km_key_is_v3 (kmi->lv, l_idx)) {
1291                      /* PGP 2 keys, version 3 have no no support for photo-id's,                      /* PGP 2 keys, version 3 have no no support for photo-id's,
1292                         designated revokers and secondary keys. */                         designated revokers and secondary keys. */
1293                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1294                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1295                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);
1296                  }                  }
1297                  if( km_get_key_status( kmi->lv, idx ) & KM_FLAG_DISABLED )                  if (km_get_key_status( kmi->lv, l_idx ) & KM_FLAG_DISABLED)
1298                      set_menu_state( popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED);
1299                  else                  else
1300                      set_menu_state( popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED);
1301                  if (km_get_key_status (kmi->lv, idx) & KM_FLAG_REVOKED)                  if (km_get_key_status (kmi->lv, l_idx) & KM_FLAG_REVOKED ||
1302                        km_get_key_status (kmi->lv, l_idx) & KM_FLAG_EXPIRED)
1303                      set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);
1304                  if (mapi_init())                  if (!clip_contains_pgpkey ())
1305                        set_menu_state (popup, ID_KEYCTX_PASTE, MF_DISABLED|MF_GRAYED);
1306                    if (mapi_init ())
1307                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);
1308                  /* Override 'Default Keyserver' with the actual name. */                  /* Override 'Default Keyserver' with the actual name. */
1309                  host = kserver_get_hostname (0, -1, &port);                  host = kserver_get_hostname (0, -1, &port);
1310                  set_menu_text (popup, ID_KEYCTX_KS_DEFAULT, host);                  set_menu_text (popup, ID_KEYCTX_KS_DEFAULT, host);
1311                  popup_gpg_readonly (dlg, popup);                  popup_gpg_readonly (dlg, popup);
1312                    if (listview_count_items (kmi->lv, 1) > 1)
1313                        popup_multiple (dlg, popup);
1314                  TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);                  TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);
1315                  DestroyMenu (popup);                  DestroyMenu (popup);
1316                  DestroyMenu (hm);                  DestroyMenu (hm);
1317                  return TRUE;                  return TRUE;
1318              }              }
             #if 0 /* XXX */  
             if( notify->idFrom == IDC_KEYMISC_GROUP ) {  
                 HWND tree = GetDlgItem( dlg, IDC_KEYMISC_GROUP );  
                 if( TreeView_GetSelection( tree ) ) {  
                     GetCursorPos( &p );  
                     hm = LoadMenu( glob_hinst, MAKEINTRESOURCE(IDR_WINPT_GROUP_CTX) );  
                     popup = GetSubMenu( hm, 0 );  
                     if( km_index == -1 )  
                         set_menu_state( popup, ID_GROUP_PASTE, MF_DISABLED|MF_GRAYED );  
                     set_menu_text( popup, ID_GROUP_PASTE, _("Paste into this group") );  
                     set_menu_text( popup, ID_GROUP_DELETE, _("Delete") );  
                     TrackPopupMenu( popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL );  
                     DestroyMenu( popup );  
                     DestroyMenu( hm );  
                     return TRUE;  
                 }  
             }  
             #endif  
1319              break;              break;
1320    
1321          case LVN_COLUMNCLICK:          case LVN_COLUMNCLICK:
1322              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
1323                  NMLISTVIEW * nml = (LPNMLISTVIEW) lparam;                  NMLISTVIEW *nft = (LPNMLISTVIEW) lparam;
1324                  int sortby = 0;                  int sortby = 0;
1325                  switch (nml->iSubItem) {                  switch (nft->iSubItem) {
1326                  case 0:  sortby = KEY_SORT_USERID; break;                  case 0:  sortby = KEY_SORT_USERID; break;
1327                  case 1:  sortby = KEY_SORT_KEYID; break;                  case 1:  sortby = KEY_SORT_KEYID; break;
1328                  case 2:  sortby = KEY_SORT_IS_SECRET; break;                  case 2:  sortby = KEY_SORT_IS_SECRET; break;
# Line 1016  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1344  keymanager_dlg_proc (HWND dlg, UINT msg,
1344              break;              break;
1345          }          }
1346          break;          break;
         }  
1347    
1348      case WM_WINDOWPOSCHANGING:      case WM_WINDOWPOSCHANGING:
1349          if (((WINDOWPOS*)lparam)->cx < 400)          if (((WINDOWPOS*)lparam)->cx < 400)
# Line 1030  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1357  keymanager_dlg_proc (HWND dlg, UINT msg,
1357          return TRUE;          return TRUE;
1358                    
1359      case WM_SYSCOMMAND:      case WM_SYSCOMMAND:
1360          if( LOWORD (wparam) == SC_CLOSE )          if (LOWORD (wparam) == SC_CLOSE)
1361              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
1362          return FALSE;          return FALSE;
1363                    
1364      case WM_MENUSELECT:      case WM_MENUSELECT:
1365          menu_gpg_readonly (dlg, (HMENU)lparam, LOWORD (wparam));          change_edit_menu (kmi->lv, (HMENU)lparam, LOWORD (wparam));
1366            change_key_menu ((HMENU)lparam, LOWORD (wparam));
1367          break;          break;
1368    
1369      case WM_INITMENUPOPUP:      case WM_INITMENUPOPUP:
1370          if ((UINT)LOWORD (lparam) == 3) {          if ((UINT)LOWORD (lparam) == 3) {
1371              HMENU m = (HMENU)wparam;              HMENU h = (HMENU)wparam;
1372              set_menu_text_bypos (m, 0, _("New"));              set_menu_text_bypos (h, 0, _("New"));
1373          }          }
1374          return FALSE;          return FALSE;
1375    
1376      case WM_COMMAND:      case WM_COMMAND:
1377          if( gnupg_access_keyring( 1 ) ) {          /* Allow at least 'Exit' in such a case. */
1378              msg_box( dlg, _("Could not access public keyring"), _("Key Manager"), MB_ERR );          if (gnupg_access_keyring (1) && LOWORD (wparam) != ID_KEYMISC_QUIT) {
1379                msg_box (dlg, _("Could not access public keyring"),
1380                         _("Key Manager"), MB_ERR);
1381              return FALSE;              return FALSE;
1382          }          }
1383          do_check_cache( kmi->lv, dlg, kmi->statbar );  
1384          switch( LOWORD( wparam ) ) {          switch (LOWORD (wparam)) {
1385          case ID_KEYMISC_QUIT:          case ID_KEYMISC_QUIT:
1386              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
1387              return TRUE;              return TRUE;
               
         case ID_KEYMISC_MAIL:  
             /* XXX  
             DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_MAIL, GetDesktopWindow (),  
                             winpt_mail_proc, NULL);*/  
             break;  
1388                    
1389          case ID_KEYMISC_FIND:          case ID_KEYMISC_FIND:
1390              km_find_key (dlg, kmi->lv);              km_find_key (dlg, kmi->lv);
1391              break;              break;
1392    
1393          case ID_KEYMISC_DELETE:          case ID_KEYMISC_DELETE:
1394              km_delete_keys (kmi->lv, dlg);          case ID_KEYMISC_DELETE2:
1395                if (!km_delete_keys (kmi->lv, dlg))
1396                    update_status_bar (kmi->statbar, kmi->lv);
1397              return TRUE;              return TRUE;
1398                            
1399          case ID_KEYMISC_SIGN:                  case ID_KEYMISC_SIGN:
1400              if ( (idx = listview_get_curr_pos( kmi->lv )) == -1 ) {              if (kmi->lv_idx == -1) {
1401                  msg_box( dlg, _("Please select a key."),  _("Key Manager"),                  msg_box (dlg, _("Please select a key."),  
1402                           MB_ERR );                           _("Key Manager"), MB_ERR);
1403                  return TRUE;;                  return TRUE;
1404              }              }
1405              if (km_check_key_status (kmi->lv, idx))              if (km_check_key_status (kmi->lv, kmi->lv_idx))
1406                  return TRUE;                  return TRUE;
1407              key = (gpgme_key_t)listview_get_item2 (kmi->lv, idx);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
             listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
1408              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1409                strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1410              k.ctx = key;              k.ctx = key;
1411              k.keyid = keyid;              k.keyid = key->subkeys->keyid;
1412              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIGN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIGN, dlg,
1413                                keysign_dlg_proc, (LPARAM)&k,                                keysign_dlg_proc, (LPARAM)&k,
1414                                _("Key Signing"), IDS_WINPT_KEYSIGN);                                _("Key Signing"), IDS_WINPT_KEYSIGN);
1415              if (k.update)              if (k.update)
1416                  update_key (kmi->lv, idx, k.keyid, 0);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 0);
1417              return TRUE;              return TRUE;
1418                            
1419          case ID_KEYMISC_REVCERT:          case ID_KEYMISC_REVCERT:
1420              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1421              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
                 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );  
1422                  return TRUE;                  return TRUE;
1423              }              }
1424              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1425              listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid-1 );              if (!key)
1426              if ( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {                  BUG (NULL);
1427                  msg_box( dlg, _("There is no secret key available!"), _("Key Manager"), MB_ERR );              if (!km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL)) {
1428                    msg_box (dlg, _("There is no secret key available!"),
1429                            _("Key Manager"), MB_ERR);
1430                  return TRUE;                  return TRUE;
1431              }              }
1432                            
1433              {              {
1434                  char rinf[128];                  char state[64];
1435                  listview_get_item_text (kmi->lv, idx, 5, rinf, sizeof (rinf) -1);                  listview_get_item_text (kmi->lv, kmi->lv_idx, 5,
1436                  if (strchr (rinf, 'R')) {                                          state, sizeof (state) -1);
1437                    if (strchr (state, 'R' )) {
1438                      msg_box (dlg, _("Key already revoked!"),                      msg_box (dlg, _("Key already revoked!"),
1439                               _("Key Manager"), MB_INFO);                               _("Key Manager"), MB_INFO);
1440                      return TRUE;                      return TRUE;
# Line 1115  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1443  keymanager_dlg_proc (HWND dlg, UINT msg,
1443                            
1444              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1445              k.key_pair = 1;              k.key_pair = 1;
1446              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1447              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1448              dialog_box_param(glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,              dialog_box_param(glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,
1449                               key_revoke_dlg_proc, (LPARAM)&k,                               key_revoke_dlg_proc, (LPARAM)&k,
1450                               _("Key Revocation"), IDS_WINPT_KEYREVOKE);                               _("Key Revocation Cert"), IDS_WINPT_KEYREVOKE);
1451              return TRUE;              return TRUE;
1452                            
1453          case ID_KEYMISC_TRUSTPATH:          case ID_KEYMISC_TRUSTPATH:
1454              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1455              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
                 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );  
1456                  return TRUE;                  return TRUE;
1457              }              }
1458              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1459              listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid -1 );              if (km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL)) {
1460              if( km_check_for_seckey( kmi->lv, idx, NULL ) ) {                  msg_box (dlg, _("It does not make any sense with a key pair!"),
1461                  msg_box( dlg, _("It does not make any sense with a key pair!"), _("Key Manager"), MB_OK );                           _("Key Manager"), MB_ERR);
1462                  return FALSE;                  return TRUE;
1463              }              }
1464              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1465              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1466              k.uid = uid;              k.uid = key->uids->uid;
1467              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYTRUST, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYTRUST, dlg,
1468                                keytrust_dlg_proc, (LPARAM)&k,                                keytrust_dlg_proc, (LPARAM)&k,
1469                                _("List Trust Path"), IDS_WINPT_KEYTRUST );                                _("List Trust Path"), IDS_WINPT_KEYTRUST);
1470              return TRUE;              return TRUE;
1471                            
1472          case ID_KEYMISC_CHECKSIGS:          case ID_KEYMISC_CHECKSIGS:          
1473              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1) {
1474              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1475                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  return TRUE;
                 return FALSE;  
1476              }              }
1477              listview_get_item_text (kmi->lv, idx, 0, uid, DIM (uid)-1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1478              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1479                    BUG (NULL);
1480              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1481              k.keyid = keyid;              strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1482              k.uid = uid;              k.keyid = k.tmp_keyid;
1483              k.ctx = (gpgme_key_t)listview_get_item2 (kmi->lv, idx);              k.uid = key->uids->uid;
1484                k.ctx = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1485              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,
1486                                keysig_dlg_proc, (LPARAM)&k,                                keysig_dlg_proc, (LPARAM)&k,
1487                                _("Key Signature List" ), IDS_WINPT_KEYSIG);                                _("Key Signature List" ), IDS_WINPT_KEYSIG);
1488                if (k.update)
1489                    update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 0);
1490              return TRUE;              return TRUE;
1491                            
1492          case ID_KEYMISC_PROPS:          case ID_KEYMISC_PROPS:      
1493              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
             if( idx == -1 ) {  
1494                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
1495                  return FALSE;                  return TRUE;
1496              }              }
1497              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1498              listview_get_item_text (kmi->lv, idx, 2, type, DIM (type)-1);              if (!key)
1499                    BUG (NULL);
1500              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1501              k.key_pair = 0;              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL)? 1 : 0;
1502              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
             if( !strcmp( type, "pub/sec" ) || !strcmp( type, "pub/crd" ) )  
                 k.key_pair = 1;  
1503              k.callback.ctl = kmi->lv;              k.callback.ctl = kmi->lv;
1504              k.callback.idx = idx;              k.callback.idx = kmi->lv_idx;
1505              k.is_v3 = km_key_is_v3 (kmi->lv, idx);              k.is_v3 = km_key_is_v3 (kmi->lv, kmi->lv_idx);
1506              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,
1507                                keyprops_dlg_proc, (LPARAM)&k,                                keyprops_dlg_proc, (LPARAM)&k,
1508                                _("Key Properties"), IDS_WINPT_KEYPROPS );                                _("Key Properties"), IDS_WINPT_KEYPROPS );
1509              if (k.callback.new_val != 0) {              if (k.callback.new_val != 0) {
1510                  t = get_key_trust_str (k.callback.new_val);                  t = get_key_trust_str (k.callback.new_val);
1511                  listview_add_sub_item (kmi->lv, idx, 6, t);                  listview_add_sub_item (kmi->lv, kmi->lv_idx, 6, t);
1512              }              }
1513              return TRUE;              return TRUE;
1514                            
1515          case ID_KEYMISC_RECACHE:          case ID_KEYMISC_RECACHE:
1516              /* If there is already a reload request, don't bother the user with a message. */              if (updated_keys_avail ())
1517              if (keycache_get_reload () == 1)                  l_idx = IDYES;
                 idx = IDYES;  
1518              else {              else {
1519                  char inf[256];                  char inf[256];
1520                  _snprintf (inf, sizeof (inf) -1,                  _snprintf (inf, sizeof (inf) -1,
1521                             _("This is only useful when the keyring has been "                             _("This is only useful when the keyring has been "
1522                               "modified (sign a key...).\n"                               "modified (sign a key...).\n"
1523                               "Do you really want to reload the keycache?"));                               "Do you really want to reload the keycache?"));
1524                  idx = msg_box (dlg, inf, _("Key Manager"), MB_YESNO);                  l_idx = msg_box (dlg, inf, _("Key Manager"), MB_YESNO);
1525              }              }
1526              if( idx == IDYES ) {              if (l_idx == IDYES) {
1527                  rcs.kr_reload = rcs.kr_update = 1;                  rcs.kr_reload = rcs.kr_update = 1;
1528                  rcs.tr_update = 0;                  rcs.tr_update = 0;
1529                  DialogBoxParam( glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,                  DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,
1530                                  keycache_dlg_proc, (LPARAM)&rcs );                                  keycache_dlg_proc, (LPARAM)&rcs);
1531                  c = keycache_get_ctx( 1 );                  c = keycache_get_ctx (1);
1532                  if( !c )                  if (!c)
1533                      BUG( dlg );                      BUG (dlg);
1534                  keylist_reload( kmi->lv, c, KEYLIST_LIST, KEY_SORT_USERID );                  keylist_reload (kmi->lv, c, KEYLIST_LIST, KEY_SORT_USERID);
                 refresh_keys = 0;  
1535              }              }
1536                SetForegroundWindow (dlg);
1537              return TRUE;              return TRUE;
1538                            
1539          case ID_KEYMISC_REBUILD:          case ID_KEYMISC_REBUILD:
1540              name=NULL;              name = NULL;
1541              gpg_rebuild_cache (&name);              gpg_rebuild_cache (&name);
1542              if (name) {              if (name != NULL) {
1543                  char *p = strchr (name, '\n');                  char *line = strchr (name, '\n');
1544                  show_msg (dlg, 2000, p? name + (p-name)+1 : name);                  show_msg (dlg, 2000, line? name + (line-name)+1 : name);
1545                  free (name);                  safe_free (name);
1546              }              }
1547                SetForegroundWindow (dlg);
1548              return TRUE;              return TRUE;
1549                            
1550          case ID_KEYMISC_NEWKEY:          case ID_KEYMISC_NEWKEY:
1551              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1552              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,
1553                                keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),                                keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),
1554                                IDS_WINPT_KEYGEN);                                IDS_WINPT_KEYGEN);
1555              if (genkey.newkey != NULL) {              if (genkey.cancel == 0)
1556                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  refresh_keylist (kmi);
                 keylist_sort (kmi->lv, KEY_SORT_USERID);  
             }  
1557              return TRUE;              return TRUE;
1558    
1559          case ID_KEYMISC_CARDNEW:          case ID_KEYMISC_CARDNEW:
1560              if( !scard_support ) {              if (!scard_support) {
1561                  msg_box( dlg, _("Smart Card support is not available."), _("Key Manager"), MB_INFO );                  msg_box (dlg, _("Smart Card support is not available."),
1562                             _("Key Manager"), MB_INFO);
1563                  return TRUE;                  return TRUE;
1564              }              }
1565              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,
1566                                card_keygen_dlg_proc, 0, _("Card Key Generation"),                                card_keygen_dlg_proc, 0, _("Card Key Generation"),
1567                                IDS_WINPT_CARD_KEYGEN );                                IDS_WINPT_CARD_KEYGEN);
1568              /* XXX: use new code */              if (updated_keys_avail ())
1569              if( keycache_get_reload() )                  send_cmd_id (dlg, ID_KEYMISC_RECACHE);
                 send_cmd_id( dlg, ID_KEYMISC_RECACHE );  
1570              return TRUE;              return TRUE;
1571    
1572          case ID_KEYMISC_KEYWIZARD:          case ID_KEYMISC_KEYWIZARD:
1573              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1574              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,
1575                                keygen_wizard_dlg_proc, (LPARAM)&genkey, _("Key Generation Wizard"),                                keygen_wizard_dlg_proc, (LPARAM)&genkey,
1576                                  _("Key Generation Wizard"),
1577                                IDS_WINPT_KEYWIZARD);                                IDS_WINPT_KEYWIZARD);
1578              if (genkey.newkey != NULL) {              if (genkey.cancel == 0)
1579                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  refresh_keylist (kmi);
                 keylist_sort (kmi->lv, KEY_SORT_USERID);  
             }  
1580              return TRUE;              return TRUE;
1581                            
1582          case ID_KEYMISC_SENDRECV:          case ID_KEYMISC_SENDRECV:
1583              memset (&genkey, 0, sizeof (genkey));              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,
1584              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,                                keyserver_dlg_proc, 0, _("Keyserver Access"),
1585                                keyserver_dlg_proc, (LPARAM)&genkey,                                IDS_WINPT_KEYSERVER);
1586                                _("Keyserver Access"), IDS_WINPT_KEYSERVER);              refresh_keylist (kmi);
             if (genkey.newkey != NULL) {  
                 keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);  
                 keylist_sort (kmi->lv, KEY_SORT_USERID);  
             }  
1587              return TRUE;              return TRUE;
1588                            
1589          case ID_KEYMISC_GPGPREFS:          case ID_KEYMISC_GPGPREFS:
1590              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGPREFS, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GPGPREFS, dlg,
1591                                gpgprefs_dlg_proc, 0, _("GnuPG Preferences"),                                gpgprefs_dlg_proc, 0, _("GnuPG Preferences"),
1592                                IDS_WINPT_GPGPREFS );                                IDS_WINPT_GPGPREFS);
1593              return TRUE;              return TRUE;
1594                            
1595          case ID_KEYMISC_GPGOPT:          case ID_KEYMISC_GPGOPT:
1596              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGOPT, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GPGOPT, dlg,
1597                                gpgopt_dlg_proc, 0, _("GnuPG Options" ),                                gpgopt_dlg_proc, 0, _("GnuPG Options"),
1598                                IDS_WINPT_GPGOPT );                                IDS_WINPT_GPGOPT);
1599              return TRUE;              return TRUE;
1600                            
1601          case ID_KEYMISC_IMPORT:          case ID_KEYMISC_IMPORT:
1602              t = get_fileopen_dlg (dlg, _("Choose Name of the Key File"), NULL, NULL);              t = get_fileopen_dlg (dlg, _("Choose Name of the Key File"),
1603              if (t)                                    NULL, NULL);
1604                  km_file_import (dlg, t);              if (!t)
1605                    break;
1606                if (!km_file_import (dlg, t))
1607                    refresh_keylist (kmi);
1608              return TRUE;              return TRUE;
1609    
1610          case ID_KEYMISC_IMPORT_HTTP:          case ID_KEYMISC_IMPORT_HTTP:
1611              url = (struct URL_ctx_s*)get_http_file_dlg (dlg);              url = (struct URL_ctx_s*)get_http_file_dlg (dlg);
1612              if (url->cancel == 0)              if (url->cancel == 0) {
1613                  km_http_import (dlg, url->url);                  km_http_import (dlg, url->url);
1614              delete url; url=NULL;                  refresh_keylist (kmi);
1615                }
1616                free_if_alloc (url);
1617              break;              break;
1618                            
1619          case ID_KEYMISC_EXPORT:          case ID_KEYMISC_EXPORT:
1620              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1) {
1621              if (idx == -1) {                  msg_box (dlg, _("Please select a key."),
1622                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                           _("Key Manager"), MB_ERR);
1623                  return TRUE;                  return TRUE;
1624              }              }
1625              if (listview_count_items (kmi->lv, 1) > 1)              if (listview_count_items (kmi->lv, 1) > 1)
1626                  name = m_strdup ("Exported_GPG_Keys.asc");                  name = m_strdup ("Exported_GPG_Keys.asc");
1627              else {              else {
1628                  listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);                  key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);          
1629                  name = gen_export_filename (keyid, 0);                  name = km_gen_export_filename (key->subkeys->keyid+8, 0);
1630              }              }
1631              t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);              t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1632              free_if_alloc (name);              free_if_alloc (name);
# Line 1310  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1636  keymanager_dlg_proc (HWND dlg, UINT msg,
1636              return TRUE;              return TRUE;
1637                            
1638          case ID_KEYMISC_EXPORT_PRIVKEY:          case ID_KEYMISC_EXPORT_PRIVKEY:
1639              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1640              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
                 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );  
1641                  return TRUE;                  return TRUE;
1642              }              }
1643              if( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {              if( !km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL ) ) {
1644                  msg_box( dlg, _("There is no corresponding secret key for this key."),                  msg_box (dlg, _("There is no corresponding secret key for this key."),
1645                          _("Key Manager"), MB_ERR );                           _("Key Manager"), MB_ERR);
1646                  return TRUE;                  return TRUE;
1647              }              }
1648              if( listview_count_items( kmi->lv, 1 ) > 1 ) {              if (listview_count_items (kmi->lv, 1) > 1) {
1649                  msg_box( dlg, _("You can only export one secret key."), _("Key Manager"), MB_ERR );                  msg_box (dlg, _("You can only export one secret key."),
1650                             _("Key Manager"), MB_ERR);
1651                  return TRUE;                  return TRUE;
1652              }              }
1653              idx = msg_box( dlg,              i = msg_box (dlg,
1654                            _("This operation will export your *SECRET* key!\n\n"                            _("This operation will export your *SECRET* key!\n\n"
1655                              "Never send this key to ANYONE, it should be available\n"                              "Never send this key to ANYONE, it should be available\n"
1656                              "ONLY on your machine and you may use this function\n"                              "ONLY on your machine and you may use this function\n"
1657                              "to copy the key to a safe place.\n\n"                              "to copy the key to a safe place.\n\n"
1658                              "Do you really want to export the key?"),                              "Do you really want to export the key?"),
1659                            _("WARNING"), MB_INFO|MB_YESNO );                            _("WARNING"), MB_INFO|MB_YESNO);
1660              if( idx == IDYES ) {              if (i == IDYES) {
1661                  idx = listview_get_curr_pos( kmi->lv );                  key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1662                  listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof (keyid)-8 );                  if (!key)
1663                  name = gen_export_filename (keyid, 1);                      BUG (NULL);
1664                    name = km_gen_export_filename (key->subkeys->keyid+8, 1);
1665                  t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);                  t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1666                  if (t != NULL)                            if (t != NULL)          
1667                      km_privkey_export (dlg, kmi->lv, t);                      km_privkey_export (dlg, kmi->lv, t);
1668              }              }
1669              return TRUE;              return TRUE;
1670    
1671          case ID_KEYMISC_INFO:          case ID_KEYMISC_INFO:
1672              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,
1673                                about_winpt_dlg_proc, 0, _("About WinPT"),                                about_winpt_dlg_proc, 0, _("About WinPT"),
1674                                IDS_WINPT_ABOUT );                                IDS_WINPT_ABOUT);
1675                break;
1676    
1677            case ID_KEYMISC_WEBSITE:
1678                ShellExecute (dlg, "open", "http://www.winpt.org",
1679                              NULL, NULL, SW_SHOW);
1680              break;              break;
1681    
1682          case ID_KEYMISC_HELP:          case ID_KEYMISC_HELP:
1683              ShellExecute (dlg, "open", "winpt.chm", NULL, NULL, SW_SHOW);              start_help (dlg, 0);
1684              break;              break;
1685    
1686          case ID_KEYMISC_OT:          case ID_KEYMISC_OT:
1687              dialog_box_param( glob_hinst, (LPCTSTR)IDD_WINPT_OWNERTRUST, glob_hwnd,              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_OWNERTRUST,
1688                                ownertrust_dlg_proc, 0,                                glob_hwnd, ownertrust_dlg_proc, 0,
1689                                _("Ownertrust"), IDS_WINPT_OWNERTRUST );                                _("Ownertrust"), IDS_WINPT_OWNERTRUST);
1690              break;              break;
1691    
1692          case ID_KEYMISC_EDITKEY:          case ID_KEYMISC_EDITKEY:
1693              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1)
             if (idx == -1)  
1694                  break;                  break;
1695              listview_get_item_text (kmi->lv, idx, 1, keyid, sizeof (keyid)-1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1696                if (!key)
1697                    BUG (NULL);
1698              /* XXX: pub/crd = secret key does not work */              /* XXX: pub/crd = secret key does not work */
1699              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1700              k.is_protected = km_check_if_protected (kmi->lv, idx);              strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1701              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.keyid = k.tmp_keyid;
1702              k.keyid = keyid;              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1703              k.is_v3 = km_key_is_v3 (kmi->lv, idx);              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1704              k.flags = km_get_key_status (kmi->lv, idx);              k.is_v3 = km_key_is_v3 (kmi->lv, kmi->lv_idx);
1705                k.flags = km_get_key_status (kmi->lv, kmi->lv_idx);
1706              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,
1707                                keyedit_main_dlg_proc, (LPARAM)&k,                                keyedit_main_dlg_proc, (LPARAM)&k,
1708                                _("Key Edit"), IDS_KEYCTX_EDIT);                                _("Key Edit"), IDS_KEYCTX_EDIT);
1709              if (k.update)              if (k.update)
1710                  update_key (kmi->lv,  idx, keyid, 1);                  update_key (kmi->lv,  kmi->lv_idx, k.tmp_keyid, 1);
1711              break;              break;
1712                            
1713          case ID_KEYMISC_COPY:          case ID_KEYMISC_COPY:
             km_index = listview_get_curr_pos (kmi->lv);  
1714              km_clip_export (dlg, kmi->lv);              km_clip_export (dlg, kmi->lv);
1715              break;              break;
1716                            
# Line 1386  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1719  keymanager_dlg_proc (HWND dlg, UINT msg,
1719              break;              break;
1720    
1721          case ID_KEYMISC_PASTE:          case ID_KEYMISC_PASTE:
1722              km_index = -1;              if (!km_clip_import (dlg))
1723              km_clip_import (dlg);                  refresh_keylist (kmi);
1724              break;              break;
1725                            
1726          case ID_KEYCTX_SETPREFKS:          case ID_KEYCTX_SETPREFKS:
1727              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM(keyid)-1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1728                if (!key)
1729                    BUG (NULL);
1730              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1731              k.keyid = keyid;              k.keyid = key->subkeys->keyid+8;
1732              keyedit_set_pref_keyserver (&k, dlg);              keyedit_set_pref_keyserver (&k, dlg);
1733              break;              break;
1734    
1735          case ID_KEYMISC_REFRESH_KEYS:          case ID_KEYMISC_REFRESH_KEYS:
1736              if (listview_count_items (kmi->lv, 1) == 0) {              if (listview_count_items (kmi->lv, 1) == 0) {
1737                  msg_box (dlg, _("No key was selected, select all by default."), _("Key Manager"), MB_INFO);                  msg_box (dlg, _("No key was selected, select all by default."),
1738                             _("Key Manager"), MB_INFO);
1739                  listview_select_all (kmi->lv);                  listview_select_all (kmi->lv);
1740              }              }
1741              km_refresh_from_keyserver (kmi->lv, dlg);              km_refresh_from_keyserver (kmi->lv, dlg);
# Line 1440  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1776  keymanager_dlg_proc (HWND dlg, UINT msg,
1776              break;              break;
1777    
1778          case ID_KEYCTX_ADDKEY:          case ID_KEYCTX_ADDKEY:
1779              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1780              listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1781                    BUG (NULL);
1782              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1783              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1784              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.keyid = k.tmp_keyid;
1785              k.keyid = keyid;              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1786                k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1787              keyedit_add_subkey (&k, dlg, NULL);              keyedit_add_subkey (&k, dlg, NULL);
1788              if (k.update)              if (k.update)
1789                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 1);
1790              break;              break;
1791    
1792          case ID_KEYCTX_ADDUID:          case ID_KEYCTX_ADDUID:
1793              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1794              listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1795                    BUG (NULL);
1796              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1797              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1798              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.keyid = k.tmp_keyid;
1799              k.keyid = keyid;              k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1800                k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1801              keyedit_add_userid (&k, dlg, NULL);              keyedit_add_userid (&k, dlg, NULL);
1802              if (k.update)              if (k.update)
1803                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 1);
1804              break;              break;
1805    
1806          case ID_KEYCTX_ADDREV:          case ID_KEYCTX_ADDREV:
1807              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1808              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1809                    BUG (NULL);
1810              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1811              k.keyid = keyid;              strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1812              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.keyid = k.tmp_keyid;
1813              k.key_pair = km_check_for_seckey( kmi->lv, idx, NULL );              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1814                k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1815              keyedit_add_revoker (&k, dlg);              keyedit_add_revoker (&k, dlg);
1816              if (k.update)              if (k.update)
1817                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 1);
1818              break;              break;
1819    
1820          case ID_KEYCTX_ADDPHOTO:          case ID_KEYCTX_ADDPHOTO:
1821              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1822              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1823                    BUG (NULL);
1824              memset (&k, 0, sizeof (k));              memset (&k, 0, sizeof (k));
1825              k.keyid = keyid;              strncpy (k.tmp_keyid, key->subkeys->keyid+8, 8);
1826              k.is_protected = km_check_if_protected (kmi->lv, idx);              k.keyid = k.tmp_keyid;
1827              k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);              k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1828                k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1829              keyedit_add_photo (&k, dlg);              keyedit_add_photo (&k, dlg);
1830              if (k.update)              if (k.update)
1831                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 1);
1832              break;              break;
1833    
1834          case ID_KEYCTX_KS_NL:          case ID_KEYCTX_KS_NL:
# Line 1499  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1843  keymanager_dlg_proc (HWND dlg, UINT msg,
1843              km_send_to_keyserver (kmi->lv, dlg, host, port);              km_send_to_keyserver (kmi->lv, dlg, host, port);
1844              break;              break;
1845    
1846          case ID_KEYCTX_RECVFROM:          case ID_KEYCTX_RECVFROM:
1847              km_refresh_from_keyserver (kmi->lv, dlg);              km_refresh_from_keyserver (kmi->lv, dlg);
1848              break;              break;
1849    
1850          case ID_KEYCTX_UID_COPY:          case ID_KEYCTX_UID_COPY:
1851              /* XXX: add generic function to support multiple selection              /* XXX: add generic function to support multiple selection
1852                      with a callback */                      with a callback */
1853              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1854              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid-1 );              name = utf8_to_wincp2 (key->uids->uid);
1855              set_clip_text( NULL, uid, strlen( uid ) );              set_clip_text (NULL, name, strlen (name));
1856                safe_free (name);
1857              break;              break;
1858    
1859          case ID_KEYCTX_KEYID_COPY:          case ID_KEYCTX_KEYID_COPY:
1860              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1861              listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );              set_clip_text (NULL, key->subkeys->keyid+8,
1862              set_clip_text( NULL, uid, strlen( uid ) );                             strlen (key->subkeys->keyid+8));
1863              break;              break;
1864    
1865          case ID_KEYCTX_FPR_COPY:          case ID_KEYCTX_FPR_COPY:
1866              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t) listview_get_item2 (kmi->lv, kmi->lv_idx);
1867              key = (gpgme_key_t) listview_get_item2 (kmi->lv, idx);                      t = key->subkeys->fpr;
1868              if (key) {              set_clip_text (NULL, t? t : "", t? strlen (t): 0);
                 const char * s = get_key_fpr (key);  
                 set_clip_text (NULL, s? s : "", s? strlen (s): 0);  
             }  
1869              break;              break;
1870    
1871          case ID_KEYCTX_KINFO_COPY:          case ID_KEYCTX_KINFO_COPY:
1872              idx = listview_get_curr_pos( kmi->lv );              key = (gpgme_key_t) listview_get_item2 (kmi->lv, kmi->lv_idx);
1873              listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );              if (!key)
1874              km_set_clip_info( uid );                          BUG (NULL);
1875                km_set_clip_info (key->subkeys->keyid+8);
1876              break;              break;
1877    
1878          case ID_KEYCTX_COPY:          case ID_KEYCTX_COPY:
1879              km_index = listview_get_curr_pos (kmi->lv);              send_cmd_id (dlg, ID_KEYMISC_COPY);
             km_clip_export (dlg, kmi->lv);  
1880              break;              break;
1881    
1882          case ID_KEYCTX_PASTE:            case ID_KEYCTX_PASTE:
1883              km_index = -1;              send_cmd_id (dlg, ID_KEYMISC_PASTE);
             km_clip_import (dlg);  
1884              break;              break;
1885    
1886          case ID_KEYCTX_DISABLE:          case ID_KEYCTX_DISABLE:
             idx = listview_get_curr_pos (kmi->lv);  
             km_enable_disable_key (kmi->lv, dlg, idx, 0);  
             break;  
   
1887          case ID_KEYCTX_ENABLE:          case ID_KEYCTX_ENABLE:
1888              idx = listview_get_curr_pos (kmi->lv);              i = LOWORD (wparam) == ID_KEYCTX_ENABLE? 1 : 0;
1889              km_enable_disable_key (kmi->lv, dlg, idx, 1);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1890                if (!key)
1891                    BUG (NULL);
1892                rc = km_enable_disable_key (kmi->lv, dlg, kmi->lv_idx, i);
1893                if (!rc)
1894                    update_key (kmi->lv, kmi->lv_idx, key->subkeys->keyid+8, 0);
1895                /* XXX: switching a key from disabled -> enabled. does not
1896                   change the validity field in the KM. */
1897              break;              break;
1898    
1899          case ID_KEYCTX_LISTSIGS:          case ID_KEYCTX_LISTSIGS:
# Line 1557  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1901  keymanager_dlg_proc (HWND dlg, UINT msg,
1901              break;              break;
1902    
1903          case ID_KEYCTX_MAXTRUST:          case ID_KEYCTX_MAXTRUST:
1904              idx = listview_get_curr_pos (kmi->lv);              key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1905              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              if (!key)
1906              rc = km_set_implicit_trust (dlg, kmi->lv, idx);                  BUG (NULL);
1907                rc = km_set_implicit_trust (dlg, kmi->lv, kmi->lv_idx);
1908              if (!rc)              if (!rc)
1909                  update_key (kmi->lv, idx, keyid, 0);                  update_key (kmi->lv, kmi->lv_idx, key->subkeys->keyid+8, 0);
1910              break;              break;
1911    
1912          case ID_KEYCTX_SETDEFKEY:          case ID_KEYCTX_SETDEFKEY:
1913              idx = listview_get_curr_pos (kmi->lv);              if (!km_check_key_status (kmi->lv, kmi->lv_idx)) {
1914              if (!km_check_key_status (kmi->lv, idx)) {                  key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1915                  listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);                  rc = set_gnupg_default_key (key->subkeys->keyid+8);
                 rc = set_gnupg_default_key (keyid);  
1916                  if (rc)                  if (rc)
1917                      msg_box( dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);                      msg_box (dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);
1918                  km_update_default_key_str (kmi->statbar);                  update_default_key_str (kmi->statbar);
1919              }              }
1920              break;              break;
1921    
1922          #if 0 /* XXX */          case ID_KEYMISC_VIEWKEYID:
1923            case ID_KEYMISC_VIEWCIPHER:
1924            case ID_KEYMISC_VIEWTYPE:
1925            case ID_KEYMISC_VIEWCREAT:
1926                DWORD n;
1927    
1928                hm = GetMenu (dlg);
1929                n = get_menu_state (hm, LOWORD (wparam));
1930                set_menu_state (hm, LOWORD (wparam),
1931                                n & MFS_CHECKED? MFS_UNCHECKED : MFS_CHECKED);
1932                modify_listview_columns (kmi, LOWORD (wparam), !(n & MFS_CHECKED));
1933                break;
1934    
1935          case ID_GROUP_NEW:          case ID_GROUP_NEW:
             memset (&gcb, 0, sizeof (gcb));  
             gcb.gc = gc;  
             dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GROUP, glob_hwnd,  
                              group_manager_dlg_proc, (LPARAM)&gcb, _("New Group"),  
                              IDS_WINPT_GROUP);  
             if( gcb.use_name )  
                 treeview_add_item( GetDlgItem(dlg, IDC_KEYMISC_GROUP), NULL, gcb.name );  
             return TRUE;  
               
1936          case ID_GROUP_PASTE:          case ID_GROUP_PASTE:
             km_groups_add (gc, kmi->lv, km_index);  
             break;  
               
1937          case ID_GROUP_DELETE:          case ID_GROUP_DELETE:
1938              km_groups_del (gc);              /* XXX: Implement group manager. */
1939              break;              return TRUE;
1940          #endif  
1941            case IDCANCEL:
1942                EndDialog (dlg, TRUE);
1943                return TRUE;
1944          }          }
1945                    
1946          break;          break;
# Line 1601  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1948  keymanager_dlg_proc (HWND dlg, UINT msg,
1948            
1949      return FALSE;      return FALSE;
1950  }  }
   
   
   

Legend:
Removed from v.119  
changed lines
  Added in v.150

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26