/[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 36 by werner, Thu Oct 27 15:25:13 2005 UTC revision 244 by twoaday, Mon Jul 3 14:10:21 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
24    
25  #include <windows.h>  #include <windows.h>
 #include <windows.h>  
26  #include <commctrl.h>  #include <commctrl.h>
27    
28  #include "../resource.h"  #include "resource.h"
29  #include "wptTypes.h"  #include "wptTypes.h"
30  #include "wptGPG.h"  #include "wptGPG.h"
31  #include "wptCommonCtl.h"  #include "wptCommonCtl.h"
# Line 43  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    /* Handle to the global image list. */
67  HIMAGELIST glob_imagelist;  HIMAGELIST glob_imagelist;
68    
69  struct km_info {  struct km_info_s {
70      /* Window positions */      /* Window positions */
71      int pos_x, pos_y;      int pos_x, pos_y;
72      int ypos_sep;      int ypos_sep;
73      int ypercent_sep;      int ypercent_sep;
74    
75        /* Different kind of windows. */
76        HWND dlg;
77      HWND hwnd_sep;      HWND hwnd_sep;
78      HWND toolbar;      HWND toolbar;
79      HWND statbar;      HWND statbar;
80    
81      listview_ctrl_t lv;      listview_ctrl_t lv;
82        int             lv_idx;
83      int keylist_sortby;      int keylist_sortby;
84        int magic;
85    
86        unsigned int enable_groups:1;
87  };  };
88    typedef struct km_info_s *km_info_t;
89    
90    /* Toolbar button structure. */
91  struct mybuttons {  struct mybuttons {
92      long icon;      long icon;
93      long command;      long command;
# Line 83  struct mybuttons myb[] = { Line 103  struct mybuttons myb[] = {
103  };  };
104    
105    
106  #ifndef VK_F  static void km_gui_import (struct km_info_s *kmi, int cmd_id, void *param);
107  #define VK_F 70  void key_get_clip_info (const char *keyid, char *buf, size_t buflen);
108  #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  
109    
110    /* Subclass the keylist listview control to allow extended commands. */
111  static BOOL CALLBACK  static BOOL CALLBACK
112  keylist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keylist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
113  {  {
114      struct listview_ctrl_s lv;      struct listview_ctrl_s lv;
115        struct km_info_s *kmi;
116    
117      switch (msg) {      switch (msg) {
118        case WM_DROPFILES:
119            kmi = (km_info_s *)keylist_proc.opaque;
120            km_gui_import (kmi, WM_DROPFILES, (void*)wparam);
121            break;
122    
123      case WM_LBUTTONDBLCLK:      case WM_LBUTTONDBLCLK:
124          send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PROPS);          send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PROPS);
125          break;          break;
# Line 110  keylist_subclass_proc (HWND dlg, UINT ms Line 128  keylist_subclass_proc (HWND dlg, UINT ms
128          int virt_key = (int)wparam;          int virt_key = (int)wparam;
129          switch (virt_key) {          switch (virt_key) {
130          case VK_SPACE:          case VK_SPACE:
131              send_cmd_id( keylist_proc.dlg, ID_KEYMISC_PROPS );              send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PROPS);
132              break;              break;
133                    
134          case VK_DELETE:          case VK_DELETE:
135              send_cmd_id( keylist_proc.dlg, ID_KEYMISC_DELETE );              send_cmd_id (keylist_proc.dlg, ID_KEYMISC_DELETE);
136              break;              break;
137                    
138          case VK_INSERT:          case VK_INSERT:
# Line 131  keylist_subclass_proc (HWND dlg, UINT ms Line 149  keylist_subclass_proc (HWND dlg, UINT ms
149          case VK_C:          case VK_C:
150              if (GetAsyncKeyState (VK_CONTROL)) {              if (GetAsyncKeyState (VK_CONTROL)) {
151                  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);  
152                  km_clip_export (keylist_proc.dlg, &lv);                  km_clip_export (keylist_proc.dlg, &lv);
153              }              }
154              break;              break;
155    
156          case VK_P:          case VK_P:
157              if (GetAsyncKeyState (VK_CONTROL)) {              if (GetAsyncKeyState (VK_CONTROL))
158                  km_index = -1;                  send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PASTE);
                 km_clip_import (keylist_proc.dlg);  
             }  
159              break;              break;
160    
161          case VK_F:          case VK_F:
# Line 153  keylist_subclass_proc (HWND dlg, UINT ms Line 168  keylist_subclass_proc (HWND dlg, UINT ms
168          break;          break;
169      }      }
170            
171      return CallWindowProc( keylist_proc.old, dlg, msg, wparam, lparam );      return CallWindowProc (keylist_proc.old, dlg, msg, wparam, lparam);
172  } /* keylist_subclass_proc */  }
173    
174    
175    #define ico2idx(ico) imagelist_getindex ((ico))
176    
177    /* Create a new toolbar window with a pre-defined list of buttons. */
178  static HWND  static HWND
179  load_toolbar (HWND dlg, struct km_info * kmi)  create_toolbar (HWND dlg, struct km_info_s *kmi)
180  {  {    
181      HWND tbwnd;      HWND tbwnd;
182      TBSAVEPARAMS tbsp;      TBSAVEPARAMS tbsp;
183      TBBUTTON tb_buttons[] = {      TBBUTTON tb_buttons[] = {
184          /*{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},
185          {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},
186          {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},
187          {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},
188            {ico2idx (IMI_KEY_SEARCH), ID_KEYMISC_SENDRECV, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
189          {0,                                  0,                 0,               TBSTYLE_SEP,    {0}, 0L, 0},          {0,                                  0,                 0,               TBSTYLE_SEP,    {0}, 0L, 0},
190          {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},
191          {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},
192       };          {ico2idx (IMI_KEY_IMPORT), ID_KEYCTX_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
193                {ico2idx (IMI_KEY_EXPORT), ID_KEYCTX_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
194        };
195    
196      tbwnd = CreateWindowEx (0, TOOLBARCLASSNAME, NULL,      tbwnd = CreateWindowEx (0, TOOLBARCLASSNAME, NULL,
197                              WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|CCS_ADJUSTABLE,                              WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|CCS_ADJUSTABLE,
198                              0, 0, 0, 0, dlg, (HMENU)IDR_WINPT_KMTB, glob_hinst, NULL);                              0, 0, 0, 0, dlg, (HMENU)IDR_WINPT_KMTB, glob_hinst, NULL);
199      if (tbwnd) {      if (!tbwnd)
200          SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);          BUG (0);
201          SendMessage (tbwnd, TB_SETIMAGELIST, 0, (LPARAM)glob_imagelist);      SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
202                  SendMessage (tbwnd, TB_AUTOSIZE, 0, 0);      SendMessage (tbwnd, TB_SETIMAGELIST, 0, (LPARAM)glob_imagelist);
203          ShowWindow (tbwnd, SW_SHOW);      SendMessage (tbwnd, TB_AUTOSIZE, 0, 0);
204        ShowWindow (tbwnd, SW_SHOW);
205          /* Restore toolbar */  
206          tbsp.hkr = HKEY_CURRENT_USER;      /* Restore toolbar */
207          tbsp.pszSubKey = "Software\\WinPT";      tbsp.hkr = HKEY_CURRENT_USER;
208          tbsp.pszValueName = "KM_toolbar";      tbsp.pszSubKey = "Software\\WinPT";
209          if (SendMessage(tbwnd, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp ) == 0)      tbsp.pszValueName = "KM_toolbar";
210              SendMessage (tbwnd, TB_ADDBUTTONS, sizeof(tb_buttons) / sizeof(tb_buttons[0]), (LONG)&tb_buttons[0]);      if (SendMessage (tbwnd, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp) == 0)
211       }          SendMessage (tbwnd, TB_ADDBUTTONS,
212       return tbwnd;                       sizeof (tb_buttons) / sizeof (tb_buttons[0]),
213  } /* load_toolbar */                       (LONG)&tb_buttons[0]);
214    
215        return tbwnd;
216    }
217    
218    
219    /* Restore the width of the columns from the registry.
220       If no bitstring was found, the default size is used. */
221    int
222    restore_column_info (struct km_info_s *kmi)
223    {
224        WORD *buf;
225        HKEY root;
226        DWORD type;
227        DWORD size = kmi->lv->cols*sizeof (WORD), i;
228        LONG ec;
229    
230        ec = RegOpenKeyEx (HKEY_CURRENT_USER, "Software\\WinPT", 0,
231                           KEY_ALL_ACCESS, &root);
232        if (ec != ERROR_SUCCESS)
233            return -1;
234    
235        buf = new WORD[size/2];
236        if (!buf)
237            BUG (NULL);
238        ec = RegQueryValueEx (root, "KMColumnSize", NULL, &type,
239                              (BYTE*)buf, &size);    
240        if (ec != ERROR_SUCCESS) {
241            RegCloseKey (root);
242            free_if_alloc (buf);
243            return -1;
244        }
245    
246        /* check for garbled values. */
247        for (i=0; i < size/2; i++) {
248            if (buf[i] == 0 || buf[i] > 512) {
249                free_if_alloc (buf);
250                return -1;
251            }
252        }
253        for (i=0; i < size/2; i++)
254            listview_set_column_width (kmi->lv, i, buf[i]);
255        free_if_alloc (buf);
256    
257        size = sizeof (kmi->keylist_sortby);
258        ec = RegQueryValueEx (root, "KMSortBy", NULL, &type,
259                              (BYTE*)&kmi->keylist_sortby, &size);
260        if (ec != ERROR_SUCCESS)
261            kmi->keylist_sortby = KEY_SORT_USERID;
262        RegCloseKey (root);
263        return 0;
264    }
265    
266    
267    /* Save the current column width to the registry. */
268    int
269    save_column_info (struct km_info_s *kmi)
270    {    
271        HKEY root;
272        WORD *buf;
273        LONG ec;
274        int i;
275    
276        buf = new WORD[kmi->lv->cols];
277        if (!buf)
278            BUG (NULL);
279        for (i=0; i < kmi->lv->cols; i++) {
280            LVCOLUMN lvc;
281    
282            memset (&lvc, 0, sizeof (lvc));
283            lvc.mask = LVCF_WIDTH;
284            ListView_GetColumn (kmi->lv->ctrl, i, &lvc);
285            buf[i] = lvc.cx;
286        }
287    
288        ec = RegOpenKeyEx (HKEY_CURRENT_USER, "Software\\WinPT", 0,
289                           KEY_ALL_ACCESS, &root);
290        if (ec != ERROR_SUCCESS) {
291            free_if_alloc (buf);
292            return -1;
293        }
294    
295        ec = RegSetValueEx (root, "KMColumnSize", 0, REG_BINARY,
296                            (const BYTE*)buf, 2*kmi->lv->cols);
297        if (ec == ERROR_SUCCESS) {
298            ec = RegSetValueEx (root, "KMSortBy", 0, REG_DWORD_BIG_ENDIAN,
299                                (const BYTE*)&kmi->keylist_sortby,
300                                sizeof (kmi->keylist_sortby));
301        }
302        RegCloseKey (root);
303        free_if_alloc (buf);
304        return ec == ERROR_SUCCESS? 0 : -1;
305    }
306    
307    
308    /* Restore the original size of the dialog. */
309  static void  static void
310  do_center_window (HWND dlg, struct km_info * kmi)  restore_window_size (HWND dlg, struct km_info_s *kmi)
311    {
312        char *p;
313        int height = 0, width = 0;
314    
315        /* Restore the original window size. */
316        p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Size_Width");
317        if (p) {
318            width = atoi (p);
319            free_if_alloc (p);
320        }
321        p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Size_Height");
322        if (p) {
323            height = atoi (p);
324            free_if_alloc (p);
325        }
326        if (height > 0 && width > 0)
327            SetWindowPos (dlg, HWND_TOP, kmi->pos_x, kmi->pos_y,
328                          height, width, SWP_SHOWWINDOW);
329    }
330    
331    
332    /* Center window @dlg. */
333    static void
334    do_center_window (HWND dlg, struct km_info_s *kmi)
335  {  {
336      RECT rect;      RECT rect;
337      char * p;      char *p;
338      int pos_x = 0, pos_y = 0;      int pos_x = 0;
339        int pos_y = 0;
340                    
341      /* Find bottom of keylist */      /* Find bottom of keylist */
342      GetWindowRect (GetDlgItem(dlg, IDC_KEYMISC_KEYLIST), &rect);      GetWindowRect (GetDlgItem(dlg, IDC_KEYMISC_KEYLIST), &rect);
# Line 205  do_center_window (HWND dlg, struct km_in Line 344  do_center_window (HWND dlg, struct km_in
344    
345      kmi->ypos_sep = rect.bottom;      kmi->ypos_sep = rect.bottom;
346    
347      p = get_reg_entry( HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X" );      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X");
348      if( p && !strcmp( p, " " ) ) {      if (p && !strcmp (p, " ")) {
349          free_if_alloc( p );              free_if_alloc (p);      
350          center_window( dlg, NULL );          center_window (dlg, NULL);
351          return;          return;
352      }      }
353      else if( p )      else if (p)
354          pos_x = atol( p );          pos_x = atoi (p);
355    
356      p = get_reg_entry( HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y" );      p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");
357      if( p && !strcmp( p, " " ) ) {      if (p && !strcmp (p, " ")) {
358          free_if_alloc( p );          free_if_alloc (p);
359          center_window( dlg, NULL );          center_window (dlg, NULL);
360          return;          return;
361      }      }
362      else if( p )      else if (p)
363          pos_y = atol( p );          pos_y = atoi (p);
364    
365      if( !pos_y && !pos_x ) {      if (!pos_y && !pos_x) {
366          center_window( dlg, NULL );          center_window (dlg, NULL);
367          return;          return;
368      }      }
369            
370      if( pos_x > GetSystemMetrics( SM_CXSCREEN )      if (pos_x < 0 || pos_y < 0)
371          || pos_y > GetSystemMetrics( SM_CYSCREEN ) ) {          pos_x = pos_y = 0;
372        if (pos_x > GetSystemMetrics (SM_CXSCREEN)
373            || pos_y > GetSystemMetrics (SM_CYSCREEN)) {
374          pos_x = pos_y = 0;          pos_x = pos_y = 0;
375      }      }
376      GetClientRect( dlg, &rect );      kmi->pos_x = pos_x;
377      MoveWindow( dlg, pos_x, pos_y, rect.right, rect.bottom, TRUE );      kmi->pos_y = pos_y;
378    
379        GetClientRect (dlg, &rect);
380        MoveWindow (dlg, pos_x, pos_y, rect.right, rect.bottom, TRUE);
381  }  }
382    
383    
384    /* Resize the key manager window with the information from @kmi. */
385  static void  static void
386  do_resize_window( HWND dlg, struct km_info *kmi)  do_resize_window (HWND dlg, struct km_info_s *kmi)
387  {  {
388      HWND h;      HWND h;
389      RECT rclient, rect;      RECT rclient, rect;
390      BOOL bRepaint = FALSE;      BOOL bRepaint = FALSE;
391    
392      /* Get rect of client area and make life easier */      /* Get rect of client area and make life easier */
393      GetClientRect( dlg, &rclient );      GetClientRect (dlg, &rclient);
394    
395      /* Move toolbar to the top of the window */      /* Move toolbar to the top of the window */
396      if (kmi->toolbar) {      if (kmi->toolbar) {
397          GetWindowRect(kmi->toolbar, &rect);          GetWindowRect (kmi->toolbar, &rect);
398          ScreenToClient(dlg, (POINT*)&rect);          ScreenToClient (dlg, (POINT*)&rect);
399          ScreenToClient(dlg, (POINT*)&(rect.right));          ScreenToClient (dlg, (POINT*)&(rect.right));
400    
401          rclient.top += rect.bottom - rect.top;          rclient.top += rect.bottom - rect.top;
402          MoveWindow (kmi->toolbar, 0, 0, rclient.right - rclient.left,          MoveWindow (kmi->toolbar, 0, 0, rclient.right - rclient.left,
# Line 260  do_resize_window( HWND dlg, struct km_in Line 405  do_resize_window( HWND dlg, struct km_in
405    
406      /* Move statusbar to the bottom of the window */      /* Move statusbar to the bottom of the window */
407      if (kmi->statbar) {      if (kmi->statbar) {
408          GetWindowRect( kmi->statbar, &rect );          GetWindowRect (kmi->statbar, &rect);
409          ScreenToClient(dlg, (POINT*)&rect);          ScreenToClient (dlg, (POINT*)&rect);
410          ScreenToClient(dlg, (POINT*)&(rect.right));          ScreenToClient (dlg, (POINT*)&(rect.right));
411    
412          rclient.bottom -= rect.bottom - rect.top;          rclient.bottom -= rect.bottom - rect.top;
413          MoveWindow (kmi->statbar, 0, rclient.bottom, rclient.right - rclient.left,          MoveWindow (kmi->statbar, 0, rclient.bottom,
414                        rclient.right - rclient.left,
415                      rect.bottom - rect.top, bRepaint);                      rect.bottom - rect.top, bRepaint);
416      }      }
417    
418      // Obtain separator information and move it to the desired posistion      /* Obtain separator information and move it to the desired posistion */
419      if (kmi->ypercent_sep)      if (kmi->ypercent_sep)
420          kmi->ypos_sep = (rclient.bottom - rclient.top) * kmi->ypercent_sep / 100;          kmi->ypos_sep = (rclient.bottom - rclient.top) * kmi->ypercent_sep / 100;
421      else      else
422          kmi->ypercent_sep = kmi->ypos_sep * 100 / (rclient.bottom - rclient.top);          kmi->ypercent_sep = kmi->ypos_sep * 100 / (rclient.bottom - rclient.top);
423                    
424      // Don't move away      /* Don't move away */
425      if (kmi->ypos_sep+5 > rclient.bottom)      if (kmi->ypos_sep+5 > rclient.bottom)
426          kmi->ypos_sep = rclient.bottom - 5;          kmi->ypos_sep = rclient.bottom - 5;
427      if (kmi->ypos_sep < rclient.top)      if (kmi->ypos_sep < rclient.top)
428          kmi->ypos_sep = rclient.top;          kmi->ypos_sep = rclient.top;
429      MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep, (rclient.right - rclient.left), 5, bRepaint);      MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep,
430                    (rclient.right - rclient.left), 5, bRepaint);
431                    
432      // Place the keylist above the separator      /* Place the keylist above the separator */
433      h = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );      h = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
434      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
435                  kmi->ypos_sep - rclient.top, bRepaint);                  kmi->ypos_sep - rclient.top, bRepaint);
436      rclient.top = kmi->ypos_sep + 5 + 8;      rclient.top = kmi->ypos_sep + 5 + 8;
437    
438      /* Place the group text and the group box below the separator */      if (kmi->enable_groups != 0) {
439      h = GetDlgItem( dlg, IDC_KEYMISC_GTEXT );          /* Place the group text and the group box below the separator */
440      MoveWindow( h, rclient.left, rclient.top, 100, 14, bRepaint);          h = GetDlgItem (dlg, IDC_KEYMISC_GTEXT);
441      rclient.top += 18;          MoveWindow (h, rclient.left, rclient.top, 100, 14, bRepaint);
442            rclient.top += 18;
443      h = GetDlgItem( dlg, IDC_KEYMISC_GROUP );  
444      MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,          h = GetDlgItem (dlg, IDC_KEYMISC_GROUP);
445                  (rclient.bottom < rclient.top) ? 0 : rclient.bottom - rclient.top, bRepaint);          MoveWindow (h, rclient.left, rclient.top,
446                        rclient.right - rclient.left,
447                        (rclient.bottom < rclient.top) ?
448                        0 : rclient.bottom - rclient.top, bRepaint);
449        }
450            
451      /* Repaint the whole thing */      /* Repaint the whole thing */
452      InvalidateRect (dlg, NULL, TRUE);      InvalidateRect (dlg, NULL, TRUE);
453  } /* do_resize_window */  }
454    
455    
456    /* Return true if the clipboard contains an OpenPGP key. */
457    static bool
458    clip_contains_pgpkey (void)
459    {
460        char *ctxt;
461        bool val = false;
462    
463        ctxt = get_clip_text (NULL);
464        if (!ctxt || strlen (ctxt) < 512)
465            val = false;
466        else if (strstr (ctxt, "BEGIN PGP") && strstr (ctxt, "KEY BLOCK") &&
467                 strstr (ctxt, "END PGP"))
468            val = true;
469        free_if_alloc (ctxt);
470        return val;
471    }
472    
473    
474    /* Show a mini popup menu to import keys. */
475  static void  static void
476  do_create_minpopup (HWND dlg)  do_create_minpopup (HWND dlg)
477  {  {
478      HMENU hm;      HMENU hm;
     MENUITEMINFO mi;  
     char * s;  
479      POINT p;      POINT p;
480            
481      if (gpg_read_only)      if (gpg_read_only || !clip_contains_pgpkey ())
482          return;          return;
483      hm = CreatePopupMenu ();      hm = CreatePopupMenu ();
484      if (!hm)      if (!hm)
485          BUG( NULL );          BUG (0);
486      memset (&mi, 0, sizeof mi);      insert_menu_item (hm, 0, ID_KEYCTX_PASTE, _("Paste Key from Clipboard"));
     mi.cbSize = sizeof mi;  
     s = (char *)_("Paste Key from Clipboard");  
     mi.fType = MF_STRING;  
     mi.dwTypeData = s;  
     mi.cch = strlen (s);  
     mi.fMask = MIIM_DATA | MIIM_ID | MIIM_TYPE;  
     mi.wID = ID_KEYCTX_PASTE;  
     InsertMenuItem (hm, 0, FALSE, &mi);  
487      GetCursorPos (&p);      GetCursorPos (&p);
488      TrackPopupMenu (hm, 0, p.x, p.y, 0, dlg, NULL);      TrackPopupMenu (hm, 0, p.x, p.y, 0, dlg, NULL);
489      DestroyMenu (hm);      DestroyMenu (hm);
490  } /* do_create_minpopup */  }
491    
492    
493  static void  /* Update the default key entry in the status bar for dialog @dlg. */
494  do_check_cache (listview_ctrl_t lv, HWND dlg, HWND sb)  void
495    update_default_key_str (HWND dlg)
496    {
497        const char *fmt;
498        char *keyid;
499        char defkeyinf[128];
500    
501        keyid = get_gnupg_default_key ();
502        if (!keyid)
503            return;
504        if ((keyid[0] >= 'A' && keyid[0] <= 'Z') ||
505            (keyid[0] >= 'a' && keyid[0] <= 'z') ||
506            (keyid[0] == '0' && keyid[1] == 'x'))
507            fmt = _("Default Key: %s");
508        else
509            fmt = _("Default Key: 0x%s");
510        _snprintf (defkeyinf, sizeof (defkeyinf) - 1, fmt, keyid);
511        SendMessage (dlg, SB_SETTEXT, 0, (LPARAM)defkeyinf);
512        gpg_keycache_set_default_key (keycache_get_ctx (0), keyid);
513        free_if_alloc (keyid);
514    }
515    
516    
517    /* Count all keys and show from @lv results in the status bar @sb. */
518    void
519    update_status_bar (HWND sb, listview_ctrl_t lv)
520  {  {
521      gpg_keycache_t cache;      char txt_sec[128], txt_pub[128];
522        int nkeys = 0, nsec = 0;
523        int i;
524    
525      if( keycache_get_reload( ) ) {      nkeys = listview_count_items (lv, 0);
526          keycache_reload( dlg );      for (i = 0; i < nkeys; i++) {
527          keycache_set_reload( 0 );          if (km_check_for_seckey (lv, i, NULL))
528          cache = keycache_get_ctx( 1 );              nsec++;
         if( !cache )  
             BUG( dlg );  
         keylist_reload( lv, cache, KEYLIST_LIST, KEY_SORT_USERID );  
         km_complete_status_bar (sb, lv);  
529      }      }
530  } /* do_check_cache */      _snprintf (txt_sec, sizeof (txt_sec)-1, _("%d secret keys"), nsec);
531        _snprintf (txt_pub, sizeof (txt_pub)-1, _("%d keys"), nkeys);
532        SendMessage (sb, SB_SETTEXT, 1, (LPARAM)txt_sec);
533        SendMessage (sb, SB_SETTEXT, 2, (LPARAM)txt_pub);
534    }
535    
536    
537  long CALLBACK  long CALLBACK
538  separator_wnd_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )  separator_wnd_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
539  {  {
540      static POINT last_mouse_pos;      static POINT last_mouse_pos;
541    
542      if (msg == WM_CREATE)      if (msg == WM_CREATE)
543          SetWindowLong (hwnd, GWL_USERDATA, (long)(((CREATESTRUCT*)lparam)->lpCreateParams));          SetWindowLong (hwnd, GWL_USERDATA,
544                           (long)(((CREATESTRUCT*)lparam)->lpCreateParams));
545    
546      switch (msg) {      switch (msg) {
547      case WM_PAINT:      case WM_PAINT:
# Line 364  separator_wnd_proc( HWND hwnd, UINT msg, Line 552  separator_wnd_proc( HWND hwnd, UINT msg,
552          GetClientRect (hwnd, &rect);          GetClientRect (hwnd, &rect);
553          BeginPaint (hwnd, &ps);          BeginPaint (hwnd, &ps);
554    
555          // Background          /* Background */
556          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));          FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));
557    
558          // The lines from the light into the dark          /* The lines from the light into the dark */
559          MoveToEx(ps.hdc, 0,0, NULL);          MoveToEx (ps.hdc, 0,0, NULL);
560          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT))) != NULL) {          hpen = CreatePen (PS_SOLID, 0, GetSysColor (COLOR_3DHILIGHT));
561              SelectObject(ps.hdc, (LPVOID)hpen);          if (hpen != NULL) {
562              LineTo(ps.hdc, rect.right, 0);              SelectObject (ps.hdc, (LPVOID)hpen);
563              DeleteObject(hpen);              LineTo (ps.hdc, rect.right, 0);
564                DeleteObject (hpen);
565          }          }
566          MoveToEx(ps.hdc, 0, 1, NULL);          MoveToEx (ps.hdc, 0, 1, NULL);
567          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT))) != NULL) {          hpen = CreatePen (PS_SOLID, 0, GetSysColor (COLOR_3DLIGHT));
568               SelectObject(ps.hdc, (LPVOID)hpen);          if (hpen != NULL) {
569               LineTo(ps.hdc, rect.right, rect.bottom);               SelectObject (ps.hdc, (LPVOID)hpen);
570               DeleteObject(hpen);               LineTo (ps.hdc, rect.right, rect.bottom);
571                 DeleteObject (hpen);
572           }           }
573    
574          MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);          MoveToEx (ps.hdc, 0, rect.bottom-1, NULL);
575          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW))) != NULL) {          hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW));
576              SelectObject(ps.hdc, (LPVOID)hpen);          if (hpen != NULL) {
577              LineTo(ps.hdc, rect.right, rect.bottom-1);              SelectObject (ps.hdc, (LPVOID)hpen);
578              DeleteObject(hpen);              LineTo (ps.hdc, rect.right, rect.bottom-1);
579                DeleteObject (hpen);
580          }          }
581          MoveToEx(ps.hdc, 0, rect.bottom, NULL);          MoveToEx (ps.hdc, 0, rect.bottom, NULL);
582          if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {          hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW));
583              SelectObject(ps.hdc, (LPVOID)hpen);          if (hpen != NULL) {
584              LineTo(ps.hdc, rect.right, rect.bottom);              SelectObject (ps.hdc, (LPVOID)hpen);
585              DeleteObject(hpen);              LineTo (ps.hdc, rect.right, rect.bottom);
586                DeleteObject (hpen);
587          }          }
588    
589          EndPaint (hwnd, &ps);          EndPaint (hwnd, &ps);
590          return 0;          return 0;
591    
592      case WM_LBUTTONDOWN:      case WM_LBUTTONDOWN:
593          last_mouse_pos.x = LOWORD(lparam);          last_mouse_pos.x = LOWORD (lparam);
594          last_mouse_pos.y = HIWORD(lparam);          last_mouse_pos.y = HIWORD (lparam);
595          ClientToScreen (hwnd, &last_mouse_pos);          ClientToScreen (hwnd, &last_mouse_pos);
596          SetCapture (hwnd);          SetCapture (hwnd);
597          return 0;          return 0;
# Line 410  separator_wnd_proc( HWND hwnd, UINT msg, Line 602  separator_wnd_proc( HWND hwnd, UINT msg,
602    
603      case WM_MOUSEMOVE:      case WM_MOUSEMOVE:
604          if (wparam == MK_LBUTTON) {          if (wparam == MK_LBUTTON) {
605              struct km_info *kmi;              struct km_info_s *kmi;
606              POINT p;              POINT p;
607              RECT rect;              RECT r;
608    
609              if ((kmi = (struct km_info *)GetWindowLong (hwnd, GWL_USERDATA)) == NULL)              kmi = (struct km_info_s *)GetWindowLong (hwnd, GWL_USERDATA);
610                if (kmi == NULL)
611                  break;                  break;
612    
613              // Calculate mouse movement              /* Calculate mouse movement */
614              p.x = LOWORD(lparam);              p.x = LOWORD (lparam);
615              p.y = HIWORD(lparam);              p.y = HIWORD (lparam);
616              ClientToScreen (hwnd, &p);              ClientToScreen (hwnd, &p);
617    
618              GetWindowRect (hwnd, &rect);              GetWindowRect (hwnd, &r);
619              rect.top += (short)(p.y - last_mouse_pos.y);              r.top += (short)(p.y - last_mouse_pos.y);
620              rect.bottom += (short)(p.y - last_mouse_pos.y);              r.bottom += (short)(p.y - last_mouse_pos.y);
621    
622              last_mouse_pos.y = p.y;              last_mouse_pos.y = p.y;
623    
624              // Apply mouse movement to window. Beware the MoveWindow is relaive              /* Apply mouse movement to window. Beware the MoveWindow is relaive
625              // to parent NOT screen                 to parent NOT screen */
626              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&rect, 2);              MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&r, 2);
627              kmi->ypos_sep = rect.top;              kmi->ypos_sep = r.top;
628              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 */
629              do_resize_window (GetParent(hwnd), kmi);              do_resize_window (GetParent (hwnd), kmi);
630              return 0;              return 0;
631          }          }
632      }      }
# Line 442  separator_wnd_proc( HWND hwnd, UINT msg, Line 635  separator_wnd_proc( HWND hwnd, UINT msg,
635  }  }
636    
637    
638    /* Register the separator window with @dlg as the parent window. */
639  static HWND  static HWND
640  regist_sep_wnd (HWND dlg, struct km_info * kmi)  regist_sep_wnd (HWND dlg, struct km_info_s *kmi)
641  {  {
642      WNDCLASS wndclass;      WNDCLASS wndclass;
643      HWND h;      HWND h;
# Line 465  regist_sep_wnd (HWND dlg, struct km_info Line 659  regist_sep_wnd (HWND dlg, struct km_info
659                          0, 400, 2000, 5, dlg, (HMENU) 0, glob_hinst, kmi);                              0, 400, 2000, 5, dlg, (HMENU) 0, glob_hinst, kmi);    
660      ShowWindow (h, SW_SHOW);      ShowWindow (h, SW_SHOW);
661      return h;      return h;
662  } /* regist_sep_wnd */  }
   
