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

Annotation of /trunk/Src/wptKeyManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 123 - (hide annotations)
Wed Dec 14 09:01:45 2005 UTC (19 years, 2 months ago) by twoaday
File size: 55483 byte(s)
2005-12-13  Timo Schulz  <ts@g10code.com>
 
        * wptCommonDlg.cpp (http_dlg_proc): Localized missing elements.
        * wptKeyManagerDlg.cpp (change_edit_menu): New.
        (change_key_menu): Renamed from...
        (menu_gpg_readonly): ..this.
        (clip_contains_pgpkey): New.
        (update_ui_items): Do not allow to sign expired keys.
        (keymanager_dlg_proc): Same for popup menu.
        * wptKeyPropsDlg.cpp (parse_preflist): Fixed string handling.
        * wptKeyCache.cpp (copy_uid_prefs):
        (gpg_keycache_sync): Copy uid prefs so the key property
        dialog show the correct values. Thanks to Shane.
         


1 werner 36 /* wptKeyManagerDlg.cpp - WinPT Key Manager
2     * Copyright (C) 2000-2005 Timo Schulz
3     * Copyright (C) 2004 Andreas Jobs
4     *
5     * This file is part of WinPT.
6     *
7     * WinPT is free software; you can redistribute it and/or modify
8     * it under the terms of the GNU General Public License as published by
9     * the Free Software Foundation; either version 2 of the License, or
10     * (at your option) any later version.
11     *
12     * WinPT is distributed in the hope that it will be useful,
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     * GNU General Public License for more details.
16     *
17     * You should have received a copy of the GNU General Public License
18     * along with WinPT; if not, write to the Free Software Foundation,
19     * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20     */
21     #ifdef HAVE_CONFIG_H
22     #include <config.h>
23     #endif
24    
25     #include <windows.h>
26     #include <commctrl.h>
27    
28 werner 47 #include "resource.h"
29 werner 36 #include "wptTypes.h"
30     #include "wptGPG.h"
31     #include "wptCommonCtl.h"
32     #include "wptContext.h" /* for passphrase_s */
33     #include "wptDlgs.h"
34     #include "wptW32API.h"
35     #include "wptVersion.h"
36     #include "wptKeylist.h"
37     #include "wptNLS.h"
38     #include "wptErrors.h"
39     #include "wptHotkey.h"
40     #include "wptKeyManager.h"
41     #include "wptKeyserver.h"
42     #include "wptKeyEdit.h"
43     #include "wptRegistry.h"
44    
45 twoaday 123 /* Name and ID of the separator window. */
46 werner 36 #define KM_SEPARATOR_ID 10000
47     #define WINDOWCLASS_SEPARATOR_CHILD "WINPT_SEP_CHILD"
48    
49 twoaday 123 /* Virtual key codes. */
50     #ifndef VK_F
51     #define VK_F 70
52     #endif
53     #ifndef VK_A
54     #define VK_A 65
55     #endif
56     #ifndef VK_C
57     #define VK_C 67
58     #endif
59     #ifndef VK_P
60     #define VK_P 80
61     #endif
62 werner 36
63     static subclass_s keylist_proc;
64    
65     HIMAGELIST glob_imagelist;
66    
67     struct km_info {
68     /* Window positions */
69     int pos_x, pos_y;
70     int ypos_sep;
71     int ypercent_sep;
72    
73     HWND hwnd_sep;
74     HWND toolbar;
75     HWND statbar;
76    
77     listview_ctrl_t lv;
78 twoaday 123 int lv_idx;
79 werner 36 int keylist_sortby;
80     };
81    
82 twoaday 123 /* Toolbar button structure. */
83 werner 36 struct mybuttons {
84     long icon;
85     long command;
86     char *text;
87     };
88    
89     struct mybuttons myb[] = {
90     {IMI_KEY_DELETE, ID_KEYMISC_DELETE, "Delete"},
91     {IMI_KEY_PROPS, ID_KEYMISC_PROPS, "Properties"},
92     {IMI_KEY_SIGN, ID_KEYMISC_SIGN, "Sign"},
93     {IMI_KEY_IMPORT, ID_KEYMISC_IMPORT, "Import"},
94     {IMI_KEY_EXPORT, ID_KEYMISC_EXPORT, "Export"},
95     };
96    
97    
98 twoaday 123 /* Subclass the keylist listview control to allow extended commands. */
99 werner 36 static BOOL CALLBACK
100     keylist_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
101     {
102     struct listview_ctrl_s lv;
103    
104     switch (msg) {
105     case WM_LBUTTONDBLCLK:
106     send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PROPS);
107     break;
108    
109     case WM_KEYUP:
110     int virt_key = (int)wparam;
111     switch (virt_key) {
112     case VK_SPACE:
113 twoaday 123 send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PROPS);
114 werner 36 break;
115    
116     case VK_DELETE:
117 twoaday 123 send_cmd_id (keylist_proc.dlg, ID_KEYMISC_DELETE);
118 werner 36 break;
119    
120     case VK_INSERT:
121     send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PASTE);
122     break;
123    
124     case VK_A:
125     if (GetAsyncKeyState (VK_CONTROL)) {
126     lv.ctrl = GetDlgItem (keylist_proc.dlg, IDC_KEYMISC_KEYLIST);
127     listview_select_all (&lv);
128     }
129     break;
130    
131     case VK_C:
132     if (GetAsyncKeyState (VK_CONTROL)) {
133     lv.ctrl = GetDlgItem (keylist_proc.dlg, IDC_KEYMISC_KEYLIST);
134     km_clip_export (keylist_proc.dlg, &lv);
135     }
136     break;
137    
138     case VK_P:
139 twoaday 123 if (GetAsyncKeyState (VK_CONTROL))
140 werner 36 km_clip_import (keylist_proc.dlg);
141     break;
142    
143     case VK_F:
144     if (GetAsyncKeyState (VK_CONTROL)) {
145     lv.ctrl = GetDlgItem (keylist_proc.dlg, IDC_KEYMISC_KEYLIST);
146     km_find_key (dlg, &lv);
147     }
148     break;
149     }
150     break;
151     }
152    
153 twoaday 123 return CallWindowProc (keylist_proc.old, dlg, msg, wparam, lparam);
154     }
155 werner 36
156    
157     static HWND
158 twoaday 123 load_toolbar (HWND dlg, struct km_info *kmi)
159 werner 36 {
160     HWND tbwnd;
161     TBSAVEPARAMS tbsp;
162     TBBUTTON tb_buttons[] = {
163     /*{imagelist_getindex(IMI_EXIT), ID_KEYMISC_QUIT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0L, 0},*/
164     {imagelist_getindex(IMI_KEY_DELETE), ID_KEYMISC_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
165     {imagelist_getindex(IMI_KEY_PROPS), ID_KEYMISC_PROPS, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
166     {imagelist_getindex(IMI_KEY_SIGN), ID_KEYMISC_SIGN, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
167     {0, 0, 0, TBSTYLE_SEP, {0}, 0L, 0},
168     {imagelist_getindex(IMI_KEY_IMPORT), ID_KEYMISC_IMPORT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
169     {imagelist_getindex(IMI_KEY_EXPORT), ID_KEYMISC_EXPORT, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, 0},
170     };
171    
172     tbwnd = CreateWindowEx (0, TOOLBARCLASSNAME, NULL,
173     WS_CHILD|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|CCS_ADJUSTABLE,
174     0, 0, 0, 0, dlg, (HMENU)IDR_WINPT_KMTB, glob_hinst, NULL);
175     if (tbwnd) {
176 twoaday 123 SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
177 werner 36 SendMessage (tbwnd, TB_SETIMAGELIST, 0, (LPARAM)glob_imagelist);
178     SendMessage (tbwnd, TB_AUTOSIZE, 0, 0);
179     ShowWindow (tbwnd, SW_SHOW);
180    
181     /* Restore toolbar */
182     tbsp.hkr = HKEY_CURRENT_USER;
183     tbsp.pszSubKey = "Software\\WinPT";
184     tbsp.pszValueName = "KM_toolbar";
185     if (SendMessage(tbwnd, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp ) == 0)
186 twoaday 123 SendMessage (tbwnd, TB_ADDBUTTONS, sizeof(tb_buttons) / sizeof(tb_buttons[0]),
187     (LONG)&tb_buttons[0]);
188 werner 36 }
189     return tbwnd;
190 twoaday 123 }
191 werner 36
192    
193 twoaday 85 /* Center window @dlg. */
194 werner 36 static void
195 twoaday 123 do_center_window (HWND dlg, struct km_info *kmi)
196 werner 36 {
197     RECT rect;
198 twoaday 123 char *p;
199 werner 36 int pos_x = 0, pos_y = 0;
200    
201     /* Find bottom of keylist */
202     GetWindowRect (GetDlgItem(dlg, IDC_KEYMISC_KEYLIST), &rect);
203     MapWindowPoints (NULL, dlg, (POINT*)&rect, 2);
204    
205     kmi->ypos_sep = rect.bottom;
206    
207 twoaday 85 p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X");
208     if (p && !strcmp (p, " ")) {
209 twoaday 123 free_if_alloc (p);
210 twoaday 85 center_window (dlg, NULL);
211 werner 36 return;
212     }
213 twoaday 85 else if (p)
214     pos_x = atol (p);
215 werner 36
216 twoaday 85 p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");
217     if (p && !strcmp (p, " ")) {
218     free_if_alloc (p);
219 twoaday 123 center_window (dlg, NULL);
220 werner 36 return;
221     }
222 twoaday 85 else if (p)
223     pos_y = atol (p);
224 werner 36
225 twoaday 85 if (!pos_y && !pos_x) {
226     center_window (dlg, NULL);
227 werner 36 return;
228     }
229    
230 twoaday 85 if (pos_x < 0 || pos_y < 0)
231 werner 36 pos_x = pos_y = 0;
232 twoaday 123 if (pos_x > GetSystemMetrics (SM_CXSCREEN)
233 twoaday 85 || pos_y > GetSystemMetrics (SM_CYSCREEN)) {
234     pos_x = pos_y = 0;
235 werner 36 }
236 twoaday 85 GetClientRect (dlg, &rect);
237     MoveWindow (dlg, pos_x, pos_y, rect.right, rect.bottom, TRUE);
238 werner 36 }
239    
240    
241 twoaday 123 /* Resize the key manager window with the information from @kmi. */
242 werner 36 static void
243 twoaday 123 do_resize_window (HWND dlg, struct km_info *kmi)
244 werner 36 {
245     HWND h;
246     RECT rclient, rect;
247     BOOL bRepaint = FALSE;
248    
249     /* Get rect of client area and make life easier */
250 twoaday 123 GetClientRect (dlg, &rclient);
251 werner 36
252     /* Move toolbar to the top of the window */
253     if (kmi->toolbar) {
254 twoaday 123 GetWindowRect (kmi->toolbar, &rect);
255     ScreenToClient (dlg, (POINT*)&rect);
256     ScreenToClient (dlg, (POINT*)&(rect.right));
257 werner 36
258     rclient.top += rect.bottom - rect.top;
259     MoveWindow (kmi->toolbar, 0, 0, rclient.right - rclient.left,
260     rect.bottom - rect.top, bRepaint);
261     }
262    
263     /* Move statusbar to the bottom of the window */
264     if (kmi->statbar) {
265 twoaday 123 GetWindowRect (kmi->statbar, &rect);
266     ScreenToClient (dlg, (POINT*)&rect);
267     ScreenToClient (dlg, (POINT*)&(rect.right));
268 werner 36
269     rclient.bottom -= rect.bottom - rect.top;
270 twoaday 123 MoveWindow (kmi->statbar, 0, rclient.bottom,
271     rclient.right - rclient.left,
272 werner 36 rect.bottom - rect.top, bRepaint);
273     }
274    
275 twoaday 123 /* Obtain separator information and move it to the desired posistion */
276 werner 36 if (kmi->ypercent_sep)
277     kmi->ypos_sep = (rclient.bottom - rclient.top) * kmi->ypercent_sep / 100;
278     else
279     kmi->ypercent_sep = kmi->ypos_sep * 100 / (rclient.bottom - rclient.top);
280    
281 twoaday 123 /* Don't move away */
282 werner 36 if (kmi->ypos_sep+5 > rclient.bottom)
283     kmi->ypos_sep = rclient.bottom - 5;
284     if (kmi->ypos_sep < rclient.top)
285     kmi->ypos_sep = rclient.top;
286 twoaday 123 MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep,
287     (rclient.right - rclient.left), 5, bRepaint);
288 werner 36
289 twoaday 123 /* Place the keylist above the separator */
290     h = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
291 werner 36 MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
292     kmi->ypos_sep - rclient.top, bRepaint);
293     rclient.top = kmi->ypos_sep + 5 + 8;
294    
295     /* Place the group text and the group box below the separator */
296 twoaday 123 h = GetDlgItem (dlg, IDC_KEYMISC_GTEXT);
297     MoveWindow (h, rclient.left, rclient.top, 100, 14, bRepaint);
298 werner 36 rclient.top += 18;
299    
300 twoaday 123 h = GetDlgItem (dlg, IDC_KEYMISC_GROUP);
301 werner 36 MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
302 twoaday 123 (rclient.bottom < rclient.top) ?
303     0 : rclient.bottom - rclient.top, bRepaint);
304 werner 36
305     /* Repaint the whole thing */
306     InvalidateRect (dlg, NULL, TRUE);
307 twoaday 123 }
308 werner 36
309    
310 twoaday 123 /* Return true if the clipboard contains an OpenPGP key. */
311     static bool
312     clip_contains_pgpkey (void)
313     {
314     char *ctxt;
315     bool val = false;
316    
317     ctxt = get_clip_text (NULL);
318     if (!ctxt || strlen (ctxt) < 512)
319     val = false;
320     else if (strstr (ctxt, "BEGIN PGP") && strstr (ctxt, "KEY BLOCK") &&
321     strstr (ctxt, "END PGP"))
322     val = true;
323     free_if_alloc (ctxt);
324     return val;
325     }
326    
327    
328     /* Show a mini popup menu to import keys. */
329 werner 36 static void
330     do_create_minpopup (HWND dlg)
331     {
332     HMENU hm;
333     MENUITEMINFO mi;
334     char * s;
335     POINT p;
336    
337 twoaday 123 if (gpg_read_only || !clip_contains_pgpkey ())
338 werner 36 return;
339     hm = CreatePopupMenu ();
340     if (!hm)
341     BUG( NULL );
342     memset (&mi, 0, sizeof mi);
343     mi.cbSize = sizeof mi;
344     s = (char *)_("Paste Key from Clipboard");
345     mi.fType = MF_STRING;
346     mi.dwTypeData = s;
347     mi.cch = strlen (s);
348     mi.fMask = MIIM_DATA | MIIM_ID | MIIM_TYPE;
349     mi.wID = ID_KEYCTX_PASTE;
350     InsertMenuItem (hm, 0, FALSE, &mi);
351     GetCursorPos (&p);
352     TrackPopupMenu (hm, 0, p.x, p.y, 0, dlg, NULL);
353     DestroyMenu (hm);
354 twoaday 123 }
355 werner 36
356    
357 twoaday 123 /* Reload the key cache if requested. */
358 werner 36 static void
359     do_check_cache (listview_ctrl_t lv, HWND dlg, HWND sb)
360     {
361     gpg_keycache_t cache;
362    
363 twoaday 123 if (keycache_get_reload ()) {
364     keycache_reload (dlg);
365     keycache_set_reload (0);
366     cache = keycache_get_ctx (1);
367     if (!cache)
368     BUG (dlg);
369     keylist_reload (lv, cache, KEYLIST_LIST, KEY_SORT_USERID);
370 twoaday 121 km_update_status_bar (sb, lv);
371 werner 36 }
372 twoaday 123 }
373 werner 36
374    
375     long CALLBACK
376 twoaday 123 separator_wnd_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
377 werner 36 {
378     static POINT last_mouse_pos;
379 twoaday 123
380 werner 36 if (msg == WM_CREATE)
381 twoaday 123 SetWindowLong (hwnd, GWL_USERDATA,
382     (long)(((CREATESTRUCT*)lparam)->lpCreateParams));
383 werner 36
384     switch (msg) {
385     case WM_PAINT:
386     PAINTSTRUCT ps;
387 twoaday 123 RECT rect;
388 werner 36 HPEN hpen;
389    
390     GetClientRect (hwnd, &rect);
391     BeginPaint (hwnd, &ps);
392    
393 twoaday 123 /* Background */
394 werner 36 FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));
395    
396 twoaday 123 /* The lines from the light into the dark */
397 werner 36 MoveToEx(ps.hdc, 0,0, NULL);
398 twoaday 123 if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DHILIGHT))) != NULL) {
399     SelectObject (ps.hdc, (LPVOID)hpen);
400     LineTo (ps.hdc, rect.right, 0);
401     DeleteObject (hpen);
402 werner 36 }
403     MoveToEx(ps.hdc, 0, 1, NULL);
404 twoaday 123 if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT))) != NULL) {
405     SelectObject (ps.hdc, (LPVOID)hpen);
406     LineTo (ps.hdc, rect.right, rect.bottom);
407     DeleteObject (hpen);
408 werner 36 }
409    
410     MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);
411 twoaday 123 if ((hpen = CreatePen (PS_SOLID, 0, GetSysColor(COLOR_3DSHADOW))) != NULL) {
412     SelectObject (ps.hdc, (LPVOID)hpen);
413     LineTo (ps.hdc, rect.right, rect.bottom-1);
414     DeleteObject (hpen);
415 werner 36 }
416     MoveToEx(ps.hdc, 0, rect.bottom, NULL);
417     if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {
418 twoaday 123 SelectObject (ps.hdc, (LPVOID)hpen);
419     LineTo (ps.hdc, rect.right, rect.bottom);
420     DeleteObject (hpen);
421 werner 36 }
422    
423     EndPaint (hwnd, &ps);
424     return 0;
425    
426     case WM_LBUTTONDOWN:
427 twoaday 123 last_mouse_pos.x = LOWORD (lparam);
428     last_mouse_pos.y = HIWORD (lparam);
429 werner 36 ClientToScreen (hwnd, &last_mouse_pos);
430     SetCapture (hwnd);
431     return 0;
432    
433     case WM_LBUTTONUP:
434     ReleaseCapture ();
435     return 0;
436    
437     case WM_MOUSEMOVE:
438     if (wparam == MK_LBUTTON) {
439     struct km_info *kmi;
440     POINT p;
441 twoaday 123 RECT r;
442 werner 36
443 twoaday 123 kmi = (struct km_info *)GetWindowLong (hwnd, GWL_USERDATA);
444     if (kmi == NULL)
445 werner 36 break;
446    
447 twoaday 123 /* Calculate mouse movement */
448 werner 36 p.x = LOWORD(lparam);
449     p.y = HIWORD(lparam);
450     ClientToScreen (hwnd, &p);
451    
452 twoaday 123 GetWindowRect (hwnd, &r);
453     r.top += (short)(p.y - last_mouse_pos.y);
454     r.bottom += (short)(p.y - last_mouse_pos.y);
455 werner 36
456     last_mouse_pos.y = p.y;
457    
458 twoaday 123 /* Apply mouse movement to window. Beware the MoveWindow is relaive
459     to parent NOT screen */
460     MapWindowPoints (NULL, GetParent(hwnd), (POINT*)&r, 2);
461     kmi->ypos_sep = r.top;
462     kmi->ypercent_sep = 0; /* This forces do_resize_window to use abs. position */
463 werner 36 do_resize_window (GetParent(hwnd), kmi);
464     return 0;
465     }
466     }
467    
468     return DefWindowProc (hwnd, msg, wparam, lparam);
469     }
470    
471    
472 twoaday 123 /* Register the separator window with @dlg as the parent window. */
473 werner 36 static HWND
474     regist_sep_wnd (HWND dlg, struct km_info * kmi)
475     {
476     WNDCLASS wndclass;
477     HWND h;
478    
479     wndclass.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
480     wndclass.lpfnWndProc = separator_wnd_proc;
481     wndclass.cbClsExtra = 0;
482     wndclass.cbWndExtra = sizeof (long);
483     wndclass.hInstance = glob_hinst;
484     wndclass.hIcon = NULL;
485     wndclass.hCursor = LoadCursor (NULL, IDC_SIZENS);
486     wndclass.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH);
487     wndclass.lpszMenuName = 0;
488     wndclass.lpszClassName = WINDOWCLASS_SEPARATOR_CHILD;
489     RegisterClass (&wndclass);
490    
491     h = CreateWindowEx (WS_EX_WINDOWEDGE, WINDOWCLASS_SEPARATOR_CHILD, NULL,
492     WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
493     0, 400, 2000, 5, dlg, (HMENU) 0, glob_hinst, kmi);
494     ShowWindow (h, SW_SHOW);
495     return h;
496 twoaday 123 }
497 werner 36
498    
499     #define enable_button(hwnd, cid) \
500     SendMessage ((hwnd), TB_ENABLEBUTTON, (cid), MAKELONG (key_selected, 0))
501    
502    
503     /* Interactive modification of the dialog item which depend if an item
504     is selected or not and what kind of item. @lv is the list view with
505     the items. */
506     void
507     update_ui_items (HWND hwnd, listview_ctrl_t lv)
508     {
509     HWND hwnd_child;
510     HMENU hmenu;
511 twoaday 121 int key_selected = 0;
512     int key_has_sec = 0;
513     int key_inv = 0;
514     int mult_resids[] = {ID_KEYMISC_PROPS, ID_KEYMISC_SIGN, ID_KEYMISC_EDITKEY,
515 twoaday 123 ID_KEYMISC_CHECKSIGS, ID_KEYMISC_REVCERT, 0};
516 twoaday 121 int i;
517 werner 36
518     /* Get some states */
519     key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST),
520     LVM_GETSELECTEDCOUNT, 0, 0)
521     ? TRUE : FALSE;
522     key_has_sec = FALSE;
523     if (key_selected) {
524     i = listview_get_curr_pos (lv);
525     key_has_sec = km_check_for_seckey (lv, i, NULL) ? TRUE : FALSE;
526 twoaday 123 key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED ||
527     km_get_key_status (lv, i) & KM_FLAG_EXPIRED;
528 werner 36 }
529    
530     /* Enable / disable toolbar buttons */
531     hwnd_child = GetDlgItem (hwnd, IDR_WINPT_KMTB);
532     enable_button (hwnd_child, ID_KEYMISC_DELETE);
533     enable_button (hwnd_child, ID_KEYMISC_PROPS);
534     enable_button (hwnd_child, ID_KEYMISC_SIGN);
535     enable_button (hwnd_child, ID_KEYMISC_EXPORT);
536    
537     /* Enable / disable menu items */
538     hmenu = GetMenu (hwnd);
539     set_menu_state (hmenu, ID_KEYMISC_EXPORT, key_selected ? MF_ENABLED : MF_GRAYED);
540     set_menu_state (hmenu, ID_KEYMISC_EXPORT_PRIVKEY, key_has_sec ? MF_ENABLED : MF_GRAYED);
541     set_menu_state (hmenu, ID_KEYMISC_REVCERT, key_has_sec ? MF_ENABLED : MF_GRAYED);
542     set_menu_state (hmenu, ID_KEYMISC_DELETE, key_selected ? MF_ENABLED : MF_GRAYED);
543     set_menu_state (hmenu, ID_KEYMISC_PROPS, key_selected ? MF_ENABLED : MF_GRAYED);
544     set_menu_state (hmenu, ID_KEYMISC_SIGN, key_selected && !key_inv ? MF_ENABLED : MF_GRAYED);
545     set_menu_state (hmenu, ID_KEYMISC_EDITKEY, key_selected? MF_ENABLED : MF_GRAYED);
546     set_menu_state (hmenu, ID_KEYMISC_CHECKSIGS, key_selected? MF_ENABLED : MF_GRAYED);
547 twoaday 123
548 twoaday 121 /* Disable some menu items when multiple keys are selected. */
549     if (listview_count_items (lv, 1) > 1) {
550     for (i=0; mult_resids[i] != 0; i++)
551     set_menu_state (hmenu, mult_resids[i], MF_GRAYED);
552 twoaday 123 }
553 werner 36 }
554    
555 twoaday 123
556 twoaday 121 /* Disable some context menu items when multiple keys are selected. */
557     static void
558     popup_multiple (HWND dlg, HMENU hm)
559     {
560     int resids[] = {
561     ID_KEYCTX_EDIT,
562     ID_KEYCTX_SIGN,
563     ID_KEYCTX_REV,
564 twoaday 123 ID_KEYCTX_ENABLE,
565     ID_KEYCTX_DISABLE,
566     ID_KEYCTX_ADDKEY,
567     ID_KEYCTX_ADDPHOTO,
568     ID_KEYCTX_ADDUID,
569     ID_KEYCTX_ADDREV,
570     ID_KEYCTX_LISTSIGS,
571     ID_KEYCTX_MAXTRUST,
572     ID_KEYCTX_PROPS,
573     ID_KEYCTX_SENDMAIL,
574     0};
575 twoaday 121 int i;
576     for (i=0; i < resids[i] != 0; i++)
577     set_menu_state (hm, resids[i], MF_GRAYED);
578     }
579 werner 36
580 twoaday 123
581 werner 36 /* The items which are shown when GPG is in read-only mode. */
582     static void
583     popup_gpg_readonly (HWND dlg, HMENU hm)
584     {
585     int resids[] = {
586     ID_KEYCTX_PASTE,
587     ID_KEYCTX_EDIT,
588     ID_KEYCTX_SIGN,
589     ID_KEYCTX_REV,
590     ID_KEYCTX_DEL,
591     ID_KEYCTX_ENABLE,
592     ID_KEYCTX_DISABLE,
593     ID_KEYCTX_RECVFROM,
594     ID_KEYCTX_ADDKEY,
595     ID_KEYCTX_ADDPHOTO,
596     ID_KEYCTX_ADDUID,
597     ID_KEYCTX_ADDREV,
598     0
599     };
600     int i;
601    
602     if (gpg_read_only == 0)
603     return;
604     for (i=0; resids[i] != 0; i++)
605     set_menu_state (hm, resids[i], MF_GRAYED);
606     }
607    
608    
609 twoaday 123 /* Change the 'Edit' menu based on the current state. */
610 werner 36 static void
611 twoaday 123 change_edit_menu (listview_ctrl_t lv, HMENU hm, int id)
612 werner 36 {
613 twoaday 123 int no_sel;
614    
615     if (id != 1 /*EDIT_MENU*/)
616     return;
617    
618     if (!clip_contains_pgpkey ())
619     set_menu_state (hm, ID_KEYMISC_PASTE, MF_GRAYED);
620     else
621     set_menu_state (hm, ID_KEYMISC_PASTE, MF_ENABLED);
622     no_sel = listview_get_curr_pos (lv) == -1? 1 : 0;
623     set_menu_state (hm, ID_KEYMISC_DELETE2, no_sel? MF_GRAYED: MF_ENABLED);
624     set_menu_state (hm, ID_KEYMISC_COPY, no_sel? MF_GRAYED : MF_ENABLED);
625     }
626    
627    
628    
629     /* Show limited key menu entries when GPG is in read-only mode. */
630     static void
631     change_key_menu (HMENU hm, int id)
632     {
633 werner 36 int key_resids[] = {
634     ID_KEYMISC_SIGN,
635     ID_KEYMISC_DELETE,
636     ID_KEYMISC_REVCERT,
637     ID_KEYMISC_IMPORT_HTTP,
638     ID_KEYMISC_IMPORT,
639     ID_KEYMISC_REFRESH_KEYS,
640     ID_KEYMISC_REBUILD,
641     ID_KEYMISC_KEYWIZARD,
642     ID_KEYMISC_CARDNEW,
643     ID_KEYMISC_NEWKEY,
644     0,
645     };
646     int edit_resids[] = {
647     ID_KEYMISC_PASTE,
648     ID_KEYMISC_OT,
649     ID_KEYMISC_EDITKEY,
650     0
651     };
652 twoaday 68 int *resids;
653 werner 36 int i;
654    
655    
656     if (gpg_read_only == 0)
657     return;
658     switch (id) {
659     case 0: return;
660     case 3: resids = key_resids; break;
661     case 1: resids = edit_resids;break;
662 twoaday 123 default:resids = edit_resids; break;
663 werner 36 }
664    
665     for (i=0; resids[i] != 0; i++)
666     set_menu_state (hm, resids[i], MF_GRAYED);
667     }
668    
669    
670 twoaday 123 /* Return a user-friendly name for a key derrived from
671     name. If @is_secret is 1, a secret key name will be generated. */
672 werner 36 static char*
673     gen_export_filename (const char *keyid, int is_secret)
674     {
675     gpgme_key_t key;
676     const char *s;
677     char *p;
678    
679     if (get_pubkey (keyid, &key))
680     return m_strdup (keyid);
681     s = key->uids->name;
682     if (!s)
683     return m_strdup (keyid);
684     p = new char[strlen (s) + 8 + 16];
685     if (!p)
686     BUG (0);
687     sprintf (p, "%s%s.asc", s, is_secret? "_sec" : "");
688     for (size_t i=0; i < strlen (p); i++) {
689     if (p[i] == ' ' || p[i] == ':' || p[i] == '?' || p[i] == '|')
690     p[i] = '_';
691     }
692     return p;
693     }
694    
695    
696 twoaday 123 /* Reload a single key in the cache. */
697 werner 36 static void
698     update_key (listview_ctrl_t lv, int pos, const char *keyid, int keypair)
699     {
700     gpgme_key_t key;
701    
702     keycache_update (0, keyid);
703     if (keypair)
704     keycache_update (1, keyid);
705    
706     /* because we replaced the key item, we need to update the
707     address of the pointer in the ListView control. */
708     get_pubkey (keyid, &key);
709     keylist_upd_key (lv, pos, key);
710     }
711    
712    
713     /* Setup status bar for the main window @dlg. */
714     static HWND
715     setup_status_bar (HWND dlg, listview_ctrl_t lv)
716     {
717 twoaday 123 HWND statbar;
718 werner 36 RECT r;
719     int partpos[3];
720     int i;
721    
722     GetClientRect (dlg, &r);
723     for (i=1; i <= 3; i++)
724     partpos[i-1] = r.right/3*i;
725     statbar = CreateStatusWindow (WS_CHILD | WS_VISIBLE | CCS_BOTTOM,
726     "status bar", dlg, KM_SEPARATOR_ID);
727    
728     ShowWindow (statbar, SW_SHOW);
729     SendMessage (statbar, SB_SETPARTS, (WPARAM)3, (LPARAM)partpos);
730    
731     km_update_default_key_str (statbar);
732 twoaday 121 km_update_status_bar (statbar, lv);
733 werner 36
734     return statbar;
735     }
736    
737    
738 twoaday 123 /* Dialog box procedure for the Key Manager. */
739 werner 36 BOOL CALLBACK
740     keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
741     {
742     struct km_info *kmi;
743     static HMENU menu = NULL;
744     static int refresh_keys = 0;
745     INITCOMMONCONTROLSEX icex;
746     HWND kl;
747     HMENU hm;
748     gpg_keycache_t c;
749     gpgme_key_t key;
750     struct genkey_s genkey;
751     struct winpt_key_s k = {0};
752     struct URL_ctx_s *url;
753     refresh_cache_s rcs = {0};
754     char keyid[48], uid[128], type[32], *name;
755 twoaday 123 const char *t, *host;
756 werner 36 u16 port = 0;
757 twoaday 123 int l_idx = 0, i=0, rc;
758 werner 36
759     if ((msg != WM_INITDIALOG)
760     && ((kmi = (struct km_info*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))
761     return FALSE;
762    
763     switch (msg) {
764     case WM_INITDIALOG:
765     kmi = new struct km_info;
766     memset (kmi, 0, sizeof (struct km_info));
767 twoaday 123 kmi->lv_idx = -1;
768 werner 36 icex.dwSize = sizeof (INITCOMMONCONTROLSEX);
769     icex.dwICC = ICC_BAR_CLASSES;
770     InitCommonControlsEx (&icex);
771     kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);
772     imagelist_load (dlg);
773 twoaday 123 SetWindowText (dlg, _("Key Manager"));
774     menu = LoadMenu (glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC);
775 twoaday 85 set_menu_text_bypos (menu, 0, _("File"));
776     set_menu_text_bypos (menu, 1, _("Edit"));
777     set_menu_text_bypos (menu, 2, _("View"));
778     set_menu_text_bypos (menu, 3, _("Key"));
779 twoaday 99 set_menu_text_bypos (menu, 4, _("Groups"));
780 twoaday 85 set_menu_text (menu, ID_KEYMISC_EDITKEY, _("Edit"));
781 werner 36 set_menu_text (menu, ID_KEYMISC_MAIL, _("Send Mail..."));
782     set_menu_text (menu, ID_KEYMISC_OT, _("Ownertrust")); /* XXX */
783     set_menu_text (menu, ID_KEYMISC_COPY, _("&Copy\tCtrl+C"));
784     set_menu_text (menu, ID_KEYMISC_PASTE, _("&Paste\tCtrl+V"));
785     set_menu_text (menu, ID_KEYMISC_FIND, _("Search...\tCtrl+F"));
786     set_menu_text (menu, ID_KEYMISC_SELALL, _("Select All\tCtrl+A"));
787     set_menu_text (menu, ID_KEYMISC_QUIT, _("&Quit"));
788     set_menu_text (menu, ID_KEYMISC_UID, _("User ID"));
789     set_menu_text (menu, ID_KEYMISC_NEWKEY, _("&Expert"));
790     set_menu_text (menu, ID_KEYMISC_KEYWIZARD, _("&Normal"));
791     set_menu_text (menu, ID_KEYMISC_EDIT, _("Edit"));
792     set_menu_text (menu, ID_KEYMISC_SIGN, _("&Sign"));
793     set_menu_text (menu, ID_KEYMISC_DELETE, _("&Delete"));
794 twoaday 123 set_menu_text (menu, ID_KEYMISC_DELETE2, _("&Delete"));
795 werner 36 set_menu_text (menu, ID_KEYMISC_REVCERT, _("&Revoke"));
796     set_menu_text (menu, ID_KEYMISC_CHECKSIGS, _("&List Signatures"));
797     set_menu_text (menu, ID_KEYMISC_TRUSTPATH, _("List Trust Path"));
798     set_menu_text (menu, ID_KEYMISC_EXPORT, _("&Export..."));
799     set_menu_text (menu, ID_KEYMISC_IMPORT, _("&Import..."));
800     set_menu_text (menu, ID_KEYMISC_PROPS, _("&Properties"));
801     set_menu_text (menu, ID_KEYMISC_GPGOPT, _("Options"));
802     set_menu_text (menu, ID_KEYMISC_GPGPREFS, _("Preferences"));
803     set_menu_text (menu, ID_KEYMISC_SENDRECV, _("Keyserver") );
804     set_menu_text (menu, ID_KEYMISC_EXPORT_PRIVKEY, _("E&xport Secret Key"));
805     set_menu_text (menu, ID_KEYMISC_RECACHE, _("Re&load Key Cache"));
806     set_menu_text (menu, ID_KEYMISC_REBUILD, _("R&everify Signatures"));
807     set_menu_text (menu, ID_KEYMISC_REFRESH_KEYS, _("Refresh &Keys (Keyserver)"));
808     set_menu_text (menu, ID_KEYMISC_INFO, _("Info") );
809     set_menu_text (menu, ID_KEYMISC_HELP, _("&Help"));
810 twoaday 123
811     /* XXX: implement help code. */
812     set_menu_state (menu, ID_KEYMISC_HELP, MF_GRAYED);
813    
814 werner 36 SetMenu (dlg, menu);
815 twoaday 123 if (keyring_check_last_access ())
816     keycache_set_reload (1);
817     if (keycache_get_reload ())
818     keycache_reload (dlg);
819     c = keycache_get_ctx (KEYCACHE_PUB);
820     if (!c)
821     BUG (NULL);
822 werner 36 kmi->keylist_sortby = KEY_SORT_USERID;
823 twoaday 123 Header_SetImageList(ListView_GetHeader (GetDlgItem (dlg, IDC_KEYMISC_KEYLIST)),
824 werner 36 glob_imagelist);
825 twoaday 123 kmi->lv = keylist_load (GetDlgItem (dlg, IDC_KEYMISC_KEYLIST), c,
826     NULL, KEYLIST_LIST, kmi->keylist_sortby);
827 werner 36 /* init subclassing for the listview */
828 twoaday 123 kl = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
829 werner 36 keylist_proc.dlg = dlg;
830     keylist_proc.current = (WNDPROC)keylist_subclass_proc;
831     keylist_proc.old = (WNDPROC)GetWindowLong( kl, GWL_WNDPROC );
832 twoaday 123 if (keylist_proc.old) {
833     if( !SetWindowLong (kl, GWL_WNDPROC, (LONG)keylist_proc.current)) {
834     msg_box (dlg, _("Could not set keylist window procedure."),
835     _("Key Manager"), MB_ERR);
836     BUG (NULL);
837 werner 36 }
838     }
839     #if 0
840 twoaday 123 km_groups_new (&gc, GetDlgItem (dlg, IDC_KEYMISC_GROUP));
841     km_groups_load (gc);
842 werner 36 #endif
843     kmi->statbar = setup_status_bar (dlg, kmi->lv);
844     SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);
845     kmi->toolbar = load_toolbar (dlg, kmi);
846    
847     do_center_window (dlg, kmi);
848     do_resize_window (dlg, kmi);
849     update_ui_items (dlg, kmi->lv);
850 twoaday 123
851 twoaday 104 SetDlgItemText (dlg, IDC_KEYMISC_GTEXT, _("Groups"));
852 twoaday 123 SetClassLong (dlg, GCL_HICON, (LONG)LoadIcon (glob_hinst,
853     (LPCTSTR)IDI_WINPT));
854 twoaday 104 SetForegroundWindow (dlg);
855 werner 36 return TRUE;
856    
857     case WM_DESTROY:
858     if (kmi->lv) {
859     keylist_delete (kmi->lv);
860     kmi->lv = NULL;
861 twoaday 123 }
862     imagelist_destroy ();
863 werner 36
864 twoaday 123 ltoa (kmi->pos_x, type, 10);
865     set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", type);
866     ltoa (kmi->pos_y, type, 10);
867     set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", type);
868     /* Remove runtime information. This should be the last action taken here. */
869     delete kmi; kmi = NULL;
870     SetWindowLong (dlg, GWL_USERDATA, 0);
871     keycache_set_reload (refresh_keys);
872     return FALSE;
873 werner 36
874 twoaday 123 case WM_MOVE:
875 werner 36 RECT r;
876     GetWindowRect (dlg, &r);
877     kmi->pos_x = r.left;
878     kmi->pos_y = r.top;
879     break;
880    
881    
882     case WM_RBUTTONUP:
883     do_create_minpopup (dlg);
884     break;
885    
886     case WM_NOTIFY:
887 twoaday 123 NMHDR *notify;
888 werner 36 POINT p;
889     HMENU popup;
890    
891     notify = (NMHDR *)lparam;
892 twoaday 123 if (!notify)
893 werner 36 break;
894 twoaday 123 switch (notify->code) {
895 werner 36 case TBN_QUERYDELETE:
896 twoaday 123 SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
897 werner 36 return TRUE;
898    
899     case TBN_QUERYINSERT:
900 twoaday 123 SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
901 werner 36 return TRUE;
902    
903     case TBN_GETBUTTONINFO:
904     LPTBNOTIFY lpTbNotify;
905     lpTbNotify = (LPTBNOTIFY)lparam;
906     if (lpTbNotify->iItem < (sizeof(myb) / sizeof(mybuttons))) {
907     lpTbNotify->tbButton.iBitmap = imagelist_getindex(myb[lpTbNotify->iItem].icon);
908     lpTbNotify->tbButton.idCommand = myb[lpTbNotify->iItem].command;
909     lpTbNotify->tbButton.fsState = TBSTATE_ENABLED;
910     lpTbNotify->tbButton.fsStyle = TBSTYLE_BUTTON;
911     lpTbNotify->tbButton.iString = 0;
912     strncpy (lpTbNotify->pszText, myb[lpTbNotify->iItem].text, lpTbNotify->cchText);
913     SetWindowLong(dlg, DWL_MSGRESULT, TRUE);
914     }
915     return TRUE;
916    
917     case TBN_RESET: /* Restore last saved toolbar status */
918     TBSAVEPARAMS tbsp;
919    
920     tbsp.hkr = HKEY_CURRENT_USER;
921     tbsp.pszSubKey = "Software\\WinPT";
922     tbsp.pszValueName = "KM_toolbar";
923     SendMessage (notify->hwndFrom, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp);
924     break;
925    
926     case TBN_BEGINADJUST: /* User is about to change the toolbar. Save it */
927     tbsp.hkr = HKEY_CURRENT_USER;
928     tbsp.pszSubKey = "Software\\WinPT";
929     tbsp.pszValueName = "KM_toolbar";
930     SendMessage (notify->hwndFrom, TB_SAVERESTORE, TRUE, (LPARAM)&tbsp);
931     break;
932    
933     case TBN_ENDADJUST: /* User has finished customizing the toolbar. Save it. */
934     tbsp.hkr = HKEY_CURRENT_USER;
935     tbsp.pszSubKey = "Software\\WinPT";
936     tbsp.pszValueName = "KM_toolbar";
937     SendMessage (notify->hwndFrom, TB_SAVERESTORE, TRUE, (LPARAM)&tbsp);
938     break;
939    
940     case TTN_GETDISPINFO:
941     LPTOOLTIPTEXT lpttt;
942     lpttt = (LPTOOLTIPTEXT)lparam;
943    
944     lpttt->hinst = NULL;
945     switch (lpttt->hdr.idFrom) {
946     case ID_KEYMISC_DELETE:
947     lpttt->lpszText = (char *)_("Delete key from keyring");
948     break;
949    
950     case ID_KEYMISC_PROPS:
951     lpttt->lpszText = (char *)_("Show key properties");
952     break;
953    
954     case ID_KEYMISC_SIGN:
955     lpttt->lpszText = (char *)_("Sign key");
956     break;
957    
958     case ID_KEYMISC_IMPORT:
959     lpttt->lpszText = (char *)_("Import key to keyring");
960     break;
961    
962     case ID_KEYMISC_EXPORT:
963     lpttt->lpszText = (char *)_("Export key to a file");
964     break;
965     }
966     return TRUE;
967    
968     case LVN_ITEMCHANGED:
969 twoaday 123 if (((LPNMLISTVIEW)lparam)->uNewState) { /* item selected? */
970     kmi->lv_idx = listview_get_curr_pos (kmi->lv);
971 werner 36 update_ui_items (dlg, kmi->lv);
972     return TRUE;
973     }
974     break;
975    
976     case NM_RCLICK:
977     if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
978 twoaday 123 l_idx =listview_get_curr_pos (kmi->lv);
979     if (l_idx == -1)
980 werner 36 return TRUE; /* Popup only when a item was selected */
981     do_check_cache (kmi->lv, dlg, kmi->statbar);
982     GetCursorPos (&p);
983     hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));
984     popup = GetSubMenu (hm, 0);
985 twoaday 99
986 werner 36 set_menu_text (popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard"));
987     set_menu_text (popup, ID_KEYCTX_KEYID_COPY, _("Copy Key ID to Clipboard"));
988     set_menu_text (popup, ID_KEYCTX_FPR_COPY, _("Copy Fingerprint to Clipboard"));
989     set_menu_text (popup, ID_KEYCTX_KINFO_COPY, _("Copy Key Info to Clipboard"));
990     set_menu_text (popup, ID_KEYCTX_COPY, _("Copy Key to Clipboard"));
991     set_menu_text (popup, ID_KEYCTX_PASTE, _("Paste Key from Clipboard"));
992     set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Refresh from Keyserver"));
993     set_menu_text (popup, ID_KEYCTX_MAXTRUST, _("Set Implicit &Trust"));
994     set_menu_text (popup, ID_KEYCTX_LISTSIGS, _("&List Signatures"));
995     set_menu_text (popup, ID_KEYCTX_PROPS, _("&Key Properties"));
996     set_menu_text (popup, ID_KEYCTX_EDIT, _("Key Edit"));
997     set_menu_text (popup, ID_KEYCTX_DEL, _("&Delete"));
998     set_menu_text (popup, ID_KEYCTX_REV, _("&Revoke"));
999     set_menu_text (popup, ID_KEYCTX_SIGN, _("&Sign"));
1000     set_menu_text (popup, ID_KEYCTX_ENABLE, _("&Enable"));
1001     set_menu_text (popup, ID_KEYCTX_DISABLE, _("&Disable"));
1002     set_menu_text (popup, ID_KEYCTX_RECVFROM, _("Re&fresh from Keyserver"));
1003     set_menu_text (popup, ID_KEYCTX_SETPREFKS, _("Set preferred Keyserver URL"));
1004     set_menu_text (popup, ID_KEYCTX_SENDMAIL, _("Send Key to Mail Recipient"));
1005     set_menu_text (popup, ID_KEYCTX_SETDEFKEY, _("Set as Default Key"));
1006 twoaday 123
1007     set_menu_text (popup, ID_KEYCTX_ADDKEY, _("Key..."));
1008     set_menu_text (popup, ID_KEYCTX_ADDUID, _("User ID..."));
1009     set_menu_text (popup, ID_KEYCTX_ADDPHOTO, _("Photo ID..."));
1010     set_menu_text (popup, ID_KEYCTX_ADDREV, _("Revoker..."));
1011    
1012 werner 36 /* change popup texts */
1013     set_menu_text_bypos (popup, 0, _("Key Attributes"));
1014     set_menu_text_bypos (popup, 6, _("Add"));
1015     set_menu_text_bypos (popup, 19, _("Send to Keyserver"));
1016 twoaday 123
1017     if (km_check_for_seckey (kmi->lv, l_idx, &i))
1018 werner 36 set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);
1019     if (i == 0)
1020     set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);
1021 twoaday 123 if (!km_check_for_seckey (kmi->lv, l_idx, NULL)) {
1022     set_menu_state (popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED);
1023     set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1024     set_menu_state (popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED);
1025     set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1026     set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );
1027 werner 36 set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);
1028     }
1029 twoaday 123 else if (km_check_for_seckey (kmi->lv, l_idx, NULL) &&
1030     km_key_is_v3 (kmi->lv, l_idx)) {
1031 werner 36 /* PGP 2 keys, version 3 have no no support for photo-id's,
1032     designated revokers and secondary keys. */
1033     set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
1034     set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
1035     set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);
1036     }
1037 twoaday 123 if (km_get_key_status( kmi->lv, l_idx ) & KM_FLAG_DISABLED)
1038     set_menu_state (popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED);
1039 werner 36 else
1040 twoaday 123 set_menu_state (popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED);
1041     if (km_get_key_status (kmi->lv, l_idx) & KM_FLAG_REVOKED ||
1042     km_get_key_status (kmi->lv, l_idx) & KM_FLAG_EXPIRED)
1043 werner 36 set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);
1044 twoaday 123 if (!clip_contains_pgpkey ())
1045     set_menu_state (popup, ID_KEYCTX_PASTE, MF_DISABLED|MF_GRAYED);
1046     if (mapi_init ())
1047 werner 36 set_menu_state (popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED);
1048     /* Override 'Default Keyserver' with the actual name. */
1049     host = kserver_get_hostname (0, -1, &port);
1050     set_menu_text (popup, ID_KEYCTX_KS_DEFAULT, host);
1051     popup_gpg_readonly (dlg, popup);
1052 twoaday 121 if (listview_count_items (kmi->lv, 1) > 1)
1053 twoaday 123 popup_multiple (dlg, popup);
1054 werner 36 TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);
1055     DestroyMenu (popup);
1056     DestroyMenu (hm);
1057     return TRUE;
1058     }
1059     #if 0 /* XXX */
1060     if( notify->idFrom == IDC_KEYMISC_GROUP ) {
1061     HWND tree = GetDlgItem( dlg, IDC_KEYMISC_GROUP );
1062     if( TreeView_GetSelection( tree ) ) {
1063     GetCursorPos( &p );
1064     hm = LoadMenu( glob_hinst, MAKEINTRESOURCE(IDR_WINPT_GROUP_CTX) );
1065 twoaday 123 popup = GetSubMenu (hm, 0);
1066     if (km_index == -1) /* XXX */
1067 werner 36 set_menu_state( popup, ID_GROUP_PASTE, MF_DISABLED|MF_GRAYED );
1068     set_menu_text( popup, ID_GROUP_PASTE, _("Paste into this group") );
1069     set_menu_text( popup, ID_GROUP_DELETE, _("Delete") );
1070     TrackPopupMenu( popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL );
1071     DestroyMenu( popup );
1072     DestroyMenu( hm );
1073     return TRUE;
1074     }
1075     }
1076     #endif
1077     break;
1078    
1079     case LVN_COLUMNCLICK:
1080     if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
1081 twoaday 123 NMLISTVIEW *nft = (LPNMLISTVIEW) lparam;
1082 werner 36 int sortby = 0;
1083 twoaday 123 switch (nft->iSubItem) {
1084 werner 36 case 0: sortby = KEY_SORT_USERID; break;
1085     case 1: sortby = KEY_SORT_KEYID; break;
1086     case 2: sortby = KEY_SORT_IS_SECRET; break;
1087     case 3: sortby = KEY_SORT_LEN; break;
1088     case 5: sortby = KEY_SORT_VALIDITY; break;
1089     case 6: sortby = KEY_SORT_OTRUST; break;
1090     case 7: sortby = KEY_SORT_CREATED; break;
1091     case 8: sortby = KEY_SORT_ALGO; break;
1092     default: return TRUE; //sortby = KEY_SORT_USERID; break;
1093     }
1094    
1095     if ((kmi->keylist_sortby & ~KEYLIST_SORT_DESC) == sortby)
1096     kmi->keylist_sortby ^= KEYLIST_SORT_DESC;
1097     else
1098     kmi->keylist_sortby = sortby;
1099     keylist_sort (kmi->lv, kmi->keylist_sortby);
1100     return TRUE;
1101     }
1102     break;
1103     }
1104     break;
1105    
1106     case WM_WINDOWPOSCHANGING:
1107     if (((WINDOWPOS*)lparam)->cx < 400)
1108     ((WINDOWPOS*)lparam)->cx = 400;
1109     if (((WINDOWPOS*)lparam)->cy < 200)
1110     ((WINDOWPOS*)lparam)->cy = 200;
1111     return TRUE;
1112    
1113     case WM_SIZE:
1114     do_resize_window (dlg, kmi);
1115     return TRUE;
1116    
1117     case WM_SYSCOMMAND:
1118 twoaday 123 if (LOWORD (wparam) == SC_CLOSE)
1119     EndDialog (dlg, TRUE);
1120 werner 36 return FALSE;
1121    
1122     case WM_MENUSELECT:
1123 twoaday 123 change_edit_menu (kmi->lv, (HMENU)lparam, LOWORD (wparam));
1124     change_key_menu ((HMENU)lparam, LOWORD (wparam));
1125 werner 36 break;
1126    
1127     case WM_INITMENUPOPUP:
1128     if ((UINT)LOWORD (lparam) == 3) {
1129 twoaday 123 HMENU h = (HMENU)wparam;
1130     set_menu_text_bypos (h, 0, _("New"));
1131 werner 36 }
1132     return FALSE;
1133    
1134     case WM_COMMAND:
1135 twoaday 123 /* Allow at least 'Exit' in such a case. */
1136 twoaday 120 if (gnupg_access_keyring (1) && LOWORD (wparam) != ID_KEYMISC_QUIT) {
1137 twoaday 123 msg_box (dlg, _("Could not access public keyring"),
1138     _("Key Manager"), MB_ERR);
1139 werner 36 return FALSE;
1140     }
1141 twoaday 123 do_check_cache (kmi->lv, dlg, kmi->statbar);
1142     switch( LOWORD (wparam)) {
1143 werner 36 case ID_KEYMISC_QUIT:
1144 twoaday 123 EndDialog (dlg, TRUE);
1145 werner 36 return TRUE;
1146    
1147     case ID_KEYMISC_MAIL:
1148     /* XXX
1149     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_MAIL, GetDesktopWindow (),
1150     winpt_mail_proc, NULL);*/
1151     break;
1152    
1153     case ID_KEYMISC_FIND:
1154     km_find_key (dlg, kmi->lv);
1155     break;
1156    
1157     case ID_KEYMISC_DELETE:
1158 twoaday 123 case ID_KEYMISC_DELETE2:
1159     if (!km_delete_keys (kmi->lv, dlg))
1160     km_update_status_bar (kmi->statbar, kmi->lv);
1161 werner 36 return TRUE;
1162    
1163 twoaday 123 case ID_KEYMISC_SIGN:
1164     if (kmi->lv_idx == -1) {
1165     msg_box (dlg, _("Please select a key."),
1166     _("Key Manager"), MB_ERR);
1167 werner 36 return TRUE;;
1168     }
1169 twoaday 123 if (km_check_key_status (kmi->lv, kmi->lv_idx))
1170 werner 36 return TRUE;
1171 twoaday 123 key = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1172     listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1173 werner 36 memset (&k, 0, sizeof (k));
1174     k.ctx = key;
1175     k.keyid = keyid;
1176     dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIGN, dlg,
1177     keysign_dlg_proc, (LPARAM)&k,
1178     _("Key Signing"), IDS_WINPT_KEYSIGN);
1179     if (k.update)
1180 twoaday 123 update_key (kmi->lv, kmi->lv_idx, k.keyid, 0);
1181 werner 36 return TRUE;
1182    
1183     case ID_KEYMISC_REVCERT:
1184 twoaday 123 if (kmi->lv_idx == -1) {
1185     msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1186 werner 36 return TRUE;
1187     }
1188 twoaday 123 listview_get_item_text (kmi->lv, kmi->lv_idx, 0, uid, sizeof uid-1);
1189     listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, sizeof keyid-1);
1190     if ( !km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL ) ) {
1191     msg_box (dlg, _("There is no secret key available!"),
1192     _("Key Manager"), MB_ERR);
1193 werner 36 return TRUE;
1194     }
1195    
1196     {
1197 twoaday 123 char state[64];
1198     listview_get_item_text (kmi->lv, kmi->lv_idx, 5,
1199     state, sizeof (state) -1);
1200     if( strchr (state, 'R' )) {
1201 twoaday 104 msg_box (dlg, _("Key already revoked!"),
1202     _("Key Manager"), MB_INFO);
1203 werner 36 return TRUE;
1204     }
1205     }
1206    
1207     memset (&k, 0, sizeof (k));
1208     k.key_pair = 1;
1209     k.keyid = keyid;
1210 twoaday 123 k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1211 werner 36 dialog_box_param(glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,
1212     key_revoke_dlg_proc, (LPARAM)&k,
1213     _("Key Revocation"), IDS_WINPT_KEYREVOKE);
1214     return TRUE;
1215    
1216     case ID_KEYMISC_TRUSTPATH:
1217 twoaday 123 if (kmi->lv_idx == -1) {
1218     msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1219 werner 36 return TRUE;
1220     }
1221 twoaday 123 listview_get_item_text( kmi->lv, kmi->lv_idx, 0, uid, sizeof uid -1 );
1222     listview_get_item_text( kmi->lv, kmi->lv_idx, 1, keyid, sizeof keyid -1 );
1223     if( km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL ) ) {
1224 werner 36 msg_box( dlg, _("It does not make any sense with a key pair!"), _("Key Manager"), MB_OK );
1225 twoaday 123 return TRUE;
1226 werner 36 }
1227     memset (&k, 0, sizeof (k));
1228     k.keyid = keyid;
1229     k.uid = uid;
1230     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYTRUST, dlg,
1231     keytrust_dlg_proc, (LPARAM)&k,
1232     _("List Trust Path"), IDS_WINPT_KEYTRUST );
1233     return TRUE;
1234    
1235 twoaday 123 case ID_KEYMISC_CHECKSIGS:
1236     if (kmi->lv_idx == -1) {
1237     msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1238     return TRUE;
1239 werner 36 }
1240 twoaday 123 listview_get_item_text (kmi->lv, kmi->lv_idx, 0, uid, DIM (uid)-1);
1241     listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1242 werner 36 memset (&k, 0, sizeof (k));
1243     k.keyid = keyid;
1244     k.uid = uid;
1245 twoaday 123 k.ctx = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1246 werner 36 dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,
1247     keysig_dlg_proc, (LPARAM)&k,
1248     _("Key Signature List" ), IDS_WINPT_KEYSIG);
1249     return TRUE;
1250    
1251 twoaday 123 case ID_KEYMISC_PROPS:
1252     if (kmi->lv_idx == -1) {
1253 werner 36 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
1254 twoaday 123 return TRUE;
1255 werner 36 }
1256 twoaday 123 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1257     listview_get_item_text (kmi->lv, kmi->lv_idx, 2, type, DIM (type)-1);
1258 werner 36 memset (&k, 0, sizeof (k));
1259     k.key_pair = 0;
1260     k.keyid = keyid;
1261     if( !strcmp( type, "pub/sec" ) || !strcmp( type, "pub/crd" ) )
1262     k.key_pair = 1;
1263     k.callback.ctl = kmi->lv;
1264 twoaday 123 k.callback.idx = kmi->lv_idx;
1265     k.is_v3 = km_key_is_v3 (kmi->lv, kmi->lv_idx);
1266 werner 36 dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,
1267     keyprops_dlg_proc, (LPARAM)&k,
1268     _("Key Properties"), IDS_WINPT_KEYPROPS );
1269     if (k.callback.new_val != 0) {
1270     t = get_key_trust_str (k.callback.new_val);
1271 twoaday 123 listview_add_sub_item (kmi->lv, kmi->lv_idx, 6, t);
1272 werner 36 }
1273     return TRUE;
1274    
1275     case ID_KEYMISC_RECACHE:
1276     /* If there is already a reload request, don't bother the user with a message. */
1277 twoaday 123 if (keycache_get_reload() == 1)
1278     l_idx = IDYES;
1279 werner 36 else {
1280 twoaday 104 char inf[256];
1281     _snprintf (inf, sizeof (inf) -1,
1282 werner 36 _("This is only useful when the keyring has been "
1283     "modified (sign a key...).\n"
1284 twoaday 104 "Do you really want to reload the keycache?"));
1285 twoaday 123 l_idx = msg_box (dlg, inf, _("Key Manager"), MB_YESNO);
1286 werner 36 }
1287 twoaday 123 if (l_idx == IDYES) {
1288 werner 36 rcs.kr_reload = rcs.kr_update = 1;
1289     rcs.tr_update = 0;
1290 twoaday 123 DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,
1291     keycache_dlg_proc, (LPARAM)&rcs);
1292     c = keycache_get_ctx (1);
1293     if (!c)
1294     BUG (dlg);
1295     keylist_reload (kmi->lv, c, KEYLIST_LIST, KEY_SORT_USERID);
1296 werner 36 refresh_keys = 0;
1297     }
1298     return TRUE;
1299    
1300     case ID_KEYMISC_REBUILD:
1301 twoaday 123 name = NULL;
1302 werner 36 gpg_rebuild_cache (&name);
1303 twoaday 123 if (name != NULL) {
1304     char *line = strchr (name, '\n');
1305     show_msg (dlg, 2000, line? name + (line-name)+1 : name);
1306     safe_free (name);
1307 werner 36 }
1308     return TRUE;
1309    
1310     case ID_KEYMISC_NEWKEY:
1311     memset (&genkey, 0, sizeof (genkey));
1312     dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,
1313 twoaday 123 keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),
1314 werner 36 IDS_WINPT_KEYGEN);
1315 twoaday 119 if (genkey.newkey != NULL) {
1316 werner 36 keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1317 twoaday 119 keylist_sort (kmi->lv, KEY_SORT_USERID);
1318     }
1319 werner 36 return TRUE;
1320    
1321     case ID_KEYMISC_CARDNEW:
1322 twoaday 123 if (!scard_support) {
1323     msg_box (dlg, _("Smart Card support is not available."),
1324     _("Key Manager"), MB_INFO);
1325 werner 36 return TRUE;
1326     }
1327 twoaday 123 dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,
1328 twoaday 65 card_keygen_dlg_proc, 0, _("Card Key Generation"),
1329 twoaday 123 IDS_WINPT_CARD_KEYGEN);
1330 werner 36 /* XXX: use new code */
1331 twoaday 123 if (keycache_get_reload ())
1332     send_cmd_id (dlg, ID_KEYMISC_RECACHE);
1333 werner 36 return TRUE;
1334    
1335     case ID_KEYMISC_KEYWIZARD:
1336     memset (&genkey, 0, sizeof (genkey));
1337     dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,
1338 twoaday 123 keygen_wizard_dlg_proc, (LPARAM)&genkey,
1339     _("Key Generation Wizard"),
1340 werner 36 IDS_WINPT_KEYWIZARD);
1341 twoaday 119 if (genkey.newkey != NULL) {
1342 werner 36 keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1343 twoaday 119 keylist_sort (kmi->lv, KEY_SORT_USERID);
1344     }
1345 werner 36 return TRUE;
1346    
1347     case ID_KEYMISC_SENDRECV:
1348 twoaday 115 memset (&genkey, 0, sizeof (genkey));
1349 twoaday 123 dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,
1350     keyserver_dlg_proc, (LPARAM)&genkey, _("Keyserver Access"),
1351     IDS_WINPT_KEYSERVER);
1352 twoaday 119 if (genkey.newkey != NULL) {
1353     keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1354     keylist_sort (kmi->lv, KEY_SORT_USERID);
1355     }
1356 werner 36 return TRUE;
1357    
1358     case ID_KEYMISC_GPGPREFS:
1359     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGPREFS, dlg,
1360 twoaday 65 gpgprefs_dlg_proc, 0, _("GnuPG Preferences"),
1361 werner 36 IDS_WINPT_GPGPREFS );
1362     return TRUE;
1363    
1364     case ID_KEYMISC_GPGOPT:
1365     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGOPT, dlg,
1366 twoaday 65 gpgopt_dlg_proc, 0, _("GnuPG Options" ),
1367 werner 36 IDS_WINPT_GPGOPT );
1368     return TRUE;
1369    
1370     case ID_KEYMISC_IMPORT:
1371 twoaday 77 t = get_fileopen_dlg (dlg, _("Choose Name of the Key File"), NULL, NULL);
1372 werner 36 if (t)
1373     km_file_import (dlg, t);
1374     return TRUE;
1375    
1376     case ID_KEYMISC_IMPORT_HTTP:
1377     url = (struct URL_ctx_s*)get_http_file_dlg (dlg);
1378     if (url->cancel == 0)
1379     km_http_import (dlg, url->url);
1380     delete url; url=NULL;
1381     break;
1382    
1383     case ID_KEYMISC_EXPORT:
1384 twoaday 123 if (kmi->lv_idx == -1) {
1385 werner 36 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
1386     return TRUE;
1387     }
1388     if (listview_count_items (kmi->lv, 1) > 1)
1389     name = m_strdup ("Exported_GPG_Keys.asc");
1390     else {
1391 twoaday 123 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1392 werner 36 name = gen_export_filename (keyid, 0);
1393     }
1394 twoaday 77 t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1395 werner 36 free_if_alloc (name);
1396     if (t == NULL)
1397     return TRUE;
1398     km_file_export (dlg, kmi->lv, t);
1399     return TRUE;
1400    
1401     case ID_KEYMISC_EXPORT_PRIVKEY:
1402 twoaday 123 if (kmi->lv_idx == -1) {
1403     msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1404 werner 36 return TRUE;
1405     }
1406 twoaday 123 if( !km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL ) ) {
1407     msg_box (dlg, _("There is no corresponding secret key for this key."),
1408     _("Key Manager"), MB_ERR);
1409 werner 36 return TRUE;
1410     }
1411 twoaday 123 if (listview_count_items (kmi->lv, 1) > 1) {
1412     msg_box (dlg, _("You can only export one secret key."),
1413     _("Key Manager"), MB_ERR);
1414 werner 36 return TRUE;
1415     }
1416 twoaday 123 i = msg_box (dlg,
1417 werner 36 _("This operation will export your *SECRET* key!\n\n"
1418     "Never send this key to ANYONE, it should be available\n"
1419     "ONLY on your machine and you may use this function\n"
1420     "to copy the key to a safe place.\n\n"
1421     "Do you really want to export the key?"),
1422 twoaday 123 _("WARNING"), MB_INFO|MB_YESNO);
1423     if( i == IDYES ) {
1424     listview_get_item_text( kmi->lv, kmi->lv_idx, 1, keyid, sizeof (keyid)-8 );
1425 werner 36 name = gen_export_filename (keyid, 1);
1426 twoaday 77 t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1427 werner 36 if (t != NULL)
1428     km_privkey_export (dlg, kmi->lv, t);
1429     }
1430 twoaday 123 return TRUE;
1431 werner 36
1432     case ID_KEYMISC_INFO:
1433 twoaday 123 dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,
1434 twoaday 65 about_winpt_dlg_proc, 0, _("About WinPT"),
1435 twoaday 123 IDS_WINPT_ABOUT);
1436 werner 36 break;
1437    
1438     case ID_KEYMISC_HELP:
1439     ShellExecute (dlg, "open", "winpt.chm", NULL, NULL, SW_SHOW);
1440     break;
1441    
1442     case ID_KEYMISC_OT:
1443     dialog_box_param( glob_hinst, (LPCTSTR)IDD_WINPT_OWNERTRUST, glob_hwnd,
1444 twoaday 65 ownertrust_dlg_proc, 0,
1445 werner 36 _("Ownertrust"), IDS_WINPT_OWNERTRUST );
1446     break;
1447    
1448 twoaday 123 case ID_KEYMISC_EDITKEY:
1449     if (kmi->lv_idx == -1)
1450 werner 36 break;
1451 twoaday 123 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, sizeof (keyid)-1);
1452 werner 36 /* XXX: pub/crd = secret key does not work */
1453     memset (&k, 0, sizeof (k));
1454 twoaday 123 k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1455     k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1456 werner 36 k.keyid = keyid;
1457 twoaday 123 k.is_v3 = km_key_is_v3 (kmi->lv, kmi->lv_idx);
1458     k.flags = km_get_key_status (kmi->lv, kmi->lv_idx);
1459 werner 36 dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,
1460     keyedit_main_dlg_proc, (LPARAM)&k,
1461     _("Key Edit"), IDS_KEYCTX_EDIT);
1462     if (k.update)
1463 twoaday 123 update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1464 werner 36 break;
1465    
1466     case ID_KEYMISC_COPY:
1467     km_clip_export (dlg, kmi->lv);
1468     break;
1469    
1470     case ID_KEYMISC_SELALL:
1471     listview_select_all (kmi->lv);
1472     break;
1473    
1474     case ID_KEYMISC_PASTE:
1475     km_clip_import (dlg);
1476     break;
1477    
1478     case ID_KEYCTX_SETPREFKS:
1479 twoaday 123 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM(keyid)-1);
1480 werner 36 memset (&k, 0, sizeof (k));
1481     k.keyid = keyid;
1482     keyedit_set_pref_keyserver (&k, dlg);
1483     break;
1484    
1485     case ID_KEYMISC_REFRESH_KEYS:
1486     if (listview_count_items (kmi->lv, 1) == 0) {
1487     msg_box (dlg, _("No key was selected, select all by default."), _("Key Manager"), MB_INFO);
1488     listview_select_all (kmi->lv);
1489     }
1490     km_refresh_from_keyserver (kmi->lv, dlg);
1491     break;
1492    
1493     /** Context menu **/
1494     case ID_KEYCTX_EDIT:
1495     send_cmd_id( dlg, ID_KEYMISC_EDITKEY );
1496     break;
1497    
1498     case ID_KEYCTX_PROPS:
1499     send_cmd_id( dlg, ID_KEYMISC_PROPS );
1500     break;
1501    
1502     case ID_KEYCTX_UIDS:
1503     send_cmd_id( dlg, ID_KEYMISC_UID );
1504     break;
1505    
1506     case ID_KEYCTX_SIGN:
1507     send_cmd_id( dlg, ID_KEYMISC_SIGN );
1508     break;
1509    
1510     case ID_KEYCTX_DEL:
1511     send_cmd_id (dlg, ID_KEYMISC_DELETE);
1512     break;
1513    
1514     case ID_KEYCTX_REV:
1515     send_cmd_id( dlg, ID_KEYMISC_REVCERT );
1516     break;
1517    
1518     case ID_KEYCTX_SENDMAIL:
1519     km_send_to_mail_recipient (kmi->lv, dlg);
1520     break;
1521    
1522     case ID_KEYCTX_KS_DEFAULT:
1523     host = kserver_get_hostname (0, -1, &port);
1524     km_send_to_keyserver (kmi->lv, dlg, host, port);
1525     break;
1526    
1527     case ID_KEYCTX_ADDKEY:
1528 twoaday 123 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1529 werner 36 memset (&k, 0, sizeof (k));
1530 twoaday 123 k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1531     k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1532 werner 36 k.keyid = keyid;
1533     keyedit_add_subkey (&k, dlg, NULL);
1534     if (k.update)
1535 twoaday 123 update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1536 werner 36 break;
1537    
1538     case ID_KEYCTX_ADDUID:
1539 twoaday 123 listview_get_item_text( kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1540 werner 36 memset (&k, 0, sizeof (k));
1541 twoaday 123 k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1542     k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1543 werner 36 k.keyid = keyid;
1544     keyedit_add_userid (&k, dlg, NULL);
1545     if (k.update)
1546 twoaday 123 update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1547 werner 36 break;
1548    
1549     case ID_KEYCTX_ADDREV:
1550 twoaday 123 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1551 werner 36 memset (&k, 0, sizeof (k));
1552     k.keyid = keyid;
1553 twoaday 123 k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1554     k.key_pair = km_check_for_seckey( kmi->lv, kmi->lv_idx, NULL );
1555 werner 36 keyedit_add_revoker (&k, dlg);
1556     if (k.update)
1557 twoaday 123 update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1558 werner 36 break;
1559    
1560     case ID_KEYCTX_ADDPHOTO:
1561 twoaday 123 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1562 werner 36 memset (&k, 0, sizeof (k));
1563     k.keyid = keyid;
1564 twoaday 123 k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1565     k.key_pair = km_check_for_seckey (kmi->lv, kmi->lv_idx, NULL);
1566 werner 36 keyedit_add_photo (&k, dlg);
1567     if (k.update)
1568 twoaday 123 update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1569 werner 36 break;
1570    
1571     case ID_KEYCTX_KS_NL:
1572     case ID_KEYCTX_KS_PL:
1573     case ID_KEYCTX_KS_AT:
1574     case ID_KEYCTX_KS_DE:
1575     case ID_KEYCTX_KS_DK:
1576     case ID_KEYCTX_KS_CZ:
1577     case ID_KEYCTX_KS_ES:
1578     case ID_KEYCTX_KS_UK:
1579     host = kserver_get_hostname (LOWORD (wparam) - 40107, 0, &port);
1580     km_send_to_keyserver (kmi->lv, dlg, host, port);
1581     break;
1582    
1583     case ID_KEYCTX_RECVFROM:
1584     km_refresh_from_keyserver (kmi->lv, dlg);
1585     break;
1586    
1587     case ID_KEYCTX_UID_COPY:
1588     /* XXX: add generic function to support multiple selection
1589     with a callback */
1590 twoaday 123 listview_get_item_text( kmi->lv, kmi->lv_idx, 0, uid, sizeof uid-1 );
1591 werner 36 set_clip_text( NULL, uid, strlen( uid ) );
1592     break;
1593    
1594     case ID_KEYCTX_KEYID_COPY:
1595 twoaday 123 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, uid, sizeof uid-1);
1596     set_clip_text (NULL, uid, strlen (uid));
1597 werner 36 break;
1598    
1599     case ID_KEYCTX_FPR_COPY:
1600 twoaday 123 key = (gpgme_key_t) listview_get_item2 (kmi->lv, kmi->lv_idx);
1601 werner 36 if (key) {
1602 twoaday 123 t = get_key_fpr (key);
1603     set_clip_text (NULL, t? t : "", t? strlen (t): 0);
1604 werner 36 }
1605     break;
1606    
1607     case ID_KEYCTX_KINFO_COPY:
1608 twoaday 123 listview_get_item_text( kmi->lv, kmi->lv_idx, 1, uid, sizeof uid-1 );
1609 werner 36 km_set_clip_info( uid );
1610     break;
1611    
1612     case ID_KEYCTX_COPY:
1613     km_clip_export (dlg, kmi->lv);
1614     break;
1615    
1616 twoaday 123 case ID_KEYCTX_PASTE:
1617 werner 36 km_clip_import (dlg);
1618     break;
1619    
1620     case ID_KEYCTX_DISABLE:
1621     case ID_KEYCTX_ENABLE:
1622 twoaday 123 i = LOWORD (wparam) == ID_KEYCTX_ENABLE? 1 : 0;
1623     listview_get_item_text (kmi->lv, kmi->lv_idx, KM_COL_KEYID,
1624     keyid, DIM (keyid)-1);
1625     rc = km_enable_disable_key (kmi->lv, dlg, kmi->lv_idx, i);
1626     if (!rc)
1627     update_key (kmi->lv, kmi->lv_idx, keyid, 0);
1628     /* XXX: switching a key from disabled -> enabled. does not
1629     change the validity field in the KM. */
1630 werner 36 break;
1631    
1632     case ID_KEYCTX_LISTSIGS:
1633     send_cmd_id (dlg, ID_KEYMISC_CHECKSIGS);
1634     break;
1635    
1636     case ID_KEYCTX_MAXTRUST:
1637 twoaday 123 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1638     rc = km_set_implicit_trust (dlg, kmi->lv, kmi->lv_idx);
1639 werner 36 if (!rc)
1640 twoaday 123 update_key (kmi->lv, kmi->lv_idx, keyid, 0);
1641 werner 36 break;
1642    
1643     case ID_KEYCTX_SETDEFKEY:
1644 twoaday 123 if (!km_check_key_status (kmi->lv, kmi->lv_idx)) {
1645     listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1646 werner 36 rc = set_gnupg_default_key (keyid);
1647     if (rc)
1648 twoaday 123 msg_box (dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);
1649 werner 36 km_update_default_key_str (kmi->statbar);
1650     }
1651     break;
1652    
1653     case ID_GROUP_NEW:
1654     case ID_GROUP_PASTE:
1655     case ID_GROUP_DELETE:
1656 twoaday 123 /* XXX: Implement group manager. */
1657     return TRUE;
1658 werner 36 }
1659    
1660     break;
1661     }
1662    
1663     return FALSE;
1664     }
1665    
1666    
1667    

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26