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

Annotation of /trunk/Src/wptKeyManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 20 - (hide annotations)
Wed Jul 27 11:17:22 2005 UTC (19 years, 7 months ago) by twoaday
File size: 49559 byte(s)
2005-07-22  Timo Schulz  <twoaday@freakmail.de>
 
        * wptMainProc.cpp (winpt_main_proc): Take care for shutdown
        messages and make sure WinPT make a keyring backup in this case.
        * wptGPGME.cpp (keycache_reload): Do not rebuild the signature
        cache each time. Just do it on startup.
        * wptKeyManager.cpp (km_key_is_v3): Use new ATTR_VERSION.
        * wptKeyEditDlgs.cpp (keyedit_main_dlg_proc): Assume the v3 flag
        was set by the calling function.
        * wptKeyGenDlg.cpp (keygen_wizard_dlg_proc): Ask for backups.
        (keygen_dlg_proc): Only add the generated key to the keycache
        and do not reload the entire cache.
        * wptKeyManager.cpp (km_delete_keys): Store the number of keys
        because in each loop iteration it will be new calculated.
        * wptListView.cpp (listview_del_items): Likewise.
        * wptKeyManagerDlg.cpp (keymanager_dlg_proc): Directly add the
        generated key to the list instead of reloading the entire cache.
        * wptKeyEditDlgs.cpp (parse_preflist): Support fpr SHAnnn.


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 twoaday 19 int key_resids[] = {
499 twoaday 2 ID_KEYMISC_SIGN,
500     ID_KEYMISC_DELETE,
501     ID_KEYMISC_REVCERT,
502     ID_KEYMISC_IMPORT_HTTP,
503     ID_KEYMISC_IMPORT,
504     ID_KEYMISC_REFRESH_KEYS,
505     ID_KEYMISC_REBUILD,
506     ID_KEYMISC_KEYWIZARD,
507     ID_KEYMISC_CARDNEW,
508     ID_KEYMISC_NEWKEY,
509     0,
510     };
511 twoaday 19 int edit_resids[] = {
512 twoaday 2 ID_KEYMISC_PASTE,
513     ID_KEYMISC_OT,
514     ID_KEYMISC_EDITKEY,
515     0
516     };
517     int * resids;
518     int i;
519    
520    
521     if (gpg_read_only == 0)
522     return;
523 twoaday 19 switch (id) {
524 twoaday 2 case 0: return;
525     case 3: resids = key_resids; break;
526     case 1: resids = edit_resids;break;
527     }
528    
529     for (i=0; resids[i] != 0; i++)
530     set_menu_state (hm, resids[i], MF_GRAYED);
531     }
532    
533    
534     BOOL CALLBACK
535     keymanager_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
536     {
537     struct km_info *kmi;
538     static km_group_s *gc = NULL;
539     static HMENU menu = NULL;
540     static int refresh_keys = 0;
541     INITCOMMONCONTROLSEX icex;
542     HWND kl;
543     HMENU hm;
544     gpgme_keycache_t c;
545     gpgme_key_t pk;
546 twoaday 20 km_group_cb_s gcb;
547     struct genkey_s genkey;
548 twoaday 2 struct winpt_key_s k = {0};
549 twoaday 19 struct URL_ctx_s *url;
550 twoaday 2 refresh_cache_s rcs = {0};
551     char keyid[48], uid[128], type[32], * q;
552     const char *t, * host;
553     u16 port = 0;
554     int idx = 0, i=0, rc;
555     size_t size = 0;
556    
557     if ((msg != WM_INITDIALOG)
558     && ((kmi = (struct km_info*)GetWindowLong (dlg, GWL_USERDATA)) == NULL))
559     return FALSE;
560    
561     switch (msg) {
562     case WM_INITDIALOG:
563     kmi = new struct km_info;
564     memset (kmi, 0, sizeof (struct km_info));
565     icex.dwSize = sizeof (INITCOMMONCONTROLSEX);
566     icex.dwICC = ICC_BAR_CLASSES;
567     InitCommonControlsEx (&icex);
568     kmi->hwnd_sep = regist_sep_wnd (dlg, kmi);
569     imagelist_load (dlg);
570    
571     #ifndef LANG_DE
572     SetWindowText( dlg, _("Key Manager") );
573     #endif
574     menu = LoadMenu( glob_hinst, (LPCSTR)IDR_WINPT_KEYMISC );
575     #ifndef LANG_DE
576     set_menu_text( menu, ID_KEYMISC_QUIT, _("&Quit") );
577     set_menu_text( menu, ID_KEYMISC_UID, _("User ID") );
578     set_menu_text( menu, ID_KEYMISC_NEWKEY, _("&Expert") );
579     set_menu_text( menu, ID_KEYMISC_KEYWIZARD, _("&Normal") );
580     set_menu_text( menu, ID_KEYMISC_EDIT, _("Edit") );
581     set_menu_text( menu, ID_KEYMISC_SIGN, _("&Sign") );
582     set_menu_text( menu, ID_KEYMISC_DELETE, _("&Delete") );
583     set_menu_text( menu, ID_KEYMISC_REVCERT, _("&Revoke") );
584     set_menu_text( menu, ID_KEYMISC_CHECKSIGS, _("&List Signatures") );
585     set_menu_text( menu, ID_KEYMISC_TRUSTPATH, _("List Trust Path") );
586     set_menu_text( menu, ID_KEYMISC_PROPS, _("&Properties") );
587     set_menu_text( menu, ID_KEYMISC_GPGOPT, _("Options") );
588     set_menu_text( menu, ID_KEYMISC_GPGPREFS, _("Preferences") );
589     set_menu_text( menu, ID_KEYMISC_SENDRECV, _("Keyserver") );
590     set_menu_text( menu, ID_KEYMISC_RECACHE, _("Re&load Key Cache") );
591     set_menu_text( menu, ID_KEYMISC_REBUILD, _("R&everify Signatures") );
592     set_menu_text( menu, ID_KEYMISC_INFO, _("Info") );
593     set_menu_text (menu, ID_KEYMISC_HELP, _("Help"));
594     #endif
595     SetMenu( dlg, menu );
596     if( keyring_check_last_access() )
597     keycache_set_reload( 1 );
598     if( keycache_get_reload( ) )
599     keycache_reload( dlg );
600     c = keycache_get_ctx( KEYCACHE_PUB );
601     if( !c )
602     BUG( NULL );
603     kmi->keylist_sortby = GPGME_ATTR_USERID;
604     Header_SetImageList(ListView_GetHeader(GetDlgItem( dlg, IDC_KEYMISC_KEYLIST )),
605     glob_imagelist);
606     kmi->lv = keylist_load( GetDlgItem( dlg, IDC_KEYMISC_KEYLIST ), c,
607     NULL, KEYLIST_LIST, kmi->keylist_sortby );
608     /* init subclassing for the listview */
609     kl = GetDlgItem( dlg, IDC_KEYMISC_KEYLIST );
610     keylist_proc.dlg = dlg;
611     keylist_proc.current = (WNDPROC)keylist_subclass_proc;
612     keylist_proc.old = (WNDPROC)GetWindowLong( kl, GWL_WNDPROC );
613     if( keylist_proc.old ) {
614     if( !SetWindowLong( kl, GWL_WNDPROC, (LONG)keylist_proc.current) ) {
615     msg_box( dlg, _("Could not set keylist window procedure."), _("Key Manager"), MB_ERR );
616     BUG( NULL );
617     }
618     }
619     km_groups_new( &gc, GetDlgItem( dlg, IDC_KEYMISC_GROUP ) );
620     km_groups_load( gc );
621     SetForegroundWindow( dlg );
622    
623     kmi->statbar = CreateStatusWindow( WS_CHILD | WS_VISIBLE | CCS_BOTTOM, "status bar", dlg, 100000 );
624     ShowWindow( kmi->statbar, SW_SHOW );
625     km_update_default_key_str (kmi->statbar, &km_def_pos);
626     km_complete_status_bar( kmi->statbar, kmi->lv, km_def_pos );
627    
628     SetWindowLong (dlg, GWL_USERDATA, (LONG)kmi);
629     kmi->toolbar = load_toolbar (dlg, kmi);
630    
631     do_center_window( dlg, kmi );
632     do_resize_window( dlg, kmi );
633     update_ui_items (dlg, kmi->lv);
634     return TRUE;
635    
636     case WM_DESTROY:
637     if (kmi->lv) {
638     keylist_delete (kmi->lv);
639     kmi->lv = NULL;
640    
641     if (gc) {
642     km_groups_release (gc);
643     gc = NULL;
644     }
645     imagelist_destroy ();
646    
647     char buf[32];
648     ltoa (kmi->pos_x, buf, 10);
649     set_reg_entry( HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_X", buf );
650     ltoa (kmi->pos_y, buf, 10);
651     set_reg_entry (HKEY_CURRENT_USER, "Software\\WinPT", "KM_Pos_Y", buf);
652     /* Remove runtime information. This should be the last action taken here. */
653     delete kmi; kmi = NULL;
654     SetWindowLong (dlg, GWL_USERDATA, NULL);
655     keycache_set_reload (refresh_keys);
656     return FALSE;
657    
658     case WM_MOVE:
659     /* kmi->pos_x = (int)(short)LOWORD(lparam);
660     kmi->pos_y = (int)(short)HIWORD(lparam); */
661     RECT r;
662     GetWindowRect (dlg, &r);
663     kmi->pos_x = r.left;
664     kmi->pos_y = r.top;
665     break;
666    
667    
668     case WM_RBUTTONUP:
669     do_create_minpopup (dlg);
670     break;
671    
672     case WM_NOTIFY:
673     NMHDR * notify;
674     POINT p;
675     HMENU popup;
676    
677     notify = (NMHDR *)lparam;
678     if (notify == NULL)
679     break;
680     switch (notify->code)
681     {
682     case TBN_QUERYDELETE:
683     SetWindowLong(dlg, DWL_MSGRESULT, TRUE);
684     return TRUE;
685    
686     case TBN_QUERYINSERT:
687     SetWindowLong(dlg, DWL_MSGRESULT, TRUE);
688     return TRUE;
689    
690     case TBN_GETBUTTONINFO:
691     LPTBNOTIFY lpTbNotify;
692     lpTbNotify = (LPTBNOTIFY)lparam;
693     if (lpTbNotify->iItem < (sizeof(myb) / sizeof(mybuttons))) {
694     lpTbNotify->tbButton.iBitmap = imagelist_getindex(myb[lpTbNotify->iItem].icon);
695     lpTbNotify->tbButton.idCommand = myb[lpTbNotify->iItem].command;
696     lpTbNotify->tbButton.fsState = TBSTATE_ENABLED;
697     lpTbNotify->tbButton.fsStyle = TBSTYLE_BUTTON;
698     lpTbNotify->tbButton.iString = 0;
699     strncpy (lpTbNotify->pszText, myb[lpTbNotify->iItem].text, lpTbNotify->cchText);
700     SetWindowLong(dlg, DWL_MSGRESULT, TRUE);
701     }
702     return TRUE;
703    
704     case TBN_RESET: /* Restore last saved toolbar status */
705     TBSAVEPARAMS tbsp;
706    
707     tbsp.hkr = HKEY_CURRENT_USER;
708     tbsp.pszSubKey = "Software\\WinPT";
709     tbsp.pszValueName = "KM_toolbar";
710     SendMessage (notify->hwndFrom, TB_SAVERESTORE, FALSE, (LPARAM)&tbsp);
711     break;
712    
713     case TBN_BEGINADJUST: /* User is about to change the toolbar. Save it */
714     tbsp.hkr = HKEY_CURRENT_USER;
715     tbsp.pszSubKey = "Software\\WinPT";
716     tbsp.pszValueName = "KM_toolbar";
717     SendMessage (notify->hwndFrom, TB_SAVERESTORE, TRUE, (LPARAM)&tbsp);
718     break;
719    
720     case TBN_ENDADJUST: /* User has finished customizing the toolbar. Save it. */
721     tbsp.hkr = HKEY_CURRENT_USER;
722     tbsp.pszSubKey = "Software\\WinPT";
723     tbsp.pszValueName = "KM_toolbar";
724     SendMessage (notify->hwndFrom, TB_SAVERESTORE, TRUE, (LPARAM)&tbsp);
725     break;
726    
727     case TTN_GETDISPINFO:
728     LPTOOLTIPTEXT lpttt;
729     lpttt = (LPTOOLTIPTEXT)lparam;
730    
731     lpttt->hinst = NULL;
732     switch (lpttt->hdr.idFrom) {
733     case ID_KEYMISC_DELETE:
734     lpttt->lpszText = (char *)_("Delete key from keyring");
735     break;
736    
737     case ID_KEYMISC_PROPS:
738     lpttt->lpszText = (char *)_("Show key properties");
739     break;
740    
741     case ID_KEYMISC_SIGN:
742     lpttt->lpszText = (char *)_("Sign key");
743     break;
744    
745     case ID_KEYMISC_IMPORT:
746     lpttt->lpszText = (char *)_("Import key to keyring");
747     break;
748    
749     case ID_KEYMISC_EXPORT:
750     lpttt->lpszText = (char *)_("Export key to a file");
751     break;
752     }
753     return TRUE;
754    
755     case LVN_ITEMCHANGED:
756     if (((LPNMLISTVIEW)lparam)->uNewState) /* item selected? */
757     {
758     update_ui_items (dlg, kmi->lv);
759     return TRUE;
760     }
761     break;
762    
763     case NM_RCLICK:
764     if (notify->idFrom == IDC_KEYMISC_KEYLIST)
765     {
766     if (listview_get_curr_pos (kmi->lv) == -1)
767     return TRUE; /* Popup only when a item was selected */
768     do_check_cache (kmi->lv, dlg, kmi->statbar);
769     GetCursorPos (&p);
770     hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYMISC_CTX));
771     popup = GetSubMenu (hm, 0);
772     #ifndef LANG_DE
773     set_menu_text( popup, ID_KEYCTX_UID_COPY, _("Copy User ID to Clipboard") );
774     set_menu_text( popup, ID_KEYCTX_COPY, _("Copy Key to Clipboard") );
775     set_menu_text( popup, ID_KEYCTX_PASTE, _("Paste Key from Clipboard") );
776     set_menu_text( popup, ID_KEYCTX_RECVFROM, _("Refresh from Keyserver") );
777     #endif
778     idx = listview_get_curr_pos (kmi->lv);
779 twoaday 19 if (km_check_for_seckey (kmi->lv, idx, &i) && i == 0) {
780 twoaday 2 set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);
781     set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);
782     }
783 twoaday 19 if (!km_check_for_seckey (kmi->lv, idx, NULL)) {
784 twoaday 2 set_menu_state( popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED );
785     set_menu_state( popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED );
786     set_menu_state( popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED );
787     set_menu_state( popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED );
788     set_menu_state( popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED );
789     set_menu_state (popup, ID_KEYCTX_SETPREFKS, MF_DISABLED|MF_GRAYED);
790     }
791     else if( km_check_for_seckey( kmi->lv, idx, NULL )
792     && km_key_is_v3( kmi->lv, idx ) )
793     {
794     /* PGP 2 keys, version 3 have no no support for photo-id's,
795     designated revokers and secondary keys. */
796 twoaday 20 set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
797     set_menu_state (popup, ID_KEYCTX_ADDREV, MF_DISABLED|MF_GRAYED);
798     set_menu_state (popup, ID_KEYCTX_ADDPHOTO, MF_DISABLED|MF_GRAYED);
799 twoaday 2 }
800     if( km_get_key_status( kmi->lv, idx ) & KM_FLAG_DISABLED )
801     set_menu_state( popup, ID_KEYCTX_DISABLE, MF_DISABLED|MF_GRAYED );
802     else
803     set_menu_state( popup, ID_KEYCTX_ENABLE, MF_DISABLED|MF_GRAYED );
804     if (km_get_key_status (kmi->lv, idx) & KM_FLAG_REVOKED)
805     set_menu_state (popup, ID_KEYCTX_SIGN, MF_DISABLED|MF_GRAYED);
806     if( mapi_init() )
807     set_menu_state( popup, ID_KEYCTX_SENDMAIL, MF_DISABLED|MF_GRAYED );
808     popup_gpg_readonly (dlg, popup);
809     TrackPopupMenu( popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL );
810     DestroyMenu( popup );
811     DestroyMenu( hm );
812     return TRUE;
813     }
814     if( notify->idFrom == IDC_KEYMISC_GROUP ) {
815     HWND tree = GetDlgItem( dlg, IDC_KEYMISC_GROUP );
816     if( TreeView_GetSelection( tree ) ) {
817     GetCursorPos( &p );
818     hm = LoadMenu( glob_hinst, MAKEINTRESOURCE(IDR_WINPT_GROUP_CTX) );
819     popup = GetSubMenu( hm, 0 );
820     if( km_index == -1 )
821     set_menu_state( popup, ID_GROUP_PASTE, MF_DISABLED|MF_GRAYED );
822     set_menu_text( popup, ID_GROUP_PASTE, _("Paste into this group") );
823     set_menu_text( popup, ID_GROUP_DELETE, _("Delete") );
824     TrackPopupMenu( popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL );
825     DestroyMenu( popup );
826     DestroyMenu( hm );
827     return TRUE;
828     }
829     }
830     break;
831    
832     case LVN_COLUMNCLICK:
833     if (notify->idFrom == IDC_KEYMISC_KEYLIST) {
834     NMLISTVIEW * p = (LPNMLISTVIEW) lparam;
835     int sortby = 0;
836     switch (p->iSubItem) {
837     case 0: sortby = GPGME_ATTR_USERID; break;
838     case 1: sortby = GPGME_ATTR_KEYID; break;
839     case 2: sortby = GPGME_ATTR_IS_SECRET; break;
840     case 3: sortby = GPGME_ATTR_LEN; break;
841     case 5: sortby = GPGME_ATTR_VALIDITY; break;
842     case 6: sortby = GPGME_ATTR_OTRUST; break;
843     case 7: sortby = GPGME_ATTR_CREATED; break;
844     case 8: sortby = GPGME_ATTR_ALGO; break;
845     default: return TRUE; //sortby = GPGME_ATTR_USERID; break;
846     }
847    
848     if ((kmi->keylist_sortby & ~KEYLIST_SORT_DESC) == sortby)
849     kmi->keylist_sortby ^= KEYLIST_SORT_DESC;
850     else
851     kmi->keylist_sortby = sortby;
852     keylist_sort (kmi->lv, kmi->keylist_sortby);
853     return TRUE;
854     }
855     break;
856     }
857     break;
858     }
859    
860     case WM_WINDOWPOSCHANGING:
861     if (((WINDOWPOS*)lparam)->cx < 400)
862     ((WINDOWPOS*)lparam)->cx = 400;
863     if (((WINDOWPOS*)lparam)->cy < 200)
864     ((WINDOWPOS*)lparam)->cy = 200;
865     return TRUE;
866    
867     case WM_SIZE:
868     do_resize_window (dlg, kmi);
869     return TRUE;
870    
871     case WM_SYSCOMMAND:
872     if( LOWORD (wparam) == SC_CLOSE )
873     EndDialog( dlg, TRUE );
874     return FALSE;
875    
876     case WM_MENUSELECT:
877     menu_gpg_readonly (dlg, (HMENU)lparam, LOWORD (wparam));
878     break;
879    
880     case WM_COMMAND:
881     if( gnupg_access_keyring( 1 ) ) {
882     msg_box( dlg, _("Could not access public keyring"), _("Key Manager"), MB_ERR );
883     return FALSE;
884     }
885     do_check_cache( kmi->lv, dlg, kmi->statbar );
886     switch( LOWORD( wparam ) ) {
887     case ID_KEYMISC_QUIT:
888     EndDialog( dlg, TRUE );
889     return TRUE;
890    
891     case ID_KEYMISC_MAIL:
892     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_MAIL, GetDesktopWindow (),
893     winpt_mail_proc, NULL);
894     break;
895    
896     case ID_KEYMISC_DELETE:
897     if (km_delete_keys (kmi->lv, dlg))
898     return FALSE;
899     refresh_keys = 1;
900     return TRUE;
901    
902     case ID_KEYMISC_SIGN:
903     gpgme_key_t key;
904    
905     if ( (idx = listview_get_curr_pos( kmi->lv )) == -1 ) {
906     msg_box( dlg, _("Please select a key."), _("Key Manager"),
907     MB_ERR );
908     return FALSE;
909     }
910     if( !km_check_key_status( kmi->lv, idx ) )
911     return FALSE;
912     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid );
913     listview_get_item_text( kmi->lv, idx, 2, type, sizeof type -1 );
914     rc = get_pubkey( keyid, &key );
915     if( rc )
916     BUG( dlg );
917     if( key )
918     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYSIGN, dlg,
919     keysign_dlg_proc, (LPARAM)key,
920     _("Key Signing"), IDS_WINPT_KEYSIGN);
921     return TRUE;
922    
923     case ID_KEYMISC_REVCERT:
924     idx = listview_get_curr_pos( kmi->lv );
925     if( idx == -1 ) {
926     msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
927     return FALSE;
928     }
929     listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );
930     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid-1 );
931     if ( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {
932     msg_box( dlg, _("There is no secret key available!"), _("Key Manager"), MB_ERR );
933     return FALSE;
934     }
935    
936     {
937     char t[128];
938     listview_get_item_text( kmi->lv, idx, 5, t, sizeof t -1 );
939     if( strchr( t, 'R' ) ) {
940     msg_box( dlg, _("Key already revoked!"), _("Key Manager"), MB_INFO );
941     return FALSE;
942     }
943     }
944    
945     q = km_quote_uid (uid);
946 twoaday 19 memset (&k, 0, sizeof (k));
947 twoaday 2 k.key_pair = 1;
948     k.keyid = keyid;
949     k.uid = q;
950     k.is_protected = km_check_if_protected( kmi->lv, idx );
951     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYREVOKE, dlg,
952     key_revoke_dlg_proc, (LPARAM)&k,
953     _("Key Revocation"), IDS_WINPT_KEYREVOKE );
954     free_if_alloc( q );
955     return TRUE;
956    
957     case ID_KEYMISC_TRUSTPATH:
958     idx = listview_get_curr_pos( kmi->lv );
959     if( idx == -1 ) {
960     msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
961     return FALSE;
962     }
963     listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid -1 );
964     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid -1 );
965     if( km_check_for_seckey( kmi->lv, idx, NULL ) ) {
966     msg_box( dlg, _("It does not make any sense with a key pair!"), _("Key Manager"), MB_OK );
967     return FALSE;
968     }
969 twoaday 19 memset (&k, 0, sizeof (k));
970 twoaday 2 k.keyid = keyid;
971     k.uid = uid;
972     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYTRUST, dlg,
973     keytrust_dlg_proc, (LPARAM)&k,
974     _("List Trust Path"), IDS_WINPT_KEYTRUST );
975     return TRUE;
976    
977     case ID_KEYMISC_CHECKSIGS:
978     idx = listview_get_curr_pos( kmi->lv );
979     if( idx == -1 ) {
980     msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
981     return FALSE;
982     }
983 twoaday 19 listview_get_item_text (kmi->lv, idx, 0, uid, DIM (uid)-1);
984     listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);
985     memset (&k, 0, sizeof (k));
986 twoaday 2 k.keyid = keyid;
987     k.uid = uid;
988 twoaday 19 dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYSIG, dlg,
989 twoaday 2 keysig_dlg_proc, (LPARAM)&k,
990 twoaday 19 _("Key Signature List" ), IDS_WINPT_KEYSIG);
991 twoaday 2 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 twoaday 19 memset (&k, 0, sizeof (k));
1002 twoaday 2 k.key_pair = 0;
1003     k.keyid = keyid;
1004     if( !strcmp( type, "pub/sec" ) || !strcmp( type, "pub/crd" ) )
1005     k.key_pair = 1;
1006     k.callback.ctl = kmi->lv;
1007     k.callback.idx = idx;
1008     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYPROPS, dlg,
1009     keyprops_dlg_proc, (LPARAM)&k,
1010     _("Key Properties"), IDS_WINPT_KEYPROPS );
1011     if (k.callback.new_val != 0)
1012     {
1013     t = get_key_trust_str (k.callback.new_val);
1014     listview_add_sub_item (kmi->lv, idx, 6, t);
1015     }
1016     return TRUE;
1017    
1018     case ID_KEYMISC_RECACHE:
1019     /* If there is already a reload request, don't bother the user with a message. */
1020     if( keycache_get_reload() == 1 )
1021     idx = IDYES;
1022     else {
1023     char t[256];
1024     _snprintf( t, sizeof t -1,
1025     _("This is only useful when the keyring has been "
1026     "modified (sign a key...).\n"
1027     "Do you really want to reload the keycache?") );
1028     idx = msg_box( dlg, t, _("Key Manager"), MB_YESNO );
1029     }
1030     if( idx == IDYES ) {
1031     rcs.kr_reload = rcs.kr_update = 1;
1032     rcs.tr_update = 0;
1033     DialogBoxParam( glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,
1034     keycache_dlg_proc, (LPARAM)&rcs );
1035     c = keycache_get_ctx( 1 );
1036     if( !c )
1037     BUG( dlg );
1038     keylist_reload( kmi->lv, c, KEYLIST_LIST, GPGME_ATTR_USERID );
1039     refresh_keys = 0;
1040     }
1041     return TRUE;
1042    
1043     case ID_KEYMISC_REBUILD:
1044     rcs.kr_reload = rcs.kr_update = 1;
1045     rcs.tr_update = 1;
1046     DialogBoxParam( glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,
1047     keycache_dlg_proc, (LPARAM)&rcs );
1048     c = keycache_get_ctx( 1 );
1049     if( !c )
1050     BUG( dlg );
1051     keylist_reload( kmi->lv, c, KEYLIST_LIST, GPGME_ATTR_USERID );
1052     return TRUE;
1053    
1054     case ID_KEYMISC_NEWKEY:
1055 twoaday 20 memset (&genkey, 0, sizeof (genkey));
1056     dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYGEN, dlg,
1057     keygen_dlg_proc, (LPARAM)&genkey, _("Key Generation"),
1058     IDS_WINPT_KEYGEN);
1059     if (genkey.newkey)
1060     keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1061 twoaday 2 return TRUE;
1062    
1063     case ID_KEYMISC_CARDNEW:
1064     if( !scard_support ) {
1065     msg_box( dlg, _("Smart Card support is not available."), _("Key Manager"), MB_INFO );
1066     return FALSE;
1067     }
1068     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN, dlg,
1069     card_keygen_dlg_proc, NULL, _("Card Key Generation"),
1070     IDS_WINPT_CARD_KEYGEN );
1071     if( keycache_get_reload() )
1072     send_cmd_id( dlg, ID_KEYMISC_RECACHE );
1073     return TRUE;
1074    
1075     case ID_KEYMISC_KEYWIZARD:
1076 twoaday 20 memset (&genkey, 0, sizeof (genkey));
1077     dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD, dlg,
1078     keygen_wizard_dlg_proc, (LPARAM)&genkey, _("Key Generation Wizard"),
1079     IDS_WINPT_KEYWIZARD);
1080     if (genkey.newkey)
1081     keylist_add_key (kmi->lv, KEYLIST_LIST, genkey.newkey);
1082 twoaday 2 return TRUE;
1083    
1084     case ID_KEYMISC_SENDRECV:
1085     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_KEYSERVER, dlg,
1086     keyserver_dlg_proc, NULL, _("Keyserver Access"),
1087     IDS_WINPT_KEYSERVER );
1088     return TRUE;
1089    
1090     case ID_KEYMISC_GPGPREFS:
1091     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGPREFS, dlg,
1092     gpgprefs_dlg_proc, NULL, _("GnuPG Preferences"),
1093     IDS_WINPT_GPGPREFS );
1094     return TRUE;
1095    
1096     case ID_KEYMISC_GPGOPT:
1097     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_GPGOPT, dlg,
1098     gpgopt_dlg_proc, NULL, _("GnuPG Options" ),
1099     IDS_WINPT_GPGOPT );
1100     return TRUE;
1101    
1102     case ID_KEYMISC_IMPORT:
1103     t = get_filename_dlg( dlg, FILE_OPEN, _("Choose Name of the Key File"), NULL, NULL );
1104     if( t )
1105     km_file_import( dlg, t );
1106     return TRUE;
1107    
1108     case ID_KEYMISC_IMPORT_HTTP:
1109 twoaday 19 url = (struct URL_ctx_s*)get_http_file_dlg (dlg);
1110     if (url->cancel == 0)
1111     km_http_import (dlg, url->url);
1112     delete url; url=NULL;
1113 twoaday 2 break;
1114    
1115     case ID_KEYMISC_EXPORT:
1116     idx = listview_get_curr_pos( kmi->lv );
1117     if( idx == -1 ) {
1118     msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
1119     return FALSE;
1120     }
1121     if( listview_count_items( kmi->lv, 1 ) > 1 )
1122     strcpy( keyid, _("Exported_GPG_Keys.asc") );
1123     else {
1124     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof keyid-1 );
1125     strcat( keyid, ".asc" );
1126     }
1127     t = get_filename_dlg( dlg, FILE_SAVE, _("Choose Name for Key File"), NULL, keyid );
1128     if( !t || overwrite_file( t ) == 0 )
1129     return FALSE;
1130     km_file_export( dlg, kmi->lv, t );
1131     return TRUE;
1132    
1133     case ID_KEYMISC_EXPORT_PRIVKEY:
1134     idx = listview_get_curr_pos( kmi->lv );
1135     if( idx == -1 ) {
1136     msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
1137     return FALSE;
1138     }
1139     if( !km_check_for_seckey( kmi->lv, idx, NULL ) ) {
1140     msg_box( dlg, _("There is no corresponding secret key for this key."),
1141     _("Key Manager"), MB_ERR );
1142     return FALSE;
1143     }
1144     if( listview_count_items( kmi->lv, 1 ) > 1 ) {
1145     msg_box( dlg, _("You can only export one secret key."), _("Key Manager"), MB_ERR );
1146     return FALSE;
1147     }
1148     idx = msg_box( dlg,
1149     _("This operation will export your *SECRET* key!\n\n"
1150     "Never send this key to ANYONE, it should be available\n"
1151     "ONLY on your machine and you may use this function\n"
1152     "to copy the key to a safe place.\n\n"
1153     "Do you really want to export the key?"),
1154     _("WARNING"), MB_INFO|MB_YESNO );
1155     if( idx == IDYES ) {
1156     idx = listview_get_curr_pos( kmi->lv );
1157     listview_get_item_text( kmi->lv, idx, 1, keyid, sizeof (keyid)-8 );
1158     strcat( keyid, ".sec.asc" );
1159     t = get_filename_dlg( dlg, 1, _("Choose Name for Key File"), NULL, keyid );
1160     if( t && !file_exist_check( t ) ) {
1161     idx = log_box( _("Key Manager"), MB_INFO|MB_YESNO,
1162     _("File %s already exists.\nOverwrite?"), t );
1163     if( idx == IDNO )
1164     return FALSE;
1165     }
1166     if( t )
1167     km_privkey_export( dlg, kmi->lv, t );
1168     }
1169     break;
1170    
1171     case ID_KEYMISC_INFO:
1172     dialog_box_param( glob_hinst, (LPCSTR)IDD_WINPT_ABOUT, glob_hwnd,
1173     about_winpt_dlg_proc, NULL, _("About WinPT"),
1174     IDS_WINPT_ABOUT );
1175     break;
1176    
1177     case ID_KEYMISC_HELP:
1178     ShellExecute (dlg, "open", "winpt.chm", NULL, NULL, SW_SHOW);
1179     break;
1180    
1181     case ID_KEYMISC_OT:
1182     dialog_box_param( glob_hinst, (LPCTSTR)IDD_WINPT_OWNERTRUST, glob_hwnd,
1183     ownertrust_dlg_proc, NULL,
1184     _("Ownertrust"), IDS_WINPT_OWNERTRUST );
1185     break;
1186    
1187     case ID_KEYMISC_EDITKEY:
1188     idx = listview_get_curr_pos (kmi->lv);
1189 twoaday 16 if (idx == -1)
1190 twoaday 2 break;
1191 twoaday 16 listview_get_item_text (kmi->lv, idx, 1, keyid, sizeof (keyid)-1);
1192     /* XXX: pub/crd = secret key does not work */
1193 twoaday 19 memset (&k, 0, sizeof (k));
1194 twoaday 16 k.is_protected = km_check_if_protected (kmi->lv, idx);
1195     k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);
1196 twoaday 2 k.keyid = keyid;
1197 twoaday 20 k.is_v3 = km_key_is_v3 (kmi->lv, idx);
1198 twoaday 16 k.flags = km_get_key_status (kmi->lv, idx);
1199     dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT, dlg,
1200 twoaday 2 keyedit_main_dlg_proc, (LPARAM)&k,
1201 twoaday 16 _("Key Edit"), IDS_KEYCTX_EDIT);
1202 twoaday 2 break;
1203    
1204     case ID_GROUP_NEW:
1205 twoaday 16 memset (&gcb, 0, sizeof (gcb));
1206 twoaday 2 gcb.gc = gc;
1207 twoaday 16 dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_GROUP, glob_hwnd,
1208 twoaday 2 group_manager_dlg_proc, (LPARAM)&gcb, _("New Group"),
1209 twoaday 16 IDS_WINPT_GROUP);
1210 twoaday 2 if( gcb.use_name )
1211     treeview_add_item( GetDlgItem(dlg, IDC_KEYMISC_GROUP), NULL, gcb.name );
1212     return TRUE;
1213    
1214     case ID_KEYMISC_COPY:
1215     km_index = listview_get_curr_pos( kmi->lv );
1216     km_clip_export( dlg, kmi->lv );
1217     break;
1218    
1219     case ID_KEYMISC_SELALL:
1220     listview_select_all (kmi->lv);
1221     break;
1222    
1223     case ID_KEYMISC_PASTE:
1224     km_index = -1;
1225     km_clip_import (dlg);
1226     break;
1227    
1228     case ID_KEYCTX_SETPREFKS:
1229 twoaday 19 listview_get_item_text (kmi->lv, idx, 1, keyid, DIM(keyid)-1);
1230     memset (&k, 0, sizeof (k));
1231     k.keyid = keyid;
1232     keyedit_set_pref_keyserver (&k, dlg);
1233 twoaday 2 break;
1234    
1235     case ID_KEYMISC_REFRESH_KEYS:
1236 twoaday 19 if (listview_count_items (kmi->lv, 1) == 0) {
1237 twoaday 2 msg_box (dlg, _("No key was selected, select all by default."), _("Key Manager"), MB_INFO);
1238     listview_select_all (kmi->lv);
1239     }
1240     km_refresh_from_keyserver (kmi->lv, dlg);
1241     break;
1242    
1243     /** Context menu **/
1244     case ID_KEYCTX_EDIT:
1245     send_cmd_id( dlg, ID_KEYMISC_EDITKEY );
1246     break;
1247    
1248     case ID_KEYCTX_PROPS:
1249     send_cmd_id( dlg, ID_KEYMISC_PROPS );
1250     break;
1251    
1252     case ID_KEYCTX_UIDS:
1253     send_cmd_id( dlg, ID_KEYMISC_UID );
1254     break;
1255    
1256     case ID_KEYCTX_SIGN:
1257     send_cmd_id( dlg, ID_KEYMISC_SIGN );
1258     break;
1259    
1260     case ID_KEYCTX_DEL:
1261     send_cmd_id (dlg, ID_KEYMISC_DELETE);
1262     break;
1263    
1264     case ID_KEYCTX_REV:
1265     send_cmd_id( dlg, ID_KEYMISC_REVCERT );
1266     break;
1267    
1268     case ID_KEYCTX_SENDMAIL:
1269     km_send_to_mail_recipient( kmi->lv, dlg );
1270     break;
1271    
1272     case ID_KEYCTX_KS_DEFAULT:
1273     host = kserver_get_hostname (0, -1, &port);
1274     km_send_to_keyserver (kmi->lv, dlg, host, port);
1275     break;
1276    
1277     case ID_KEYCTX_ADDKEY:
1278     idx = listview_get_curr_pos( kmi->lv );
1279 twoaday 19 listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);
1280     memset (&k, 0, sizeof (k));
1281 twoaday 2 k.key_pair = km_check_for_seckey( kmi->lv, idx, NULL );
1282     k.is_protected = km_check_if_protected( kmi->lv, idx );
1283     k.keyid = keyid;
1284     keyedit_add_subkey( &k, dlg, NULL );
1285     break;
1286    
1287     case ID_KEYCTX_ADDUID:
1288     idx = listview_get_curr_pos( kmi->lv );
1289 twoaday 19 listview_get_item_text( kmi->lv, idx, 1, keyid, DIM (keyid)-1);
1290     memset (&k, 0, sizeof (k));
1291 twoaday 2 k.key_pair = km_check_for_seckey( kmi->lv, idx, NULL );
1292     k.is_protected = km_check_if_protected( kmi->lv, idx );
1293     k.keyid = keyid;
1294     keyedit_add_userid( &k, dlg, NULL );
1295     break;
1296    
1297     case ID_KEYCTX_ADDREV:
1298 twoaday 19 idx = listview_get_curr_pos (kmi->lv);
1299     listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);
1300     memset (&k, 0, sizeof (k));
1301 twoaday 2 k.keyid = keyid;
1302     k.is_protected = km_check_if_protected( kmi->lv, idx );
1303     k.key_pair = km_check_for_seckey( kmi->lv, idx, NULL );
1304     keyedit_add_revoker( &k, dlg );
1305     break;
1306    
1307     case ID_KEYCTX_ADDPHOTO:
1308 twoaday 19 idx = listview_get_curr_pos (kmi->lv);
1309     listview_get_item_text (kmi->lv, idx, 1, keyid, DIM (keyid)-1);
1310     memset (&k, 0, sizeof (k));
1311 twoaday 2 k.keyid = keyid;
1312 twoaday 19 k.is_protected = km_check_if_protected (kmi->lv, idx);
1313     k.key_pair = km_check_for_seckey (kmi->lv, idx, NULL);
1314     keyedit_add_photo (&k, dlg);
1315 twoaday 2 break;
1316    
1317     case ID_KEYCTX_KS_NL:
1318     case ID_KEYCTX_KS_PL:
1319     case ID_KEYCTX_KS_AT:
1320     case ID_KEYCTX_KS_DE:
1321     case ID_KEYCTX_KS_DK:
1322     case ID_KEYCTX_KS_CZ:
1323     case ID_KEYCTX_KS_ES:
1324     case ID_KEYCTX_KS_UK:
1325     host = kserver_get_hostname (LOWORD (wparam) - 40107, 0, &port);
1326     km_send_to_keyserver (kmi->lv, dlg, host, port);
1327     break;
1328    
1329     case ID_KEYCTX_RECVFROM:
1330     km_refresh_from_keyserver (kmi->lv, dlg);
1331     break;
1332    
1333     case ID_KEYCTX_UID_COPY:
1334     /* XXX: add generic function to support multiple selection
1335     with a callback */
1336     idx = listview_get_curr_pos( kmi->lv );
1337     listview_get_item_text( kmi->lv, idx, 0, uid, sizeof uid-1 );
1338     set_clip_text( NULL, uid, strlen( uid ) );
1339     break;
1340    
1341     case ID_KEYCTX_KEYID_COPY:
1342     idx = listview_get_curr_pos( kmi->lv );
1343     listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );
1344     set_clip_text( NULL, uid, strlen( uid ) );
1345     break;
1346    
1347     case ID_KEYCTX_FPR_COPY:
1348     idx = listview_get_curr_pos( kmi->lv );
1349     listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );
1350     get_pubkey( uid, &pk );
1351     if( pk ) {
1352     const char * s = get_key_fpr( pk );
1353     set_clip_text( NULL, s? s : "", s? strlen( s ): 0 );
1354     }
1355     break;
1356    
1357     case ID_KEYCTX_KINFO_COPY:
1358     idx = listview_get_curr_pos( kmi->lv );
1359     listview_get_item_text( kmi->lv, idx, 1, uid, sizeof uid-1 );
1360     km_set_clip_info( uid );
1361     break;
1362    
1363     case ID_KEYCTX_COPY:
1364     km_index = listview_get_curr_pos (kmi->lv);
1365     km_clip_export (dlg, kmi->lv);
1366     break;
1367    
1368     case ID_KEYCTX_PASTE:
1369     km_index = -1;
1370     km_clip_import (dlg);
1371     break;
1372    
1373     case ID_KEYCTX_DISABLE:
1374     idx = listview_get_curr_pos (kmi->lv);
1375     km_enable_disable_key (kmi->lv, dlg, idx, 0);
1376     break;
1377    
1378     case ID_KEYCTX_ENABLE:
1379     idx = listview_get_curr_pos (kmi->lv);
1380     km_enable_disable_key (kmi->lv, dlg, idx, 1);
1381     break;
1382    
1383     case ID_KEYCTX_LISTSIGS:
1384     send_cmd_id (dlg, ID_KEYMISC_CHECKSIGS);
1385     break;
1386    
1387     case ID_KEYCTX_MAXTRUST:
1388     idx = listview_get_curr_pos (kmi->lv);
1389     km_set_implicit_trust (dlg, kmi->lv, idx);
1390     break;
1391    
1392     case ID_KEYCTX_SETDEFKEY:
1393     idx = listview_get_curr_pos (kmi->lv);
1394     if (km_check_key_status (kmi->lv, idx))
1395     {
1396     listview_get_item_text (kmi->lv, idx, 1, keyid, sizeof keyid -1);
1397     rc = set_gnupg_default_key (keyid);
1398     if (rc)
1399     msg_box( dlg, winpt_strerror (rc), _("Key Manager"), MB_ERR);
1400     km_update_default_key_str (kmi->statbar, &km_def_pos);
1401     }
1402     break;
1403    
1404     case ID_GROUP_PASTE:
1405     km_groups_add (gc, kmi->lv, km_index);
1406     break;
1407    
1408     case ID_GROUP_DELETE:
1409     km_groups_del (gc);
1410     break;
1411     }
1412     break;
1413     }
1414    
1415     return FALSE;
1416     } /* keymanager_dlg_proc */
1417    
1418    

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26