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

Annotation of /trunk/Src/wptKeyPropsDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 26 - (hide annotations)
Mon Oct 17 08:49:30 2005 UTC (19 years, 4 months ago) by twoaday
File size: 9165 byte(s)
More bug fixes all over the place.
See ChangeLog for details.

1 twoaday 2 /* wptKeyPropsDlg.cpp - WinPT key properties dialog
2 twoaday 22 * Copyright (C) 2000, 2001, 2002, 2003, 2005 Timo Schulz
3 twoaday 2 *
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     #include <windows.h>
22    
23     #include "../resource.h"
24     #include "wptErrors.h"
25     #include "wptGPG.h"
26     #include "wptCommonCtl.h"
27     #include "wptContext.h" /* for passphrase_s */
28     #include "wptNLS.h"
29     #include "wptDlgs.h"
30     #include "wptTypes.h"
31     #include "wptKeylist.h"
32     #include "wptW32API.h"
33     #include "wptVersion.h"
34     #include "wptKeyEdit.h"
35    
36    
37     static void
38 twoaday 22 do_change_ownertrust (winpt_key_t k, const char *s)
39 twoaday 2 {
40 twoaday 22 char ot[64];
41 twoaday 2
42     if( strstr( s, "ultimate" ) ) {
43 twoaday 22 listview_get_item_text (k->callback.ctl, k->callback.idx, 5, ot, DIM (ot)-1);
44     strcpy (ot, "Ultimate");
45     listview_add_sub_item (k->callback.ctl, k->callback.idx, 5, ot);
46 twoaday 2 /* fixme: If we switch back from Ultimate to a lower level */
47     }
48     } /* do_change_ownertrust */
49    
50    
51     static int
52 twoaday 22 do_check_key (gpgme_key_t key)
53 twoaday 2 {
54     int okay = 0;
55 twoaday 23 okay = key->expired;
56 twoaday 22 if (!okay)
57 twoaday 23 okay = key->revoked;
58 twoaday 2 return okay;
59     } /* do_check_key */
60    
61    
62     static const char*
63 twoaday 24 ownertrust_to_string (int val)
64 twoaday 2 {
65     const char * inf;
66 twoaday 24 int id = val;
67 twoaday 2 switch (id) {
68     case 1: inf = _("Don't know"); break;
69     case 2: inf = _("I do NOT trust"); break;
70     case 3: inf = _("I trust marginally"); break;
71     case 4: inf = _("I trust fully"); break;
72     case 5:
73     case 6: inf = _("I trust ultimately"); break;
74     default:inf = _("Unknown"); break;
75     }
76    
77     return inf;
78     } /* ownertrust_to_string */
79    
80    
81 twoaday 22 #define PHOTO_TMPNAME "winpt_temp_photo.jpg"
82    
83 twoaday 2 static int
84     keyprops_show_photo (HWND dlg, gpgme_key_t key)
85     {
86     RECT r;
87     POINT p;
88     HWND h;
89     const BYTE *img;
90     DWORD imglen = 0;
91     int pos=0;
92 twoaday 23 winpt_key_s k;
93 twoaday 2
94 twoaday 23 winpt_get_pubkey (key->subkeys->keyid, &k);
95     img = k.ext->attrib.d;
96     imglen = k.ext->attrib.len;
97    
98 twoaday 2 if (!img || !imglen)
99     return -1;
100 twoaday 22 FILE *f = fopen (PHOTO_TMPNAME, "wb");
101 twoaday 2 if (f) {
102     for (pos = 0; img[pos] != 0x10; pos++)
103     ;
104     pos += 16;
105     fwrite (img + pos, 1, imglen - pos, f);
106     fwrite (img, 1, imglen, f);
107     fclose (f);
108     }
109    
110     h = GetDlgItem (dlg, IDC_KEYPROPS_IMG);
111     GetWindowRect (h, &r);
112     p.x = r.left + 5;
113     p.y = r.top - 2;
114 twoaday 22 memset (&p, 0, sizeof (p));
115     PTD_jpg_show (h, &p, PHOTO_TMPNAME);
116     unlink (PHOTO_TMPNAME);
117 twoaday 2
118     return 0;
119     }
120    
121    
122 twoaday 23 /* Return string representation of the key validity. @key. */
123 twoaday 22 static const char*
124     get_validity (gpgme_key_t key)
125     {
126     int val;
127 twoaday 23 val = key->expired;
128 twoaday 22 if (val)
129     return "Expired";
130 twoaday 23 val = key->revoked;
131 twoaday 22 if (val)
132     return "Revoked";
133 twoaday 23 return get_key_trust2 (NULL, key->uids->validity, 0, 0);
134 twoaday 22 }
135    
136    
137 twoaday 24 /* Return the preferred sym. algorithm from @key as a string. */
138 twoaday 23 static const char*
139 twoaday 24 get_pref_cipher (winpt_key_t k)
140 twoaday 23 {
141 twoaday 24 const char *sym_prefs=NULL;
142    
143     if (k->is_v3)
144     return "IDEA";
145     if (!k->ext->sym_prefs)
146     return "3DES";
147     switch (*k->ext->sym_prefs) {
148 twoaday 23 case 1: return "IDEA";
149     case 2: return "3DES";
150 twoaday 24 case 3: return "CAST5";
151 twoaday 23 case 4: return "Blowfish";
152     case 7:
153     case 8:
154     case 9: return "AES";
155 twoaday 24 case 10:return "Twofish";
156 twoaday 23 }
157     return "Unknown";
158     }
159    
160    
161     /* Return true if the key has designated revokers. */
162     static bool
163     check_for_desig_rev (gpgme_key_t key)
164     {
165     winpt_key_s k;
166 twoaday 24 memset (&k, 0, sizeof (k));
167 twoaday 23 if (!winpt_get_pubkey (key->subkeys->keyid, &k))
168     return k.ext->gloflags.has_desig_rev? true : false;
169     return false;
170     }
171    
172    
173     /* Dialog box procedure to show the key properties. */
174 twoaday 2 BOOL CALLBACK
175 twoaday 23 keyprops_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
176 twoaday 2 {
177     static winpt_key_t k;
178     static gpgme_key_t key, sk;
179     static int photo_done = 0;
180 twoaday 23 struct winpt_key_s k2;
181 twoaday 2 refresh_cache_s rcs = {0};
182     const char *inf;
183 twoaday 26 char info[512];
184 twoaday 2 u32 created, expires;
185 twoaday 22 int ot, cancel = 0;
186 twoaday 2 int rc;
187    
188     switch (msg) {
189     case WM_INITDIALOG:
190     if (!lparam)
191     dlg_fatal_error( dlg, "Could not get dialog param!" );
192     k = (winpt_key_t)lparam;
193     #ifndef LANG_DE
194     SetWindowText( dlg, _("Key Properties") );
195     SetDlgItemText (dlg, IDC_KEYPROPS_OT_CHANGE, _("&Change"));
196     SetDlgItemText (dlg, IDC_KEYPROPS_REVOKERS, _("&Revokers"));
197     SetDlgItemText (dlg, IDC_KEYPROPS_CHANGE_PWD, _("Change &Passwd"));
198     #endif
199    
200     photo_done = 0;
201 twoaday 24 memset (&k2, 0, sizeof (k2));
202     if (k->key_pair)
203     winpt_get_seckey (k->keyid, &k2);
204     else
205     winpt_get_pubkey (k->keyid, &k2);
206 twoaday 23 sk = k2.ctx;
207 twoaday 2 if (sk)
208 twoaday 23 k->is_protected = k2.is_protected;
209 twoaday 2 if (get_pubkey (k->keyid, &key))
210     BUG (0);
211 twoaday 23 created = key->subkeys->timestamp;
212     expires = key->subkeys->expires;
213     _snprintf (info, DIM (info)-1,
214 twoaday 2 "Type: %s\r\n"
215     "Key ID: %s\r\n"
216     "Algorithm: %s\r\n"
217     "Size: %s\r\n"
218     "Created: %s\r\n"
219     "Expires: %s\r\n"
220     "Validity: %s\r\n"
221     "Cipher: %s\r\n",
222 twoaday 23 get_key_type (key),
223     k->keyid,
224     get_key_algo (key, 0),
225     get_key_size (key, 0),
226     get_key_created (created),
227     get_key_expire_date (expires),
228 twoaday 22 get_validity (key),
229 twoaday 24 get_pref_cipher (&k2));
230 twoaday 23 SetDlgItemText (dlg, IDC_KEYPROPS_INFO, info);
231     SetDlgItemText (dlg, IDC_KEYPROPS_FPR, get_key_fpr (key));
232 twoaday 2 ot = gpgme_key_get_ulong_attr( key, GPGME_ATTR_OTRUST, NULL, 0 );
233 twoaday 24 inf = ownertrust_to_string (ot);
234 twoaday 2 SetDlgItemText( dlg, IDC_KEYPROPS_OT, inf );
235 twoaday 23 if (k->key_pair)
236 twoaday 2 EnableWindow( GetDlgItem( dlg, IDC_KEYPROPS_CHANGE_PWD ), TRUE );
237 twoaday 23 if (check_for_desig_rev (key))
238 twoaday 2 EnableWindow( GetDlgItem( dlg, IDC_KEYPROPS_REVOKERS ), TRUE );
239 twoaday 23 center_window (dlg, NULL);
240 twoaday 2 SetForegroundWindow (dlg);
241     return TRUE;
242    
243     case WM_PAINT:
244     if (photo_done == 0) {
245     photo_done = 1;
246     keyprops_show_photo (dlg, key);
247     }
248     break;
249    
250     case WM_SYSCOMMAND:
251     if( LOWORD( wparam ) == SC_CLOSE )
252     EndDialog( dlg, TRUE );
253     return FALSE;
254    
255     case WM_COMMAND:
256     switch( LOWORD( wparam ) ) {
257     case IDOK:
258     EndDialog( dlg, TRUE );
259     return TRUE;
260    
261     case IDC_KEYPROPS_OT_CHANGE:
262     if( do_check_key( key ) ) {
263     msg_box( dlg, _("The status of this key is 'revoked' or 'expired'.\n"
264     "You cannot change the ownertrust of such keys."),
265     _("WinPT Warning"), MB_ERR );
266     return FALSE;
267     }
268 twoaday 23 if( !k->key_pair && key->uids->validity < 3 ) {
269 twoaday 2 rc = msg_box( dlg, _("This is a non-valid key.\n"
270 twoaday 23 "Modifying the ownertrust has no effect on such keys.\n\n"
271 twoaday 2 "Do you really want to continue?"),
272     _("WinPT Warning"), MB_ICONWARNING|MB_YESNO );
273     if (rc == IDNO)
274     return FALSE;
275     }
276     GetDlgItemText( dlg, IDC_KEYPROPS_OT, info, sizeof info -1 );
277 twoaday 23
278 twoaday 24
279 twoaday 23 dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYEDIT_OWNERTRUST,
280     dlg, (DLGPROC)keyedit_ownertrust_dlg_proc,
281 twoaday 24 (LPARAM)k, _("Change Ownertrust"),
282 twoaday 23 IDS_WINPT_KEYEDIT_OWNERTRUST);
283 twoaday 24 if (k->callback.new_val == -1) { /* Cancel */
284     EndDialog (dlg, FALSE);
285     break;
286     }
287    
288     inf = ownertrust_to_string (k->callback.new_val);
289 twoaday 2 do_change_ownertrust (k, inf);
290     SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);
291     msg_box (dlg, _("Ownertrust successfully changed."), _("GnuPG Status"), MB_OK);
292    
293     /* reload only the keylist */
294     rcs.kr_reload = 1; rcs.kr_update = 1;
295     rcs.tr_update = 0;
296     DialogBoxParam( glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,
297     keycache_dlg_proc, (LPARAM)&rcs );
298 twoaday 24 /* XXX: old code!?
299 twoaday 2 get_seckey (k->keyid, &sk);
300     if (get_pubkey (k->keyid, &key))
301     BUG (0);
302 twoaday 24 */
303 twoaday 2 return TRUE;
304    
305     case IDC_KEYPROPS_CHANGE_PWD:
306     keyedit_change_passwd (k, dlg);
307     return TRUE;
308    
309     case IDC_KEYPROPS_REVOKERS:
310 twoaday 23 dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYREVOKERS, dlg,
311     key_revokers_dlg_proc, (LPARAM)key, _("Key Revokers"),
312     IDS_WINPT_KEY_REVOKERS);
313 twoaday 2 break;
314     }
315     }
316    
317     return FALSE;
318 twoaday 23 }
319    

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26