663    
664    
665  #define enable_button(hwnd, cid) \  #define enable_button(hwnd, cid, item_selected) \
666      SendMessage ((hwnd), TB_ENABLEBUTTON, (cid), MAKELONG (key_selected, 0))      SendMessage ((hwnd), TB_ENABLEBUTTON, (cid), MAKELONG ((item_selected), 0))
667    
668    
669  /* Interactive modification of the dialog item which depend if an item  /* Interactive modification of the dialog item which depend if an item
# Line 479  regist_sep_wnd (HWND dlg, struct km_info Line 672  regist_sep_wnd (HWND dlg, struct km_info
672  void  void
673  update_ui_items (HWND hwnd, listview_ctrl_t lv)  update_ui_items (HWND hwnd, listview_ctrl_t lv)
674  {  {
675      int key_selected = 0, key_has_sec = 0;      HWND tb_hwnd;
     int i, key_inv = 0;  
     HWND hwnd_child;  
676      HMENU hmenu;      HMENU hmenu;
677            int mult_resids[] = {ID_KEYMISC_PROPS, ID_KEYMISC_SIGN, ID_KEYMISC_EDITKEY,
678                             ID_KEYMISC_CHECKSIGS, ID_KEYMISC_REVCERT, 0};
679        int key_selected = 0;
680        int key_has_sec = 0;
681        int key_inv = 0;
682        int i, state=0;
683    
684      /* Get some states */      /* Get some states */
685      key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST),      key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST),
686                                             LVM_GETSELECTEDCOUNT, 0, 0)                                             LVM_GETSELECTEDCOUNT, 0, 0)
# Line 492  update_ui_items (HWND hwnd, listview_ctr Line 689  update_ui_items (HWND hwnd, listview_ctr
689      if (key_selected) {      if (key_selected) {
690          i = listview_get_curr_pos (lv);          i = listview_get_curr_pos (lv);
691          key_has_sec = km_check_for_seckey (lv, i, NULL) ? TRUE : FALSE;          key_has_sec = km_check_for_seckey (lv, i, NULL) ? TRUE : FALSE;
692          key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED;          key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED ||
693                      km_get_key_status (lv, i) & KM_FLAG_EXPIRED;
694      }      }
695    
696      /* Enable / disable toolbar buttons */      /* Enable / disable toolbar buttons */
697      hwnd_child = GetDlgItem (hwnd, IDR_WINPT_KMTB);      tb_hwnd = GetDlgItem (hwnd, IDR_WINPT_KMTB);
698      enable_button (hwnd_child, ID_KEYMISC_DELETE);      enable_button (tb_hwnd, ID_KEYMISC_DELETE, key_selected);
699      enable_button (hwnd_child, ID_KEYMISC_PROPS);      enable_button (tb_hwnd, ID_KEYMISC_PROPS, key_selected);
700      enable_button (hwnd_child, ID_KEYMISC_SIGN);      enable_button (tb_hwnd, ID_KEYMISC_SIGN, key_selected && !key_inv);
701      enable_button (hwnd_child, ID_KEYMISC_EXPORT);      enable_button (tb_hwnd, ID_KEYMISC_EXPORT, key_selected);
702        enable_button (tb_hwnd, ID_KEYCTX_COPY, key_selected);
703        enable_button (tb_hwnd, ID_KEYCTX_PASTE, clip_contains_pgpkey ());
704    
705      /* Enable / disable menu items */      /* Enable / disable menu items */
706        state = key_selected? MF_ENABLED : MF_DISABLED|MF_GRAYED;
707      hmenu = GetMenu (hwnd);      hmenu = GetMenu (hwnd);
708      set_menu_state (hmenu, ID_KEYMISC_EXPORT, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EXPORT, state);
709      set_menu_state (hmenu, ID_KEYMISC_EXPORT_PRIVKEY, key_has_sec ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_DELETE, state);
710      set_menu_state (hmenu, ID_KEYMISC_REVCERT, key_has_sec ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_PROPS, state);
711      set_menu_state (hmenu, ID_KEYMISC_DELETE, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EDITKEY, state);
712      set_menu_state (hmenu, ID_KEYMISC_PROPS, key_selected ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_CHECKSIGS, state);
713      set_menu_state (hmenu, ID_KEYMISC_SIGN, key_selected && !key_inv ? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_SIGN,
714      set_menu_state (hmenu, ID_KEYMISC_EDITKEY, key_selected? MF_ENABLED : MF_GRAYED);                      key_selected && !key_inv ? MF_ENABLED : MF_GRAYED);
715      set_menu_state (hmenu, ID_KEYMISC_CHECKSIGS, key_selected? MF_ENABLED : MF_GRAYED);      set_menu_state (hmenu, ID_KEYMISC_EXPORT_PRIVKEY,
716                        key_selected && key_has_sec? MF_ENABLED : MF_GRAYED);
717        set_menu_state (hmenu, ID_KEYMISC_REVCERT,
718                        key_selected && key_has_sec? MF_ENABLED : MF_GRAYED);
719    
720        /* Disable some menu items when multiple keys are selected. */
721        if (listview_count_items (lv, 1) > 1) {
722            for (i=0; mult_resids[i] != 0; i++)
723                set_menu_state (hmenu, mult_resids[i], MF_GRAYED);
724        }
725    
726        /* Disable all secret-key functions when no secret key is available. */
727        if (!secret_key_available ()) {
728            enable_button (tb_hwnd, ID_KEYMISC_SIGN, FALSE);
729            set_menu_state (hmenu, ID_KEYMISC_SIGN, MF_GRAYED);
730        }
731    }
732    
733    
734    /* Disable some context menu items when multiple keys are selected. */
735    static void
736    popup_multiple (HWND dlg, HMENU hm)
737    {
738        int resids[] = {
739            ID_KEYCTX_EDIT,
740            ID_KEYCTX_SIGN,
741            ID_KEYCTX_REV,
742            ID_KEYCTX_ENABLE,
743            ID_KEYCTX_DISABLE,
744            ID_KEYCTX_ADDKEY,
745            ID_KEYCTX_ADDPHOTO,
746            ID_KEYCTX_ADDUID,
747            ID_KEYCTX_ADDREV,
748            ID_KEYCTX_LISTSIGS,
749            ID_KEYCTX_MAXTRUST,
750            ID_KEYCTX_PROPS,
751            ID_KEYCTX_SENDMAIL,
752            0};
753        int i;
754        for (i=0; i < resids[i] != 0; i++)
755            set_menu_state (hm, resids[i], MF_GRAYED);
756  }  }
757    
758    
# Line 543  popup_gpg_readonly (HWND dlg, HMENU hm) Line 784  popup_gpg_readonly (HWND dlg, HMENU hm)
784  }  }
785    
786    
787    /* Change the 'Edit' menu based on the current state. */
788  static void  static void
789  menu_gpg_readonly (HWND dlg, HMENU hm, int id)  change_edit_menu (listview_ctrl_t lv, HMENU hm, int id)
790    {
791        enum item { EDIT_MENU = 1 };
792        int no_sel;
793    
794        if (id != EDIT_MENU)
795            return;
796    
797        if (!clip_contains_pgpkey ())
798            set_menu_state (hm, ID_KEYMISC_PASTE, MF_GRAYED);
799        else
800            set_menu_state (hm, ID_KEYMISC_PASTE, MF_ENABLED);
801        no_sel = listview_get_curr_pos (lv) == -1? 1 : 0;
802        set_menu_state (hm, ID_KEYMISC_DELETE2, no_sel? MF_GRAYED: MF_ENABLED);
803        set_menu_state (hm, ID_KEYMISC_COPY, no_sel? MF_GRAYED : MF_ENABLED);
804    }
805    
806    
807    
808    /* Show limited key menu entries when GPG is in read-only mode. */
809    static void
810    change_key_menu (HMENU hm, int id)
811  {  {
812      int key_resids[] = {      int key_resids[] = {
813          ID_KEYMISC_SIGN,          ID_KEYMISC_SIGN,
# Line 565  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 828  menu_gpg_readonly (HWND dlg, HMENU hm, i
828          ID_KEYMISC_EDITKEY,          ID_KEYMISC_EDITKEY,
829          0          0
830      };      };
831      int * resids;      int *resids;
832      int i;      int i;
833    
834            
# Line 575  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 838  menu_gpg_readonly (HWND dlg, HMENU hm, i
838      case 0: return;      case 0: return;
839      case 3: resids = key_resids; break;      case 3: resids = key_resids; break;
840      case 1: resids = edit_resids;break;      case 1: resids = edit_resids;break;
841        default:resids = edit_resids; break;
842      }      }
843    
844      for (i=0; resids[i] != 0; i++)      for (i=0; resids[i] != 0; i++)
# Line 582  menu_gpg_readonly (HWND dlg, HMENU hm, i Line 846  menu_gpg_readonly (HWND dlg, HMENU hm, i
846  }  }
847    
848    
849  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;  
 }  
   
   
