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

Annotation of /trunk/Src/wptKeyPropsDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 208 - (hide annotations)
Mon May 1 12:22:18 2006 UTC (18 years, 10 months ago) by twoaday
File size: 9926 byte(s)
See ChangeLog.


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26