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

Contents of /trunk/Src/wptKeyManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 123 - (show 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 /* 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 #include "resource.h"
29 #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 /* Name and ID of the separator window. */
46 #define KM_SEPARATOR_ID 10000
47 #define WINDOWCLASS_SEPARATOR_CHILD "WINPT_SEP_CHILD"
48
49 /* 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
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 int lv_idx;
79 int keylist_sortby;
80 };
81
82 /* Toolbar button structure. */
83 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 /* Subclass the keylist listview control to allow extended commands. */
99 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 send_cmd_id (keylist_proc.dlg, ID_KEYMISC_PROPS);
114 break;
115
116 case VK_DELETE:
117 send_cmd_id (keylist_proc.dlg, ID_KEYMISC_DELETE);
118 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 if (GetAsyncKeyState (VK_CONTROL))
140 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 return CallWindowProc (keylist_proc.old, dlg, msg, wparam, lparam);
154 }
155
156
157 static HWND
158 load_toolbar (HWND dlg, struct km_info *kmi)
159 {
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 SendMessage (tbwnd, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
177 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 SendMessage (tbwnd, TB_ADDBUTTONS, sizeof(tb_buttons) / sizeof(tb_buttons[0]),
187 (LONG)&tb_buttons[0]);
188 }
189 return tbwnd;
190 }
191
192
193 /* Center window @dlg. */
194 static void
195 do_center_window (HWND dlg, struct km_info *kmi)
196 {
197 RECT rect;
198 char *p;
199 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 p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X");
208 if (p && !strcmp (p, " ")) {
209 free_if_alloc (p);
210 center_window (dlg, NULL);
211 return;
212 }
213 else if (p)
214 pos_x = atol (p);
215
216 p = get_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y");
217 if (p && !strcmp (p, " ")) {
218 free_if_alloc (p);
219 center_window (dlg, NULL);
220 return;
221 }
222 else if (p)
223 pos_y = atol (p);
224
225 if (!pos_y && !pos_x) {
226 center_window (dlg, NULL);
227 return;
228 }
229
230 if (pos_x < 0 || pos_y < 0)
231 pos_x = pos_y = 0;
232 if (pos_x > GetSystemMetrics (SM_CXSCREEN)
233 || pos_y > GetSystemMetrics (SM_CYSCREEN)) {
234 pos_x = pos_y = 0;
235 }
236 GetClientRect (dlg, &rect);
237 MoveWindow (dlg, pos_x, pos_y, rect.right, rect.bottom, TRUE);
238 }
239
240
241 /* Resize the key manager window with the information from @kmi. */
242 static void
243 do_resize_window (HWND dlg, struct km_info *kmi)
244 {
245 HWND h;
246 RECT rclient, rect;
247 BOOL bRepaint = FALSE;
248
249 /* Get rect of client area and make life easier */
250 GetClientRect (dlg, &rclient);
251
252 /* Move toolbar to the top of the window */
253 if (kmi->toolbar) {
254 GetWindowRect (kmi->toolbar, &rect);
255 ScreenToClient (dlg, (POINT*)&rect);
256 ScreenToClient (dlg, (POINT*)&(rect.right));
257
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 GetWindowRect (kmi->statbar, &rect);
266 ScreenToClient (dlg, (POINT*)&rect);
267 ScreenToClient (dlg, (POINT*)&(rect.right));
268
269 rclient.bottom -= rect.bottom - rect.top;
270 MoveWindow (kmi->statbar, 0, rclient.bottom,
271 rclient.right - rclient.left,
272 rect.bottom - rect.top, bRepaint);
273 }
274
275 /* Obtain separator information and move it to the desired posistion */
276 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 /* Don't move away */
282 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 MoveWindow (kmi->hwnd_sep, 0, kmi->ypos_sep,
287 (rclient.right - rclient.left), 5, bRepaint);
288
289 /* Place the keylist above the separator */
290 h = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
291 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 h = GetDlgItem (dlg, IDC_KEYMISC_GTEXT);
297 MoveWindow (h, rclient.left, rclient.top, 100, 14, bRepaint);
298 rclient.top += 18;
299
300 h = GetDlgItem (dlg, IDC_KEYMISC_GROUP);
301 MoveWindow (h, rclient.left, rclient.top, rclient.right - rclient.left,
302 (rclient.bottom < rclient.top) ?
303 0 : rclient.bottom - rclient.top, bRepaint);
304
305 /* Repaint the whole thing */
306 InvalidateRect (dlg, NULL, TRUE);
307 }
308
309
310 /* 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 static void
330 do_create_minpopup (HWND dlg)
331 {
332 HMENU hm;
333 MENUITEMINFO mi;
334 char * s;
335 POINT p;
336
337 if (gpg_read_only || !clip_contains_pgpkey ())
338 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 }
355
356
357 /* Reload the key cache if requested. */
358 static void
359 do_check_cache (listview_ctrl_t lv, HWND dlg, HWND sb)
360 {
361 gpg_keycache_t cache;
362
363 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 km_update_status_bar (sb, lv);
371 }
372 }
373
374
375 long CALLBACK
376 separator_wnd_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
377 {
378 static POINT last_mouse_pos;
379
380 if (msg == WM_CREATE)
381 SetWindowLong (hwnd, GWL_USERDATA,
382 (long)(((CREATESTRUCT*)lparam)->lpCreateParams));
383
384 switch (msg) {
385 case WM_PAINT:
386 PAINTSTRUCT ps;
387 RECT rect;
388 HPEN hpen;
389
390 GetClientRect (hwnd, &rect);
391 BeginPaint (hwnd, &ps);
392
393 /* Background */
394 FillRect (ps.hdc, &rect, (HBRUSH)(COLOR_3DFACE+1));
395
396 /* The lines from the light into the dark */
397 MoveToEx(ps.hdc, 0,0, NULL);
398 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 }
403 MoveToEx(ps.hdc, 0, 1, NULL);
404 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 }
409
410 MoveToEx(ps.hdc, 0, rect.bottom-1, NULL);
411 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 }
416 MoveToEx(ps.hdc, 0, rect.bottom, NULL);
417 if ((hpen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW))) != NULL) {
418 SelectObject (ps.hdc, (LPVOID)hpen);
419 LineTo (ps.hdc, rect.right, rect.bottom);
420 DeleteObject (hpen);
421 }
422
423 EndPaint (hwnd, &ps);
424 return 0;
425
426 case WM_LBUTTONDOWN:
427 last_mouse_pos.x = LOWORD (lparam);
428 last_mouse_pos.y = HIWORD (lparam);
429 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 RECT r;
442
443 kmi = (struct km_info *)GetWindowLong (hwnd, GWL_USERDATA);
444 if (kmi == NULL)
445 break;
446
447 /* Calculate mouse movement */
448 p.x = LOWORD(lparam);
449 p.y = HIWORD(lparam);
450 ClientToScreen (hwnd, &p);
451
452 GetWindowRect (hwnd, &r);
453 r.top += (short)(p.y - last_mouse_pos.y);
454 r.bottom += (short)(p.y - last_mouse_pos.y);
455
456 last_mouse_pos.y = p.y;
457
458 /* 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 do_resize_window (GetParent(hwnd), kmi);
464 return 0;
465 }
466 }
467
468 return DefWindowProc (hwnd, msg, wparam, lparam);
469 }
470
471
472 /* Register the separator window with @dlg as the parent window. */
473 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 }
497
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 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 ID_KEYMISC_CHECKSIGS, ID_KEYMISC_REVCERT, 0};
516 int i;
517
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 key_inv = km_get_key_status (lv, i) & KM_FLAG_REVOKED ||
527 km_get_key_status (lv, i) & KM_FLAG_EXPIRED;
528 }
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
548 /* 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 }
553 }
554
555
556 /* 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 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 int i;
576 for (i=0; i < resids[i] != 0; i++)
577 set_menu_state (hm, resids[i], MF_GRAYED);
578 }
579
580
581 /* 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 /* Change the 'Edit' menu based on the current state. */
610 static void
611 change_edit_menu (listview_ctrl_t lv, HMENU hm, int id)
612 {
613 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 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 int *resids;
653 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 default:resids = edit_resids; break;
663 }
664
665 for (i=0; resids[i] != 0; i++)
666 set_menu_state (hm, resids[i], MF_GRAYED);
667 }
668
669
670 /* 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 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 /* Reload a single key in the cache. */
697 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 HWND statbar;
718 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 km_update_status_bar (statbar, lv);
733
734 return statbar;
735 }
736
737
738 /* Dialog box procedure for the Key Manager. */
739 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 const char *t, *host;
756 u16 port = 0;
757 int l_idx = 0, i=0, rc;
758
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 kmi->lv_idx = -1;
768 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 SetWindowText (dlg, _("Key Manager"));
774 menu = LoadMenu (glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC);
775 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 set_menu_text_bypos (menu, 4, _("Groups"));
780 set_menu_text (menu, ID_KEYMISC_EDITKEY, _("Edit"));
781 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 set_menu_text (menu, ID_KEYMISC_DELETE2, _("&Delete"));
795 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
811 /* XXX: implement help code. */
812 set_menu_state (menu, ID_KEYMISC_HELP, MF_GRAYED);
813
814 SetMenu (dlg, menu);
815 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 kmi->keylist_sortby = KEY_SORT_USERID;
823 Header_SetImageList(ListView_GetHeader (GetDlgItem (dlg, IDC_KEYMISC_KEYLIST)),
824 glob_imagelist);
825 kmi->lv = keylist_load (GetDlgItem (dlg, IDC_KEYMISC_KEYLIST), c,
826 NULL, KEYLIST_LIST, kmi->keylist_sortby);
827 /* init subclassing for the listview */
828 kl = GetDlgItem (dlg, IDC_KEYMISC_KEYLIST);
829 keylist_proc.dlg = dlg;
830 keylist_proc.current = (WNDPROC)keylist_subclass_proc;
831 keylist_proc.old = (WNDPROC)GetWindowLong( kl, GWL_WNDPROC );
832 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 }
838 }
839 #if 0
840 km_groups_new (&gc, GetDlgItem (dlg, IDC_KEYMISC_GROUP));
841 km_groups_load (gc);
842 #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
851 SetDlgItemText (dlg, IDC_KEYMISC_GTEXT, _("Groups"));
852 SetClassLong (dlg, GCL_HICON, (LONG)LoadIcon (glob_hinst,
853 (LPCTSTR)IDI_WINPT));
854 SetForegroundWindow (dlg);
855 return TRUE;
856
857 case WM_DESTROY:
858 if (kmi->lv) {
859 keylist_delete (kmi->lv);
860 kmi->lv = NULL;
861 }
862 imagelist_destroy ();
863
864 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
874 case WM_MOVE:
875 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 NMHDR *notify;
888 POINT p;
889 HMENU popup;
890
891 notify = (NMHDR *)lparam;
892 if (!notify)
893 break;
894 switch (notify->code) {
895 case TBN_QUERYDELETE:
896 SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
897 return TRUE;
898
899 case TBN_QUERYINSERT:
900 SetWindowLong (dlg, DWL_MSGRESULT, TRUE);
901 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 if (((LPNMLISTVIEW)lparam)->uNewState) { /* item selected? */
970 kmi->lv_idx = listview_get_curr_pos (kmi->lv);
971 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 l_idx =listview_get_curr_pos (kmi->lv);
979 if (l_idx == -1)
980 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
986 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
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 /* 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
1017 if (km_check_for_seckey (kmi->lv, l_idx, &i))
1018 set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);
1019 if (i == 0)
1020 set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);
1021 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 set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);
1028 }
1029 else if (km_check_for_seckey (kmi->lv, l_idx, NULL) &&
1030 km_key_is_v3 (kmi->lv, l_idx)) {
1031 /* 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 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 else
1040 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 set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);
1044 if (!clip_contains_pgpkey ())
1045 set_menu_state (popup, ID_KEYCTX_PASTE, MF_DISABLED|MF_GRAYED);
1046 if (mapi_init ())
1047 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 if (listview_count_items (kmi->lv, 1) > 1)
1053 popup_multiple (dlg, popup);
1054 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 popup = GetSubMenu (hm, 0);
1066 if (km_index == -1) /* XXX */
1067 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 NMLISTVIEW *nft = (LPNMLISTVIEW) lparam;
1082 int sortby = 0;
1083 switch (nft->iSubItem) {
1084 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 if (LOWORD (wparam) == SC_CLOSE)
1119 EndDialog (dlg, TRUE);
1120 return FALSE;
1121
1122 case WM_MENUSELECT:
1123 change_edit_menu (kmi->lv, (HMENU)lparam, LOWORD (wparam));
1124 change_key_menu ((HMENU)lparam, LOWORD (wparam));
1125 break;
1126
1127 case WM_INITMENUPOPUP:
1128 if ((UINT)LOWORD (lparam) == 3) {
1129 HMENU h = (HMENU)wparam;
1130 set_menu_text_bypos (h, 0, _("New"));
1131 }
1132 return FALSE;
1133
1134 case WM_COMMAND:
1135 /* Allow at least 'Exit' in such a case. */
1136 if (gnupg_access_keyring (1) && LOWORD (wparam) != ID_KEYMISC_QUIT) {
1137 msg_box (dlg, _("Could not access public keyring"),
1138 _("Key Manager"), MB_ERR);
1139 return FALSE;
1140 }
1141 do_check_cache (kmi->lv, dlg, kmi->statbar);
1142 switch( LOWORD (wparam)) {
1143 case ID_KEYMISC_QUIT:
1144 EndDialog (dlg, TRUE);
1145 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 case ID_KEYMISC_DELETE2:
1159 if (!km_delete_keys (kmi->lv, dlg))
1160 km_update_status_bar (kmi->statbar, kmi->lv);
1161 return TRUE;
1162
1163 case ID_KEYMISC_SIGN:
1164 if (kmi->lv_idx == -1) {
1165 msg_box (dlg, _("Please select a key."),
1166 _("Key Manager"), MB_ERR);
1167 return TRUE;;
1168 }
1169 if (km_check_key_status (kmi->lv, kmi->lv_idx))
1170 return TRUE;
1171 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 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 update_key (kmi->lv, kmi->lv_idx, k.keyid, 0);
1181 return TRUE;
1182
1183 case ID_KEYMISC_REVCERT:
1184 if (kmi->lv_idx == -1) {
1185 msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1186 return TRUE;
1187 }
1188 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 return TRUE;
1194 }
1195
1196 {
1197 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 msg_box (dlg, _("Key already revoked!"),
1202 _("Key Manager"), MB_INFO);
1203 return TRUE;
1204 }
1205 }
1206
1207 memset (&k, 0, sizeof (k));
1208 k.key_pair = 1;
1209 k.keyid = keyid;
1210 k.is_protected = km_check_if_protected (kmi->lv, kmi->lv_idx);
1211 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 if (kmi->lv_idx == -1) {
1218 msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1219 return TRUE;
1220 }
1221 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 msg_box( dlg, _("It does not make any sense with a key pair!"), _("Key Manager"), MB_OK );
1225 return TRUE;
1226 }
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 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 }
1240 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 memset (&k, 0, sizeof (k));
1243 k.keyid = keyid;
1244 k.uid = uid;
1245 k.ctx = (gpgme_key_t)listview_get_item2 (kmi->lv, kmi->lv_idx);
1246 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 case ID_KEYMISC_PROPS:
1252 if (kmi->lv_idx == -1) {
1253 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
1254 return TRUE;
1255 }
1256 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 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 k.callback.idx = kmi->lv_idx;
1265 k.is_v3 = km_key_is_v3 (kmi->lv, kmi->lv_idx);
1266 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 listview_add_sub_item (kmi->lv, kmi->lv_idx, 6, t);
1272 }
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 if (keycache_get_reload() == 1)
1278 l_idx = IDYES;
1279 else {
1280 char inf[256];
1281 _snprintf (inf, sizeof (inf) -1,
1282 _("This is only useful when the keyring has been "
1283 "modified (sign a key...).\n"
1284 "Do you really want to reload the keycache?"));
1285 l_idx = msg_box (dlg, inf, _("Key Manager"), MB_YESNO);
1286 }
1287 if (l_idx == IDYES) {
1288 rcs.kr_reload = rcs.kr_update = 1;
1289 rcs.tr_update = 0;
1290 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 refresh_keys = 0;
1297 }
1298 return TRUE;
1299
1300 case ID_KEYMISC_REBUILD:
1301 name = NULL;
1302 gpg_rebuild_cache (&name);
1303 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 }
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 keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),
1314 IDS_WINPT_KEYGEN);
1315 if (genkey.newkey != NULL) {
1316 keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1317 keylist_sort (kmi->lv, KEY_SORT_USERID);
1318 }
1319 return TRUE;
1320
1321 case ID_KEYMISC_CARDNEW:
1322 if (!scard_support) {
1323 msg_box (dlg, _("Smart Card support is not available."),
1324 _("Key Manager"), MB_INFO);
1325 return TRUE;
1326 }
1327 dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,
1328 card_keygen_dlg_proc, 0, _("Card Key Generation"),
1329 IDS_WINPT_CARD_KEYGEN);
1330 /* XXX: use new code */
1331 if (keycache_get_reload ())
1332 send_cmd_id (dlg, ID_KEYMISC_RECACHE);
1333 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 keygen_wizard_dlg_proc, (LPARAM)&genkey,
1339 _("Key Generation Wizard"),
1340 IDS_WINPT_KEYWIZARD);
1341 if (genkey.newkey != NULL) {
1342 keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1343 keylist_sort (kmi->lv, KEY_SORT_USERID);
1344 }
1345 return TRUE;
1346
1347 case ID_KEYMISC_SENDRECV:
1348 memset (&genkey, 0, sizeof (genkey));
1349 dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,
1350 keyserver_dlg_proc, (LPARAM)&genkey, _("Keyserver Access"),
1351 IDS_WINPT_KEYSERVER);
1352 if (genkey.newkey != NULL) {
1353 keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1354 keylist_sort (kmi->lv, KEY_SORT_USERID);
1355 }
1356 return TRUE;
1357
1358 case ID_KEYMISC_GPGPREFS:
1359 dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGPREFS, dlg,
1360 gpgprefs_dlg_proc, 0, _("GnuPG Preferences"),
1361 IDS_WINPT_GPGPREFS );
1362 return TRUE;
1363
1364 case ID_KEYMISC_GPGOPT:
1365 dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGOPT, dlg,
1366 gpgopt_dlg_proc, 0, _("GnuPG Options" ),
1367 IDS_WINPT_GPGOPT );
1368 return TRUE;
1369
1370 case ID_KEYMISC_IMPORT:
1371 t = get_fileopen_dlg (dlg, _("Choose Name of the Key File"), NULL, NULL);
1372 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 if (kmi->lv_idx == -1) {
1385 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 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1392 name = gen_export_filename (keyid, 0);
1393 }
1394 t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1395 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 if (kmi->lv_idx == -1) {
1403 msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
1404 return TRUE;
1405 }
1406 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 return TRUE;
1410 }
1411 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 return TRUE;
1415 }
1416 i = msg_box (dlg,
1417 _("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 _("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 name = gen_export_filename (keyid, 1);
1426 t = get_filesave_dlg (dlg, _("Choose Name for Key File"), NULL, name);
1427 if (t != NULL)
1428 km_privkey_export (dlg, kmi->lv, t);
1429 }
1430 return TRUE;
1431
1432 case ID_KEYMISC_INFO:
1433 dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,
1434 about_winpt_dlg_proc, 0, _("About WinPT"),
1435 IDS_WINPT_ABOUT);
1436 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 ownertrust_dlg_proc, 0,
1445 _("Ownertrust"), IDS_WINPT_OWNERTRUST );
1446 break;
1447
1448 case ID_KEYMISC_EDITKEY:
1449 if (kmi->lv_idx == -1)
1450 break;
1451 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, sizeof (keyid)-1);
1452 /* XXX: pub/crd = secret key does not work */
1453 memset (&k, 0, sizeof (k));
1454 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 k.keyid = keyid;
1457 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 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 update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1464 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 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM(keyid)-1);
1480 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 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1529 memset (&k, 0, sizeof (k));
1530 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 k.keyid = keyid;
1533 keyedit_add_subkey (&k, dlg, NULL);
1534 if (k.update)
1535 update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1536 break;
1537
1538 case ID_KEYCTX_ADDUID:
1539 listview_get_item_text( kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1540 memset (&k, 0, sizeof (k));
1541 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 k.keyid = keyid;
1544 keyedit_add_userid (&k, dlg, NULL);
1545 if (k.update)
1546 update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1547 break;
1548
1549 case ID_KEYCTX_ADDREV:
1550 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1551 memset (&k, 0, sizeof (k));
1552 k.keyid = keyid;
1553 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 keyedit_add_revoker (&k, dlg);
1556 if (k.update)
1557 update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1558 break;
1559
1560 case ID_KEYCTX_ADDPHOTO:
1561 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, keyid, DIM (keyid)-1);
1562 memset (&k, 0, sizeof (k));
1563 k.keyid = keyid;
1564 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 keyedit_add_photo (&k, dlg);
1567 if (k.update)
1568 update_key (kmi->lv, kmi->lv_idx, keyid, 1);
1569 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 listview_get_item_text( kmi->lv, kmi->lv_idx, 0, uid, sizeof uid-1 );
1591 set_clip_text( NULL, uid, strlen( uid ) );
1592 break;
1593
1594 case ID_KEYCTX_KEYID_COPY:
1595 listview_get_item_text (kmi->lv, kmi->lv_idx, 1, uid, sizeof uid-1);
1596 set_clip_text (NULL, uid, strlen (uid));
1597 break;
1598
1599 case ID_KEYCTX_FPR_COPY:
1600 key = (gpgme_key_t) listview_get_item2 (kmi->lv, kmi->lv_idx);
1601 if (key) {
1602 t = get_key_fpr (key);
1603 set_clip_text (NULL, t? t : "", t? strlen (t): 0);
1604 }
1605 break;
1606
1607 case ID_KEYCTX_KINFO_COPY:
1608 listview_get_item_text( kmi->lv, kmi->lv_idx, 1, uid, sizeof uid-1 );
1609 km_set_clip_info( uid );
1610 break;
1611
1612 case ID_KEYCTX_COPY:
1613 km_clip_export (dlg, kmi->lv);
1614 break;
1615
1616 case ID_KEYCTX_PASTE:
1617 km_clip_import (dlg);
1618 break;
1619
1620 case ID_KEYCTX_DISABLE:
1621 case ID_KEYCTX_ENABLE:
1622 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 break;
1631
1632 case ID_KEYCTX_LISTSIGS:
1633 send_cmd_id (dlg, ID_KEYMISC_CHECKSIGS);
1634 break;
1635
1636 case ID_KEYCTX_MAXTRUST:
1637 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 if (!rc)
1640 update_key (kmi->lv, kmi->lv_idx, keyid, 0);
1641 break;
1642
1643 case ID_KEYCTX_SETDEFKEY:
1644 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 rc = set_gnupg_default_key (keyid);
1647 if (rc)
1648 msg_box (dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);
1649 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 /* XXX: Implement group manager. */
1657 return TRUE;
1658 }
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