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

Contents of /trunk/Src/wptKeyPropsDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26