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

Annotation of /trunk/Src/wptKeyManagerDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26