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

Annotation of /trunk/Src/wptKeyPropsDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 174 - (hide annotations)
Thu Feb 2 08:20:50 2006 UTC (19 years ago) by twoaday
File size: 9952 byte(s)
2006-01-31  Timo Schulz  <ts@g10code.de>
 
        * wptMainProc.cpp (winpt_main_proc): Fix usage of the
        help system.
        * wptListView.cpp (listview_set_chkbox_style): New.
        (listview_get_item_state): Support new checkbox style.
        (listview_new): Reset flag var.
        * wptKeylist.cpp (keylist_build): Support new checkbox style.
         
2006-01-30  Timo Schulz  <ts@g10code.de>
 
        * WinPT.cpp (check_readonly_attr): New.
        (load_gpg_env): Use it here.
        (WinPT): Make the the default key is searched in the
        secret key cache.
        Change error message.
        * wptRegistry.cpp (regist_int_winpt): Make sure
        the register extension is only offered once to the user.
        * wptKeyPropsDlg.cpp (get_photo_tmpname): Always use
        temp directory. Fixed a privilege problem.


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26