850  static void  static void
851  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)
852  {  {
853      gpgme_key_t key;      struct winpt_key_s key;
854    
855      keycache_update (0, keyid);      keycache_update (0, keyid);
856      if (keypair)      if (keypair)
# Line 617  update_key (listview_ctrl_t lv, int pos, Line 858  update_key (listview_ctrl_t lv, int pos,
858    
859      /* because we replaced the key item, we need to update the      /* because we replaced the key item, we need to update the
860         address of the pointer in the ListView control. */         address of the pointer in the ListView control. */
861      get_pubkey (keyid, &key);      memset (&key, 0, sizeof (key));
862      keylist_upd_key (lv, pos, key);      winpt_get_pubkey (keyid, &key);
863        keylist_upd_key (lv, pos, key.ext, key.ctx);
864        keyring_check_last_access ();
865  }  }
866    
867    
# Line 626  update_key (listview_ctrl_t lv, int pos, Line 869  update_key (listview_ctrl_t lv, int pos,
869  static HWND  static HWND
870  setup_status_bar (HWND dlg, listview_ctrl_t lv)  setup_status_bar (HWND dlg, listview_ctrl_t lv)
871  {        {      
872      HWND statbar;          HWND statbar;
873      RECT r;      RECT r;
874      int partpos[3];      int partpos[3];
875      int i;      int i;
# Line 640  setup_status_bar (HWND dlg, listview_ctr Line 883  setup_status_bar (HWND dlg, listview_ctr
883      ShowWindow (statbar, SW_SHOW);      ShowWindow (statbar, SW_SHOW);
884      SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);      SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);
885    
886      km_update_default_key_str (statbar);      update_default_key_str (statbar);
887      km_complete_status_bar (statbar, lv);      update_status_bar (statbar, lv);
888    
889      return statbar;      return statbar;
890  }  }
891    
892    
893    /* Remove or add columns which depends on the state of @checked. */
894    void
895    modify_listview_columns (km_info_s *kmi, UINT m_uid, BOOL checked)
896    {
897        UINT resids[] = {
898            0,
899            ID_KEYMISC_VIEWKEYID,
900            ID_KEYMISC_VIEWTYPE,
901            0,
902            ID_KEYMISC_VIEWCIPHER,
903            0,
904            0,
905            ID_KEYMISC_VIEWCREAT,
906            ID_KEYMISC_VIEWDESC,
907            -1
908        };
909        listview_column_s cols[] = {
910        {0, 240, (char *)_("User ID")},
911        {1, 78, (char *)_("Key ID")},
912        {2, 52, (char *)_("Type")},    
913        {3, 66, (char *)_("Size")},
914        {4, 60, (char *)_("Cipher")},
915        {5, 66, (char *)_("Validity")},
916        {6, 58, (char *)_("Trust")},
917        {7, 72, (char *)_("Creation")},
918        {8, 160,(char *)_("Description")},
919        {0, 0, NULL}
920        };
921        UINT pos;
922    
923        for (pos=0; resids[pos] != -1; pos++) {
924            if (m_uid == resids[pos])
925                break;
926        }
927        if (!checked)
928            listview_del_column (kmi->lv, (int)pos);
929        else {      
930            listview_add_column (kmi->lv, &cols[pos]);
931            keylist_upd_col (kmi->lv, pos);
932        }
933    }
934    
935    
936    /* Helper to handle the help file. If @check is 1
937       the existence of the file is checked.
938       Otherwise the help file will be loaded. */
939    static bool
940    start_help (HWND dlg, int check)
941    {
942        DWORD n;
943        char path[MAX_PATH+1+32];
944    
945        n = GetModuleFileName (NULL, path, sizeof (path)-1-32);
946        if (!n)
947            return false;
948        path[n] = 0;
949        while (n-- && path[n] != '\\')
950            ;
951        path[n+1] = 0;
952        strcat (path, "winpt.chm");
953        if (!check)
954            ShellExecute (dlg, "open", path, NULL, NULL, SW_SHOW);
955        return file_exist_check (path) == 0? true : false;
956    }
957    
958    /* Translate all menu strings. */
959    static void
960    translate_menu_strings (HWND dlg)
961    {
962        HMENU menu;
963    
964        menu = LoadMenu (glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC);
965        set_menu_text_bypos (menu, 0, _("File"));
966        set_menu_text_bypos (menu, 1, _("Edit"));
967        set_menu_text_bypos (menu, 2, _("View"));
968        set_menu_text_bypos (menu, 3, _("Key"));
969        set_menu_text_bypos (menu, 4, _("Groups"));
970    
971        set_menu_text (menu, ID_KEYMISC_EDITKEY, _("Edit"));
972        set_menu_text (menu, ID_KEYMISC_MAIL, _("Send Mail..."));
973        set_menu_text (menu, ID_KEYMISC_OT, _("Ownertrust")); /* XXX */
974        set_menu_text (menu, ID_KEYMISC_COPY, _("&Copy\tCtrl+C"));
975        set_menu_text (menu, ID_KEYMISC_PASTE, _("&Paste\tCtrl+V"));
976        set_menu_text (menu, ID_KEYMISC_FIND, _("Search...\tCtrl+F"));
977        set_menu_text (menu, ID_KEYMISC_SELALL, _("Select All\tCtrl+A"));
978        set_menu_text (menu, ID_KEYMISC_QUIT, _("&Quit"));
979        set_menu_text (menu, ID_KEYMISC_UID, _("User ID"));
980        set_menu_text (menu, ID_KEYMISC_NEWKEY, _("&Expert"));
981        set_menu_text (menu, ID_KEYMISC_KEYWIZARD, _("&Normal"));
982        set_menu_text (menu, ID_KEYMISC_EDIT, _("Edit"));
983        set_menu_text (menu, ID_KEYMISC_SIGN, _("&Sign"));
984        set_menu_text (menu, ID_KEYMISC_DELETE, _("&Delete"));
985        set_menu_text (menu, ID_KEYMISC_DELETE2, _("&Delete"));
986        set_menu_text (menu, ID_KEYMISC_REVCERT, _("&Revoke Cert"));
987        set_menu_text (menu, ID_KEYMISC_CHECKSIGS, _("&List Signatures"));
988        set_menu_text (menu, ID_KEYMISC_TRUSTPATH, _("List Trust Path"));
989        set_menu_text (menu, ID_KEYMISC_EXPORT, _("&Export..."));
990        set_menu_text (menu, ID_KEYMISC_IMPORT, _("&Import..."));
991        set_menu_text (menu, ID_KEYMISC_PROPS, _("&Properties"));
992        set_menu_text (menu, ID_KEYMISC_GPGOPT, _("Options"));
993        set_menu_text (menu, ID_KEYMISC_GPGPREFS, _("Preferences"));
994        set_menu_text (menu, ID_KEYMISC_SENDRECV, _("Keyserver") );
995        set_menu_text (menu, ID_KEYMISC_EXPORT_PRIVKEY, _("E&xport Secret Key"));
996        set_menu_text (menu, ID_KEYMISC_RECACHE, _("Re&load Key Cache"));
997        set_menu_text (menu, ID_KEYMISC_REBUILD, _("R&everify Signatures"));
998        set_menu_text (menu, ID_KEYMISC_REFRESH_KEYS, _("Refresh &Keys (Keyserver)"));
999        set_menu_text (menu, ID_KEYMISC_INFO, _("Info") );
1000        set_menu_text (menu, ID_KEYMISC_HELP, _("&Help"));
1001    
1002        set_menu_text (menu, ID_KEYMISC_VIEWKEYID, _("Key ID"));
1003        set_menu_text (menu, ID_KEYMISC_VIEWCIPHER, _("Cipher"));
1004        set_menu_text (menu, ID_KEYMISC_VIEWTYPE, _("Type"));
1005        set_menu_text (menu, ID_KEYMISC_VIEWCREAT, _("Creation"));
1006    
1007        if (!start_help (NULL, 1))
1008            set_menu_state (menu, ID_KEYMISC_HELP, MF_GRAYED);
1009    
1010        SetMenu (dlg, menu);
1011    }
1012    
1013    
1014    /* Translate popup menu strings. */
1015    static void
1016    translate_popupmenu_strings (HMENU popup)
1017    {
1018        set_menu_text (popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard"));
1019        set_menu_text (popup, ID_KEYCTX_KEYID_COPY, _("Copy Key ID to Clipboard"));
1020        set_menu_text (popup, ID_KEYCTX_FPR_COPY, _("Copy Fingerprint to Clipboard"));
1021        set_menu_text (popup, ID_KEYCTX_KINFO_COPY, _("Copy Key Info to Clipboard"));
1022        set_menu_text (popup, ID_KEYCTX_COPY, _("Copy Key to Clipboard"));
1023        set_menu_text (popup, ID_KEYCTX_PASTE, _("Paste Key from Clipboard"));
1024        set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Refresh from Keyserver"));
1025        set_menu_text (popup, ID_KEYCTX_MAXTRUST, _("Set Implicit &Trust"));
1026        set_menu_text (popup, ID_KEYCTX_LISTSIGS, _("&List Signatures"));
1027        set_menu_text (popup, ID_KEYCTX_PROPS, _("&Properties"));
1028        set_menu_text (popup, ID_KEYCTX_EDIT, _("Key Edit"));
1029        set_menu_text (popup, ID_KEYCTX_DEL, _("&Delete"));
1030        set_menu_text (popup, ID_KEYCTX_REV, _("&Revoke Cert"));
1031        set_menu_text (popup, ID_KEYCTX_SIGN, _("&Sign"));
1032        set_menu_text (popup, ID_KEYCTX_ENABLE, _("&Enable"));
1033        set_menu_text (popup, ID_KEYCTX_DISABLE, _("&Disable"));
1034        set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Re&fresh from Keyserver"));
1035        set_menu_text (popup, ID_KEYCTX_SETPREFKS, _("Set preferred Keyserver URL"));
1036        set_menu_text (popup, ID_KEYCTX_SENDMAIL, _("Send Key to Mail Recipient"));
1037        set_menu_text (popup, ID_KEYCTX_SETDEFKEY, _("Set as Default Key"));
1038    
1039        set_menu_text (popup, ID_KEYCTX_ADDKEY, _("Key..."));
1040        set_menu_text (popup, ID_KEYCTX_ADDUID, _("User ID..."));
1041        set_menu_text (popup, ID_KEYCTX_ADDPHOTO, _("Photo ID..."));
1042        set_menu_text (popup, ID_KEYCTX_ADDREV, _("Revoker..."));
1043    
1044        /* change popup texts */
1045        set_menu_text_bypos (popup, 0, _("Key Attributes"));
1046        set_menu_text_bypos (popup, 6, _("Add"));
1047        set_menu_text_bypos (popup, 19, _("Send to Keyserver"));
1048    }
1049    
1050    
1051    /* Return true if the cache contain marked keys. */
1052    static bool
1053    updated_keys_avail (void)
1054    {
1055        gpg_keycache_t kc = keycache_get_ctx (1);
1056        struct keycache_s *k;
1057    
1058        for (k = kc->item; k; k = k->next) {
1059            if (k->flags)
1060                return true;
1061        }
1062        return false;
1063    }
1064    
1065    
1066    /* Find the index of the key identified by @key. */
1067    static int
1068    find_keypos (listview_ctrl_t lv, gpgme_key_t key)
1069    {
1070        char keyid[16+1];
1071        int i;
1072    
1073        for (i=0; i < listview_count_items (lv, 0); i++) {
1074            listview_get_item_text (lv, i, KM_COL_KEYID, keyid, sizeof (keyid)-1);
1075            if (!strcmp (key->subkeys->keyid+8, keyid+2))
1076                return i;
1077        }
1078        return -1;
1079    }
1080    
1081    
1082    /* Add all recently updated keys in the cache to the list
1083       and refresh all GUI elements. */
1084    static void
1085    refresh_keylist (struct km_info_s *kmi)
1086    {
1087        struct keycache_s *ctx;
1088        gpg_keycache_t kc;
1089        int status=0, pos;
1090    
1091        kc = keycache_get_ctx (1);
1092        while (!gpg_keycache_next_updated_key (kc, &ctx, &status)) {
1093            if (status == KC_FLAG_ADD)
1094                keylist_add_key (kmi->lv, KEYLIST_LIST, ctx, ctx->key);
1095            else {
1096                pos = find_keypos (kmi->lv, ctx->key);
1097                if (pos != -1)
1098                    keylist_upd_key (kmi->lv, pos, ctx, ctx->key);
1099            }
1100        }
1101        keylist_sort (kmi->lv, kmi->keylist_sortby);
1102        update_status_bar (kmi->statbar, kmi->lv);
1103        keyring_check_last_access ();
1104    }
1105    
1106    
1107    /* Reload the key cache. */
1108    static void
1109    keycache_reload (HWND dlg)
1110    {      
1111        refresh_cache_s rcs;
1112    
1113        memset (&rcs, 0, sizeof rcs);
1114        rcs.kr_reload = rcs.kr_update = 1;
1115        rcs.tr_update = 0;
1116        DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,                                        
1117                        keycache_dlg_proc, (LPARAM)&rcs);
1118    }
1119    
1120    
1121    /* Check if the secret keyring contains at least one
1122       key with ultimate trust.
1123       Return value: 0 on success. */
1124    int
1125    check_ultimate_trusted_key (gpg_keycache_t _sec)
1126    {
1127        struct keycache_s *n;
1128        int nkeys = 0;
1129    
1130        for (n = _sec->item; n; n = n->next) {
1131            if (n->pubpart &&
1132                n->pubpart->key->owner_trust == GPGME_VALIDITY_ULTIMATE)
1133                return 0;
1134            nkeys++;
1135        }
1136    
1137        /* if we do not have any secret keys, it does not make sense
1138           to return an error. */
1139        if (nkeys == 0)
1140            return 0;
1141        return -1;
1142    }
1143    
1144    
1145    static void
1146    reload_keylist (struct km_info_s *kmi)
1147    {
1148        gpg_keycache_t c;
1149    
1150        c = keycache_get_ctx (1);
1151        keycache_reload (kmi->dlg);
1152        keylist_reload (kmi->lv, c, KEYLIST_LIST, kmi->keylist_sortby);
1153        update_status_bar (kmi->statbar, kmi->lv);
1154        keyring_check_last_access ();
1155    }
1156    
1157    
1158    /* Reload the entire key cache and update the listview. */
1159    static void
1160    reload_keycache (struct km_info_s *kmi)
1161    {
1162        refresh_cache_s rcs = {0};
1163        gpg_keycache_t c;
1164    
1165        rcs.kr_reload = rcs.kr_update = 1;
1166        rcs.tr_update = 0;
1167        DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, kmi->dlg,
1168                        keycache_dlg_proc, (LPARAM)&rcs);
1169        c = keycache_get_ctx (1);
1170        keylist_reload (kmi->lv, c, KEYLIST_LIST, kmi->keylist_sortby);
1171        update_status_bar (kmi->statbar, kmi->lv);
1172        SetForegroundWindow (kmi->dlg);
1173    }
1174    
1175    
1176    /* Handle all import request. */
1177    static void
1178    km_gui_import (struct km_info_s *kmi, int cmd_id, void *param)
1179    {
1180        int newkeys=0, newsks=0;
1181        int err = 0;
1182    
1183        switch (cmd_id) {
1184        case ID_KEYMISC_PASTE:
1185            err = km_clip_import (kmi->dlg, &newkeys, &newsks);
1186            break;
1187    
1188        case ID_KEYMISC_IMPORT:
1189            err = km_file_import (kmi->dlg, NULL, &newkeys, &newsks);
1190            break;
1191    
1192        case WM_DROPFILES:
1193            err = km_dropped_file_import (kmi->dlg, (HDROP)param,
1194                                          &newkeys, &newsks);
1195            break;
1196    
1197        default:
1198            err = 1;
1199            break;
1200        }
1201    
1202        if (!err && !newsks && (newkeys > 0 && newkeys < KM_PRELOAD_KEYS))
1203            refresh_keylist (kmi);
1204        else if (!err) /* avoid to spawn too much processes. */
1205            reload_keylist (kmi);
1206    
1207        SetForegroundWindow (kmi->dlg);
1208    }
1209    
1210    
1211    /* Copy the requested key information (@what) to the clipboard.
1212       If multiple items were selected, each key info is copied to
1213       the clipboard. The data is separated by \r\n. */
1214    static void
1215    copy_key_info (int what, struct km_info_s *kmi)
1216    {
1217        gpgme_data_t out;
1218        gpgme_key_t key;
1219        struct keycache_s *kci = NULL;
1220        size_t n=0;
1221        char *p, tmp[256];
1222        int i=0, end = listview_count_items (kmi->lv, 0);
1223        bool single = false;
1224    
1225        /* Do not iterate over the entire list if just one item is selected. */
1226        n = listview_count_items (kmi->lv, 1);
1227        if (n == 1) {
1228            i = kmi->lv_idx;
1229            end = i+1;
1230            single = true;
1231        }
1232    
1233        gpgme_data_new (&out);
1234        for (; i < end; i++) {
1235            if (!listview_get_item_state (kmi->lv, i))
1236                continue;
1237            switch (what) {
1238            case ID_KEYCTX_UID_COPY:
1239                key = km_get_key_ptr (kmi->lv, i, &kci);
1240                gpgme_data_write (out, kci->uids->uid, strlen (kci->uids->uid));
1241                if (!single) gpgme_data_write (out, "\r\n", 2);
1242                break;
1243    
1244            case ID_KEYCTX_KEYID_COPY:
1245                key = km_get_key_ptr (kmi->lv, i, NULL);
1246                gpgme_data_write (out, "0x", 2);
1247                gpgme_data_write (out, key->subkeys->keyid+8, 8);
1248                if (!single) gpgme_data_write (out, "\r\n", 2);
1249                break;
1250    
1251            case ID_KEYCTX_FPR_COPY:
1252                key = km_get_key_ptr (kmi->lv, i, NULL);
1253                gpgme_data_write (out, key->subkeys->fpr, strlen (key->subkeys->fpr));
1254                if (!single) gpgme_data_write (out, "\r\n", 2);
1255                break;
1256    
1257            case ID_KEYCTX_KINFO_COPY:
1258                key = km_get_key_ptr (kmi->lv, i, NULL);
1259                key_get_clip_info (key->subkeys->keyid+8, tmp, sizeof (tmp)-1);
1260                gpgme_data_write (out, tmp, strlen (tmp));
1261                if (!single) gpgme_data_write (out, "\r\n", 2);
1262                break;
1263            }
1264        }
1265        gpgme_data_write (out, "\0", 1);
1266        p = gpgme_data_release_and_get_mem (out, &n);
1267        set_clip_text (NULL, p, n);
1268        gpgme_free (p);
1269    }
1270    
1271    
1272    /* Dialog box procedure for the Key Manager. */
1273  BOOL CALLBACK  BOOL CALLBACK
1274  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
1275  {  {
     struct km_info *kmi;  
     static km_group_s *gc = NULL;  
     static HMENU menu = NULL;  
     static int refresh_keys = 0;      
     INITCOMMONCONTROLSEX icex;  
1276      HWND kl;      HWND kl;
1277      HMENU hm;      HMENU hm;
1278        RECT r;
1279      gpg_keycache_t c;      gpg_keycache_t c;
1280      gpgme_key_t key;      gpgme_key_t key;
1281      /*km_group_cb_s gcb; XXX */      km_info_t kmi = NULL;    
1282      struct genkey_s genkey;      struct genkey_s genkey;
1283      struct winpt_key_s k = {0};      struct winpt_key_s k = {0};
1284      struct URL_ctx_s *url;      struct URL_ctx_s *url;
1285      refresh_cache_s rcs = {0};      char type[32], *name;
1286      char keyid[48], uid[128], type[32], *name;      const char *t, *host;
1287      const char *t, * host;      WORD port = 0;
1288      u16 port = 0;      int l_idx = 0, i=0, rc;
     int idx = 0, i=0, rc;  
     size_t size = 0;  
1289    
1290      if ((msg != WM_INITDIALOG)      if ((msg != WM_INITDIALOG)
1291          && ((kmi = (struct km_info*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))          && ((kmi = (km_info_t)GetWindowLong (dlg, GWL_USERDATA)) == NULL))
1292          return FALSE;          return FALSE;
1293        
1294        /* handle dynamic popup items in the keyserver menu. */
1295        if (msg == WM_COMMAND && LOWORD (wparam) >= WM_APP &&
1296                                 LOWORD (wparam) <= WM_APP+MAX_KEYSERVERS) {
1297            l_idx = LOWORD (wparam)-WM_APP;
1298            if (l_idx < 0)
1299                return TRUE;
1300            host = kserver_get_hostname (l_idx, 0, &port);
1301            if (host != NULL)
1302                km_send_to_keyserver (kmi->lv, dlg, host, port);
1303            return TRUE;
1304        }
1305    
1306      switch (msg) {      switch (msg) {
1307      case WM_INITDIALOG:      case WM_INITDIALOG:
1308          kmi = new struct km_info;          kmi = new struct km_info_s;
1309          memset (kmi, 0, sizeof (struct km_info));          memset (kmi, 0, sizeof (struct km_info_s));
1310          icex.dwSize = sizeof (INITCOMMONCONTROLSEX);          kmi->lv_idx = -1;
         icex.dwICC  = ICC_BAR_CLASSES;  
         InitCommonControlsEx (&icex);  
1311          kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);          kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);
1312          imagelist_load (dlg);          imagelist_load (dlg);
1313            translate_menu_strings (dlg);
1314            SetWindowText (dlg, _("Key Manager"));
1315    
1316  #ifndef LANG_DE          c = keycache_get_ctx (KEYCACHE_PUB);
1317          SetWindowText( dlg, _("Key Manager") );          kl = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
 #endif          
         menu = LoadMenu( glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC );  
 #ifndef LANG_DE  
         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"));  
           
 #endif  
         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 );  
1318          kmi->keylist_sortby = KEY_SORT_USERID;          kmi->keylist_sortby = KEY_SORT_USERID;
1319          Header_SetImageList(ListView_GetHeader(GetDlgItem( dlg, IDC_KEYMISC_KEYLIST )),          Header_SetImageList(ListView_GetHeader (kl), glob_imagelist);
1320                              glob_imagelist);          kmi->lv = keylist_load (GetDlgItem (dlg, IDC_KEYMISC_KEYLIST), c,
1321          kmi->lv = keylist_load( GetDlgItem( dlg, IDC_KEYMISC_KEYLIST ), c,                                  NULL, KEYLIST_LIST, kmi->keylist_sortby);
1322                                  NULL, KEYLIST_LIST, kmi->keylist_sortby );          if (check_ultimate_trusted_key (keycache_get_ctx (0))) {
1323                msg_box (dlg, _("No ultimately trusted key found.\n"
1324                                "Please set at least one secret key to ultimate trust."),
1325                                _("Key Manager"), MB_WARN);
1326            }
1327          /* init subclassing for the listview */          /* init subclassing for the listview */
1328          kl = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );          keylist_proc.opaque = kmi;
1329          keylist_proc.dlg = dlg;          keylist_proc.dlg = dlg;
1330          keylist_proc.current = (WNDPROC)keylist_subclass_proc;          keylist_proc.current = (WNDPROC)keylist_subclass_proc;
1331          keylist_proc.old = (WNDPROC)GetWindowLong( kl, GWL_WNDPROC );          keylist_proc.old = (WNDPROC)GetWindowLong(kl, GWL_WNDPROC);
1332          if( keylist_proc.old ) {          if (keylist_proc.old) {
1333              if( !SetWindowLong( kl, GWL_WNDPROC, (LONG)keylist_proc.current) ) {              if (!SetWindowLong (kl, GWL_WNDPROC, (LONG)keylist_proc.current)) {
1334                  msg_box( dlg, _("Could not set keylist window procedure."), _("Key Manager"), MB_ERR );                  msg_box (dlg, "Could not set keylist window procedure.",
1335                  BUG( NULL );                           _("Key Manager"), MB_ERR);
1336                    BUG (NULL);
1337              }              }
1338          }          }
         #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));  
         SetForegroundWindow (dlg);  
   
1339          kmi->statbar = setup_status_bar (dlg, kmi->lv);          kmi->statbar = setup_status_bar (dlg, kmi->lv);
   
1340          SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);          SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);
1341          kmi->toolbar = load_toolbar (dlg, kmi);          kmi->toolbar = create_toolbar (dlg, kmi);
1342            kmi->dlg = dlg;
1343    
1344          do_center_window (dlg, kmi);          do_center_window (dlg, kmi);
1345          do_resize_window (dlg, kmi);          do_resize_window (dlg, kmi);
1346            restore_window_size (dlg, kmi);
1347          update_ui_items (dlg, kmi->lv);          update_ui_items (dlg, kmi->lv);
1348            restore_column_info (kmi);
1349            keylist_sort (kmi->lv, kmi->keylist_sortby);
1350    
1351            SetDlgItemText (dlg, IDC_KEYMISC_GTEXT, _("Groups"));
1352            SetDlgItemText (dlg, ID_GROUP_SHOW, _("&Show"));
1353            SetDlgItemText (dlg, ID_GROUP_NEW, _("&New..."));
1354            SetClassLong (dlg, GCL_HICON, (LONG)LoadIcon (glob_hinst,
1355                          (LPCTSTR)IDI_WINPT));
1356            SetForegroundWindow (dlg);
1357            kmi->magic = SetTimer (dlg, 1, 1000, NULL);
1358          return TRUE;          return TRUE;
1359    
1360        case WM_TIMER:
1361            KillTimer (dlg, kmi->magic);
1362            SetForegroundWindow (dlg);
1363            break;
1364                    
1365      case WM_DESTROY:      case WM_DESTROY:
1366            save_column_info (kmi);
1367          if (kmi->lv) {          if (kmi->lv) {
1368              keylist_delete (kmi->lv);              keylist_delete (kmi->lv);
1369              kmi->lv = NULL;                    kmi->lv = NULL;      
1370                    }
1371           /*          imagelist_destroy ();
1372           if (gc) {  
1373              km_groups_release (gc);          ltoa (kmi->pos_x, type, 10);
1374              gc = NULL;          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", type);
1375          }*/          ltoa (kmi->pos_y, type, 10);
1376         imagelist_destroy ();          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", type);
1377    
1378         char buf[32];          GetWindowRect (dlg, &r);
1379         ltoa (kmi->pos_x, buf, 10);          sprintf (type, "%d", (int)(r.bottom-r.top));
1380         set_reg_entry( HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", buf );          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Size_Width",
1381         ltoa (kmi->pos_y, buf, 10);                             type);
1382         set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", buf);          sprintf (type, "%d", (int)(r.right-r.left));
1383         /* Remove runtime information. This should be the last action taken here. */          set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Size_Height",
1384         delete kmi; kmi = NULL;                          type);
1385         SetWindowLong (dlg, GWL_USERDATA, NULL);      
1386         keycache_set_reload (refresh_keys);          /* Remove runtime information. This should be the last action taken here. */
1387         return FALSE;          delete kmi;
1388            kmi = NULL;
1389      case WM_MOVE:                SetWindowLong (dlg, GWL_USERDATA, 0);
1390          /* kmi->pos_x = (int)(short)LOWORD(lparam);          return FALSE;
1391             kmi->pos_y = (int)(short)HIWORD(lparam); */  
1392          RECT r;      case WM_MOVE:
1393          GetWindowRect (dlg, &r);          GetWindowRect (dlg, &r);
1394          kmi->pos_x = r.left;          kmi->pos_x = r.left;
1395          kmi->pos_y = r.top;              kmi->pos_y = r.top;    
# Line 798  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1401  keymanager_dlg_proc (HWND dlg, UINT msg,
1401          break;          break;
1402    
1403      case WM_NOTIFY:                  case WM_NOTIFY:            
1404          NMHDR * notify;          NMHDR *notify;
1405          POINT p;          POINT p;
1406          HMENU popup;          HMENU popup;
1407                    
1408          notify = (NMHDR *)lparam;          notify = (NMHDR *)lparam;
1409          if (notify == NULL)          if (!notify)
1410              break;              break;
1411          switch (notify->code)          switch (notify->code) {
         {  
1412          case TBN_QUERYDELETE:          case TBN_QUERYDELETE:
1413              SetWindowLong(dlg, DWL_MSGRESULT, TRUE);              SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
1414              return TRUE;              return TRUE;
1415                    
1416          case TBN_QUERYINSERT:          case TBN_QUERYINSERT:
1417              SetWindowLong(dlg, DWL_MSGRESULT, TRUE);              SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
1418              return TRUE;              return TRUE;
1419    
1420          case TBN_GETBUTTONINFO:          case TBN_GETBUTTONINFO:
1421              LPTBNOTIFY lpTbNotify;              LPTBNOTIFY lpTbNotify;
1422              lpTbNotify = (LPTBNOTIFY)lparam;              lpTbNotify = (LPTBNOTIFY)lparam;
1423              if (lpTbNotify->iItem < (sizeof(myb) / sizeof(mybuttons))) {              if (lpTbNotify->iItem < (sizeof(myb) / sizeof(mybuttons))) {
1424                  lpTbNotify->tbButton.iBitmap = imagelist_getindex(myb[lpTbNotify->iItem].icon);                  lpTbNotify->tbButton.iBitmap = imagelist_getindex (myb[lpTbNotify->iItem].icon);
1425                  lpTbNotify->tbButton.idCommand = myb[lpTbNotify->iItem].command;                  lpTbNotify->tbButton.idCommand = myb[lpTbNotify->iItem].command;
1426                  lpTbNotify->tbButton.fsState = TBSTATE_ENABLED;                  lpTbNotify->tbButton.fsState = TBSTATE_ENABLED;
1427                  lpTbNotify->tbButton.fsStyle = TBSTYLE_BUTTON;                  lpTbNotify->tbButton.fsStyle = TBSTYLE_BUTTON;
# Line 858  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1460  keymanager_dlg_proc (HWND dlg, UINT msg,
1460    
1461              lpttt->hinst = NULL;              lpttt->hinst = NULL;
1462              switch (lpttt->hdr.idFrom) {              switch (lpttt->hdr.idFrom) {
1463                case ID_KEYMISC_KEYWIZARD:
1464                    lpttt->lpszText = (char*)_("Generate new key pair");
1465                    break;
1466    
1467                case ID_KEYMISC_SENDRECV:
1468                    lpttt->lpszText = (char*)_("Search for a specific key");
1469                    break;
1470    
1471              case ID_KEYMISC_DELETE:              case ID_KEYMISC_DELETE:
1472                  lpttt->lpszText = (char *)_("Delete key from keyring");                  lpttt->lpszText = (char *)_("Delete key from keyring");
1473                  break;                  break;
# Line 870  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1480  keymanager_dlg_proc (HWND dlg, UINT msg,
1480                  lpttt->lpszText = (char *)_("Sign key");                  lpttt->lpszText = (char *)_("Sign key");
1481                  break;                  break;
1482    
1483                case ID_KEYCTX_COPY:
1484                    lpttt->lpszText = (char *)_("Copy key to clipboard");
1485                    break;
1486    
1487                case ID_KEYCTX_PASTE:
1488                    lpttt->lpszText = (char*)_("Paste key from clipboard");
1489                    break;
1490    
1491              case ID_KEYMISC_IMPORT:              case ID_KEYMISC_IMPORT:
1492                  lpttt->lpszText = (char *)_("Import key to keyring");                  lpttt->lpszText = (char *)_("Import key to keyring");
1493                  break;                  break;
# Line 881  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1499  keymanager_dlg_proc (HWND dlg, UINT msg,
1499              return TRUE;              return TRUE;
1500                            
1501          case LVN_ITEMCHANGED:          case LVN_ITEMCHANGED:
1502              if (((LPNMLISTVIEW)lparam)->uNewState) /* item selected? */              if (((LPNMLISTVIEW)lparam)->uNewState) { /* item selected? */
1503              {                  kmi->lv_idx = listview_get_curr_pos (kmi->lv);
1504                  update_ui_items (dlg, kmi->lv);                  update_ui_items (dlg, kmi->lv);
1505                  return TRUE;                  return TRUE;
1506              }              }
1507              break;              break;
1508    
1509          case NM_RCLICK:          case NM_RCLICK:
1510                if (!wait_for_progress_cb (0))
1511                    break;
1512              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
1513                  if (listview_get_curr_pos (kmi->lv) == -1)                  l_idx =listview_get_curr_pos (kmi->lv);
1514                      return TRUE; /* Popup only when a item was selected */                  if (l_idx == -1)
1515                  do_check_cache (kmi->lv, dlg, kmi->statbar);                      return TRUE; /* Popup only when a item was selected */              
1516                  GetCursorPos (&p);                  GetCursorPos (&p);
1517                  hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));                  hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));
1518                  popup = GetSubMenu (hm, 0);                  popup = GetSubMenu (hm, 0);
1519              #ifndef LANG_DE                  translate_popupmenu_strings (popup);
1520                  set_menu_text (popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard"));  
1521                  set_menu_text (popup, ID_KEYCTX_KEYID_COPY, _("Copy Key ID to Clipboard"));                  if (km_check_for_seckey (kmi->lv, l_idx, &i))
                 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"));  
             #endif  
                 idx = listview_get_curr_pos (kmi->lv);  
                 if (km_check_for_seckey (kmi->lv, idx, &i))  
1522                      set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);                      set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);
1523                  if (i == 0)                  if (i == 0)
1524                      set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);                      set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);
1525                  if (!km_check_for_seckey (kmi->lv, idx, NULL)) {                  if (!km_check_for_seckey (kmi->lv, l_idx, NULL) ||
1526                      set_menu_state( popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED );                      (km_get_key_status (kmi->lv, l_idx) & KM_FLAG_REVOKED)) {
1527                      set_menu_state( popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED);
1528                      set_menu_state( popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1529                      set_menu_state( popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED);
1530                      set_menu_state( popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1531                        set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );
1532                      set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);
1533                  }                  }
1534                  else if( km_check_for_seckey (kmi->lv, idx, NULL)                  else if (km_check_for_seckey (kmi->lv, l_idx, NULL) &&
1535                        && km_key_is_v3 (kmi->lv, idx)) {                           km_key_is_v3 (kmi->lv, l_idx)) {
1536                      /* 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,
1537                         designated revokers and secondary keys. */                         designated revokers and secondary keys. */
1538                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1539                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1540                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);
1541                  }                  }
1542                  if( km_get_key_status( kmi->lv, idx ) & KM_FLAG_DISABLED )                  if (km_get_key_status( kmi->lv, l_idx ) & KM_FLAG_DISABLED)
1543                      set_menu_state( popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED);
1544                  else                  else
1545                      set_menu_state( popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED );                      set_menu_state (popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED);
1546                  if (km_get_key_status (kmi->lv, idx) & KM_FLAG_REVOKED)                  if (km_get_key_status (kmi->lv, l_idx) & KM_FLAG_REVOKED ||
1547                        km_get_key_status (kmi->lv, l_idx) & KM_FLAG_EXPIRED)
1548                      set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);
1549                  if (mapi_init())                  if (!clip_contains_pgpkey ())
1550                        set_menu_state (popup, ID_KEYCTX_PASTE, MF_DISABLED|MF_GRAYED);
1551                    if (mapi_init ())
1552                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);                      set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);
1553                    if (!secret_key_available ())
1554                        set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);
1555    
1556                  /* Override 'Default Keyserver' with the actual name. */                  /* Override 'Default Keyserver' with the actual name. */
1557                  host = kserver_get_hostname (0, -1, &port);                  host = kserver_get_hostname (0, -1, &port);
1558                    if (!host)
1559                        host = DEF_HKP_KEYSERVER;
1560                  set_menu_text (popup, ID_KEYCTX_KS_DEFAULT, host);                  set_menu_text (popup, ID_KEYCTX_KS_DEFAULT, host);
1561                    {
1562                        HMENU ks = GetSubMenu (popup, 19);
1563                        for (i=0; server[i].name != NULL; i++)                      
1564                            insert_menu_item (ks, i+2, WM_APP+i, server[i].name);
1565                    }
1566                  popup_gpg_readonly (dlg, popup);                  popup_gpg_readonly (dlg, popup);
1567                    if (listview_count_items (kmi->lv, 1) > 1)
1568                        popup_multiple (dlg, popup);
1569                  TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);                  TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);
1570                  DestroyMenu (popup);                  DestroyMenu (popup);
1571                  DestroyMenu (hm);                  DestroyMenu (hm);
1572                  return TRUE;                  return TRUE;
1573              }              }
             #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  
