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

Annotation of /trunk/Src/wptKeyManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 16 - (hide annotations)
Mon May 9 08:54:21 2005 UTC (19 years, 9 months ago) by twoaday
File size: 48993 byte(s)
2005-05-03  Timo Schulz  <twoaday@freakmail.de>
 
        * wptFileManager.cpp (fm_parse_command_line): Handle
        'SYMKEYENC' files. Thanks to the user who reported it.
        * wptKeyEditDlgs.cpp (do_find_userid): Optionally return the context.
        (showpref_dlg_proc): New.
        (keyedit_main_dlg_proc): Support SHOWPREF.
        (userid_list_init): New field 'Email'. Split userID into 'Name' + 'Email'.
        (do_add_new_userid): Adjust for new ListView.
        (do_find_userid): Use email for searching.
        (parse_preflist): New.
 

1 twoaday 2 /* wptKeyManagerDlg.cpp - WinPT Key Manager
2 twoaday 16 * Copyright (C) 2000-2005 Timo Schulz
3 twoaday 2 * 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     {
500     ID_KEYMISC_SIGN,
501     ID_KEYMISC_DELETE,
502     ID_KEYMISC_REVCERT,
503     ID_KEYMISC_IMPORT_HTTP,
504     ID_KEYMISC_IMPORT,
505     ID_KEYMISC_REFRESH_KEYS,
506     ID_KEYMISC_REBUILD,
507     ID_KEYMISC_KEYWIZARD,
508     ID_KEYMISC_CARDNEW,
509     ID_KEYMISC_NEWKEY,
510     0,
511     };
512     int edit_resids[] =
513     {
514     ID_KEYMISC_PASTE,
515     ID_KEYMISC_OT,
516     ID_KEYMISC_EDITKEY,
517     0
518     };
519     int * resids;
520     int i;
521    
522    
523     if (gpg_read_only == 0)
524     return;
525     switch (id)
526     {
527     case 0: return;
528     case 3: resids = key_resids; break;
529     case 1: resids = edit_resids;break;
530     }
531    
532     for (i=0; resids[i] != 0; i++)
533     set_menu_state (hm, resids[i], MF_GRAYED);
534     }
535    
536    
537     BOOL CALLBACK
538     keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
539     {
540     struct km_info *kmi;
541     static km_group_s *gc = NULL;
542     static HMENU menu = NULL;
543     static int refresh_keys = 0;
544     INITCOMMONCONTROLSEX icex;
545     HWND kl;
546     HMENU hm;
547     gpgme_keycache_t c;
548     gpgme_key_t pk;
549     km_group_cb_s gcb;
550     struct winpt_key_s k = {0};
551     struct http_file_s * http;
552     refresh_cache_s rcs = {0};
553     char keyid[48], uid[128], type[32], * q;
554     const char *t, * host;
555     u16 port = 0;
556     int idx = 0, i=0, rc;
557     size_t size = 0;
558    
559     if ((msg != WM_INITDIALOG)
560     && ((kmi = (struct km_info*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))
561     return FALSE;
562    
563     switch (msg) {
564     case WM_INITDIALOG:
565     kmi = new struct km_info;
566     memset (kmi, 0, sizeof (struct km_info));
567     icex.dwSize = sizeof (INITCOMMONCONTROLSEX);
568     icex.dwICC = ICC_BAR_CLASSES;
569     InitCommonControlsEx (&icex);
570     kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);
571     imagelist_load (dlg);
572    
573     #ifndef LANG_DE
574     SetWindowText( dlg, _("Key Manager") );
575     #endif
576     menu = LoadMenu( glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC );
577     #ifndef LANG_DE
578     set_menu_text( menu, ID_KEYMISC_QUIT, _("&Quit") );
579     set_menu_text( menu, ID_KEYMISC_UID, _("User ID") );
580     set_menu_text( menu, ID_KEYMISC_NEWKEY, _("&Expert") );
581     set_menu_text( menu, ID_KEYMISC_KEYWIZARD, _("&Normal") );
582     set_menu_text( menu, ID_KEYMISC_EDIT, _("Edit") );
583     set_menu_text( menu, ID_KEYMISC_SIGN, _("&Sign") );
584     set_menu_text( menu, ID_KEYMISC_DELETE, _("&Delete") );
585     set_menu_text( menu, ID_KEYMISC_REVCERT, _("&Revoke") );
586     set_menu_text( menu, ID_KEYMISC_CHECKSIGS, _("&List Signatures") );
587     set_menu_text( menu, ID_KEYMISC_TRUSTPATH, _("List Trust Path") );
588     set_menu_text( menu, ID_KEYMISC_PROPS, _("&Properties") );
589     set_menu_text( menu, ID_KEYMISC_GPGOPT, _("Options") );
590     set_menu_text( menu, ID_KEYMISC_GPGPREFS, _("Preferences") );
591     set_menu_text( menu, ID_KEYMISC_SENDRECV, _("Keyserver") );
592     set_menu_text( menu, ID_KEYMISC_RECACHE, _("Re&load Key Cache") );
593     set_menu_text( menu, ID_KEYMISC_REBUILD, _("R&everify Signatures") );
594     set_menu_text( menu, ID_KEYMISC_INFO, _("Info") );
595     set_menu_text (menu, ID_KEYMISC_HELP, _("Help"));
596     #endif
597     SetMenu( dlg, menu );
598     if( keyring_check_last_access() )
599     keycache_set_reload( 1 );
600     if( keycache_get_reload( ) )
601     keycache_reload( dlg );
602     c = keycache_get_ctx( KEYCACHE_PUB );
603     if( !c )
604     BUG( NULL );
605     kmi->keylist_sortby = GPGME_ATTR_USERID;
606     Header_SetImageList(ListView_GetHeader(GetDlgItem( dlg, IDC_KEYMISC_KEYLIST )),
607     glob_imagelist);
608     kmi->lv = keylist_load( GetDlgItem( dlg, IDC_KEYMISC_KEYLIST ), c,
609     NULL, KEYLIST_LIST, kmi->keylist_sortby );
610     /* init subclassing for the listview */
611     kl = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );
612     keylist_proc.dlg = dlg;
613     keylist_proc.current = (WNDPROC)keylist_subclass_proc;
614     keylist_proc.old = (WNDPROC)GetWindowLong( kl, GWL_WNDPROC );
615     if( keylist_proc.old ) {
616     if( !SetWindowLong( kl, GWL_WNDPROC, (LONG)keylist_proc.current) ) {
617     msg_box( dlg, _("Could not set keylist window procedure."), _("Key Manager"), MB_ERR );
618     BUG( NULL );
619     }
620     }
621     km_groups_new( &gc, GetDlgItem( dlg, IDC_KEYMISC_GROUP ) );
622     km_groups_load( gc );
623     SetForegroundWindow( dlg );
624    
625     kmi->statbar = CreateStatusWindow( WS_CHILD | WS_VISIBLE | CCS_BOTTOM, "status bar", dlg, 100000 );
626     ShowWindow( kmi->statbar, SW_SHOW );
627     km_update_default_key_str (kmi->statbar, &km_def_pos);
628     km_complete_status_bar( kmi->statbar, kmi->lv, km_def_pos );
629    
630     SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);
631     kmi->toolbar = load_toolbar (dlg, kmi);
632    
633     do_center_window( dlg, kmi );
634     do_resize_window( dlg, kmi );
635     update_ui_items (dlg, kmi->lv);
636     return TRUE;
637    
638     case WM_DESTROY:
639     if (kmi->lv) {
640     keylist_delete (kmi->lv);
641     kmi->lv = NULL;
642    
643     if (gc) {
644     km_groups_release (gc);
645     gc = NULL;
646     }
647     imagelist_destroy ();
648    
649     char buf[32];
650     ltoa (kmi->pos_x, buf, 10);
651     set_reg_entry( HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", buf );
652     ltoa (kmi->pos_y, buf, 10);
653     set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", buf);
654     /* Remove runtime information. This should be the last action taken here. */
655     delete kmi; kmi = NULL;
656     SetWindowLong (dlg, GWL_USERDATA, NULL);
657     keycache_set_reload (refresh_keys);
658     return FALSE;
659    
660     case WM_MOVE:
661     /* kmi->pos_x = (int)(short)LOWORD(lparam);
662     kmi->pos_y = (int)(short)HIWORD(lparam); */
663     RECT r;
664     GetWindowRect (dlg, &r);
665     kmi->pos_x = r.left;
666     kmi->pos_y = r.top;
667     break;
668    
669    
670     case WM_RBUTTONUP:
671     do_create_minpopup (dlg);
672     break;
673    
674     case WM_NOTIFY:
675     NMHDR * notify;
676     POINT p;
677     HMENU popup;
678    
679     notify = (NMHDR *)lparam;
680     if (notify == NULL)
681     break;
682     switch (notify->code)
683     {
684     case TBN_QUERYDELETE:
685     SetWindowLong(dlg, DWL_MSGRESULT, TRUE);
686     return TRUE;
687    
688     case TBN_QUERYINSERT:
689     SetWindowLong(dlg, DWL_MSGRESULT, TRUE);
690     return TRUE;
691    
692     case TBN_GETBUTTONINFO:
693     LPTBNOTIFY lpTbNotify;
694     lpTbNotify = (LPTBNOTIFY)lparam;
695     if (lpTbNotify->iItem < (sizeof(myb) / sizeof(mybuttons))) {
696     lpTbNotify->tbButton.iBitmap = imagelist_getindex(myb[lpTbNotify->iItem].icon);
697     lpTbNotify->tbButton.idCommand = myb[lpTbNotify->iItem].command;
698     lpTbNotify->tbButton.fsState = TBSTATE_ENABLED;
699     lpTbNotify->tbButton.fsStyle = TBSTYLE_BUTTON;
700     lpTbNotify->tbButton.iString = 0;
701     strncpy (lpTbNotify->pszText, myb[lpTbNotify->iItem].text, lpTbNotify->cchText);
702     SetWindowLong(dlg, DWL_MSGRESULT, TRUE);
703     }
704     return TRUE;
705    
706     case TBN_RESET: /* Restore last saved toolbar status */
707     TBSAVEPARAMS tbsp;
708    
709     tbsp.hkr = HKEY_CURRENT_USER;
710     tbsp.pszSubKey = "Software\\WinPT";
711     tbsp.pszValueName = "KM_toolbar";
712     SendMessage (notify->hwndFrom, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp);
713     break;
714    
715     case TBN_BEGINADJUST: /* User is about to change the toolbar. Save it */
716     tbsp.hkr = HKEY_CURRENT_USER;
717     tbsp.pszSubKey = "Software\\WinPT";
718     tbsp.pszValueName = "KM_toolbar";
719     SendMessage (notify->hwndFrom, TB_SAVERESTORE, TRUE, (LPARAM)&tbsp);
720     break;
721    
722     case TBN_ENDADJUST: /* User has finished customizing the toolbar. Save it. */
723     tbsp.hkr = HKEY_CURRENT_USER;
724     tbsp.pszSubKey = "Software\\WinPT";
725     tbsp.pszValueName = "KM_toolbar";
726     SendMessage (notify->hwndFrom, TB_SAVERESTORE, TRUE, (LPARAM)&tbsp);
727     break;
728    
729     case TTN_GETDISPINFO:
730     LPTOOLTIPTEXT lpttt;
731     lpttt = (LPTOOLTIPTEXT)lparam;
732    
733     lpttt->hinst = NULL;
734     switch (lpttt->hdr.idFrom) {
735     case ID_KEYMISC_DELETE:
736     lpttt->lpszText = (char *)_("Delete key from keyring");
737     break;
738    
739     case ID_KEYMISC_PROPS:
740     lpttt->lpszText = (char *)_("Show key properties");
741     break;
742    
743     case ID_KEYMISC_SIGN:
744     lpttt->lpszText = (char *)_("Sign key");
745     break;
746    
747     case ID_KEYMISC_IMPORT:
748     lpttt->lpszText = (char *)_("Import key to keyring");
749     break;
750    
751     case ID_KEYMISC_EXPORT:
752     lpttt->lpszText = (char *)_("Export key to a file");
753     break;
754     }
755     return TRUE;
756    
757     case LVN_ITEMCHANGED:
758     if (((LPNMLISTVIEW)lparam)->uNewState) /* item selected? */
759     {
760     update_ui_items (dlg, kmi->lv);
761     return TRUE;
762     }
763     break;
764    
765     case NM_RCLICK:
766     if (notify->idFrom == IDC_KEYMISC_KEYLIST)
767     {
768     if (listview_get_curr_pos (kmi->lv) == -1)
769     return TRUE; /* Popup only when a item was selected */
770     do_check_cache (kmi->lv, dlg, kmi->statbar);
771     GetCursorPos (&p);
772     hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));
773     popup = GetSubMenu (hm, 0);
774     #ifndef LANG_DE
775     set_menu_text( popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard") );
776     set_menu_text( popup, ID_KEYCTX_COPY, _("Copy Key to Clipboard") );
777     set_menu_text( popup, ID_KEYCTX_PASTE, _("Paste Key from Clipboard") );
778     set_menu_text( popup, ID_KEYCTX_RECVFROM, _("Refresh from Keyserver") );
779     #endif
780     idx = listview_get_curr_pos (kmi->lv);
781     if (km_check_for_seckey (kmi->lv, idx, &i) && i == 0)
782     {
783     set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);
784     set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);
785     }
786     if( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {
787     set_menu_state( popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED );
788     set_menu_state( popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED );
789     set_menu_state( popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED );
790     set_menu_state( popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED );
791     set_menu_state( popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );
792     set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);
793     }
794     else if( km_check_for_seckey( kmi->lv, idx, NULL )
795     && km_key_is_v3( kmi->lv, idx ) )
796     {
797     /* PGP 2 keys, version 3 have no no support for photo-id's,
798     designated revokers and secondary keys. */
799     set_menu_state( popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED );
800     set_menu_state( popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED );
801     set_menu_state( popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );
802     }
803     if( km_get_key_status( kmi->lv, idx ) & KM_FLAG_DISABLED )
804     set_menu_state( popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED );
805     else
806     set_menu_state( popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED );
807     if (km_get_key_status (kmi->lv, idx) & KM_FLAG_REVOKED)
808     set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);
809     if( mapi_init() )
810     set_menu_state( popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED );
811     popup_gpg_readonly (dlg, popup);
812     TrackPopupMenu( popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL );
813     DestroyMenu( popup );
814     DestroyMenu( hm );
815     return TRUE;
816     }
817     if( notify->idFrom == IDC_KEYMISC_GROUP ) {
818     HWND tree = GetDlgItem( dlg, IDC_KEYMISC_GROUP );
819     if( TreeView_GetSelection( tree ) ) {
820     GetCursorPos( &p );
821     hm = LoadMenu( glob_hinst, MAKEINTRESOURCE(IDR_WINPT_GROUP_CTX) );
822     popup = GetSubMenu( hm, 0 );
823     if( km_index == -1 )
824     set_menu_state( popup, ID_GROUP_PASTE, MF_DISABLED|MF_GRAYED );
825     set_menu_text( popup, ID_GROUP_PASTE, _("Paste into this group") );
826     set_menu_text( popup, ID_GROUP_DELETE, _("Delete") );
827     TrackPopupMenu( popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL );
828     DestroyMenu( popup );
829     DestroyMenu( hm );
830     return TRUE;
831     }
832     }
833     break;
834    
835     case LVN_COLUMNCLICK:
836     if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
837     NMLISTVIEW * p = (LPNMLISTVIEW) lparam;
838     int sortby = 0;
839     switch (p->iSubItem) {
840     case 0: sortby = GPGME_ATTR_USERID; break;
841     case 1: sortby = GPGME_ATTR_KEYID; break;
842     case 2: sortby = GPGME_ATTR_IS_SECRET; break;
843     case 3: sortby = GPGME_ATTR_LEN; break;
844     case 5: sortby = GPGME_ATTR_VALIDITY; break;
845     case 6: sortby = GPGME_ATTR_OTRUST; break;
846     case 7: sortby = GPGME_ATTR_CREATED; break;
847     case 8: sortby = GPGME_ATTR_ALGO; break;
848     default: return TRUE; //sortby = GPGME_ATTR_USERID; break;
849     }
850    
851     if ((kmi->keylist_sortby & ~KEYLIST_SORT_DESC) == sortby)
852     kmi->keylist_sortby ^= KEYLIST_SORT_DESC;
853     else
854     kmi->keylist_sortby = sortby;
855     keylist_sort (kmi->lv, kmi->keylist_sortby);
856     return TRUE;
857     }
858     break;
859     }
860     break;
861     }
862    
863     case WM_WINDOWPOSCHANGING:
864     if (((WINDOWPOS*)lparam)->cx < 400)
865     ((WINDOWPOS*)lparam)->cx = 400;
866     if (((WINDOWPOS*)lparam)->cy < 200)
867     ((WINDOWPOS*)lparam)->cy = 200;
868     return TRUE;
869    
870     case WM_SIZE:
871     do_resize_window (dlg, kmi);
872     return TRUE;
873    
874     case WM_SYSCOMMAND:
875     if( LOWORD (wparam) == SC_CLOSE )
876     EndDialog( dlg, TRUE );
877     return FALSE;
878    
879     case WM_MENUSELECT:
880     menu_gpg_readonly (dlg, (HMENU)lparam, LOWORD (wparam));
881     break;
882    
883     case WM_COMMAND:
884     if( gnupg_access_keyring( 1 ) ) {
885     msg_box( dlg, _("Could not access public keyring"), _("Key Manager"), MB_ERR );
886     return FALSE;
887     }
888     do_check_cache( kmi->lv, dlg, kmi->statbar );
889     switch( LOWORD( wparam ) ) {
890     case ID_KEYMISC_QUIT:
891     EndDialog( dlg, TRUE );
892     return TRUE;
893    
894     case ID_KEYMISC_MAIL:
895     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_MAIL, GetDesktopWindow (),
896     winpt_mail_proc, NULL);
897     break;
898    
899     case ID_KEYMISC_DELETE:
900     if (km_delete_keys (kmi->lv, dlg))
901     return FALSE;
902     refresh_keys = 1;
903     return TRUE;
904    
905     case ID_KEYMISC_SIGN:
906     gpgme_key_t key;
907    
908     if ( (idx = listview_get_curr_pos( kmi->lv )) == -1 ) {
909     msg_box( dlg, _("Please select a key."), _("Key Manager"),
910     MB_ERR );
911     return FALSE;
912     }
913     if( !km_check_key_status( kmi->lv, idx ) )
914     return FALSE;
915     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid );
916     listview_get_item_text( kmi->lv, idx, 2, type, sizeof type -1 );
917     rc = get_pubkey( keyid, &key );
918     if( rc )
919     BUG( dlg );
920     if( key )
921     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYSIGN, dlg,
922     keysign_dlg_proc, (LPARAM)key,
923     _("Key Signing"), IDS_WINPT_KEYSIGN);
924     return TRUE;
925    
926     case ID_KEYMISC_REVCERT:
927     idx = listview_get_curr_pos( kmi->lv );
928     if( idx == -1 ) {
929     msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
930     return FALSE;
931     }
932     listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );
933     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid-1 );
934     if ( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {
935     msg_box( dlg, _("There is no secret key available!"), _("Key Manager"), MB_ERR );
936     return FALSE;
937     }
938    
939     {
940     char t[128];
941     listview_get_item_text( kmi->lv, idx, 5, t, sizeof t -1 );
942     if( strchr( t, 'R' ) ) {
943     msg_box( dlg, _("Key already revoked!"), _("Key Manager"), MB_INFO );
944     return FALSE;
945     }
946     }
947    
948     q = km_quote_uid (uid);
949     k.key_pair = 1;
950     k.keyid = keyid;
951     k.uid = q;
952     k.is_protected = km_check_if_protected( kmi->lv, idx );
953     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,
954     key_revoke_dlg_proc, (LPARAM)&k,
955     _("Key Revocation"), IDS_WINPT_KEYREVOKE );
956     free_if_alloc( q );
957     return TRUE;
958    
959     case ID_KEYMISC_TRUSTPATH:
960     idx = listview_get_curr_pos( kmi->lv );
961     if( idx == -1 ) {
962     msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
963     return FALSE;
964     }
965     listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );
966     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid -1 );
967     if( km_check_for_seckey( kmi->lv, idx, NULL ) ) {
968     msg_box( dlg, _("It does not make any sense with a key pair!"), _("Key Manager"), MB_OK );
969     return FALSE;
970     }
971     k.keyid = keyid;
972     k.uid = uid;
973     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYTRUST, dlg,
974     keytrust_dlg_proc, (LPARAM)&k,
975     _("List Trust Path"), IDS_WINPT_KEYTRUST );
976     return TRUE;
977    
978     case ID_KEYMISC_CHECKSIGS:
979     idx = listview_get_curr_pos( kmi->lv );
980     if( idx == -1 ) {
981     msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
982     return FALSE;
983     }
984     listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid-1 );
985     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid-1 );
986     k.keyid = keyid;
987     k.uid = uid;
988     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,
989     keysig_dlg_proc, (LPARAM)&k,
990     _("Key Signature List" ), IDS_WINPT_KEYSIG );
991     return TRUE;
992    
993     case ID_KEYMISC_PROPS:
994     idx = listview_get_curr_pos( kmi->lv );
995     if( idx == -1 ) {
996     msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
997     return FALSE;
998     }
999     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid -1 );
1000     listview_get_item_text( kmi->lv, idx, 2, type, sizeof type -1 );
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     http = (struct http_file_s *)get_http_file_dlg (dlg);
1107     if (http->cancel == 0)
1108     km_http_import (dlg, http->url);
1109     delete http;
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 twoaday 16 if (idx == -1)
1187 twoaday 2 break;
1188 twoaday 16 listview_get_item_text (kmi->lv, idx, 1, keyid, sizeof (keyid)-1);
1189     /* XXX: pub/crd = secret key does not work */
1190     k.is_protected = km_check_if_protected (kmi->lv, idx);
1191     k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);
1192 twoaday 2 k.keyid = keyid;
1193 twoaday 16 k.flags = km_get_key_status (kmi->lv, idx);
1194     dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,
1195 twoaday 2 keyedit_main_dlg_proc, (LPARAM)&k,
1196 twoaday 16 _("Key Edit"), IDS_KEYCTX_EDIT);
1197 twoaday 2 break;
1198    
1199     case ID_GROUP_NEW:
1200 twoaday 16 memset (&gcb, 0, sizeof (gcb));
1201 twoaday 2 gcb.gc = gc;
1202 twoaday 16 dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GROUP, glob_hwnd,
1203 twoaday 2 group_manager_dlg_proc, (LPARAM)&gcb, _("New Group"),
1204 twoaday 16 IDS_WINPT_GROUP);
1205 twoaday 2 if( gcb.use_name )
1206     treeview_add_item( GetDlgItem(dlg, IDC_KEYMISC_GROUP), NULL, gcb.name );
1207     return TRUE;
1208    
1209     case ID_KEYMISC_COPY:
1210     km_index = listview_get_curr_pos( kmi->lv );
1211     km_clip_export( dlg, kmi->lv );
1212     break;
1213    
1214     case ID_KEYMISC_SELALL:
1215     listview_select_all (kmi->lv);
1216     break;
1217    
1218     case ID_KEYMISC_PASTE:
1219     km_index = -1;
1220     km_clip_import (dlg);
1221     break;
1222    
1223     case ID_KEYCTX_SETPREFKS:
1224     /* XXX: todo */
1225     break;
1226    
1227     case ID_KEYMISC_REFRESH_KEYS:
1228     if (listview_count_items (kmi->lv, 1) == 0)
1229     {
1230     msg_box (dlg, _("No key was selected, select all by default."), _("Key Manager"), MB_INFO);
1231     listview_select_all (kmi->lv);
1232     }
1233     km_refresh_from_keyserver (kmi->lv, dlg);
1234     break;
1235    
1236     /** Context menu **/
1237     case ID_KEYCTX_EDIT:
1238     send_cmd_id( dlg, ID_KEYMISC_EDITKEY );
1239     break;
1240    
1241     case ID_KEYCTX_PROPS:
1242     send_cmd_id( dlg, ID_KEYMISC_PROPS );
1243     break;
1244    
1245     case ID_KEYCTX_UIDS:
1246     send_cmd_id( dlg, ID_KEYMISC_UID );
1247     break;
1248    
1249     case ID_KEYCTX_SIGN:
1250     send_cmd_id( dlg, ID_KEYMISC_SIGN );
1251     break;
1252    
1253     case ID_KEYCTX_DEL:
1254     send_cmd_id (dlg, ID_KEYMISC_DELETE);
1255     break;
1256    
1257     case ID_KEYCTX_REV:
1258     send_cmd_id( dlg, ID_KEYMISC_REVCERT );
1259     break;
1260    
1261     case ID_KEYCTX_SENDMAIL:
1262     km_send_to_mail_recipient( kmi->lv, dlg );
1263     break;
1264    
1265     case ID_KEYCTX_KS_DEFAULT:
1266     host = kserver_get_hostname (0, -1, &port);
1267     km_send_to_keyserver (kmi->lv, dlg, host, port);
1268     break;
1269    
1270     case ID_KEYCTX_ADDKEY:
1271     idx = listview_get_curr_pos( kmi->lv );
1272     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid - 1 );
1273     k.key_pair = km_check_for_seckey( kmi->lv, idx, NULL );
1274     k.is_protected = km_check_if_protected( kmi->lv, idx );
1275     k.keyid = keyid;
1276     keyedit_add_subkey( &k, dlg, NULL );
1277     break;
1278    
1279     case ID_KEYCTX_ADDUID:
1280     idx = listview_get_curr_pos( kmi->lv );
1281     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid-1 );
1282     k.key_pair = km_check_for_seckey( kmi->lv, idx, NULL );
1283     k.is_protected = km_check_if_protected( kmi->lv, idx );
1284     k.keyid = keyid;
1285     keyedit_add_userid( &k, dlg, NULL );
1286     break;
1287    
1288     case ID_KEYCTX_ADDREV:
1289     idx = listview_get_curr_pos( kmi->lv );
1290     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid-1 );
1291     k.keyid = keyid;
1292     k.is_protected = km_check_if_protected( kmi->lv, idx );
1293     k.key_pair = km_check_for_seckey( kmi->lv, idx, NULL );
1294     keyedit_add_revoker( &k, dlg );
1295     break;
1296    
1297     case ID_KEYCTX_ADDPHOTO:
1298     idx = listview_get_curr_pos( kmi->lv );
1299     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid-1 );
1300     k.keyid = keyid;
1301     k.is_protected = km_check_if_protected( kmi->lv, idx );
1302     k.key_pair = km_check_for_seckey( kmi->lv, idx, NULL );
1303     keyedit_add_photo( &k, dlg );
1304     break;
1305    
1306     case ID_KEYCTX_KS_NL:
1307     case ID_KEYCTX_KS_PL:
1308     case ID_KEYCTX_KS_AT:
1309     case ID_KEYCTX_KS_DE:
1310     case ID_KEYCTX_KS_DK:
1311     case ID_KEYCTX_KS_CZ:
1312     case ID_KEYCTX_KS_ES:
1313     case ID_KEYCTX_KS_UK:
1314     host = kserver_get_hostname (LOWORD (wparam) - 40107, 0, &port);
1315     km_send_to_keyserver (kmi->lv, dlg, host, port);
1316     break;
1317    
1318     case ID_KEYCTX_RECVFROM:
1319     km_refresh_from_keyserver (kmi->lv, dlg);
1320     break;
1321    
1322     case ID_KEYCTX_UID_COPY:
1323     /* XXX: add generic function to support multiple selection
1324     with a callback */
1325     idx = listview_get_curr_pos( kmi->lv );
1326     listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid-1 );
1327     set_clip_text( NULL, uid, strlen( uid ) );
1328     break;
1329    
1330     case ID_KEYCTX_KEYID_COPY:
1331     idx = listview_get_curr_pos( kmi->lv );
1332     listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );
1333     set_clip_text( NULL, uid, strlen( uid ) );
1334     break;
1335    
1336     case ID_KEYCTX_FPR_COPY:
1337     idx = listview_get_curr_pos( kmi->lv );
1338     listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );
1339     get_pubkey( uid, &pk );
1340     if( pk ) {
1341     const char * s = get_key_fpr( pk );
1342     set_clip_text( NULL, s? s : "", s? strlen( s ): 0 );
1343     }
1344     break;
1345    
1346     case ID_KEYCTX_KINFO_COPY:
1347     idx = listview_get_curr_pos( kmi->lv );
1348     listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );
1349     km_set_clip_info( uid );
1350     break;
1351    
1352     case ID_KEYCTX_COPY:
1353     km_index = listview_get_curr_pos (kmi->lv);
1354     km_clip_export (dlg, kmi->lv);
1355     break;
1356    
1357     case ID_KEYCTX_PASTE:
1358     km_index = -1;
1359     km_clip_import (dlg);
1360     break;
1361    
1362     case ID_KEYCTX_DISABLE:
1363     idx = listview_get_curr_pos (kmi->lv);
1364     km_enable_disable_key (kmi->lv, dlg, idx, 0);
1365     break;
1366    
1367     case ID_KEYCTX_ENABLE:
1368     idx = listview_get_curr_pos (kmi->lv);
1369     km_enable_disable_key (kmi->lv, dlg, idx, 1);
1370     break;
1371    
1372     case ID_KEYCTX_LISTSIGS:
1373     send_cmd_id (dlg, ID_KEYMISC_CHECKSIGS);
1374     break;
1375    
1376     case ID_KEYCTX_MAXTRUST:
1377     idx = listview_get_curr_pos (kmi->lv);
1378     km_set_implicit_trust (dlg, kmi->lv, idx);
1379     break;
1380    
1381     case ID_KEYCTX_SETDEFKEY:
1382     idx = listview_get_curr_pos (kmi->lv);
1383     if (km_check_key_status (kmi->lv, idx))
1384     {
1385     listview_get_item_text (kmi->lv, idx, 1, keyid, sizeof keyid -1);
1386     rc = set_gnupg_default_key (keyid);
1387     if (rc)
1388     msg_box( dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);
1389     km_update_default_key_str (kmi->statbar, &km_def_pos);
1390     }
1391     break;
1392    
1393     case ID_GROUP_PASTE:
1394     km_groups_add (gc, kmi->lv, km_index);
1395     break;
1396    
1397     case ID_GROUP_DELETE:
1398     km_groups_del (gc);
1399     break;
1400     }
1401     break;
1402     }
1403    
1404     return FALSE;
1405     } /* keymanager_dlg_proc */
1406    
1407    

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26