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

Contents of /trunk/Src/wptKeyManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 19 - (show annotations)
Fri May 20 08:39:15 2005 UTC (19 years, 9 months ago) by twoaday
File size: 49392 byte(s)
2005-05-09 Timo Schulz  <twoaday@freakmail.de>
                                                                                  
        * wptCommonDlg.cpp (http_file_dlg_proc): Renamed to..
        (http_dlg_proc): ..this.
        (get_keyserver_URL_dlg): New.
        (check_URL): New.
        * wptKeyEditDlgs.cpp (keyedit_set_pref_keyserver): New.
        (keyedit_main_dlg_proc): Avoid massive keycache reloads, just reload
        the single key.
        * wptKeyRevokersDlg.cpp (key_revokers_dlg_proc): Show the key properties
        of the selected desig. revoker.
        * wptVerifyList.cpp (verlist_build): Increase the column size of 'keyid'.
        * wptGPGME.cpp (keycache_update): New.
        * wptKeySigDlg.cpp (keysig_dlg_proc): Update the key if a signature
        was deleted.
        * wptKeyManagerDlg.cpp (keymanager_dlg_proc): Zeroing the key struct
        before we set any values.
                                                                                  

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26