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

Annotation of /trunk/Src/wptKeysigDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 28 - (hide annotations)
Thu Oct 20 12:35:59 2005 UTC (19 years, 4 months ago) by twoaday
File size: 12170 byte(s)
Minor cleanups and prepare the translation.

1 twoaday 2 /* wptKeysigDlg.cpp - Key signature listing
2     * Copyright (C) 2001-2005 Timo Schulz
3     *
4     * This file is part of WinPT.
5     *
6     * WinPT is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * WinPT is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with WinPT; if not, write to the Free Software Foundation,
18     * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19     */
20    
21     #include <windows.h>
22     #include <commctrl.h>
23     #include <time.h>
24    
25     #include "../resource.h"
26     #include "wptGPG.h"
27     #include "wptCommonCtl.h"
28     #include "wptContext.h" /* for passphrase_s */
29     #include "wptDlgs.h"
30     #include "wptW32API.h"
31     #include "wptNLS.h"
32     #include "wptKeyList.h"
33     #include "wptKeyserver.h"
34     #include "wptUTF8.h"
35     #include "wptTypes.h"
36     #include "wptVersion.h"
37     #include "wptErrors.h"
38 twoaday 23 #include "wptKeyEdit.h"
39 twoaday 2
40     static subclass_s siglist_proc;
41    
42    
43     static int inline
44     is_sig (listview_ctrl_t lv, int pos)
45     {
46     char tmpbuf[256];
47    
48     if (pos == -1)
49     pos = listview_get_curr_pos (lv);
50     listview_get_item_text (lv, pos, 0, tmpbuf, 200);
51     if (*tmpbuf == ' ')
52     return -1;
53     return 0;
54     }
55    
56    
57     static int
58     do_delsig (HWND dlg, listview_ctrl_t lv, winpt_key_t key)
59     {
60     int pos, npos, id;
61     int signo=0, uidno=0;
62 twoaday 23 GpgKeyEdit *ke;
63     gpgme_error_t err;
64 twoaday 2
65     npos = pos = listview_get_curr_pos (lv);
66     if (!is_sig (lv, -1))
67     return -1;
68 twoaday 22 while (pos > 0 && is_sig (lv, pos)) {
69 twoaday 2 signo++;
70     pos--;
71     }
72     pos = npos;
73 twoaday 22 while (npos > 0) {
74 twoaday 2 if (!is_sig (lv, npos))
75     uidno++;
76     npos--;
77     }
78     uidno++;
79 twoaday 22
80     /* XXX: do not allow to delete the self signature */
81 twoaday 23 id = log_box (_("Key Manager"), MB_YESNO,
82 twoaday 2 _("Are you really sure you want to delete this signature from\n"
83     " \"%s\""), key->uid);
84     if (id == IDNO)
85     return 0;
86 twoaday 23
87     ke = new GpgKeyEdit (key->keyid);
88     if (!ke)
89     BUG (NULL);
90 twoaday 24 err = ke->delUseridSignature (uidno, signo);
91 twoaday 23 if (err)
92     msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);
93 twoaday 2 else
94     listview_del_item (lv, pos);
95 twoaday 23 delete ke;
96 twoaday 19 key->update = 1; /*update*/
97 twoaday 2 return 0;
98     }
99    
100    
101     static BOOL CALLBACK
102     sigprops_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
103     {
104     static listview_ctrl_t lv;
105     char tmpbuf[256];
106     int n;
107     struct {
108     unsigned int exportable:1;
109     unsigned int expired:1;
110     unsigned int nrev:1;
111     unsigned int rev:1;
112     const char * alg;
113     int _class;
114     } ctx;
115 twoaday 24 const char *fmt_templ = "%s %s signature";
116 twoaday 2
117 twoaday 19 switch (msg) {
118 twoaday 2 case WM_SYSCOMMAND:
119     if (LOWORD (wparam) == SC_CLOSE)
120     EndDialog (dlg, TRUE);
121     return FALSE;
122    
123     case WM_INITDIALOG:
124     lv = (listview_ctrl_t)lparam;
125     if (!lv)
126     dlg_fatal_error (dlg, "could not get dialog param");
127     memset (&ctx, 0, sizeof ctx);
128     n = listview_get_curr_pos (lv);
129     listview_get_item_text (lv, n, 2, tmpbuf, DIM (tmpbuf)-1);
130     if (!strstr (tmpbuf, "L"))
131     ctx.exportable = 1;
132     ctx._class = atoi (tmpbuf);
133     if (ctx._class == 0)
134     ctx._class = 10;
135     else if (ctx._class < 10)
136     ctx._class += 10;
137     listview_get_item_text (lv, n, 6, tmpbuf, DIM (tmpbuf)-1);
138     if (strstr (tmpbuf, "DSA"))
139     ctx.alg = "DSA";
140     else if (strstr (tmpbuf, "RSA"))
141     ctx.alg = "RSA";
142     else
143     ctx.alg = "ELG";
144     _snprintf (tmpbuf, DIM (tmpbuf)-1, fmt_templ,
145     ctx.exportable? "Exportable" : "Non-exportable", ctx.alg);
146     SetDlgItemText (dlg, IDC_SIGPROPS_INFO, tmpbuf);
147     listview_get_item_text (lv, n, 4, tmpbuf, DIM (tmpbuf)-1);
148     SetDlgItemText (dlg, IDC_SIGPROPS_KEYID, tmpbuf);
149     SetDlgItemInt (dlg, IDC_SIGPROPS_CLASS, ctx._class, FALSE);
150     if (ctx.exportable)
151     CheckDlgButton (dlg, IDC_SIGPROPS_EXP, BST_CHECKED);
152     listview_get_item_text (lv, n, 0, tmpbuf, DIM (tmpbuf)-1);
153     SetDlgItemText (dlg, IDC_SIGPROPS_ISSUER, tmpbuf+1);
154     tmpbuf[0] = 0;
155     listview_get_item_text (lv, n, 5, tmpbuf, DIM (tmpbuf)-1);
156 twoaday 13 if (strlen (tmpbuf) == 0) {
157 twoaday 2 ShowWindow (GetDlgItem (dlg, IDC_SIGPROPS_EXPSTR), SW_HIDE);
158     ShowWindow (GetDlgItem (dlg, IDC_SIGPROPS_EXPDATE), SW_HIDE);
159     }
160 twoaday 13 else {
161 twoaday 2 SYSTEMTIME st;
162     struct tm * tm;
163     time_t t = time (NULL);
164    
165     memset (&st, 0, sizeof st);
166     st.wYear = atoi (tmpbuf);
167     st.wMonth = atoi (tmpbuf+5);
168     st.wDay = atoi (tmpbuf+8);
169     DateTime_SetSystemtime (GetDlgItem (dlg, IDC_SIGPROPS_EXPDATE),
170     GDT_VALID, &st);
171    
172     tm = localtime (&t);
173     tm->tm_mon++;
174     tm->tm_year += 1900;
175     if (tm->tm_year > st.wYear)
176     ctx.expired = 1;
177     else if (tm->tm_mon > st.wMonth)
178     ctx.expired = 1;
179     if (ctx.expired)
180     CheckDlgButton (dlg, IDC_SIGPROPS_EXPIRED, BST_CHECKED);
181     }
182     SetDlgItemText (dlg, IDC_SIGPROPS_EXP, _("Exportable"));
183     SetDlgItemText (dlg, IDC_SIGPROPS_NREV, _("Non-revocably"));
184     SetDlgItemText (dlg, IDC_SIGPROPS_REV, _("Revoked"));
185     SetDlgItemText (dlg, IDC_SIGPROPS_EXPIRED, _("Expired"));
186     SetForegroundWindow (dlg);
187 twoaday 23 center_window (dlg, NULL);
188 twoaday 2 return TRUE;
189    
190     case WM_COMMAND:
191 twoaday 13 switch (LOWORD (wparam)) {
192 twoaday 2 case IDOK:
193     EndDialog (dlg, TRUE);
194     break;
195     }
196     }
197    
198     return FALSE;
199     }
200    
201    
202     static BOOL CALLBACK
203     subclass_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
204     {
205     listview_ctrl_t lv;
206     winpt_key_t key;
207    
208 twoaday 19 switch (msg) {
209 twoaday 2 case WM_KEYUP:
210     int virt_key = (int)wparam;
211     key = (winpt_key_t)siglist_proc.opaque;
212     lv = key->callback.ctl;
213 twoaday 19 if (virt_key == VK_SPACE) {
214 twoaday 2 if (is_sig (lv, -1))
215     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_SIGPROPS, dlg,
216     sigprops_dlg_proc, (LPARAM)lv);
217     }
218     else if (virt_key == VK_DELETE)
219     do_delsig (dlg, lv, key);
220     break;
221     }
222     return CallWindowProc (siglist_proc.old, dlg, msg, wparam, lparam);
223     }
224    
225    
226     static int
227     check_for_missing_keys (listview_ctrl_t lv)
228     {
229     int i, n;
230     char id[128];
231    
232     n = listview_count_items( lv, 0 );
233     for( i = 0; i < n; i++ ) {
234 twoaday 20 listview_get_item_text( lv, i, 1, id, sizeof (id) - 1 );
235 twoaday 2 if( !strncmp( id, "NOKEY", 5 ) )
236     return 1;
237     }
238    
239     return 0;
240     } /* check_for_missing_keys */
241    
242    
243     static int
244     recv_missing_keys (HWND dlg, listview_ctrl_t lv)
245     {
246     int i, n, rc;
247     char id[128], keyid[18+1];
248    
249     n = listview_count_items (lv, 0);
250     for( i = 0; i < n; i++ ) {
251     listview_get_item_text( lv, i, 1, id, sizeof id - 1 );
252     if( !strncmp( id, "NOKEY", 5 ) ) {
253     listview_get_item_text( lv, i, 4, keyid, sizeof keyid -1 );
254     rc = hkp_recv_key( dlg, default_keyserver, default_keyserver_port, keyid, 0, 0 );
255     if( rc )
256     break;
257     }
258     }
259    
260     return rc;
261     } /* recv_missing_keys */
262    
263    
264     static void
265     do_create_popup (HWND dlg)
266     {
267     HMENU hm, sm;
268     POINT p;
269    
270     GetCursorPos (&p);
271     hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYSIG_CTX));
272     sm = GetSubMenu (hm, 0);
273    
274 twoaday 28 set_menu_text (sm, ID_SIGCTX_PROPS, _("Signature &Properties"));
275     set_menu_text (sm, ID_SIGCTX_KEYPROPS, _("Signing &Key Properties"));
276    
277 twoaday 2 TrackPopupMenu (sm, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);
278    
279     DestroyMenu (hm);
280     DestroyMenu (sm);
281     }
282    
283    
284     static void
285     do_load_keyprops (HWND dlg, listview_ctrl_t lv)
286     {
287     winpt_key_s k;
288     gpgme_key_t key;
289     char keyid[32] = {0};
290     char status[64] = {0}, creation[64] = {0};
291     int n = listview_get_curr_pos (lv);
292    
293     listview_get_item_text (lv, n, 1, status, DIM (status)-1);
294     listview_get_item_text (lv, n, 3, creation, DIM (creation)-1);
295     listview_get_item_text (lv, n, 4, keyid, DIM (keyid)-1);
296     if (!strcmp (status, "NOKEY")) {
297     msg_box (dlg, _("Key not found in keyring, please get it from the keyserver first."),
298     _("Key Manager"), MB_INFO);
299     return;
300     }
301    
302     if ((strlen (keyid) < 3 ||get_pubkey (keyid, &key))) {
303     if (strlen (creation) > 0)
304     msg_box (dlg, _("Key not found in keyring."), _("Key Manager"), MB_INFO);
305     return;
306     }
307     memset (&k, 0, sizeof k);
308     k.keyid = keyid;
309     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYPROPS, dlg,
310     keyprops_dlg_proc, (LPARAM)&k);
311     }
312    
313 twoaday 19
314 twoaday 2 BOOL CALLBACK
315     keysig_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
316     {
317     static listview_ctrl_t lv = NULL;
318 twoaday 19 static struct winpt_key_s *k;
319 twoaday 2 char inf[384], keyid[18+1];
320     int idx = 0, id, rc;
321     HWND sl;
322    
323     switch( msg ) {
324     case WM_INITDIALOG:
325     k = (winpt_key_t) lparam;
326     if (!k)
327     BUG (0);
328 twoaday 19 if (k->uid)
329     _snprintf (inf, DIM (inf)-1, _("Signature List for \"%s\""), k->uid);
330     SetWindowText (dlg, inf);
331 twoaday 2 #ifndef LANG_DE
332 twoaday 19 SetDlgItemText (dlg, IDC_KEYSIG_RECVKEY, _("&Receive Key"));
333 twoaday 2 SetDlgItemText (dlg, IDC_KEYSIG_SIGPROPS, _("&Properties"));
334     #endif
335 twoaday 22 lv = siglist_load (GetDlgItem (dlg, IDC_KEYSIG_LIST), k->keyid);
336     if (!check_for_missing_keys (lv))
337     EnableWindow (GetDlgItem( dlg, IDC_KEYSIG_RECVKEY ), FALSE);
338 twoaday 2 k->callback.ctl = lv;
339     sl = GetDlgItem (dlg, IDC_KEYSIG_LIST);
340     siglist_proc.dlg = dlg;
341     siglist_proc.opaque = k;
342     siglist_proc.current = (WNDPROC)subclass_dlg_proc;
343     siglist_proc.old = (WNDPROC)GetWindowLong (sl, GWL_WNDPROC);
344 twoaday 19 if (siglist_proc.old) {
345     if (!SetWindowLong (sl, GWL_WNDPROC, (LONG)siglist_proc.current)) {
346 twoaday 2 msg_box (dlg, _("Could not set keylist window procedure."), _("Key Manager"), MB_ERR);
347     BUG (0);
348     }
349     }
350     SetForegroundWindow (dlg);
351 twoaday 23 center_window (dlg, NULL);
352 twoaday 2 return TRUE;
353    
354     case WM_DESTROY:
355     if ( lv ) {
356     siglist_delete( lv );
357     lv = NULL;
358     }
359     return FALSE;
360    
361     case WM_SYSCOMMAND:
362 twoaday 19 if (LOWORD (wparam) == SC_CLOSE) {
363     if (k->update)
364 twoaday 20 keycache_update (0, k->keyid);
365 twoaday 19 EndDialog (dlg, TRUE);
366     }
367 twoaday 2 return FALSE;
368    
369     case WM_NOTIFY:
370     NMHDR * notify;
371    
372     notify = (NMHDR *)lparam;
373     if( notify && notify->code == NM_DBLCLK
374     && notify->idFrom == IDC_KEYSIG_LIST )
375     do_load_keyprops (dlg, lv);
376     if (notify && notify->code == NM_RCLICK &&
377     notify->idFrom == IDC_KEYSIG_LIST)
378     do_create_popup (dlg);
379     break;
380    
381     case WM_COMMAND:
382     switch ( LOWORD( wparam ) ) {
383    
384     case ID_SIGCTX_KEYPROPS:
385     do_load_keyprops (dlg, lv);
386     break;
387    
388     case ID_SIGCTX_PROPS:
389     if (is_sig (lv, -1))
390     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_SIGPROPS, dlg,
391     sigprops_dlg_proc, (LPARAM)lv);
392     break;
393    
394     case IDC_KEYSIG_RECVKEY:
395 twoaday 22 idx = listview_get_curr_pos (lv);
396     if (idx == -1) {
397 twoaday 2 id = msg_box( dlg, _("Really receive all missing keys?"),
398     _("Key Manager"), MB_YESNO|MB_INFO );
399 twoaday 19 if (id == IDYES) {
400     rc = recv_missing_keys (dlg, lv);
401 twoaday 2 if( !rc )
402 twoaday 19 keycache_set_reload (1);
403 twoaday 2 return TRUE;
404     }
405 twoaday 23 return TRUE;
406 twoaday 2 }
407 twoaday 22 listview_get_item_text (lv, idx, 1, inf, DIM (inf)-1);
408     if (strcmp (inf, "NOKEY"))
409     return FALSE;
410     listview_get_item_text (lv, idx, 4, keyid, DIM (keyid)-1);
411 twoaday 2 rc = hkp_recv_key (dlg, default_keyserver, default_keyserver_port, keyid, 0, 0);
412     if (!rc)
413     keycache_set_reload (1);
414     return TRUE;
415    
416     case IDC_KEYSIG_SIGPROPS:
417     if (is_sig (lv, -1))
418     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_SIGPROPS, dlg,
419     sigprops_dlg_proc, (LPARAM)lv);
420     return TRUE;
421    
422     case IDOK:
423 twoaday 19 if (k->update)
424 twoaday 20 keycache_update (0, k->keyid);
425 twoaday 2 EndDialog (dlg, TRUE);
426     return TRUE;
427     }
428     break;
429     }
430     return FALSE;
431     } /* keysig_dlg_proc */

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26