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

Annotation of /trunk/Src/wptKeyPropsDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 41 - (hide annotations)
Fri Oct 28 07:15:26 2005 UTC (19 years, 4 months ago) by twoaday
File size: 9942 byte(s)
A lot of bug fixes. See ChangeLog.

1 werner 36 /* wptKeyPropsDlg.cpp - WinPT key properties dialog
2     * Copyright (C) 2000, 2001, 2002, 2003, 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    
23     #include "../resource.h"
24     #include "wptErrors.h"
25     #include "wptGPG.h"
26     #include "wptCommonCtl.h"
27     #include "wptContext.h" /* for passphrase_s */
28     #include "wptNLS.h"
29     #include "wptDlgs.h"
30     #include "wptTypes.h"
31     #include "wptKeylist.h"
32     #include "wptW32API.h"
33     #include "wptVersion.h"
34     #include "wptKeyEdit.h"
35    
36    
37     /* Check that the key is not expired or revoked. */
38     static int
39     do_check_key (gpgme_key_t key)
40     {
41     int okay = 0;
42     okay = key->expired;
43     if (!okay)
44     okay = key->revoked;
45     return okay;
46     }
47    
48    
49     /* Convert a trust integer into a string representation. */
50     static const char*
51     ownertrust_to_string (int val)
52     {
53 twoaday 41 const char *inf;
54 werner 36 int id = val;
55 twoaday 41
56 werner 36 switch (id) {
57     case 1: inf = _("Don't know"); break;
58     case 2: inf = _("I do NOT trust"); break;
59     case 3: inf = _("I trust marginally"); break;
60     case 4: inf = _("I trust fully"); break;
61     case 5:
62     case 6: inf = _("I trust ultimately"); break;
63     default:inf = _("Unknown"); break;
64     }
65    
66     return inf;
67     }
68    
69    
70     /* Generate a unique temp name for the photo which
71     depends on the dialog handle and return it. */
72     static const char*
73     get_photo_tmpname (HWND dlg)
74     {
75     static char buf[64];
76    
77     _snprintf (buf, sizeof (buf)-1, "winpt_photo_%08lX.tmp", (DWORD)dlg);
78     return buf;
79     }
80    
81    
82     /* Load the photo from the key @key */
83     static int
84     keyprops_load_photo (HWND dlg, gpgme_key_t key, gpgme_validity_t *r_valid)
85     {
86     winpt_key_s k;
87     FILE *f;
88     const BYTE *img;
89     DWORD imglen = 0;
90     int pos=0;
91    
92     winpt_get_pubkey (key->subkeys->keyid, &k);
93     img = k.ext->attrib.d;
94     imglen = k.ext->attrib.len;
95     if (!k.ext->attrib.validity)
96     get_uat_validity (key->subkeys->keyid, &k.ext->attrib.validity);
97     *r_valid = k.ext->attrib.validity;
98    
99     if (!img || !imglen)
100     return -1;
101     f = fopen (get_photo_tmpname (dlg), "wb");
102     if (f) {
103     for (pos = 0; img[pos] != 0x10; pos++)
104     ;
105     pos += 16;
106     fwrite (img + pos, 1, imglen - pos, f);
107     fwrite (img, 1, imglen, f);
108     fclose (f);
109     }
110     return 0;
111     }
112    
113    
114     /* Display the photo in the image control in the dialog @dlg. */
115     static int
116     keyprops_show_photo (HWND dlg)
117     {
118     RECT r;
119     POINT p;
120     HWND h;
121    
122     h = GetDlgItem (dlg, IDC_KEYPROPS_IMG);
123     GetWindowRect (h, &r);
124     p.x = r.left + 5;
125     p.y = r.top - 2;
126     memset (&p, 0, sizeof (p));
127     PTD_jpg_show (h, &p, get_photo_tmpname (dlg));
128    
129     return 0;
130     }
131    
132    
133     /* Return string representation of the key validity. @key. */
134     static const char*
135     get_validity (gpgme_key_t key)
136     {
137     int val;
138     val = key->expired;
139     if (val)
140     return _("Expired");
141     val = key->revoked;
142     if (val)
143     return _("Revoked");
144 twoaday 41 val = key->disabled;
145     if (val)
146     return _("Disabled");
147 werner 36 return get_key_trust2 (NULL, key->uids->validity, 0, 0);
148     }
149    
150    
151     /* Return the preferred sym. algorithm from @key as a string. */
152     static const char*
153     get_pref_cipher (winpt_key_t k)
154     {
155     const char *sym_prefs=NULL;
156    
157     if (k->is_v3)
158     return "IDEA";
159     if (!k->ext->sym_prefs)
160     return "3DES";
161     switch (*k->ext->sym_prefs) {
162     case 1: return "IDEA";
163     case 2: return "3DES";
164     case 3: return "CAST5";
165     case 4: return "Blowfish";
166     case 7:
167     case 8:
168     case 9: return "AES";
169     case 10:return "Twofish";
170     }
171     return "Unknown";
172     }
173    
174    
175     /* Return true if the key has designated revokers. */
176     static bool
177     check_for_desig_rev (gpgme_key_t key)
178     {
179     winpt_key_s k;
180     memset (&k, 0, sizeof (k));
181     if (!winpt_get_pubkey (key->subkeys->keyid, &k))
182     return k.ext->gloflags.has_desig_rev? true : false;
183     return false;
184     }
185    
186    
187     /* Print information (name) of the smart card. */
188     static const char*
189     get_card_type (winpt_key_t k)
190     {
191     static char buf[64];
192    
193     if (!k->ext->card_type)
194     return "";
195     _snprintf (buf, sizeof (buf)-1, _("Card-Type: %s\r\n"), k->ext->card_type);
196     return buf;
197     }
198    
199    
200     /* Display the key information for key @k.
201     Return value: gpgme key on success. */
202     static void
203     display_key_info (HWND dlg, winpt_key_t k, gpgme_key_t *r_key)
204     {
205     struct winpt_key_s k2;
206     gpgme_key_t sk, key;
207     char info[512];
208     const char *inf;
209     u32 created, expires;
210    
211     memset (&k2, 0, sizeof (k2));
212     if (k->key_pair)
213     winpt_get_seckey (k->keyid, &k2);
214     else
215     winpt_get_pubkey (k->keyid, &k2);
216     sk = k2.ctx;
217     if (sk)
218     k->is_protected = k2.is_protected;
219     if (get_pubkey (k->keyid, &key))
220     BUG (0);
221     created = key->subkeys->timestamp;
222     expires = key->subkeys->expires;
223     _snprintf (info, DIM (info)-1,
224     _("Type: %s\r\n"
225     "Key ID: %s\r\n"
226     "Algorithm: %s\r\n"
227     "Size: %s\r\n"
228     "Created: %s\r\n"
229     "Expires: %s\r\n"
230     "Validity: %s\r\n"
231     "Cipher: %s\r\n"
232     "%s\r\n"),
233     get_key_type (key),
234     k->keyid,
235     get_key_algo (key, 0),
236     get_key_size (key, 0),
237     get_key_created (created),
238     get_key_expire_date (expires),
239     get_validity (key),
240     get_pref_cipher (&k2),
241     get_card_type (&k2));
242    
243     SetDlgItemText (dlg, IDC_KEYPROPS_INFO, info);
244     SetDlgItemText (dlg, IDC_KEYPROPS_FPR, get_key_fpr (key));
245     inf = ownertrust_to_string (key->owner_trust);
246     SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);
247    
248     *r_key = key;
249     }
250    
251    
252     /* Dialog box procedure to show the key properties. */
253     BOOL CALLBACK
254     keyprops_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
255     {
256     static winpt_key_t k;
257     static gpgme_key_t key;
258     gpgme_validity_t valid;
259     refresh_cache_s rcs = {0};
260     const char *inf;
261     int cancel = 0;
262     int rc;
263    
264     /* XXX: static variable (k) prevent that the dialog can
265     be opened twice. */
266     switch (msg) {
267     case WM_INITDIALOG:
268     if (!lparam)
269     dlg_fatal_error (dlg, "Could not get dialog param!");
270     k = (winpt_key_t)lparam;
271     #ifndef LANG_DE
272     SetWindowText (dlg, _("Key Properties"));
273     SetDlgItemText (dlg, IDC_KEYPROPS_OT_CHANGE, _("&Change"));
274     SetDlgItemText (dlg, IDC_KEYPROPS_REVOKERS, _("&Revokers"));
275     SetDlgItemText (dlg, IDC_KEYPROPS_CHANGE_PWD, _("Change &Passwd"));
276     SetDlgItemText (dlg, IDC_KEYPROPS_OTINF, _("Ownertrust"));
277     #endif
278    
279     display_key_info (dlg, k, &key);
280     if (!keyprops_load_photo (dlg, key, &valid)) {
281     k->has_photo = 1;
282     if (valid < GPGME_VALIDITY_MARGINAL)
283     SetDlgItemText (dlg, IDC_KEYPROPS_IMGINF, _("Photo-ID not validated."));
284     }
285     if (k->key_pair)
286     EnableWindow (GetDlgItem (dlg, IDC_KEYPROPS_CHANGE_PWD), TRUE);
287     if (check_for_desig_rev (key))
288     EnableWindow (GetDlgItem (dlg, IDC_KEYPROPS_REVOKERS), TRUE);
289     center_window (dlg, NULL);
290     SetForegroundWindow (dlg);
291     return TRUE;
292    
293     case WM_DESTROY:
294     unlink (get_photo_tmpname (dlg));
295     break;
296    
297     case WM_PAINT:
298     if (k->has_photo)
299     keyprops_show_photo (dlg);
300     break;
301    
302     case WM_SYSCOMMAND:
303     if (LOWORD (wparam) == SC_CLOSE)
304     EndDialog (dlg, TRUE);
305     return FALSE;
306    
307     case WM_COMMAND:
308     switch (LOWORD (wparam)) {
309     case IDOK:
310     EndDialog (dlg, TRUE);
311     return TRUE;
312    
313     case IDC_KEYPROPS_OT_CHANGE:
314     if (do_check_key (key)) {
315     msg_box (dlg, _("The status of this key is 'revoked' or 'expired'.\n"
316     "You cannot change the ownertrust of such keys."),
317     _("WinPT Warning"), MB_ERR);
318     return TRUE;
319     }
320     if( !k->key_pair && key->uids->validity < 3 ) {
321     rc = msg_box( dlg, _("This is a non-valid key.\n"
322     "Modifying the ownertrust has no effect on such keys.\n\n"
323     "Do you really want to continue?"),
324     _("WinPT Warning"), MB_ICONWARNING|MB_YESNO );
325     if (rc == IDNO)
326     return TRUE;
327     }
328     //GetDlgItemText (dlg, IDC_KEYPROPS_OT, info, sizeof info -1);
329     dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYEDIT_OWNERTRUST,
330     dlg, (DLGPROC)keyedit_ownertrust_dlg_proc,
331     (LPARAM)k, _("Change Ownertrust"),
332     IDS_WINPT_KEYEDIT_OWNERTRUST);
333     if (k->callback.new_val == -1) { /* Cancel */
334     EndDialog (dlg, FALSE);
335     break;
336     }
337    
338     inf = ownertrust_to_string (k->callback.new_val);
339     SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);
340     msg_box (dlg, _("Ownertrust successfully changed."),
341     _("GnuPG Status"), MB_OK);
342    
343 twoaday 41 /* XXX: modified ownertrust values can effect the entire
344     WoT so we reload the cache. But this is very slow. */
345     memset (&rcs, 0, sizeof (rcs));
346     rcs.kr_reload = 1; rcs.kr_update = 1; /* reload only keylist */
347 werner 36 DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,
348     keycache_dlg_proc, (LPARAM)&rcs);
349     return TRUE;
350    
351     case IDC_KEYPROPS_CHANGE_PWD:
352     keyedit_change_passwd (k, dlg);
353     return TRUE;
354    
355     case IDC_KEYPROPS_REVOKERS:
356     dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYREVOKERS, dlg,
357 twoaday 41 key_revokers_dlg_proc, (LPARAM)key,
358     _("Key Revokers"), IDS_WINPT_KEY_REVOKERS);
359 werner 36 break;
360     }
361     }
362    
363     return FALSE;
364     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26