1574              break;              break;
1575    
1576          case LVN_COLUMNCLICK:          case LVN_COLUMNCLICK:
1577              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {              if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
1578                  NMLISTVIEW * p = (LPNMLISTVIEW) lparam;                  NMLISTVIEW *nft = (LPNMLISTVIEW) lparam;
1579                  int sortby = 0;                  int sortby = 0;
1580                  switch (p->iSubItem) {  
1581                    if (!wait_for_progress_cb (0))
1582                        break;
1583                    switch (nft->iSubItem) {
1584                  case 0:  sortby = KEY_SORT_USERID; break;                  case 0:  sortby = KEY_SORT_USERID; break;
1585                  case 1:  sortby = KEY_SORT_KEYID; break;                  case 1:  sortby = KEY_SORT_KEYID; break;
1586                  case 2:  sortby = KEY_SORT_IS_SECRET; break;                  case 2:  sortby = KEY_SORT_IS_SECRET; break;
# Line 993  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1589  keymanager_dlg_proc (HWND dlg, UINT msg,
1589                  case 6:  sortby = KEY_SORT_OTRUST; break;                  case 6:  sortby = KEY_SORT_OTRUST; break;
1590                  case 7:  sortby = KEY_SORT_CREATED; break;                  case 7:  sortby = KEY_SORT_CREATED; break;
1591                  case 8:  sortby = KEY_SORT_ALGO; break;                  case 8:  sortby = KEY_SORT_ALGO; break;
1592                  default: return TRUE; //sortby = KEY_SORT_USERID; break;                  default: return TRUE; /*sortby userid.*/
1593                  }                  }
1594    
1595                  if ((kmi->keylist_sortby & ~KEYLIST_SORT_DESC) == sortby)                  if ((kmi->keylist_sortby & ~KEYLIST_SORT_DESC) == sortby)
# Line 1006  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1602  keymanager_dlg_proc (HWND dlg, UINT msg,
1602              break;              break;
1603          }          }
1604          break;          break;
         }  
