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

Annotation of /trunk/Src/wptKeyPropsDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 73 - (hide annotations)
Tue Nov 8 07:15:13 2005 UTC (19 years, 3 months ago) by twoaday
File size: 9931 byte(s)
2005-11-08  Timo Schulz  <ts@g10code.com>
 
        More minor changes to avoid GCC warnings.
         
        * wptGPG.cpp (check_homedir): Free memory in case of errors.
        (multi_gnupg_path): Add strict mode. If non-strict mode return
        the folder even if it does not exist.
        (check_for_gpgwin): New.
        * wptKeyserverDlg.cpp (hkp_recv_key): Make sure import_res is
        initialized.
        * wptRegistry.cpp (get_reg_entry_gpg4win): New.
        (get_reg_entry_mo): Support for gpg4win.
         
For complete changes see ChangeLogs.

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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26