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

Annotation of /trunk/Src/wptKeyManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 128 - (hide annotations)
Mon Dec 19 13:05:59 2005 UTC (19 years, 2 months ago) by twoaday
File size: 56539 byte(s)
2005-12-17  Timo Schulz  <ts@g10code.com>
 
        * wptUTF8.cpp: Removed unused charset array.
        * wptSigList.cpp (siglist_build): Increase size for 'class'
        column.
        * wptGPG.cpp (get_gnupg_path): Simplified.
        * WinPT.cpp (load_gpg_env): New.
        (check_crypto_engine): Return type is now bool.
        * wptRegistry.cpp (is_gpg4win_installed): New.
        * wptGPGPrefsDlg.cpp (gpgprefs_dlg_proc): More consistent
        dialog design.
        * wptKeyManagerDlg.cpp (translate_menu_strings): New.
        (translate_popupmenu_strings): New.
        * wptKeyEditDlgs.cpp (is_jpg_file): New.


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26