1605    
1606      case WM_WINDOWPOSCHANGING:      case WM_WINDOWPOSCHANGING:
1607          if (((WINDOWPOS*)lparam)->cx < 400)          if (((WINDOWPOS*)lparam)->cx < 400)
# Line 1020  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1615  keymanager_dlg_proc (HWND dlg, UINT msg,
1615          return TRUE;          return TRUE;
1616                    
1617      case WM_SYSCOMMAND:      case WM_SYSCOMMAND:
1618          if( LOWORD (wparam) == SC_CLOSE )          if (LOWORD (wparam) == SC_CLOSE)
1619              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
1620          return FALSE;          return FALSE;
1621                    
1622      case WM_MENUSELECT:      case WM_MENUSELECT:
1623          menu_gpg_readonly (dlg, (HMENU)lparam, LOWORD (wparam));          change_edit_menu (kmi->lv, (HMENU)lparam, LOWORD (wparam));
1624            change_key_menu ((HMENU)lparam, LOWORD (wparam));
1625          break;          break;
1626    
1627      case WM_INITMENUPOPUP:      case WM_INITMENUPOPUP:
1628          if ((UINT)LOWORD (lparam) == 3) {          if ((UINT)LOWORD (lparam) == 3) {
1629              HMENU hm = (HMENU)wparam;              HMENU h = (HMENU)wparam;
1630              set_menu_text_bypos (hm, 0, _("New"));              set_menu_text_bypos (h, 0, _("New"));
1631          }          }
1632            /* XXX: before we can use it, we need to find a way to
1633                    update the gpg access timestamp after each operation.
1634            if (keyring_check_last_access ())
1635                reload_keylist (kmi);
1636            */
1637          return FALSE;          return FALSE;
1638    
1639      case WM_COMMAND:      case WM_COMMAND:
1640          if( gnupg_access_keyring( 1 ) ) {          /* Allow at least 'Exit' in such a case. */
1641              msg_box( dlg, _("Could not access public keyring"), _("Key Manager"), MB_ERR );          if (gnupg_access_keyring (1) && LOWORD (wparam) != ID_KEYMISC_QUIT) {
1642                msg_box (dlg, _("Could not access public keyring"),
1643                         _("Key Manager"), MB_ERR);
1644              return FALSE;              return FALSE;
1645          }          }
1646          do_check_cache( kmi->lv, dlg, kmi->statbar );  
1647          switch( LOWORD( wparam ) ) {          /*wait_for_progress_cb ();*/
1648            switch (LOWORD (wparam)) {
1649          case ID_KEYMISC_QUIT:          case ID_KEYMISC_QUIT:
1650              EndDialog( dlg, TRUE );              EndDialog (dlg, TRUE);
1651              return TRUE;              return TRUE;
               
         case ID_KEYMISC_MAIL:  
             /* XXX  
             DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_MAIL, GetDesktopWindow (),  
                             winpt_mail_proc, NULL);*/  
             break;  
1652                    
1653          case ID_KEYMISC_FIND:          case ID_KEYMISC_FIND:
1654              km_find_key (dlg, kmi->lv);              km_find_key (dlg, kmi->lv);
1655              break;              break;
1656    
1657          case ID_KEYMISC_DELETE:          case ID_KEYMISC_DELETE:
1658              km_delete_keys (kmi->lv, dlg);          case ID_KEYMISC_DELETE2:
1659                if (!km_delete_keys (kmi->lv, dlg))
1660                    update_status_bar (kmi->statbar, kmi->lv);
1661              return TRUE;              return TRUE;
1662                            
1663          case ID_KEYMISC_SIGN:                  case ID_KEYMISC_SIGN:
1664              if ( (idx = listview_get_curr_pos( kmi->lv )) == -1 ) {              if (kmi->lv_idx == -1) {
1665                  msg_box( dlg, _("Please select a key."),  _("Key Manager"),                  msg_box (dlg, _("Please select a key."),  
1666                           MB_ERR );                           _("Key Manager"), MB_ERR);
1667                  return TRUE;;                  return TRUE;
1668              }              }
1669              if (km_check_key_status (kmi->lv, idx))              if (km_check_key_status (kmi->lv, kmi->lv_idx))
1670                  return TRUE;                  return TRUE;
1671              key = (gpgme_key_t)listview_get_item2 (kmi->lv, idx);              km_get_key (kmi->lv, kmi->lv_idx, &k);
             listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
             memset (&k, 0, sizeof (k));  
             k.ctx = key;  
             k.keyid = keyid;  
1672              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIGN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIGN, dlg,
1673                                keysign_dlg_proc, (LPARAM)&k,                                keysign_dlg_proc, (LPARAM)&k,
1674                                _("Key Signing"), IDS_WINPT_KEYSIGN);                                _("Key Signing"), IDS_WINPT_KEYSIGN);
1675              if (k.update)              if (k.update)
1676                  update_key (kmi->lv, idx, k.keyid, 0);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 0);
1677              return TRUE;              return TRUE;
1678                            
1679          case ID_KEYMISC_REVCERT:          case ID_KEYMISC_REVCERT:
1680              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1681              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 );  
1682                  return TRUE;                  return TRUE;
1683              }              }
1684              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );                  
             listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid-1 );  
             if ( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {  
                 msg_box( dlg, _("There is no secret key available!"), _("Key Manager"), MB_ERR );  
                 return TRUE;  
             }  
               
1685              {              {
1686                  char t[128];                  char state[64];
1687                  listview_get_item_text( kmi->lv, idx, 5, t, sizeof t -1 );                  listview_get_item_text (kmi->lv, kmi->lv_idx, 5,
1688                  if( strchr( t, 'R' ) ) {                                          state, sizeof (state) -1);
1689                      msg_box( dlg, _("Key already revoked!"), _("Key Manager"), MB_INFO );                  if (strchr (state, 'R' )) {
1690                        msg_box (dlg, _("Key already revoked!"),
1691                                 _("Key Manager"), MB_INFO);
1692                      return TRUE;                      return TRUE;
1693                  }                  }
1694              }              }
1695                
1696              memset (&k, 0, sizeof (k));              km_get_key (kmi->lv, kmi->lv_idx, &k);
1697              k.key_pair = 1;              if (!k.key_pair) {
1698              k.keyid = keyid;                  msg_box (dlg, _("There is no secret key available!"),
1699              k.is_protected = km_check_if_protected (kmi->lv, idx);                          _("Key Manager"), MB_ERR);
1700                    return TRUE;
1701                }
1702              dialog_box_param(glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,              dialog_box_param(glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,
1703                               key_revoke_dlg_proc, (LPARAM)&k,                               key_revoke_dlg_proc, (LPARAM)&k,
1704                               _("Key Revocation"), IDS_WINPT_KEYREVOKE);                               _("Key Revocation Cert"), IDS_WINPT_KEYREVOKE);
1705              return TRUE;              return TRUE;
1706                            
1707          case ID_KEYMISC_TRUSTPATH:          case ID_KEYMISC_TRUSTPATH:
1708              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1709              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 );  
1710                  return TRUE;                  return TRUE;
1711              }              }
1712              listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );              km_get_key (kmi->lv, kmi->lv_idx, &k);
1713              listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid -1 );              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYTRUST, dlg,
             if( km_check_for_seckey( kmi->lv, idx, NULL ) ) {  
                 msg_box( dlg, _("It does not make any sense with a key pair!"), _("Key Manager"), MB_OK );  
                 return FALSE;  
             }  
             memset (&k, 0, sizeof (k));  
             k.keyid = keyid;  
             k.uid = uid;  
             dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYTRUST, dlg,  
