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

Contents of /trunk/Src/wptKeyPropsDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 211 - (show annotations)
Sun May 7 12:36:48 2006 UTC (18 years, 9 months ago) by twoaday
File size: 9971 byte(s)


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26