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

Contents of /trunk/Src/wptKeyPropsDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 41 - (show 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 /* 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 const char *inf;
54 int id = val;
55
56 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 val = key->disabled;
145 if (val)
146 return _("Disabled");
147 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 /* 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 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 key_revokers_dlg_proc, (LPARAM)key,
358 _("Key Revokers"), IDS_WINPT_KEY_REVOKERS);
359 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