1714                                keytrust_dlg_proc, (LPARAM)&k,                                keytrust_dlg_proc, (LPARAM)&k,
1715                                _("List Trust Path"), IDS_WINPT_KEYTRUST );                                _("List Trust Path"), IDS_WINPT_KEYTRUST);
1716              return TRUE;              return TRUE;
1717                            
1718          case ID_KEYMISC_CHECKSIGS:          case ID_KEYMISC_CHECKSIGS:          
1719              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1) {
1720              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1721                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  return TRUE;
                 return FALSE;  
1722              }              }
1723              listview_get_item_text (kmi->lv, idx, 0, uid, DIM (uid)-1);              km_get_key (kmi->lv, kmi->lv_idx, &k);
1724              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG_TREE, dlg,
1725              memset (&k, 0, sizeof (k));                                sigtree_dlg_proc, (LPARAM)&k,
1726              k.keyid = keyid;                                _("Key Signature List"), IDS_WINPT_KEYSIG);
1727              k.uid = uid;              if (k.update)
1728              k.ctx = (gpgme_key_t)listview_get_item2 (kmi->lv, idx);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 0);
1729              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,              if (updated_keys_avail ())
1730                                keysig_dlg_proc, (LPARAM)&k,                  refresh_keylist (kmi);
                               _("Key Signature List" ), IDS_WINPT_KEYSIG);  
