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

Contents of /trunk/Src/wptKeyPropsDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 24 - (show annotations)
Sat Oct 8 10:43:08 2005 UTC (19 years, 4 months ago) by twoaday
File size: 9166 byte(s)
Bug fixes to correct some problems introduced by
the MyGPGME to GPGME port.

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 #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 do_change_ownertrust (winpt_key_t k, const char *s)
39 {
40 char ot[64];
41
42 if( strstr( s, "ultimate" ) ) {
43 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 /* fixme: If we switch back from Ultimate to a lower level */
47 }
48 } /* do_change_ownertrust */
49
50
51 static int
52 do_check_key (gpgme_key_t key)
53 {
54 int okay = 0;
55 okay = key->expired;
56 if (!okay)
57 okay = key->revoked;
58 return okay;
59 } /* do_check_key */
60
61
62 static const char*
63 ownertrust_to_string (int val)
64 {
65 const char * inf;
66 int id = val;
67 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 #define PHOTO_TMPNAME "winpt_temp_photo.jpg"
82
83 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 winpt_key_s k;
93
94 winpt_get_pubkey (key->subkeys->keyid, &k);
95 img = k.ext->attrib.d;
96 imglen = k.ext->attrib.len;
97
98 if (!img || !imglen)
99 return -1;
100 FILE *f = fopen (PHOTO_TMPNAME, "wb");
101 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 memset (&p, 0, sizeof (p));
115 PTD_jpg_show (h, &p, PHOTO_TMPNAME);
116 unlink (PHOTO_TMPNAME);
117
118 return 0;
119 }
120
121
122 /* Return string representation of the key validity. @key. */
123 static const char*
124 get_validity (gpgme_key_t key)
125 {
126 int val;
127 val = key->expired;
128 if (val)
129 return "Expired";
130 val = key->revoked;
131 if (val)
132 return "Revoked";
133 return get_key_trust2 (NULL, key->uids->validity, 0, 0);
134 }
135
136
137 /* Return the preferred sym. algorithm from @key as a string. */
138 static const char*
139 get_pref_cipher (winpt_key_t k)
140 {
141 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 case 1: return "IDEA";
149 case 2: return "3DES";
150 case 3: return "CAST5";
151 case 4: return "Blowfish";
152 case 7:
153 case 8:
154 case 9: return "AES";
155 case 10:return "Twofish";
156 }
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 memset (&k, 0, sizeof (k));
167 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 BOOL CALLBACK
175 keyprops_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
176 {
177 static winpt_key_t k;
178 static gpgme_key_t key, sk;
179 static int photo_done = 0;
180 struct winpt_key_s k2;
181 refresh_cache_s rcs = {0};
182 const char *inf;
183 char info[2048];
184 u32 created, expires;
185 int ot, cancel = 0;
186 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 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 sk = k2.ctx;
207 if (sk)
208 k->is_protected = k2.is_protected;
209 if (get_pubkey (k->keyid, &key))
210 BUG (0);
211 created = key->subkeys->timestamp;
212 expires = key->subkeys->expires;
213 _snprintf (info, DIM (info)-1,
214 "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 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 get_validity (key),
229 get_pref_cipher (&k2));
230 SetDlgItemText (dlg, IDC_KEYPROPS_INFO, info);
231 SetDlgItemText (dlg, IDC_KEYPROPS_FPR, get_key_fpr (key));
232 ot = gpgme_key_get_ulong_attr( key, GPGME_ATTR_OTRUST, NULL, 0 );
233 inf = ownertrust_to_string (ot);
234 SetDlgItemText( dlg, IDC_KEYPROPS_OT, inf );
235 if (k->key_pair)
236 EnableWindow( GetDlgItem( dlg, IDC_KEYPROPS_CHANGE_PWD ), TRUE );
237 if (check_for_desig_rev (key))
238 EnableWindow( GetDlgItem( dlg, IDC_KEYPROPS_REVOKERS ), TRUE );
239 center_window (dlg, NULL);
240 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 if( !k->key_pair && key->uids->validity < 3 ) {
269 rc = msg_box( dlg, _("This is a non-valid key.\n"
270 "Modifying the ownertrust has no effect on such keys.\n\n"
271 "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
278
279 dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYEDIT_OWNERTRUST,
280 dlg, (DLGPROC)keyedit_ownertrust_dlg_proc,
281 (LPARAM)k, _("Change Ownertrust"),
282 IDS_WINPT_KEYEDIT_OWNERTRUST);
283 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 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 /* XXX: old code!?
299 get_seckey (k->keyid, &sk);
300 if (get_pubkey (k->keyid, &key))
301 BUG (0);
302 */
303 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 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 break;
314 }
315 }
316
317 return FALSE;
318 }
319

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26