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

Legend:
Removed from v.99  
changed lines
  Added in v.262

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26