1731              return TRUE;              return TRUE;
1732                            
1733          case ID_KEYMISC_PROPS:          case ID_KEYMISC_PROPS:      
1734              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1735              if( idx == -1 ) {                  msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1736                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                  return TRUE;
                 return FALSE;  
1737              }              }
1738              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);              km_get_key (kmi->lv, kmi->lv_idx, &k);
             listview_get_item_text (kmi->lv, idx, 2, type, DIM (type)-1);  
             memset (&k, 0, sizeof (k));  
             k.key_pair = 0;  
             k.keyid = keyid;  
             if( !strcmp( type, "pub/sec" ) || !strcmp( type, "pub/crd" ) )  
                 k.key_pair = 1;  
1739              k.callback.ctl = kmi->lv;              k.callback.ctl = kmi->lv;
1740              k.callback.idx = idx;              k.callback.idx = kmi->lv_idx;
1741              k.is_v3 = km_key_is_v3 (kmi->lv, idx);              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,
             dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,  
1742                                keyprops_dlg_proc, (LPARAM)&k,                                keyprops_dlg_proc, (LPARAM)&k,
1743                                _("Key Properties"), IDS_WINPT_KEYPROPS );                                _("Key Properties"), IDS_WINPT_KEYPROPS);
1744              if (k.callback.new_val != 0) {              if (k.update)
1745                  t = get_key_trust_str (k.callback.new_val);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, k.key_pair);
                 listview_add_sub_item (kmi->lv, idx, 6, t);  
             }  
1746              return TRUE;              return TRUE;
1747                            
1748          case ID_KEYMISC_RECACHE:          case ID_KEYMISC_RECACHE:
1749              /* If there is already a reload request, don't bother the user with a message. */              if (updated_keys_avail ())
1750              if( keycache_get_reload() == 1 )                  l_idx = IDYES;
                 idx = IDYES;  
1751              else {              else {
1752                  char t[256];                  l_idx = log_box (_("Key Manager"), MB_YESNO,
                 _snprintf( t, sizeof t -1,  
1753                             _("This is only useful when the keyring has been "                             _("This is only useful when the keyring has been "
1754                               "modified (sign a key...).\n"                               "modified (sign a key...).\n"
1755                               "Do you really want to reload the keycache?") );                               "Do you really want to reload the keycache?"));
                 idx = msg_box( dlg, t, _("Key Manager"), MB_YESNO );  
             }  
             if( idx == IDYES ) {  
                 rcs.kr_reload = rcs.kr_update = 1;  
                 rcs.tr_update = 0;  
                 DialogBoxParam( glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,  
                                 keycache_dlg_proc, (LPARAM)&rcs );  
                 c = keycache_get_ctx( 1 );  
                 if( !c )  
                     BUG( dlg );  
                 keylist_reload( kmi->lv, c, KEYLIST_LIST, KEY_SORT_USERID );  
                 refresh_keys = 0;  
1756              }              }
1757                if (l_idx == IDYES)
1758                    reload_keycache (kmi);
1759              return TRUE;              return TRUE;
1760                            
1761          case ID_KEYMISC_REBUILD:          case ID_KEYMISC_REBUILD:
1762              name=NULL;              name = NULL;
1763              gpg_rebuild_cache (&name);              gpg_rebuild_cache (&name);
1764              if (name) {              if (name != NULL) {
1765                  char *p = strchr (name, '\n');                  char *line = strchr (name, '\n');
1766                  show_msg (dlg, 2000, p? name + (p-name)+1 : name);                  show_msg (dlg, 2000, line? name + (line-name)+1 : name);
1767                  free (name);                  safe_free (name);
1768              }              }
1769                SetForegroundWindow (dlg);
1770              return TRUE;              return TRUE;
1771                            
1772          case ID_KEYMISC_NEWKEY:          case ID_KEYMISC_NEWKEY:
1773              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1774              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,
1775                                keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),                                keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),
1776                                IDS_WINPT_KEYGEN);                                IDS_WINPT_KEYGEN);
1777              if (genkey.newkey != NULL)              if (genkey.cancel == 0)
1778                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  refresh_keylist (kmi);
1779              return TRUE;              return TRUE;
1780    
1781          case ID_KEYMISC_CARDNEW:          case ID_KEYMISC_CARDNEW:
1782              if( !scard_support ) {              if (!scard_support) {
1783                  msg_box( dlg, _("Smart Card support is not available."), _("Key Manager"), MB_INFO );                  msg_box (dlg, _("Smart Card support is not available."),
1784                             _("Key Manager"), MB_INFO);
1785                  return TRUE;                  return TRUE;
1786              }              }
1787              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,
1788                                card_keygen_dlg_proc, NULL, _("Card Key Generation"),                                card_keygen_dlg_proc, 0, _("Card Key Generation"),
1789                                IDS_WINPT_CARD_KEYGEN );                                IDS_WINPT_CARD_KEYGEN);
1790              /* XXX: use new code */              if (updated_keys_avail ())
1791              if( keycache_get_reload() )                  send_cmd_id (dlg, ID_KEYMISC_RECACHE);
                 send_cmd_id( dlg, ID_KEYMISC_RECACHE );  
1792              return TRUE;              return TRUE;
1793    
1794          case ID_KEYMISC_KEYWIZARD:          case ID_KEYMISC_KEYWIZARD:
1795              memset (&genkey, 0, sizeof (genkey));              memset (&genkey, 0, sizeof (genkey));
1796              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,
1797                                keygen_wizard_dlg_proc, (LPARAM)&genkey, _("Key Generation Wizard"),                                keygen_wizard_dlg_proc, (LPARAM)&genkey,
1798                                  _("Key Generation Wizard"),
1799                                IDS_WINPT_KEYWIZARD);                                IDS_WINPT_KEYWIZARD);
1800              if (genkey.newkey != NULL)              if (genkey.cancel == 0)
1801                  keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);                  refresh_keylist (kmi);
1802              return TRUE;              return TRUE;
1803                            
1804          case ID_KEYMISC_SENDRECV:          case ID_KEYMISC_SENDRECV:
1805              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,
1806                                keyserver_dlg_proc, NULL, _("Keyserver Access"),                                keyserver_dlg_proc, 0, _("Keyserver Access"),
1807                                IDS_WINPT_KEYSERVER );                                IDS_WINPT_KEYSERVER);
1808                refresh_keylist (kmi);
1809              return TRUE;              return TRUE;
1810                            
1811          case ID_KEYMISC_GPGPREFS:          case ID_KEYMISC_GPGPREFS:
1812              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGPREFS, dlg,              rc = dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GPGPREFS,
1813                                gpgprefs_dlg_proc, NULL, _("GnuPG Preferences"),                                     dlg, gpgprefs_dlg_proc, 0,
1814                                IDS_WINPT_GPGPREFS );                                     _("GnuPG Preferences"), IDS_WINPT_GPGPREFS);
1815                if (rc == TRUE) {
1816                    reload_keycache (kmi);
1817                    update_default_key_str (kmi->statbar);
1818                }
1819              return TRUE;              return TRUE;
1820                            
1821          case ID_KEYMISC_GPGOPT:          case ID_KEYMISC_GPGOPT:
1822              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGOPT, dlg,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GPGOPT, dlg,
1823                                gpgopt_dlg_proc, NULL, _("GnuPG Options" ),                                gpgopt_dlg_proc, 0, _("GnuPG Options"),
1824                                IDS_WINPT_GPGOPT );                                IDS_WINPT_GPGOPT);
1825              return TRUE;              return TRUE;
1826                            
1827          case ID_KEYMISC_IMPORT:          case ID_KEYMISC_IMPORT:
1828              t = get_filename_dlg (dlg, FILE_OPEN, _("Choose Name of the Key File"), NULL, NULL);              km_gui_import (kmi, LOWORD (wparam), NULL);
             if (t)  
                 km_file_import (dlg, t);  
1829              return TRUE;              return TRUE;
1830    
1831          case ID_KEYMISC_IMPORT_HTTP:          case ID_KEYMISC_IMPORT_HTTP:
1832              url = (struct URL_ctx_s*)get_http_file_dlg (dlg);              url = (struct URL_ctx_s*)get_http_file_dlg (dlg);
1833              if (url->cancel == 0)              if (url && url->cancel == 0) {
1834                  km_http_import (dlg, url->url);                  km_http_import (dlg, url->url);
1835              delete url; url=NULL;                  refresh_keylist (kmi);
1836                }
1837                free_if_alloc (url);
1838              break;              break;
1839                            
1840          case ID_KEYMISC_EXPORT:          case ID_KEYMISC_EXPORT:
1841              idx = listview_get_curr_pos (kmi->lv);              if (kmi->lv_idx == -1) {
1842              if (idx == -1) {                  msg_box (dlg, _("Please select a key."),
1843                  msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );                           _("Key Manager"), MB_ERR);
1844                  return TRUE;                  return TRUE;
1845              }              }
1846              if (listview_count_items (kmi->lv, 1) > 1)              if (listview_count_items (kmi->lv, 1) > 1)
1847                  name = m_strdup ("Exported_GPG_Keys.asc");                  name = m_strdup ("Exported_GPG_Keys.asc");
1848              else {              else {
1849                  listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);                  key = km_get_key_ptr (kmi->lv, kmi->lv_idx, NULL);
1850                  name = gen_export_filename (keyid, 0);                  name = km_gen_export_filename (key->subkeys->keyid+8, 0);
1851              }              }
1852              t = get_filename_dlg (dlg, FILE_SAVE, _("Choose Name for Key File"), NULL, name);              t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1853              free_if_alloc (name);              free_if_alloc (name);
1854              if (t == NULL)              if (t == NULL)
1855                  return TRUE;                  return TRUE;
# Line 1290  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1857  keymanager_dlg_proc (HWND dlg, UINT msg,
1857              return TRUE;              return TRUE;
1858                            
1859          case ID_KEYMISC_EXPORT_PRIVKEY:          case ID_KEYMISC_EXPORT_PRIVKEY:
1860              idx = listview_get_curr_pos( kmi->lv );              if (kmi->lv_idx == -1) {
1861              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 );  
1862                  return TRUE;                  return TRUE;
1863              }              }
1864              if( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {              if( !km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL ) ) {
1865                  msg_box( dlg, _("There is no corresponding secret key for this key."),                  msg_box (dlg, _("There is no corresponding secret key for this key."),
1866                          _("Key Manager"), MB_ERR );                           _("Key Manager"), MB_ERR);
1867                  return TRUE;                  return TRUE;
1868              }              }
1869              if( listview_count_items( kmi->lv, 1 ) > 1 ) {              if (listview_count_items (kmi->lv, 1) > 1) {
1870                  msg_box( dlg, _("You can only export one secret key."), _("Key Manager"), MB_ERR );                  msg_box (dlg, _("You can only export one secret key."),
1871                             _("Key Manager"), MB_ERR);
1872                  return TRUE;                  return TRUE;
1873              }              }
1874              idx = msg_box( dlg,              i = msg_box (dlg,
1875                            _("This operation will export your *SECRET* key!\n\n"                            _("This operation will export your *SECRET* key!\n\n"
1876                              "Never send this key to ANYONE, it should be available\n"                              "Never send this key to ANYONE, it should be available\n"
1877                              "ONLY on your machine and you may use this function\n"                              "ONLY on your machine and you may use this function\n"
1878                              "to copy the key to a safe place.\n\n"                              "to copy the key to a safe place.\n\n"
1879                              "Do you really want to export the key?"),                              "Do you really want to export the key?"),
1880                            _("WARNING"), MB_INFO|MB_YESNO );                            _("WARNING"), MB_INFO|MB_YESNO);
1881              if( idx == IDYES ) {              if (i == IDYES) {
1882                  idx = listview_get_curr_pos( kmi->lv );                  key = km_get_key_ptr (kmi->lv, kmi->lv_idx, NULL);
1883                  listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof (keyid)-8 );                  name = km_gen_export_filename (key->subkeys->keyid+8, 1);
1884                  name = gen_export_filename (keyid, 1);                  t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
                 t = get_filename_dlg (dlg, FILE_SAVE, _("Choose Name for Key File"), NULL, name);  
1885                  if (t != NULL)                            if (t != NULL)          
1886                      km_privkey_export (dlg, kmi->lv, t);                      km_privkey_export (dlg, kmi->lv, t);
1887              }              }
1888              break;              return TRUE;
1889    
1890          case ID_KEYMISC_INFO:          case ID_KEYMISC_INFO:
1891              dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, dlg,
1892                                about_winpt_dlg_proc, NULL, _("About WinPT"),                                about_winpt_dlg_proc, 0, _("About WinPT"),
1893                                IDS_WINPT_ABOUT );                                IDS_WINPT_ABOUT);
1894                break;
1895    
1896            case ID_KEYMISC_WEBSITE:
1897                ShellExecute (dlg, "open", "http://www.winpt.org",
1898                              NULL, NULL, SW_SHOW);
1899              break;              break;
1900    
1901          case ID_KEYMISC_HELP:          case ID_KEYMISC_HELP:
1902              ShellExecute (dlg, "open", "winpt.chm", NULL, NULL, SW_SHOW);              start_help (dlg, 0);
1903              break;              break;
1904    
1905          case ID_KEYMISC_OT:          case ID_KEYMISC_OT:
1906              dialog_box_param( glob_hinst, (LPCTSTR)IDD_WINPT_OWNERTRUST, glob_hwnd,              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_OWNERTRUST,
1907                                ownertrust_dlg_proc, NULL,                                dlg, ownertrust_dlg_proc, 0,
1908                                _("Ownertrust"), IDS_WINPT_OWNERTRUST );                                _("Ownertrust"), IDS_WINPT_OWNERTRUST);
1909              break;              break;
1910    
1911          case ID_KEYMISC_EDITKEY:          case ID_KEYMISC_EDITKEY:
1912              idx = listview_get_curr_pos (kmi->lv);              if (km_get_key (kmi->lv, kmi->lv_idx, &k))
             if (idx == -1)  
