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

Annotation of /trunk/Src/wptKeyPropsDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 36 - (hide 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 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     #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