1913                  break;                  break;
             listview_get_item_text (kmi->lv, idx, 1, keyid, sizeof (keyid)-1);  
             /* XXX: pub/crd = secret key does not work */  
             memset (&k, 0, sizeof (k));  
             k.is_protected = km_check_if_protected (kmi->lv, idx);  
             k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);  
             k.keyid = keyid;  
             k.is_v3 = km_key_is_v3 (kmi->lv, idx);  
             k.flags = km_get_key_status (kmi->lv, idx);  
1914              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,
1915                                keyedit_main_dlg_proc, (LPARAM)&k,                                keyedit_main_dlg_proc, (LPARAM)&k,
1916                                _("Key Edit"), IDS_KEYCTX_EDIT);                                _("Key Edit"), IDS_KEYCTX_EDIT);
1917              if (k.update)              if (k.update)
1918                  update_key (kmi->lv,  idx, keyid, 1);                  update_key (kmi->lv,  kmi->lv_idx, k.tmp_keyid, 1);
1919              break;              break;
1920                            
1921          case ID_KEYMISC_COPY:          case ID_KEYMISC_COPY:
             km_index = listview_get_curr_pos (kmi->lv);  
1922              km_clip_export (dlg, kmi->lv);              km_clip_export (dlg, kmi->lv);
1923              break;              break;
1924                            
# Line 1366  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1927  keymanager_dlg_proc (HWND dlg, UINT msg,
1927              break;              break;
1928    
1929          case ID_KEYMISC_PASTE:          case ID_KEYMISC_PASTE:
1930              km_index = -1;              km_gui_import (kmi, LOWORD (wparam), NULL);
             km_clip_import (dlg);  
1931              break;              break;
1932                            
1933          case ID_KEYCTX_SETPREFKS:          case ID_KEYCTX_SETPREFKS:
1934              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM(keyid)-1);              if (km_get_key (kmi->lv, kmi->lv_idx, &k))
1935              memset (&k, 0, sizeof (k));                  break;
             k.keyid = keyid;  
1936              keyedit_set_pref_keyserver (&k, dlg);              keyedit_set_pref_keyserver (&k, dlg);
1937              break;              break;
1938    
1939          case ID_KEYMISC_REFRESH_KEYS:          case ID_KEYMISC_REFRESH_KEYS:
1940              if (listview_count_items (kmi->lv, 1) == 0) {              if (listview_count_items (kmi->lv, 1) == 0) {
1941                  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."),
1942                             _("Key Manager"), MB_INFO);
1943                  listview_select_all (kmi->lv);                  listview_select_all (kmi->lv);
1944              }              }
1945              km_refresh_from_keyserver (kmi->lv, dlg);              if (!km_refresh_from_keyserver (kmi->lv, dlg))
1946                    msg_box (dlg, _("Keyserver refresh finished."),
1947                             _("Key Manager"), MB_OK);
1948              break;              break;
1949                                                    
1950          /** Context menu **/          /** Context menu **/
# Line 1420  keymanager_dlg_proc (HWND dlg, UINT msg, Line 1982  keymanager_dlg_proc (HWND dlg, UINT msg,
1982              break;              break;
1983    
1984          case ID_KEYCTX_ADDKEY:          case ID_KEYCTX_ADDKEY:
1985              idx = listview_get_curr_pos (kmi->lv);              km_get_key (kmi->lv, kmi->lv_idx, &k);
             listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
             memset (&k, 0, sizeof (k));  
             k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);  
             k.is_protected = km_check_if_protected (kmi->lv, idx);  
             k.keyid = keyid;  
1986              keyedit_add_subkey (&k, dlg, NULL);              keyedit_add_subkey (&k, dlg, NULL);
1987              if (k.update)              if (k.update)
1988                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 1);
1989              break;              break;
1990    
1991          case ID_KEYCTX_ADDUID:          case ID_KEYCTX_ADDUID:
1992              idx = listview_get_curr_pos (kmi->lv);              km_get_key (kmi->lv, kmi->lv_idx, &k);
             listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
             memset (&k, 0, sizeof (k));  
             k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);  
             k.is_protected = km_check_if_protected (kmi->lv, idx);  
             k.keyid = keyid;  
1993              keyedit_add_userid (&k, dlg, NULL);              keyedit_add_userid (&k, dlg, NULL);
1994              if (k.update)              if (k.update)
1995                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 1);
1996              break;              break;
1997    
1998          case ID_KEYCTX_ADDREV:          case ID_KEYCTX_ADDREV:
1999              idx = listview_get_curr_pos (kmi->lv);              km_get_key (kmi->lv, kmi->lv_idx, &k);
             listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
             memset (&k, 0, sizeof (k));  
             k.keyid = keyid;  
             k.is_protected = km_check_if_protected (kmi->lv, idx);  
             k.key_pair = km_check_for_seckey( kmi->lv, idx, NULL );  
2000              keyedit_add_revoker (&k, dlg);              keyedit_add_revoker (&k, dlg);
2001              if (k.update)              if (k.update)
2002                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 1);
2003              break;              break;
2004    
2005          case ID_KEYCTX_ADDPHOTO:          case ID_KEYCTX_ADDPHOTO:
2006              idx = listview_get_curr_pos (kmi->lv);              km_get_key (kmi->lv, kmi->lv_idx, &k);
             listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);  
             memset (&k, 0, sizeof (k));  
             k.keyid = keyid;  
             k.is_protected = km_check_if_protected (kmi->lv, idx);  
             k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);  
2007              keyedit_add_photo (&k, dlg);              keyedit_add_photo (&k, dlg);
2008              if (k.update)              if (k.update)
2009                  update_key (kmi->lv, idx, keyid, 1);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 1);
2010              break;              break;
2011    
2012          case ID_KEYCTX_KS_NL:          case ID_KEYCTX_RECVFROM:
         case ID_KEYCTX_KS_PL:  
         case ID_KEYCTX_KS_AT:  
         case ID_KEYCTX_KS_DE:  
         case ID_KEYCTX_KS_DK:  
         case ID_KEYCTX_KS_CZ:  
         case ID_KEYCTX_KS_ES:  
         case ID_KEYCTX_KS_UK:  
             host = kserver_get_hostname (LOWORD (wparam) - 40107, 0, &port);  
             km_send_to_keyserver (kmi->lv, dlg, host, port);  
             break;  
   
         case ID_KEYCTX_RECVFROM:  
2013              km_refresh_from_keyserver (kmi->lv, dlg);              km_refresh_from_keyserver (kmi->lv, dlg);
2014                if (updated_keys_avail ())
2015                    refresh_keylist (kmi);
2016              break;              break;
2017    
2018          case ID_KEYCTX_UID_COPY:          case ID_KEYCTX_UID_COPY:
             /* XXX: add generic function to support multiple selection  
                     with a callback */  
             idx = listview_get_curr_pos( kmi->lv );  
             listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid-1 );  
             set_clip_text( NULL, uid, strlen( uid ) );  
             break;  
   
2019          case ID_KEYCTX_KEYID_COPY:          case ID_KEYCTX_KEYID_COPY:
             idx = listview_get_curr_pos( kmi->lv );  
             listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );  
             set_clip_text( NULL, uid, strlen( uid ) );  
             break;  
   
2020          case ID_KEYCTX_FPR_COPY:          case ID_KEYCTX_FPR_COPY:
             idx = listview_get_curr_pos( kmi->lv );  
             key = (gpgme_key_t) listview_get_item2 (kmi->lv, idx);          
             if (key) {  
                 const char * s = get_key_fpr (key);  
                 set_clip_text (NULL, s? s : "", s? strlen (s): 0);  
             }  
             break;  
   
2021          case ID_KEYCTX_KINFO_COPY:          case ID_KEYCTX_KINFO_COPY:
2022              idx = listview_get_curr_pos( kmi->lv );              copy_key_info (LOWORD (wparam), kmi);
             listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );  
             km_set_clip_info( uid );          
2023              break;              break;
2024    
2025          case ID_KEYCTX_COPY:          case ID_KEYCTX_COPY:
2026              km_index = listview_get_curr_pos (kmi->lv);              send_cmd_id (dlg, ID_KEYMISC_COPY);
             km_clip_export (dlg, kmi->lv);  
2027              break;              break;
2028    
2029          case ID_KEYCTX_PASTE:            case ID_KEYCTX_PASTE:
2030              km_index = -1;              send_cmd_id (dlg, ID_KEYMISC_PASTE);
             km_clip_import (dlg);  
2031              break;              break;
2032    
2033          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;  
   
2034          case ID_KEYCTX_ENABLE:          case ID_KEYCTX_ENABLE:
2035              idx = listview_get_curr_pos (kmi->lv);              i = LOWORD (wparam) == ID_KEYCTX_ENABLE? 1 : 0;
2036              km_enable_disable_key (kmi->lv, dlg, idx, 1);              if (km_get_key (kmi->lv, kmi->lv_idx, &k))
2037                    break;
2038                rc = km_enable_disable_key (kmi->lv, dlg, kmi->lv_idx, i);
2039                if (!rc)
2040                    update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 0);
2041              break;              break;
2042    
2043          case ID_KEYCTX_LISTSIGS:          case ID_KEYCTX_LISTSIGS:
# Line 1537  keymanager_dlg_proc (HWND dlg, UINT msg, Line 2045  keymanager_dlg_proc (HWND dlg, UINT msg,
2045              break;              break;
2046    
2047          case ID_KEYCTX_MAXTRUST:          case ID_KEYCTX_MAXTRUST:
2048              idx = listview_get_curr_pos (kmi->lv);              if (km_get_key (kmi->lv, kmi->lv_idx, &k))
2049              listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);                  break;
2050              rc = km_set_implicit_trust (dlg, kmi->lv, idx);              rc = km_set_implicit_trust (dlg, kmi->lv, kmi->lv_idx);
2051              if (!rc)              if (!rc)
2052                  update_key (kmi->lv, idx, keyid, 0);                  update_key (kmi->lv, kmi->lv_idx, k.tmp_keyid, 0);
2053              break;              break;
2054    
2055          case ID_KEYCTX_SETDEFKEY:          case ID_KEYCTX_SETDEFKEY:
2056              idx = listview_get_curr_pos (kmi->lv);              if (!km_check_key_status (kmi->lv, kmi->lv_idx)) {
2057              if (!km_check_key_status (kmi->lv, idx)) {                  key = km_get_key_ptr (kmi->lv, kmi->lv_idx, NULL);
2058                  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);  
2059                  if (rc)                  if (rc)
2060                      msg_box( dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);                      msg_box (dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);
2061                  km_update_default_key_str (kmi->statbar);                  update_default_key_str (kmi->statbar);
2062              }              }
2063              break;              break;
2064    
2065          #if 0 /* XXX */          case ID_KEYMISC_VIEWKEYID:
2066            case ID_KEYMISC_VIEWCIPHER:
2067            case ID_KEYMISC_VIEWTYPE:
2068            case ID_KEYMISC_VIEWCREAT:
2069            case ID_KEYMISC_VIEWDESC:
2070                hm = GetMenu (dlg);
2071                i = get_menu_state (hm, LOWORD (wparam));
2072                set_menu_state (hm, LOWORD (wparam),
2073                                i & MFS_CHECKED? MFS_UNCHECKED : MFS_CHECKED);
2074                modify_listview_columns (kmi, LOWORD (wparam), !(i & MFS_CHECKED));
2075                break;
2076    
2077          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;  
               
2078          case ID_GROUP_PASTE:          case ID_GROUP_PASTE:
             km_groups_add (gc, kmi->lv, km_index);  
             break;  
               
2079          case ID_GROUP_DELETE:          case ID_GROUP_DELETE:
2080              km_groups_del (gc);          case ID_GROUP_SHOW:
2081              break;              /* XXX: Implement group manager. */
2082          #endif              return TRUE;
2083          }          }
2084                    
2085          break;          break;
# Line 1581  keymanager_dlg_proc (HWND dlg, UINT msg, Line 2087  keymanager_dlg_proc (HWND dlg, UINT msg,
2087            
2088      return FALSE;      return FALSE;
2089  }  }
   
   
   

Legend:
Removed from v.36  
changed lines
  Added in v.244

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26