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

Annotation of /trunk/Src/wptKeyEditDlgs.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 229 - (hide annotations)
Mon Jun 19 14:04:31 2006 UTC (18 years, 8 months ago) by twoaday
File size: 60197 byte(s)


1 werner 36 /* wptKeyEditDlgs.cpp - GPG key edit dialogs
2 twoaday 133 * Copyright (C) 2002-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     #include <commctrl.h>
26 werner 47 #include <time.h>
27 twoaday 200 #include <assert.h>
28    
29 werner 47 #include "resource.h"
30 werner 36 #include "wptTypes.h"
31     #include "wptW32API.h"
32     #include "wptVersion.h"
33     #include "wptGPG.h"
34     #include "wptCommonCtl.h"
35     #include "wptContext.h"
36     #include "wptDlgs.h"
37     #include "wptNLS.h"
38     #include "wptUTF8.h"
39     #include "wptErrors.h"
40     #include "wptKeylist.h"
41     #include "wptKeyManager.h"
42     #include "wptRegistry.h"
43     #include "wptKeyEdit.h"
44    
45     /* All edit key commands. */
46     enum keyedit_commands {
47     CMD_ADDKEY = 0,
48     CMD_ADDUID,
49     CMD_ADDPHOTO,
50     CMD_ADDREVOKER,
51     CMD_DELUID,
52     CMD_DELKEY,
53     CMD_EXPIRE,
54     CMD_SHOWPREF,
55 twoaday 170 //CMD_SETPREF,
56 werner 36 CMD_PASSWD,
57     CMD_PRIMARY,
58     CMD_TRUST,
59     CMD_REVUID,
60     CMD_REVKEY,
61     CMD_DISABLE,
62 twoaday 170 CMD_ENABLE,
63     CMD_SIGN,
64     CMD_LSIGN,
65 twoaday 195 CMD_CHECK,
66 twoaday 200 CMD_CLEAN,
67 twoaday 208 CMD_MINIMIZE
68 werner 36 };
69    
70 twoaday 170 struct cmdlist_s {
71     const char *name;
72     unsigned int need_pair:1;
73     int id;
74     } cmdlist[] = {
75     {"ADDKEY", 1, CMD_ADDKEY},
76     {"ADDUID", 1, CMD_ADDUID},
77     {"ADDPHOTO", 1, CMD_ADDPHOTO},
78     {"ADDREVOKER", 1, CMD_ADDREVOKER},
79     {"DELUID", 1, CMD_DELUID},
80     {"DELKEY", 1, CMD_DELKEY},
81     {"EXPIRE", 1, CMD_EXPIRE},
82     {"SHOWPREF", 0, CMD_SHOWPREF},
83     /*{"SETPREF", 1, CMD_SETPREF},*/
84     {"PASSWD", 1, CMD_PASSWD},
85     {"PRIMARY", 1, CMD_PRIMARY},
86     {"TRUST", 0, CMD_TRUST},
87     {"REVUID", 1, CMD_REVUID},
88     {"REVKEY", 1, CMD_REVKEY},
89     {"DISABLE", 0, CMD_DISABLE},
90     {"ENABLE", 0, CMD_ENABLE},
91     {"SIGN", 0, CMD_SIGN},
92     {"LSIGN", 0, CMD_LSIGN},
93 twoaday 175 {"CHECK", 0, CMD_CHECK},
94 twoaday 195 {"CLEAN", 0, CMD_CLEAN},
95 twoaday 208 {"MINIMIZE", 0, CMD_MINIMIZE},
96 twoaday 170 {NULL, 0}
97     };
98 werner 36
99 twoaday 170
100 werner 36 /* Symbolic ids for the subkey columns. */
101     enum subk_col_t {
102     SUBK_COL_DESC = 0,
103     SUBK_COL_KEYID = 1,
104     SUBK_COL_CREATION = 2,
105     SUBK_COL_EXPIRES = 3,
106     SUBK_COL_STATUS = 4,
107     SUBK_COL_C_FLAG = 5,
108     SUBK_COL_S_FLAG = 6,
109     SUBK_COL_E_FLAG = 7,
110     SUBK_COL_A_FLAG = 8
111     };
112    
113     /* Symbolic ids for the userid columns. */
114     enum uid_col_t {
115     UID_COL_VALID = 0,
116     UID_COL_NAME = 1,
117     UID_COL_EMAIL = 2,
118     UID_COL_CREATION = 3
119     };
120    
121 twoaday 176 /* Key edit callback context. */
122     struct keyedit_cb_s {
123 twoaday 218 HWND parent; /* parent window handle. */
124     const char *keyid; /* key ID of the key. */
125     const char *pass; /* pointer to the passphrase. */
126 werner 36 listview_ctrl_t lv;
127 twoaday 208 int lv_pos;
128 werner 36 void *opaque;
129     unsigned int finished:1;
130 twoaday 176 unsigned int is_protected:1;
131 werner 36 };
132 twoaday 176 typedef struct keyedit_cb_s *keyedit_cb_t;
133 werner 36
134 twoaday 176
135     /* Key generation callback context. */
136     struct keygen_cb_s {
137 werner 36 int bits;
138     int algo;
139     u32 expire;
140     char *fpr;
141 twoaday 200 char *name;
142     char *comment;
143     char *email;
144 werner 36 };
145 twoaday 176 typedef struct keygen_cb_s *keygen_cb_t;
146 werner 36
147 twoaday 200 /* Subclass context for the subkey list. */
148     static subclass_s keyedit_subkey_proc;
149 werner 36
150 twoaday 200 /* Subclass context for the user-id list. */
151 werner 36 static subclass_s keyedit_uid_proc;
152    
153     int keygen_check_date (SYSTEMTIME *st);
154 twoaday 225 void get_userid_preflist (char **r_prefs, int *r_flags);
155 twoaday 150 char* get_subkey_keyid (const char *keyid);
156 twoaday 204 void ComboBox_AddString_utf8 (HWND cb, const char *txt);
157 werner 36
158 twoaday 225
159     /* Safe wrapper for allocation. */
160 twoaday 200 static GpgKeyEdit*
161     create_GpgKeyEdit (const char *keyid)
162     {
163     GpgKeyEdit *ke;
164    
165     ke = new GpgKeyEdit (keyid);
166     if (!ke)
167     BUG (NULL);
168     return ke;
169     }
170    
171    
172 werner 36 /* Associate each key with a combo box entry.
173     Skip the key in @k. */
174     static void
175 twoaday 200 do_init_keylist (HWND dlg, const char *keyid)
176 werner 36 {
177     gpg_keycache_t pub;
178     gpgme_key_t key;
179 twoaday 128 const char *s, *kid;
180 werner 36 int i, n;
181    
182     pub = keycache_get_ctx (1);
183     gpg_keycache_rewind (pub);
184 twoaday 225 while (!gpg_keycache_next_key (pub, 0, &key)) {
185 twoaday 128 if (key->expired || key->revoked ||
186 twoaday 78 key->disabled || key->invalid)
187     continue;
188 werner 36 s = key->uids->uid;
189     kid = key->subkeys->keyid;
190 twoaday 200 if (!s || !strcmp (kid+8, keyid))
191 werner 36 continue;
192 twoaday 204 ComboBox_AddString_utf8 (GetDlgItem (dlg, IDC_ADDREV_KEYLIST), s);
193 werner 36 }
194     gpg_keycache_rewind (pub);
195 twoaday 211 n = SendDlgItemMessage (dlg, IDC_ADDREV_KEYLIST, CB_GETCOUNT, 0, 0);
196 werner 36 for (i = 0; i < n; i++) {
197     gpg_keycache_next_key (pub, 0, &key);
198     SendDlgItemMessage (dlg, IDC_ADDREV_KEYLIST, CB_SETITEMDATA,
199     (WPARAM)(int)i, (LPARAM)key);
200     }
201     SendDlgItemMessage (dlg, IDC_ADDREV_KEYLIST, CB_SETCURSEL, 0, 0);
202     }
203    
204    
205     /* Add a new user-id to the list view @lv. */
206     static void
207     do_add_new_userid (listview_ctrl_t lv,
208 twoaday 201 const char *utf8_name, const char *email,
209     const char *utf8_comment)
210 werner 36 {
211 twoaday 218 char *p, *native;
212 werner 36 size_t n;
213    
214 twoaday 185 n = strlen (utf8_name) + strlen (email) + 16;
215 twoaday 201 if (utf8_comment)
216     n += strlen (utf8_comment);
217 werner 36 p = new char[n+1];
218     if (!p)
219 twoaday 185 BUG (NULL);
220 twoaday 218 if (utf8_comment)
221 twoaday 204 sprintf (p, "%s (%s)", utf8_name, utf8_comment);
222 werner 36 else
223 twoaday 204 sprintf (p, "%s", utf8_name);
224 twoaday 218 native = utf8_to_native (p);
225     free_if_alloc (p);
226 werner 36
227     listview_add_item (lv, "");
228 twoaday 218 listview_add_sub_item (lv, 0, UID_COL_VALID, _("Ultimate" ));
229     listview_add_sub_item (lv, 0, UID_COL_NAME, native);
230     listview_add_sub_item (lv, 0, UID_COL_EMAIL, email && *email? email : "");
231     listview_add_sub_item (lv, 0, UID_COL_CREATION, get_key_created (time (NULL)));
232     free_if_alloc (native);
233 twoaday 129 }
234 werner 36
235    
236     static void
237 twoaday 176 do_add_new_subkey (listview_ctrl_t lv, keygen_cb_t keygen, unsigned int flags)
238 werner 36 {
239     char info[128], keyid[32];
240 twoaday 200 const char *expdate, *s;
241 werner 36 int n;
242    
243     expdate = keygen->expire? get_key_expire_date (keygen->expire) : _("Never");
244 twoaday 218 _snprintf (info, sizeof (info)-1, "%d-bit %s",
245     keygen->bits,
246 werner 36 get_key_pubalgo ((gpgme_pubkey_algo_t)keygen->algo));
247 twoaday 218 _snprintf (keyid, sizeof (keyid)-1, "0x%s", keygen->fpr+8);
248 twoaday 211 s = get_key_created (time (NULL));
249 werner 36 n = listview_count_items (lv, 0);
250     listview_add_item_pos (lv, n);
251 twoaday 211 listview_add_sub_item (lv, n, SUBK_COL_DESC, info);
252     listview_add_sub_item (lv, n, SUBK_COL_KEYID, keyid);
253     listview_add_sub_item (lv, n, SUBK_COL_CREATION, s);
254     listview_add_sub_item (lv, n, SUBK_COL_EXPIRES, expdate);
255 twoaday 150 if (flags & KM_FLAG_REVOKED)
256     s = _("Revoked");
257     else if (flags & KM_FLAG_EXPIRED)
258     s = _("Expired");
259     else
260     s = _("OK");
261 twoaday 211 listview_add_sub_item (lv, n, SUBK_COL_STATUS, s);
262 twoaday 150 }
263 werner 36
264    
265     /* Try to find the GPG edit key index which belongs to the user ID
266 twoaday 160 given by the email address @email, @name is used as a fallback.
267     If @r_inf != NULL, the info context will be returned.
268 werner 36 Return value: index of the user ID or -1 on error. */
269     static int
270 twoaday 160 do_find_userid (const char *keyid, const char *email,
271     const char *name, gpg_uid_info_t *r_inf)
272 werner 36 {
273     GpgKeyEdit *ke;
274     gpgme_error_t err;
275     gpg_uid_info_t inf, ui;
276     int pos = -1;
277    
278 twoaday 200 ke = create_GpgKeyEdit (keyid);
279 werner 36 err = ke->getUseridInfo (&inf);
280     delete ke;
281     if (err) {
282     log_box (_("user ID"), MB_ERR,
283 twoaday 225 _("Could not get key information for: \"%s\":\n%s"),
284     name, gpgme_strerror (err));
285 werner 36 return -1;
286     }
287    
288     for (ui = inf; ui; ui = ui->next) {
289 twoaday 205 if (name && email && ui->email && ui->name) {
290 twoaday 160 if (!strcmp (ui->email, email) &&
291 twoaday 205 !strncmp (ui->name, name, strlen (name))) {
292 twoaday 160 pos = ui->index;
293     break;
294     }
295     continue;
296     }
297 twoaday 208 if (email && ui->email) {
298 twoaday 160 if (!strcmp (ui->email, email)) {
299     pos = ui->index;
300     break;
301     }
302     /* The email address is more unique, use the name just
303     as the fallbck when no email address is available. */
304     continue;
305     }
306 twoaday 205 if (ui->name && name && !strcmp (ui->name, name)) {
307 werner 36 pos = ui->index;
308     break;
309     }
310     }
311     if (r_inf)
312     *r_inf = inf;
313     else
314     gpg_uid_info_release (inf);
315     return pos;
316     }
317    
318    
319 twoaday 128 /* Return true if @fname is a JPEG file. */
320     bool
321     is_jpg_file (const char *fname)
322     {
323     FILE *fp;
324     BYTE buf[10];
325     int n;
326    
327     fp = fopen (fname, "rb");
328     if (!fp)
329     return false;
330     n = fread (buf, 1, 10, fp);
331     fclose (fp);
332     if (n < 10)
333     return false;
334     return buf[6] == 'J' && buf[7] == 'F' &&
335     buf[8] == 'I' && buf[9] == 'F';
336     }
337    
338    
339 werner 36 /* Dialog box procedure to add a photo. */
340     BOOL CALLBACK
341     keyedit_addphoto_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
342     {
343 twoaday 200 static keyedit_cb_t cb;
344 werner 36 GpgKeyEdit *ke;
345 twoaday 200 gpgme_error_t err;
346     const char *s;
347     char file[128];
348 werner 36 int id;
349    
350     switch( msg ) {
351     case WM_INITDIALOG:
352 twoaday 200 cb = (keyedit_cb_t)lparam;
353     if (!cb)
354 werner 36 BUG (NULL);
355     SetDlgItemText (dlg, IDC_ADDPHOTO_INF, _("Remember that the image is stored within your public key. If you use a very large picture, your key will become very large as well! Keeping the image close to 240x288 is a good size to use."));
356     SetDlgItemText (dlg, IDC_ADDPHOTO_FILEINF, _("Pick an image to use for your photo ID.\nThe image must be a JPEG file."));
357     SetDlgItemText (dlg, IDC_ADDPHOTO_PWDINF, _("Passphrase"));
358 twoaday 105 SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
359 twoaday 128 SetWindowText (dlg, _("Add Photo ID"));
360 twoaday 105 SetForegroundWindow (dlg);
361 werner 36 break;
362    
363     case WM_COMMAND:
364 twoaday 200 switch( LOWORD (wparam)) {
365 werner 36 case IDC_ADDPHOTO_SELFILE:
366 twoaday 128 s = get_fileopen_dlg (dlg, _("Select Image File"),
367 twoaday 180 "JPEG Files (*.jpg, *.jpeg)\0*.jpg;*.jpeg\0\0",
368 twoaday 128 NULL);
369     if (s && !is_jpg_file (s)) {
370     log_box (_("Add Photo"), MB_ERR,
371     _("'%s' is not a valid JPEG file."), s);
372     return FALSE;
373     }
374     if (s && *s)
375     SetDlgItemText (dlg, IDC_ADDPHOTO_FILE, s);
376 werner 36 break;
377    
378     case IDOK:
379 twoaday 128 if (!GetDlgItemText (dlg, IDC_ADDPHOTO_FILE, file, sizeof (file)-1)){
380 twoaday 225 msg_box (dlg, _("Please enter a file name."),
381     _("Add Photo"), MB_ERR);
382 werner 36 return FALSE;
383     }
384 twoaday 218 if (get_file_size (file) == 0 || get_file_size (file) > 6144) {
385 twoaday 128 id = msg_box (dlg, _("The JPEG is really large.\n"
386 werner 36 "Are you sure you want to use it?"),
387 twoaday 128 _("Add Photo"), MB_YESNO|MB_INFO);
388     if (id == IDNO)
389 werner 36 return TRUE;
390     }
391 twoaday 200 ke = create_GpgKeyEdit (cb->keyid);
392     if (cb->pass)
393     ke->setPassphrase (cb->pass);
394 twoaday 176 else
395     ke->setNoPassphrase (true);
396 twoaday 200 err = ke->addPhotoid (file);
397 werner 36 delete ke;
398 twoaday 200 if (err) {
399     msg_box (dlg, gpgme_strerror (err), _("Add Photo"), MB_ERR);
400 werner 36 return FALSE;
401     }
402     else {
403 twoaday 200 cb->finished = 1;
404 twoaday 128 msg_box (dlg, _("Photo successfully added."),
405     _("GnuPG Status"), MB_OK);
406 werner 36 }
407     EndDialog (dlg, TRUE);
408     break;
409    
410     case IDCANCEL:
411     EndDialog (dlg, FALSE);
412     break;
413     }
414     break;
415     }
416     return FALSE;
417     }
418    
419    
420     /* Dialog box procedure to add a designated revoker. */
421     BOOL CALLBACK
422     keyedit_addrevoker_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
423     {
424 twoaday 200 static keyedit_cb_t cb;
425 twoaday 129 gpgme_error_t err;
426 werner 36 GpgKeyEdit *ke;
427 twoaday 204 char *uid=NULL;
428 werner 36
429 twoaday 129 switch (msg) {
430 werner 36 case WM_INITDIALOG:
431 twoaday 200 cb = (keyedit_cb_t)lparam;
432     if (!cb)
433 twoaday 129 BUG (NULL);
434 twoaday 200 do_init_keylist (dlg, cb->keyid);
435 twoaday 129 SetDlgItemText (dlg, IDC_ADDREV_INF,
436     _("Appointing a key as designated revoker cannot be undone."));
437 werner 36 SetDlgItemText (dlg, IDC_ADDREV_KEYINF, _("Public key"));
438     SetDlgItemText (dlg, IDC_ADDREV_PWDINF, _("Passphrase"));
439 twoaday 105 SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
440 twoaday 128 SetWindowText (dlg, _("Add Revoker"));
441 twoaday 105 SetForegroundWindow (dlg);
442 twoaday 218 center_window (dlg, cb->parent);
443 werner 36 break;
444    
445     case WM_COMMAND:
446 twoaday 200 switch (LOWORD (wparam)) {
447 twoaday 204 case IDOK:
448     if (!GetDlgItemText_utf8 (dlg, IDC_ADDREV_KEYLIST, &uid)) {
449     msg_box (dlg, _("Please select a user ID."), _("Add Revoker"), MB_ERR);
450 werner 36 return FALSE;
451     }
452 twoaday 204
453 twoaday 200 ke = create_GpgKeyEdit (cb->keyid);
454     if (cb->pass)
455     ke->setPassphrase (cb->pass);
456 twoaday 176 else
457     ke->setNoPassphrase (true);
458 twoaday 204 err = ke->addDesignatedRevoker (uid);
459 werner 36 delete ke;
460 twoaday 204 safe_free (uid);
461 werner 36 if (err) {
462     msg_box (dlg, gpgme_strerror (err), _("Add Revoker"), MB_ERR);
463     return TRUE;
464     }
465     else {
466 twoaday 200 cb->finished = 1;
467 twoaday 129 msg_box (dlg, _("Revoker successfully addded."),
468     _("GnuPG Status"), MB_OK);
469 werner 36 }
470 twoaday 129 EndDialog (dlg, TRUE);
471 werner 36 break;
472    
473     case IDCANCEL:
474 twoaday 129 EndDialog (dlg, FALSE);
475 werner 36 break;
476     }
477     break;
478     }
479     return FALSE;
480     }
481    
482    
483     /* Dialog box procedure to add a new user-ID. */
484     BOOL CALLBACK
485     keyedit_adduid_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
486     {
487 twoaday 176 static keyedit_cb_t ctx;
488 twoaday 200 keygen_cb_t keygen;
489 werner 36 gpgme_error_t err;
490     GpgKeyEdit *ke;
491     char *utf8_name = NULL;
492 twoaday 201 char *utf8_comment = NULL;
493 twoaday 204 char email[128];
494 werner 36 int rc;
495    
496 twoaday 176 switch (msg) {
497 werner 36 case WM_INITDIALOG:
498 twoaday 176 ctx = (keyedit_cb_t)lparam;
499 twoaday 200 if (!ctx)
500 werner 36 dlg_fatal_error(dlg, "Could not get dialog param!");
501     SetWindowText (dlg, _("Add new User ID"));
502     SetDlgItemText (dlg, IDC_ADDUID_INFNAME, _("&Name"));
503     SetDlgItemText (dlg, IDC_ADDUID_INFEMAIL, _("&Email"));
504     SetDlgItemText (dlg, IDC_ADDUID_INFCOMMENT, _("&Comment"));
505 twoaday 105 SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
506 werner 36 SetForegroundWindow (dlg);
507 twoaday 218 center_window (dlg, ctx->parent);
508 werner 36 return FALSE;
509    
510     case WM_COMMAND:
511     switch ( LOWORD( wparam ) ) {
512     case IDOK:
513 twoaday 200 keygen = (keygen_cb_t)ctx->opaque;
514 twoaday 204 rc = GetDlgItemText_utf8 (dlg, IDC_ADDUID_NAME, &utf8_name);
515 werner 36 if (!rc || rc < 5) {
516 twoaday 204 msg_box (dlg, _("Please enter a name (min. 5 chars.)"),
517     _("UserID"), MB_ERR);
518     free_if_alloc (utf8_name);
519 werner 36 return FALSE;
520     }
521 twoaday 204 if (strchr (utf8_name, '@')) {
522     msg_box (dlg, _("Please enter the email address in the email field and not in the name field"),
523     _("UserID"), MB_INFO);
524 twoaday 225 free_if_alloc (utf8_name);
525 werner 36 return FALSE;
526     }
527 twoaday 204
528     if( !GetDlgItemText (dlg, IDC_ADDUID_EMAIL, email, sizeof (email) -1)) {
529 twoaday 225 msg_box (dlg, _("Please enter an email address."), _("UserID"), MB_ERR);
530     free_if_alloc (utf8_name);
531 werner 36 return FALSE;
532     }
533 twoaday 190 if (check_email_address (email)) {
534 twoaday 175 msg_box (dlg, _("Invalid email address."), _("UserID"), MB_ERR);
535 twoaday 225 free_if_alloc (utf8_name);
536 werner 36 return FALSE;
537     }
538    
539 twoaday 204 rc = GetDlgItemText_utf8 (dlg, IDC_ADDUID_COMMENT, &utf8_comment);
540 werner 36
541 twoaday 200 ke = create_GpgKeyEdit (ctx->keyid);
542 twoaday 176 if (ctx->is_protected)
543 werner 36 ke->setPassphrase (ctx->pass);
544 twoaday 176 else
545     ke->setNoPassphrase (true);
546 twoaday 201 err = ke->addUserid (utf8_name, utf8_comment, email);
547 werner 36 if (err)
548     msg_box (dlg, gpgme_strerror (err), _("UserID"), MB_ERR);
549     else {
550     msg_box (dlg, _("user ID successfully added."), _("GnuPG Status"), MB_OK);
551     ctx->finished = 1;
552 twoaday 225 /* The caller releases this items later. */
553 twoaday 201 keygen->name = utf8_name;
554     keygen->comment = utf8_comment;
555 twoaday 200 keygen->email = m_strdup (email);
556 werner 36 }
557 twoaday 200 delete ke;
558 werner 36 EndDialog (dlg, TRUE);
559     return TRUE;
560    
561     case IDCANCEL:
562     EndDialog (dlg, FALSE);
563     return FALSE;
564     }
565     break;
566     }
567    
568     return FALSE;
569     }
570    
571    
572 twoaday 225 /* Initalize a combo box with default key sizes (1024-4096). */
573 werner 36 static void
574     init_keysize_box (HWND dlg, int ctlid)
575     {
576     const char *sizelist[] = {
577 twoaday 200 "1024", "1536",
578 twoaday 211 "2048", "3072",
579 twoaday 200 "4096", NULL
580 werner 36 };
581     int i;
582 twoaday 200
583 werner 36 for (i=0; sizelist[i] != NULL; i++)
584 twoaday 200 SendDlgItemMessage (dlg, ctlid, CB_ADDSTRING, 0,
585     (LPARAM)(char*)sizelist[i]);
586 werner 36 SendDlgItemMessage (dlg, ctlid, CB_SETCURSEL, (WPARAM)2, 0);
587     }
588    
589 twoaday 200
590 werner 36 static int
591     get_keysize_from_box (HWND dlg, int ctlid)
592     {
593     int pos;
594     char buf[32];
595    
596     pos = SendDlgItemMessage (dlg, ctlid, CB_GETCURSEL, 0, 0);
597     if (pos == CB_ERR)
598     return -1;
599     SendDlgItemMessage (dlg, ctlid, CB_GETLBTEXT, pos, (LPARAM)(char*)buf);
600 twoaday 211 return atoi (buf);
601 werner 36 }
602    
603    
604 twoaday 175 /* Create a time_t from a system time @st. */
605     time_t
606     w32_mktime (SYSTEMTIME *st)
607     {
608     struct tm tm;
609    
610     memset (&tm, 0, sizeof (tm));
611     tm.tm_year = st->wYear-1900;
612     tm.tm_mday = st->wDay+1;
613     tm.tm_mon = st->wMonth-1;
614     return mktime (&tm);
615     }
616    
617    
618 twoaday 129 /* Dialog procedure for adding a new secondary key. */
619 werner 36 BOOL CALLBACK
620     keyedit_addsubkey_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
621     {
622 twoaday 176 static keyedit_cb_t ctx;
623 twoaday 200 keygen_cb_t keygen;
624 werner 36 GpgKeyEdit *ke;
625     gpgme_error_t err;
626 twoaday 175 SYSTEMTIME st;
627 twoaday 200 HWND hwnd;
628 werner 36 int index, size, valid;
629    
630     switch (msg) {
631     case WM_INITDIALOG:
632 twoaday 176 ctx = (keyedit_cb_t)lparam;
633 twoaday 225 if (!ctx)
634     BUG (0);
635 werner 36 SetWindowText (dlg, _("Add new Subkey"));
636     SetDlgItemText (dlg, IDC_ADDSUBKEY_INFALGO, _("Key type"));
637     SetDlgItemText (dlg, IDC_ADDSUBKEY_INFSIZE, _("Size in bits"));
638     SetDlgItemText (dlg, IDC_ADDSUBKEY_INFVALID, _("Key expiration"));
639 twoaday 99 SetDlgItemText (dlg, IDC_ADDSUBKEY_EXPIRE, _("&Never"));
640 twoaday 105 SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
641 twoaday 99
642 twoaday 200 hwnd = GetDlgItem (dlg, IDC_ADDSUBKEY_ALGO);
643     listbox_add_string (hwnd, "DSA (sign only)");
644     listbox_add_string (hwnd, "ElGamal (encrypt only)");
645     listbox_add_string (hwnd, "RSA (sign only)");
646     listbox_add_string (hwnd, "RSA (encrypt only)");
647 werner 36 CheckDlgButton (dlg, IDC_ADDSUBKEY_EXPIRE, BST_CHECKED);
648     EnableWindow (GetDlgItem (dlg, IDC_ADDSUBKEY_EXPDATE), FALSE);
649     init_keysize_box (dlg, IDC_ADDSUBKEY_SIZE);
650 twoaday 105 SetForegroundWindow (dlg);
651 twoaday 218 center_window (dlg, ctx->parent);
652 werner 36 return FALSE;
653    
654     case WM_COMMAND:
655 twoaday 150 if (HIWORD (wparam) == BN_CLICKED &&
656     LOWORD (wparam) == IDC_ADDSUBKEY_EXPIRE) {
657 werner 36 if (IsDlgButtonChecked (dlg, IDC_ADDSUBKEY_EXPIRE))
658     EnableWindow (GetDlgItem (dlg, IDC_ADDSUBKEY_EXPDATE), FALSE);
659     else
660     EnableWindow (GetDlgItem (dlg, IDC_ADDSUBKEY_EXPDATE), TRUE);
661     }
662 twoaday 150 if (HIWORD (wparam) == LBN_SELCHANGE &&
663     LOWORD (wparam) == IDC_ADDSUBKEY_ALGO) {
664 werner 36 index = SendMessage ((HWND)lparam, LB_GETCURSEL, 0, 0);
665     if (index == 0)
666     SendDlgItemMessage (dlg, IDC_ADDSUBKEY_SIZE, CB_SETCURSEL, 0, 0);
667     }
668    
669 twoaday 150 switch (LOWORD (wparam)) {
670 werner 36 case IDOK:
671 twoaday 200 keygen = (keygen_cb_t)ctx->opaque;
672     assert (keygen);
673     hwnd = GetDlgItem (dlg, IDC_ADDSUBKEY_ALGO);
674     switch (listbox_get_cursel (hwnd)) {
675 werner 36 case 0: index = 2; break;
676     case 1: index = 4; break;
677     case 2: index = 5; break;
678     case 3: index = 6; break;
679 twoaday 150 default:
680 twoaday 200 msg_box (dlg, _("Please select one entry."),
681     _("Add Subkey"), MB_ERR);
682 werner 36 return FALSE;
683     }
684     size = get_keysize_from_box (dlg, IDC_ADDSUBKEY_SIZE);
685     if (index == 2 && size != 1024) {
686 twoaday 200 msg_box (dlg,_("DSS uses a fixed keysize of 1024. Size changed."),
687 twoaday 150 _("Add Subkey"), MB_INFO);
688 werner 36 size = 1024;
689     }
690 twoaday 175
691 twoaday 200 hwnd = GetDlgItem (dlg, IDC_ADDSUBKEY_EXPDATE);
692     DateTime_GetSystemtime (hwnd, &st);
693 twoaday 175 valid = w32_mktime (&st) - time (NULL);
694     valid /= 86400;
695    
696 werner 36 keygen->bits = size;
697     switch (index) {
698     case 2: keygen->algo = GPGME_PK_DSA; break;
699     case 4: keygen->algo = GPGME_PK_ELG_E; break;
700     case 5: keygen->algo = GPGME_PK_RSA_S; break;
701     case 6: keygen->algo = GPGME_PK_RSA_E; break;
702     }
703     if (valid > 0)
704     keygen->expire = time (NULL) + valid*24*60*60;
705    
706 twoaday 200 ke = create_GpgKeyEdit (ctx->keyid);
707 werner 36 ke->setCallback (keygen_cb, NULL);
708 twoaday 176 if (ctx->is_protected)
709 twoaday 150 ke->setPassphrase (ctx->pass);
710 twoaday 176 else
711     ke->setNoPassphrase (true);
712 werner 36 keygen_cb_dlg_create ();
713    
714     err = ke->addSubkey ((gpgme_pubkey_algo_t)index, size, valid);
715 twoaday 150 keygen->fpr = get_subkey_keyid (ctx->keyid);
716 twoaday 211 keygen_cb_dlg_destroy (1);
717 werner 36 if (err)
718     msg_box (dlg, gpgme_strerror (err), _("Add Subkey"), MB_ERR);
719     else {
720 twoaday 200 msg_box (dlg, _("Subkey successfully added."),
721     _("GnuPG Status"), MB_OK);
722 werner 36 ctx->finished = 1;
723     }
724     delete ke;
725 twoaday 129 EndDialog (dlg, TRUE);
726 werner 36 return TRUE;
727    
728     case IDCANCEL:
729 twoaday 129 EndDialog (dlg, FALSE);
730 werner 36 return FALSE;
731     }
732     break;
733     }
734    
735     return FALSE;
736 twoaday 129 }
737 werner 36
738    
739     BOOL
740     keyedit_add_userid (winpt_key_t k, HWND dlg, listview_ctrl_t lv)
741     {
742 twoaday 176 keyedit_cb_s cb;
743 twoaday 200 keygen_cb_s keygen;
744 werner 36 char *pass = NULL;
745     int cancel = 0;
746    
747     if (!k->key_pair) {
748 twoaday 200 msg_box (dlg, _("There is no secret key available!"),
749     _("Add user ID"), MB_ERR);
750 werner 36 return FALSE;
751     }
752    
753     if (k->is_protected) {
754 twoaday 225 pass = request_key_passphrase (k->ctx, _("Key Edit"), &cancel);
755 werner 36 if (cancel)
756     return FALSE;
757     }
758 twoaday 200
759     memset (&keygen, 0, sizeof (keygen));
760 werner 36 memset (&cb, 0, sizeof cb);
761 twoaday 218 cb.parent = dlg;
762 twoaday 200 cb.opaque = &keygen;
763 twoaday 176 cb.is_protected = k->is_protected;
764     cb.pass = pass;
765 werner 36 cb.keyid = k->keyid;
766     dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYEDIT_ADDUID,
767     dlg, keyedit_adduid_dlg_proc,
768     (LPARAM)&cb, _("Add user ID"),
769     IDS_WINPT_KEYEDIT_ADDUID);
770 twoaday 200 if (lv != NULL && cb.finished)
771     do_add_new_userid (lv, keygen.name, keygen.email, keygen.comment);
772 werner 36 if (cb.finished)
773     k->update = 1;
774    
775 twoaday 200 free_if_alloc (keygen.name);
776     free_if_alloc (keygen.email);
777     free_if_alloc (keygen.comment);
778 werner 36 sfree_if_alloc (pass);
779     return TRUE;
780     }
781    
782    
783 twoaday 200 /* Return the keyID of the last subkey. */
784 werner 36 char*
785 twoaday 150 get_subkey_keyid (const char *keyid)
786 werner 36 {
787     gpgme_error_t err;
788 twoaday 150 gpgme_key_t key;
789 werner 36 gpgme_ctx_t ctx;
790 twoaday 150 gpgme_subkey_t subk;
791 twoaday 200 char *kid = NULL;
792 werner 36
793     err = gpgme_new (&ctx);
794     if (err)
795     return NULL;
796     err = gpgme_get_key (ctx, keyid, &key, 0);
797 twoaday 150 gpgme_release (ctx);
798 werner 36 if (err)
799     return NULL;
800 twoaday 150 subk = get_nth_key (key, count_subkeys (key));
801 twoaday 200 if (subk != NULL)
802     kid = strdup (subk->keyid);
803 werner 36 gpgme_key_release (key);
804 twoaday 150 return kid;
805 werner 36 }
806    
807    
808     BOOL
809     keyedit_add_subkey (winpt_key_t k, HWND dlg, listview_ctrl_t lv)
810     {
811 twoaday 176 keyedit_cb_s cb;
812     keygen_cb_s keygen;
813 werner 36 char *pass = NULL;
814     int cancel = 0;
815    
816     if (!k->key_pair) {
817 twoaday 200 msg_box (dlg, _("There is no secret key available!"),
818     _("Add Subkey"), MB_ERR);
819 werner 36 return FALSE;
820     }
821     if (k->is_protected) {
822 twoaday 225 pass = request_key_passphrase (k->ctx, _("Key Edit"), &cancel);
823 werner 36 if (cancel)
824     return FALSE;
825     }
826    
827     memset (&keygen, 0, sizeof (keygen));
828     memset (&cb, 0, sizeof (cb));
829     cb.keyid = k->keyid;
830 twoaday 176 cb.is_protected = k->is_protected;
831     cb.pass = pass;
832 werner 36 cb.opaque = &keygen;
833     dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYEDIT_ADDSUBKEY,
834     dlg, keyedit_addsubkey_dlg_proc,
835     (LPARAM)&cb, _("Add new Subkey"),
836     IDS_WINPT_KEYEDIT_ADDSUBKEY);
837 twoaday 200 if (lv != NULL && cb.finished)
838     do_add_new_subkey (lv, &keygen, 0);
839 werner 36 if (cb.finished)
840     k->update = 1;
841    
842 twoaday 200 safe_free (keygen.fpr);
843     sfree_if_alloc (pass);
844 werner 36 return cb.finished? TRUE: FALSE;
845     }
846    
847    
848 twoaday 225 /* Set the preferred keyserver of the given key @k. */
849 werner 36 BOOL
850     keyedit_set_pref_keyserver (winpt_key_t k, HWND dlg)
851     {
852     GpgKeyEdit *ke;
853     gpgme_error_t err;
854     struct URL_ctx_s *url;
855 twoaday 200 char *pass = NULL;
856 werner 36
857     url = (struct URL_ctx_s *)get_keyserver_URL_dlg (dlg);
858     if (url->cancel == 1) {
859     delete url;
860     return FALSE;
861     }
862    
863 twoaday 225 pass = request_key_passphrase (k->ctx, _("Key Edit"), &url->cancel);
864 werner 36 if (url->cancel) {
865     delete url;
866     return FALSE;
867     }
868    
869 twoaday 200 ke = create_GpgKeyEdit (k->keyid);
870 twoaday 175 if (k->is_protected)
871     ke->setPassphrase (pass);
872 twoaday 176 else
873     ke->setNoPassphrase (true);
874 twoaday 181 err = ke->setPreferredKeyserver (-1, url->url);
875 werner 36 if (!err)
876     msg_box (dlg, _("Preferred keyserver successfully set."), _("Key Edit"), MB_OK);
877 twoaday 188 else
878     msg_box (dlg, gpgme_strerror (err), _("Key Edit"), MB_ERR);
879 werner 36
880     sfree_if_alloc (pass);
881     delete ke;
882 twoaday 181 delete url;
883 werner 36 return err == 0? 0 : WPTERR_GENERAL;
884     }
885    
886    
887     /* Add a photo-ID to the key specified in @k. @dlg is the handle of
888     the calling dialog. */
889     BOOL
890     keyedit_add_photo (winpt_key_t k, HWND dlg)
891     {
892 twoaday 200 keyedit_cb_s cb;
893     char *pass = NULL;
894     int cancel;
895    
896 werner 36 if (!k->key_pair) {
897 twoaday 180 msg_box (dlg, _("There is no secret key available!"),
898     _("Add Photo"), MB_ERR);
899 werner 36 return FALSE;
900     }
901 twoaday 200
902     memset (&cb, 0, sizeof (cb));
903     if (k->is_protected) {
904 twoaday 225 pass = request_key_passphrase (k->ctx, _("Key Edit"), &cancel);
905 twoaday 200 if (cancel)
906     return FALSE;
907     }
908 twoaday 218 cb.parent = dlg;
909 twoaday 200 cb.pass = pass;
910     cb.keyid = k->keyid;
911 werner 36 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT_ADDPHOTO, dlg,
912 twoaday 200 keyedit_addphoto_dlg_proc, (LPARAM)&cb);
913    
914     if (cb.finished)
915     k->update = 1;
916     sfree_if_alloc (pass);
917 werner 36 return TRUE;
918     }
919    
920    
921     BOOL
922     keyedit_add_revoker (winpt_key_t k, HWND dlg)
923     {
924 twoaday 200 keyedit_cb_s cb;
925     char *pass = NULL;
926     int cancel;
927    
928 twoaday 129 if (!k->key_pair) {
929     msg_box (dlg, _("There is no secret key available!"), _("Add Revoker"), MB_ERR);
930 werner 36 return FALSE;
931     }
932 twoaday 200
933     if (k->is_protected) {
934 twoaday 225 pass = request_key_passphrase (k->ctx, _("Key Edit"), &cancel);
935 twoaday 200 if (cancel)
936     return FALSE;
937     }
938    
939     memset (&cb, 0, sizeof (cb));
940 twoaday 218 cb.parent = dlg;
941 twoaday 200 cb.is_protected = k->is_protected;
942     cb.keyid = k->keyid;
943     cb.pass = pass;
944 werner 36 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT_ADDREV, dlg,
945 twoaday 200 keyedit_addrevoker_dlg_proc, (LPARAM)&cb);
946    
947     if (cb.finished)
948     k->update = 1;
949     sfree_if_alloc (pass);
950 werner 36 return TRUE;
951 twoaday 129 }
952 werner 36
953    
954 twoaday 165 /* Change ownertrust of the given key @key.
955     Return TRUE if the ownertrust was changed. */
956     BOOL
957     keyedit_change_ownertrust (winpt_key_t key, HWND dlg)
958     {
959     int rc;
960    
961     rc = dialog_box_param (glob_hinst,
962     (LPCSTR)IDD_WINPT_KEYEDIT_OWNERTRUST,
963     dlg, keyedit_ownertrust_dlg_proc,
964     (LPARAM)key, _("Change Ownertrust"),
965     IDS_WINPT_KEYEDIT_OWNERTRUST);
966 twoaday 170 if (rc == TRUE) {
967     msg_box (dlg, _("Key status changed."), _("Key Edit"), MB_OK);
968 twoaday 165 key->update = 1;
969 twoaday 170 }
970 twoaday 165 return rc;
971     }
972    
973    
974 twoaday 180 /* Check if the given key is supposed to have IDEA
975     for secret key protection. */
976 werner 36 static int
977 twoaday 180 is_idea_protect_algo (const char *keyid)
978 werner 36 {
979     winpt_key_s k;
980     const unsigned char *sym_prefs;
981     size_t n;
982    
983     memset (&k, 0, sizeof (k));
984     if (winpt_get_pubkey (keyid, &k))
985 twoaday 180 BUG (0);
986     if (!k.is_v3)
987     return 0;
988 twoaday 226 sym_prefs = k.ext->sym_prefs;
989 werner 36 if (!sym_prefs)
990     return 1; /* assume that only v3 keys have no symmetric cipher preferences
991     and thus IDEA is explicit. */
992     for (n = 0; sym_prefs[n]; n++)
993     ;
994     if ((n == 0 || n == 1) && *sym_prefs == 0x01)
995     return 1;
996     return 0;
997 twoaday 180 }
998 werner 36
999    
1000     BOOL
1001 twoaday 129 keyedit_change_passwd (winpt_key_t k, HWND dlg)
1002 werner 36 {
1003 twoaday 200 gpgme_error_t err;
1004 werner 36 GpgKeyEdit *ke;
1005 twoaday 129 char *old_pass = NULL;
1006     char *new_pass = NULL;
1007 werner 36 int cancel = 0;
1008    
1009 twoaday 175 if (!k->key_pair) {
1010     msg_box (dlg, _("There is no secret key available!"),
1011     _("Key Edit"), MB_ERR);
1012 werner 36 return FALSE;
1013     }
1014    
1015 twoaday 180 if (!idea_available && is_idea_protect_algo (k->keyid)) {
1016     msg_box (dlg, _("Cannot change passphrase because the key\n"
1017     "is protected with the IDEA encryption algorithm."),
1018     _("Key Edit"), MB_ERR);
1019 werner 36 return FALSE;
1020     }
1021    
1022 twoaday 129 if (k->is_protected) {
1023 twoaday 229 old_pass = request_passphrase (_("Current (old) Passphrase"),
1024     PASSDLG_INIT, &cancel);
1025 twoaday 128 if (cancel)
1026 werner 36 return FALSE;
1027     }
1028 twoaday 229 new_pass = request_passphrase2 (_("New Passphrase" ),
1029     PASSDLG_INIT|PASSDLG_WARN_UTF8, &cancel);
1030 twoaday 129 if (cancel) {
1031 twoaday 220 sfree_if_alloc (old_pass);
1032 werner 36 return FALSE;
1033     }
1034    
1035 twoaday 220 if (strlen (new_pass) == 0) {
1036     cancel = msg_box (dlg, _("Are you sure that you really don't want a passphrase?\n"
1037     "This is propably a bad idea, still proceed?"),
1038     _("Key Edit"), MB_WARN_ASK);
1039     if (cancel != IDYES) {
1040     sfree_if_alloc (old_pass);
1041     sfree_if_alloc (new_pass);
1042     return FALSE;
1043     }
1044     }
1045    
1046 twoaday 200 ke = create_GpgKeyEdit (k->keyid);
1047 werner 36 ke->setPassphrase (k->is_protected? old_pass : NULL);
1048 twoaday 220 if (!k->is_protected)
1049     ke->setNoPassphrase (true);
1050     err = ke->changePassphrase (new_pass, 1);
1051 twoaday 200 if (err)
1052     msg_box (dlg, gpgme_strerror (err), _("Change Passwd"), MB_ERR);
1053 werner 36 else
1054     msg_box (dlg, _("Passphrase successfully changed."), _("GnuPG status"), MB_OK);
1055     sfree_if_alloc (old_pass);
1056     sfree_if_alloc (new_pass);
1057     delete ke;
1058     return TRUE;
1059     }
1060    
1061    
1062 twoaday 165 /* Initialize sub key list from key @k and return
1063     the new listview control. */
1064 werner 36 listview_ctrl_t
1065 twoaday 165 subkey_list_init (HWND dlg, winpt_key_t k)
1066 werner 36 {
1067     LV_ITEM lvi;
1068     gpgme_subkey_t sub;
1069     struct listview_column_s cols[] = {
1070     {0, 80, (char *)_("Description")},
1071     {1, 78, (char *)_("Key ID")},
1072     {2, 66, (char *)_("Creation")},
1073     {3, 66, (char *)_("Expires")},
1074     {4, 64, (char *)_("Status")},
1075     {5, 16, "C"/*ertify*/},
1076     {6, 16, "S"/*ign*/},
1077     {7, 16, "E"/*ncrypt*/},
1078     {8, 16, "A"/*uth*/},
1079     {0, 0, 0}
1080     };
1081     listview_ctrl_t lv;
1082     char buf[256], tmp[128];
1083     const char *t;
1084 twoaday 211 int nkeys = 0, i, bits;
1085 werner 36
1086 twoaday 211 nkeys = count_subkeys (k->ctx);
1087 twoaday 225 if (!nkeys)
1088     BUG (0); /* should never happen. */
1089 werner 36
1090 twoaday 208 listview_new (&lv, GetDlgItem (dlg, IDC_KEYEDIT_KEYLIST));
1091     for (i = 0; cols[i].fieldname != NULL; i++)
1092     listview_add_column (lv, &cols[i]);
1093 werner 36
1094 twoaday 215 for (i = 0; i < nkeys; i++) {
1095     listview_add_item (lv, "");
1096     listview_add_sub_item (lv, 0, 1, "");
1097     memset (&lvi, 0, sizeof (lvi));
1098 werner 36 lvi.mask = LVIF_PARAM;
1099 twoaday 215 lvi.lParam = (LPARAM)k->ext;
1100 twoaday 225 if (ListView_SetItem (lv->ctrl, &lvi) == FALSE)
1101     BUG (0);
1102 werner 36 }
1103    
1104     listview_set_ext_style( lv );
1105 twoaday 211 for( i = 0, sub = k->ctx->subkeys; i < nkeys; i++, sub = sub->next ) {
1106 werner 36 memset( buf, 0, sizeof buf );
1107    
1108     bits = sub->length;
1109     _snprintf( tmp, sizeof tmp-1, "%d-bit ", bits );
1110     strcat( buf, tmp );
1111    
1112     _snprintf( tmp, sizeof tmp-1, "%s", get_key_pubalgo (sub->pubkey_algo));
1113     strcat( buf, tmp );
1114    
1115     listview_add_sub_item( lv, i, 0, buf );
1116     t = sub->keyid;
1117     if( !t )
1118     t = "DEADBEEFDEADBEEF";
1119     _snprintf( tmp, sizeof tmp-1, "0x%s", t+8 );
1120     listview_add_sub_item( lv, i, 1, tmp );
1121    
1122     t = get_key_created (sub->timestamp);
1123     if( !t )
1124 werner 116 t = "????" "-??" "-??";
1125 werner 36 listview_add_sub_item( lv, i, 2, t );
1126    
1127     if( sub->expires ) {
1128     t = get_key_created (sub->expires);
1129     listview_add_sub_item( lv, i, 3, t );
1130     }
1131     else
1132     listview_add_sub_item( lv, i, 3, _("Never") );
1133    
1134     if( sub->expired )
1135     t = _("Expired");
1136     else if( sub->revoked )
1137     t = _("Revoked");
1138     else
1139     t = _("OK");
1140     listview_add_sub_item( lv, i, 4, t );
1141    
1142     if (sub->can_certify) t = "*"; else t = "";
1143     listview_add_sub_item (lv, i, 5, t);
1144     if (sub->can_sign) t = "*"; else t = "";
1145     listview_add_sub_item( lv, i, 6, t );
1146     if (sub->can_encrypt) t = "*"; else t = "";
1147     listview_add_sub_item( lv, i, 7, t );
1148     if (sub->can_authenticate) t = "*"; else t = "";
1149     listview_add_sub_item (lv, i, 8, t);
1150     }
1151     return lv;
1152 twoaday 200 }
1153 werner 36
1154    
1155     static listview_ctrl_t
1156     userid_list_init (HWND dlg, winpt_key_t k)
1157     {
1158     listview_ctrl_t lv = NULL;
1159     gpgme_key_sig_t ks;
1160 twoaday 207 struct native_uid_s *u;
1161 twoaday 208 int nuids = 0, j, u_attr;
1162 werner 36 struct listview_column_s cols[] = {
1163     {0, 72, (char *)_("Validity")},
1164     {1, 150, (char *)_("Name")},
1165     {2, 110, (char *)_("Email")},
1166     {3, 76, (char *)_("Creation")},
1167     {0, 0, 0}
1168     };
1169     const char *attr;
1170    
1171 twoaday 211 nuids = count_userids (k->ctx);
1172 twoaday 225 if (!nuids)
1173     BUG (0); /* should never happen. */
1174 werner 36
1175 twoaday 208 listview_new (&lv, GetDlgItem (dlg, IDC_KEYEDIT_UIDLIST));
1176 twoaday 225 for (j = 0; cols[j].fieldname != NULL; j++)
1177 twoaday 208 listview_add_column (lv, &cols[j]);
1178 werner 36
1179 twoaday 211 for (j = 0; j < nuids; j++) {
1180 twoaday 208 listview_add_item (lv, " ");
1181     listview_add_sub_item (lv, 0, 1, " " );
1182 werner 36 }
1183    
1184     listview_set_ext_style (lv);
1185 twoaday 208 for (j = 0, u=k->ext->uids; j < nuids; u=u->next, j++) {
1186 werner 36 if (u->revoked)
1187     attr = _("Revoked");
1188     else {
1189     u_attr = (int)u->validity;
1190     attr = get_key_trust2 (NULL, u_attr, 0, 0);
1191     }
1192 twoaday 208 listview_add_sub_item (lv, j, UID_COL_VALID, (char *)attr);
1193 werner 36 /* XXX: add comment if available */
1194 twoaday 208 listview_add_sub_item (lv, j, UID_COL_NAME,
1195 twoaday 204 u->name? u->name : _("Invalid user ID"));
1196     if (u->email)
1197 twoaday 208 listview_add_sub_item (lv, j, UID_COL_EMAIL, u->email);
1198 werner 36
1199 twoaday 208 ks = get_selfsig (u->signatures, k->keyid, 1);
1200 werner 36 if (ks)
1201 twoaday 208 listview_add_sub_item (lv, j, UID_COL_CREATION,
1202     get_key_created (ks->timestamp));
1203 werner 36 }
1204 twoaday 225 if (!k->key_pair) {
1205 twoaday 211 CheckDlgButton (dlg, IDC_KEYUID_ADD, BST_INDETERMINATE);
1206     CheckDlgButton (dlg, IDC_KEYUID_REVOKE, BST_INDETERMINATE);
1207 werner 36 }
1208     return lv;
1209 twoaday 200 }
1210 werner 36
1211    
1212     static void
1213 twoaday 170 do_init_cmdlist (HWND dlg, int is_keypair)
1214     {
1215     const char *s;
1216 werner 36 int i = 0;
1217    
1218 twoaday 170 for (i = 0; (s=cmdlist[i].name); i++) {
1219     if (is_keypair)
1220     SendDlgItemMessage (dlg, IDC_KEYEDIT_CMD, CB_ADDSTRING, 0,
1221     (LPARAM)(char *)s);
1222     else if (!cmdlist[i].need_pair)
1223     SendDlgItemMessage (dlg, IDC_KEYEDIT_CMD, CB_ADDSTRING, 0,
1224     (LPARAM)(char *)s);
1225 werner 36 }
1226 twoaday 170 SendDlgItemMessage (dlg, IDC_KEYEDIT_CMD, CB_SETCURSEL, 0, 0);
1227     }
1228 werner 36
1229    
1230 twoaday 165 /* Return 1 if the requested command is RFC2440. */
1231 werner 36 static int
1232 twoaday 165 is_cmd_openpgp (int cmdid)
1233 werner 36 {
1234 twoaday 165 switch (cmdid) {
1235 werner 36 case CMD_ADDKEY:
1236     case CMD_ADDPHOTO:
1237     case CMD_ADDREVOKER:
1238 twoaday 170 //case CMD_SETPREF:
1239 werner 36 return 1;
1240     }
1241     return 0;
1242 twoaday 165 }
1243 werner 36
1244    
1245 twoaday 165 /* Display a message box with a short description of the commands. */
1246 werner 36 static void
1247 twoaday 165 do_show_help (HWND dlg)
1248 werner 36 {
1249     char helptext[2048];
1250    
1251 twoaday 165 _snprintf (helptext, sizeof (helptext)-1,
1252 twoaday 170 _(
1253 werner 36 "ADDUID \t\tadd a user ID\r\n"
1254     "ADDPHOTO \t\tadd a photo ID\r\n"
1255     "DELUID \t\tdelete a user ID\r\n"
1256     "ADDKEY \t\tadd a secondard key\r\n"
1257     "DELKEY \t\tdelete a secondary key\r\n"
1258     "ADDREVOKER\t\tadd a revocation key\r\n"
1259     "EXPIRE \t\tchange the expire date\r\n"
1260     "SHOWPREF \t\tlist preferences (verbose)\r\n"
1261 twoaday 170 "SETPREF \t\tset preference list\r\n"
1262 werner 36 "UPDPREF \t\tupdated preferences\r\n"
1263     "PASSWD \t\tchange the passphrase\r\n"
1264     "PRIMARY \t\tflag user ID as primary\r\n"
1265     "TRUST \t\tchange the ownertrust\r\n"
1266     "REVUID \t\trevoke a user ID\r\n"
1267     "REVKEY \t\trevoke a secondary key\r\n"
1268     "DISABLE \t\tdisable a key\r\n"
1269     "ENABLE \t\tenable a key\r\n"
1270 twoaday 170 "SIGN \t\tsign a user-id (exportable)\r\n"
1271 twoaday 195 "LSIGN \t\tsign a user-id (non-exportable)\r\n"
1272     "CLEAN \t\tremove unusable signatures from key\r\n"
1273 twoaday 208 "MINIMIZE \t\tremove all signatures from key\r\n"
1274 twoaday 195 ));
1275 twoaday 165 msg_box (dlg, helptext, _("Key Edit Help"), MB_OK);
1276     }
1277 werner 36
1278    
1279     static int
1280     do_editkey_delkey (winpt_key_t k, HWND dlg, listview_ctrl_t lv)
1281     {
1282     gpgme_error_t err;
1283     GpgKeyEdit *ke;
1284 twoaday 225 int pos, id;
1285 werner 36 char tmp[64];
1286    
1287     if (!k->key_pair)
1288 twoaday 225 return FALSE;
1289 werner 36
1290 twoaday 225 if (listview_count_items (lv, 0) == 1) {
1291     msg_box (dlg, _("Primary key can not be deleted!"), _("Key Edit"), MB_ERR);
1292 werner 36 return FALSE;
1293     }
1294 twoaday 225 pos = listview_get_curr_pos (lv);
1295     if (pos == -1) {
1296     msg_box (dlg, _("Please select a key."), _("Key Edit"), MB_ERR);
1297 werner 36 return FALSE;
1298     }
1299 twoaday 225 if (pos == 0) {
1300     msg_box (dlg, _("Primary key can not be deleted!"), _("Key Edit"), MB_ERR);
1301 werner 36 return FALSE;
1302     }
1303    
1304 twoaday 200 /* XXX: change the warning to make clear that verification won't work
1305     any longer if this is a sign-only key. */
1306 twoaday 225 listview_get_item_text (lv, pos, 0, tmp, sizeof (tmp) -1);
1307 twoaday 200 id = log_box (_("Key Edit"), MB_YESNO|MB_ICONWARNING,
1308 werner 36 _("\"Subkey %s.\"\n\n"
1309     "Anything encrypted to the selected subkey will no longer\n"
1310     "be able to be decrypted.\n\n"
1311 twoaday 200 "Do you really want to delete this subkey?"), tmp);
1312     if (id == IDNO)
1313 werner 36 return FALSE;
1314    
1315 twoaday 225 ke = create_GpgKeyEdit (k->keyid);
1316     err = ke->delKey (pos);
1317 werner 36 if (err)
1318     msg_box (dlg, gpgme_strerror (err), _("Delete Subkey"), MB_ERR);
1319     else {
1320 twoaday 225 listview_del_item (lv, pos);
1321 werner 36 k->update = 1;
1322     status_box (dlg, _("Subkey successfully deleted."), _("GnuPG status"));
1323     }
1324     delete ke;
1325     return err? FALSE : TRUE;
1326 twoaday 200 }
1327 werner 36
1328    
1329     /* Set the expiration date for the selected key in list view @lv.
1330     Return value: TRUE on success. */
1331     static int
1332     do_editkey_expire (winpt_key_t k, HWND dlg, listview_ctrl_t lv)
1333     {
1334     gpgme_error_t err;
1335     GpgKeyEdit *ke;
1336     date_s udd = {0};
1337     char buf[256], * pass = NULL;
1338 twoaday 226 time_t exp;
1339 twoaday 225 int pos, cancel = 0;
1340 werner 36
1341     if (!k->key_pair) {
1342 twoaday 41 msg_box (dlg, _("There is no secret key available!"), _("Key Edit"), MB_ERR);
1343 werner 36 return FALSE;
1344     }
1345 twoaday 225 pos = listview_get_curr_pos (lv);
1346     if (pos == -1) {
1347     msg_box (dlg, _("Please select a key."), _("Key Edit"), MB_ERR);
1348 werner 36 return FALSE;
1349     }
1350 twoaday 41
1351     /* If a key already expired, it is possible the user wants to
1352 twoaday 225 set a new expiration date.. */
1353     listview_get_item_text (lv, pos, SUBK_COL_STATUS, buf, sizeof (buf)-1);
1354 twoaday 41 if (!strcmp (buf, _("Expired"))) {
1355     cancel = msg_box (dlg, _("Key already expired.\n\n"
1356     "Do you want to change the expiration date?"),
1357     _("Key Edit"), MB_QUEST_ASK);
1358     if (cancel == IDNO)
1359     return FALSE;
1360     cancel = 0;
1361 werner 36 }
1362 twoaday 41
1363 werner 36 memset (&udd, 0, sizeof udd);
1364     udd.text = _("Key Expiration Date");
1365     dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_DATE, dlg,
1366     date_dlg_proc, (LPARAM)&udd,
1367     _("Key Expiration Date"), IDS_WINPT_DATE);
1368     if (udd.cancel == 1)
1369     return FALSE;
1370     if (!keygen_check_date (&udd.st)) {
1371     msg_box (dlg, _("The date you have chosen lies in the past."),
1372     _("Key Edit"), MB_ERR);
1373     return FALSE;
1374     }
1375 twoaday 225 if (k->is_protected) {
1376     pass = request_key_passphrase (k->ctx, _("Key Edit"), &cancel);
1377 twoaday 41 if (cancel)
1378 werner 36 return FALSE;
1379     }
1380 twoaday 226 exp = w32_mktime (&udd.st);
1381 twoaday 225 ke = create_GpgKeyEdit (k->keyid);
1382 werner 36 if (k->is_protected)
1383     ke->setPassphrase (pass);
1384 twoaday 176 else
1385     ke->setNoPassphrase (true);
1386 twoaday 226 err = ke->setKeyExpireDate (pos, exp, false);
1387 werner 36 if (err)
1388     msg_box (dlg, gpgme_strerror (err), _("Expire Subkey"), MB_ERR);
1389     else {
1390 twoaday 226 _snprintf (buf, sizeof (buf)-1, "%s", get_key_created (exp));
1391 twoaday 225 listview_add_sub_item (lv, pos, SUBK_COL_EXPIRES, buf);
1392 werner 36 k->update = 1;
1393     msg_box (dlg, _("Subkey expire date successfully set."),
1394     _("GnuPG status"), MB_OK);
1395     }
1396     sfree_if_alloc (pass);
1397     delete ke;
1398     return TRUE;
1399     }
1400    
1401    
1402     /* Revoke the selected key in the list view @lv. @k contains
1403     control information about the global key.
1404     Return value: TRUE on success. */
1405     static int
1406     do_editkey_revoke (winpt_key_t k, HWND dlg, listview_ctrl_t lv)
1407     {
1408     gpgme_error_t err;
1409     GpgKeyEdit *ke;
1410     char buf[256];
1411     char *pass = NULL;
1412     int j, cancel = 0;
1413    
1414     if (!k->key_pair) {
1415     msg_box (dlg, _("There is no secret key available!"), _("Key Edit"), MB_ERR);
1416     return FALSE;
1417     }
1418    
1419     if ((j = listview_get_curr_pos (lv)) == -1) {
1420     msg_box( dlg, _("Please select a key."), _("Key Edit"), MB_ERR );
1421     return FALSE;
1422     }
1423     else if (listview_count_items (lv, 0) == 1) {
1424     msg_box( dlg, _("No subkeys were found, if you want to revoke the\n"
1425     "whole key, please use the Key Manager command directly.\n\n"
1426     "This command is only available to revoke single subkeys"),
1427     _("Key Edit"), MB_INFO );
1428     return FALSE;
1429     }
1430    
1431     listview_get_item_text (lv, j, SUBK_COL_STATUS, buf, sizeof (buf)-1);
1432     if (!strcmp (buf, _("Revoked"))) {
1433     msg_box (dlg, _("Key already revoked."), _("Key Edit"), MB_ERR);
1434     return FALSE;
1435     }
1436    
1437     if (k->is_protected) {
1438 twoaday 225 pass = request_key_passphrase (k->ctx, _("Key Edit"), &cancel);
1439 werner 36 if (cancel)
1440     return FALSE;
1441     }
1442    
1443 twoaday 225 ke = create_GpgKeyEdit (k->keyid);
1444 werner 36 if (k->is_protected)
1445     ke->setPassphrase (pass);
1446 twoaday 176 else
1447     ke->setNoPassphrase (true);
1448 werner 36 err = ke->revokeSubkey (j, 0, NULL);
1449     if (err)
1450     msg_box( dlg, gpgme_strerror (err), _("Revoke Subkey"), MB_ERR);
1451     else {
1452     listview_add_sub_item (lv, j, SUBK_COL_STATUS, _("Revoked"));
1453     k->update = 1;
1454     msg_box( dlg, _("Subkey successfully revoked."), _("GnuPG Status"), MB_OK );
1455     }
1456     sfree_if_alloc (pass);
1457     delete ke;
1458     return TRUE;
1459     }
1460    
1461    
1462     /* Revoked the selected userid in list view @lv.
1463     Return value: TRUE on success. */
1464     int
1465     do_editkey_revuid (winpt_key_t k, HWND dlg, listview_ctrl_t lv)
1466     {
1467     gpgme_error_t err;
1468     GpgKeyEdit *ke;
1469 twoaday 160 char buf[128], email[128];
1470     char inf[512];
1471     char *pass = NULL;
1472 werner 36 int cancel = 0, id = 0, j;
1473    
1474     if (!k->key_pair) {
1475 twoaday 160 msg_box (dlg, _("There is no secret key available!"),
1476     _("Revoke user ID"), MB_ERR);
1477 werner 36 return FALSE;
1478     }
1479    
1480 twoaday 160 if (listview_count_items (lv, 0) == 1) {
1481     msg_box (dlg, _("Key has only one user ID."), _("Key Edit"), MB_ERR);
1482 werner 36 return FALSE;
1483     }
1484    
1485     if( (j = listview_get_curr_pos( lv )) == -1 ) {
1486     msg_box( dlg, _("Please select a user ID."), _("Key Edit"), MB_ERR );
1487     return FALSE;
1488     }
1489    
1490 twoaday 160 listview_get_item_text( lv, j, UID_COL_VALID, buf, sizeof buf - 1);
1491     if (strstr (buf, _("Revoked"))) {
1492     msg_box (dlg, _("This user ID has been already revoked."),
1493     _("Key Edit"), MB_INFO);
1494 werner 36 return FALSE;
1495     }
1496    
1497 twoaday 160 listview_get_item_text (lv, j, UID_COL_NAME, buf, sizeof buf -1);
1498     _snprintf (inf, sizeof (inf) -1, _("user ID \"%s\".\n\n"
1499     "Do you really want to revoke this user ID?"), buf);
1500     if (msg_box (dlg, inf, _("Key Edit"), MB_WARN_ASK) == IDNO)
1501 werner 36 return FALSE;
1502 twoaday 160 if (k->is_protected) {
1503 twoaday 225 pass = request_key_passphrase (k->ctx, _("Key Edit"), &cancel);
1504 twoaday 68 if (cancel)
1505 werner 36 return FALSE;
1506     }
1507 twoaday 160 listview_get_item_text (lv, j, UID_COL_EMAIL, email, sizeof (email)-1);
1508     listview_get_item_text (lv, j, UID_COL_NAME, buf, sizeof (buf)-1);
1509     id = do_find_userid (k->keyid, email, buf, NULL);
1510 werner 36 if (id == -1)
1511     BUG (NULL);
1512    
1513 twoaday 225 ke = create_GpgKeyEdit (k->keyid);
1514 werner 36 if (k->is_protected)
1515     ke->setPassphrase (pass);
1516 twoaday 176 else
1517     ke->setNoPassphrase (true);
1518 werner 36 err = ke->revokeUserid (id);
1519     if (err)
1520 twoaday 160 msg_box (dlg, gpgme_strerror (err), _("Revoke User ID"), MB_ERR);
1521 werner 36 else {
1522     listview_add_sub_item (lv, j, 0, _("Revoked"));
1523     k->update = 1;
1524     status_box (dlg, _("User ID successfully revoked"), _("GnuPG Status"));
1525     }
1526     sfree_if_alloc (pass);
1527     delete ke;
1528     return err? FALSE : TRUE;
1529     }
1530    
1531    
1532     static int
1533     do_editkey_setpref (winpt_key_t k, HWND dlg, listview_ctrl_t lv)
1534     {
1535     gpgme_error_t rc;
1536     GpgKeyEdit *ke;
1537     char buf[256], * pass = NULL, * prefs;
1538     int j, id, cancel=0, flags=0;
1539    
1540     if ((j = listview_get_curr_pos (lv)) == -1) {
1541     msg_box (dlg, _("Please select a user ID."), _("Key Edit"), MB_ERR);
1542     return FALSE;
1543     }
1544     listview_get_item_text (lv, j, 2, buf, sizeof buf-1);
1545 twoaday 160 id = do_find_userid (k->keyid, buf, NULL, NULL);
1546 werner 36 if (id == -1)
1547 twoaday 225 BUG (NULL);
1548 werner 36 if (k->is_protected) {
1549 twoaday 225 pass = request_key_passphrase (k->ctx, _("Key Edit"), &cancel);
1550 werner 36 if (cancel)
1551     return FALSE;
1552     }
1553    
1554 twoaday 225 ke = create_GpgKeyEdit (k->keyid);
1555 werner 36 if (k->is_protected)
1556     ke->setPassphrase (pass);
1557 twoaday 176 else
1558     ke->setNoPassphrase (true);
1559 werner 36
1560     get_userid_preflist (&prefs, &flags);
1561    
1562     rc = ke->setUseridPreferences (id, prefs);
1563 twoaday 176 if (rc)
1564     msg_box (dlg, _("Could not set user ID preferences"), _("Key Edit"), MB_ERR);
1565 werner 36
1566     sfree_if_alloc (pass);
1567     free_if_alloc (prefs);
1568     delete ke;
1569     return 0;
1570     }
1571    
1572    
1573     static int
1574     do_editkey_primary (winpt_key_t k, HWND dlg, listview_ctrl_t lv)
1575     {
1576     gpgme_error_t err;
1577     GpgKeyEdit *ke;
1578     int j, id, cancel=0;
1579 twoaday 225 char valid[32];
1580 twoaday 197 char buf[256], *pass = NULL;
1581 werner 36
1582     if (listview_count_items (lv, 0) == 1)
1583     return TRUE;
1584     if ((j = listview_get_curr_pos (lv)) == -1) {
1585 twoaday 225 msg_box (dlg, _("Please select a user ID."), _("Key Edit"), MB_ERR);
1586 werner 36 return FALSE;
1587     }
1588 twoaday 225 listview_get_item_text (lv, j, UID_COL_VALID, valid, sizeof (valid)-1);
1589     if (!strcmp (valid, _("Revoked")))
1590     return FALSE;
1591     listview_get_item_text (lv, j, UID_COL_EMAIL, buf, sizeof (buf)-1);
1592 twoaday 160 id = do_find_userid (k->keyid, buf, NULL, NULL);
1593 werner 36 if (id == -1)
1594 twoaday 197 BUG (0);
1595 werner 36 if (k->is_protected) {
1596 twoaday 225 pass = request_key_passphrase (k->ctx, _("Key Edit"), &cancel);
1597 twoaday 128 if (cancel)
1598 werner 36 return FALSE;
1599     }
1600    
1601 twoaday 225 ke = create_GpgKeyEdit (k->keyid);
1602 werner 36 if (k->is_protected)
1603     ke->setPassphrase (pass);
1604 twoaday 176 else
1605     ke->setNoPassphrase (true);
1606 werner 36 err = ke->setPrimaryUserid (id);
1607     if (err)
1608     msg_box (dlg, gpgme_strerror (err), _("Primary"), MB_ERR);
1609     else {
1610     k->update = 1;
1611     status_box (dlg, _("User ID successfully flagged"), _("GnuPG Status"));
1612     }
1613    
1614     sfree_if_alloc (pass);
1615     delete ke;
1616     return err? FALSE : TRUE;
1617     }
1618    
1619    
1620 twoaday 123
1621 twoaday 128 #define CIPHER 11
1622     #define HASH 11
1623     #define COMPR 4
1624    
1625 werner 36 static int
1626     parse_preflist (HWND dlg, const char *list)
1627     {
1628 twoaday 123 char buf[128] = {0};
1629     char *p, *pbuf = buf;
1630     const char *ciphers[CIPHER] = {"", "IDEA", "3DES",
1631 twoaday 128 "CAST5", "BLOWFISH", "", "",
1632     "AES", "AES192", "AES256", "TWOFISH"};
1633     const char *hash[HASH] = {"", "MD5", "SHA1", "RMD160", "",
1634     "", "", "", "SHA256", "SHA384", "SHA512"};
1635 twoaday 123 const char *compress[COMPR] = {"", "ZIP", "ZLIB", "BZIP2"};
1636 werner 36 int n=0;
1637    
1638     strncpy (buf, list, 127);
1639     p = strtok (pbuf, " ");
1640     while (p != NULL) {
1641     int algid = atol (p+1);
1642     n++;
1643     switch (*p) {
1644     case 'S':
1645 twoaday 123 SendDlgItemMessage (dlg, IDC_SHOWPREF_CIPHERS, LB_ADDSTRING, 0,
1646     (LPARAM)(const char*)ciphers[algid % CIPHER]);
1647 werner 36 break;
1648    
1649     case 'H':
1650 twoaday 123 SendDlgItemMessage (dlg, IDC_SHOWPREF_HASH, LB_ADDSTRING, 0,
1651     (LPARAM)(const char*)hash[algid % HASH]);
1652 werner 36 break;
1653    
1654     case 'Z':
1655 twoaday 123 SendDlgItemMessage (dlg, IDC_SHOWPREF_ZIP, LB_ADDSTRING, 0,
1656     (LPARAM)(const char*)compress[algid % COMPR]);
1657 werner 36 break;
1658    
1659     default:
1660     n--;
1661     }
1662     p = strtok (NULL, " ");
1663     }
1664     return n;
1665     }
1666    
1667    
1668     /* Dialog box procedure to show the key preferences. */
1669     BOOL CALLBACK
1670     showpref_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
1671     {
1672 twoaday 176 static keyedit_cb_t cb = NULL;
1673 twoaday 208 gpg_uid_info_t inf=NULL, u;
1674 twoaday 200 gpgme_key_t key;
1675 werner 36 char buf[128];
1676     int pos;
1677    
1678     switch (msg) {
1679     case WM_INITDIALOG:
1680 twoaday 176 cb = (keyedit_cb_t)lparam;
1681 twoaday 200 if (!cb)
1682     BUG (NULL);
1683     key = (gpgme_key_t)cb->opaque;
1684 twoaday 208 listview_get_item_text (cb->lv, cb->lv_pos,
1685     UID_COL_EMAIL, buf, sizeof (buf)-1);
1686     pos = do_find_userid (cb->keyid, buf, NULL, &inf);
1687     if (pos < 0 || !inf) {
1688     gpg_uid_info_release (inf);
1689     EndDialog (dlg, FALSE);
1690     break;
1691     }
1692     for (u=inf; u; u = u->next) {
1693     if (u->index == pos && u->prefs && *u->prefs) {
1694     _snprintf (buf, sizeof (buf)-1, "%s", u->name);
1695     SetDlgItemText (dlg, IDC_SHOWPREF_INFO, buf);
1696     if (parse_preflist (dlg, u->prefs) <= 0)
1697 werner 36 pos = -1;
1698 twoaday 208 if (u->flags.mdc)
1699     CheckDlgButton (dlg, IDC_SHOWPREF_MDC, BST_CHECKED);
1700     break;
1701 werner 36 }
1702     }
1703 twoaday 208 gpg_uid_info_release (inf);
1704     if (pos == -1) {
1705     msg_box (dlg, _("No preferences available."), _("Key Edit"), MB_ERR);
1706     EndDialog (dlg, FALSE);
1707     break;
1708     }
1709 twoaday 128 SetDlgItemText (dlg, IDC_SHOWPREF_MDC, _("MDC feature"));
1710     SetDlgItemText (dlg, IDC_SHOWPREF_PREFINF, _("Preferences"));
1711 twoaday 200 SetDlgItemText (dlg, IDC_SHOWPREF_UIDHINT, _("user ID:"));
1712 werner 36 SetWindowText (dlg, _("Key Preferences"));
1713     SetForegroundWindow (dlg);
1714 twoaday 218 center_window (dlg, cb->parent);
1715 werner 36 break;
1716    
1717     case WM_COMMAND:
1718     switch (LOWORD (wparam)) {
1719     case IDOK:
1720     EndDialog (dlg, TRUE);
1721     break;
1722 twoaday 211
1723     case IDCANCEL:
1724     EndDialog (dlg, FALSE);
1725     break;
1726 werner 36 }
1727     break;
1728     }
1729     return FALSE;
1730     }
1731    
1732    
1733     static int
1734     do_editkey_showpref (winpt_key_t k, HWND dlg, listview_ctrl_t lv)
1735     {
1736 twoaday 176 struct keyedit_cb_s cb;
1737 twoaday 208 char status[32];
1738 werner 36
1739     if (k->is_v3)
1740     return TRUE;
1741    
1742     if (listview_get_curr_pos (lv) == -1) {
1743     msg_box (dlg, _("Please select a user ID."), _("Key Edit"), MB_ERR);
1744     return FALSE;
1745     }
1746     memset (&cb, 0, sizeof (cb));
1747 twoaday 218 cb.parent = dlg;
1748 twoaday 200 cb.opaque = k->ctx;
1749     cb.keyid = k->keyid;
1750 twoaday 208 cb.lv = lv;
1751     cb.lv_pos = listview_get_curr_pos (lv);
1752    
1753     listview_get_item_text (lv, cb.lv_pos, UID_COL_VALID,
1754     status, sizeof (status)-1);
1755     if (!strcmp (status, _("Revoked")))
1756     return TRUE;
1757    
1758 werner 36 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT_SHOWPREF, dlg,
1759     showpref_dlg_proc, (LPARAM)&cb);
1760     return TRUE;
1761     }
1762    
1763    
1764     static int
1765     do_editkey_deluid (winpt_key_t k, HWND dlg, listview_ctrl_t lv)
1766     {
1767     gpgme_error_t err;
1768     GpgKeyEdit *ke;
1769 twoaday 160 char email[128], name[128];
1770     char inf[384];
1771 twoaday 225 int pos, id = 0;
1772 werner 36
1773     if (!k->key_pair)
1774 twoaday 225 return FALSE;
1775 werner 36
1776 twoaday 160 if (listview_count_items (lv, 0) == 1) {
1777     msg_box (dlg, _("Primary user ID can not be deleted!"),
1778     _("Key Edit"), MB_ERR);
1779 werner 36 return FALSE;
1780     }
1781 twoaday 225 pos = listview_get_curr_pos (lv);
1782     if (pos == -1) {
1783 twoaday 160 msg_box (dlg, _("Please select a user ID."), _("Key Edit"), MB_ERR);
1784 werner 36 return FALSE;
1785     }
1786    
1787 twoaday 225 listview_get_item_text (lv, pos, UID_COL_NAME, name, DIM(name) -1);
1788 twoaday 160 _snprintf (inf, DIM (inf)-1, _("user ID \"%s\".\n\n"
1789 twoaday 193 "All signatures on this user ID will be also deleted."
1790     "\n\n"
1791 twoaday 160 "Do you really want to delete this user ID?"),
1792     name);
1793     if (msg_box (dlg, inf, _("Key Edit"), MB_YESNO|MB_ICONWARNING) == IDNO)
1794 werner 36 return FALSE;
1795    
1796 twoaday 225 listview_get_item_text (lv, pos, UID_COL_EMAIL, email, DIM (email)-1);
1797     listview_get_item_text (lv, pos, UID_COL_NAME, name, DIM (name)-1);
1798 twoaday 160 id = do_find_userid (k->keyid, email, name, NULL);
1799 werner 36 if (id == -1)
1800 twoaday 225 BUG (0);
1801 werner 36
1802 twoaday 225 ke = create_GpgKeyEdit (k->keyid);
1803 werner 36 err = ke->delUserid (id);
1804 twoaday 160 if (err)
1805 twoaday 225 msg_box (dlg, gpgme_strerror (err), _("Delete User ID"), MB_ERR);
1806 werner 36 else {
1807 twoaday 225 listview_del_item (lv, pos);
1808 werner 36 k->update = 1;
1809 twoaday 160 status_box (dlg, _("User ID successfully deleted"), _("GnuPG Status"));
1810 werner 36 }
1811     delete ke;
1812     return err? FALSE : TRUE;
1813 twoaday 193 }
1814 werner 36
1815    
1816 twoaday 193 /* Subclass routine for the subkey listview control to allow shortcuts. */
1817 werner 36 static BOOL CALLBACK
1818 twoaday 193 subkey_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
1819 werner 36 {
1820 twoaday 193 int virt_key = 0;
1821     winpt_key_t key;
1822    
1823     switch (msg) {
1824 werner 36 case WM_KEYUP:
1825 twoaday 193 virt_key = (int)wparam;
1826     key = (winpt_key_t)keyedit_subkey_proc.opaque;
1827     if (!key || !key->key_pair)
1828     break;
1829    
1830     switch (virt_key) {
1831 werner 36 case VK_DELETE:
1832 twoaday 193 SendDlgItemMessage (keyedit_subkey_proc.dlg, IDC_KEYEDIT_CMD,
1833     CB_SETCURSEL, CMD_DELKEY, 0);
1834     send_cmd_id (keyedit_subkey_proc.dlg, IDOK);
1835 werner 36 break;
1836    
1837     case VK_INSERT:
1838 twoaday 200 SendDlgItemMessage (keyedit_subkey_proc.dlg, IDC_KEYEDIT_CMD,
1839     CB_SETCURSEL, CMD_ADDKEY, 0);
1840     send_cmd_id (keyedit_subkey_proc.dlg, IDOK);
1841 werner 36 break;
1842     }
1843     }
1844 twoaday 193 return CallWindowProc (keyedit_subkey_proc.old, dlg, msg, wparam, lparam);
1845     }
1846 werner 36
1847    
1848     static BOOL CALLBACK
1849     uid_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
1850     {
1851 twoaday 193 int virt_key = 0;
1852     winpt_key_t key;
1853    
1854     switch (msg) {
1855 werner 36 case WM_KEYUP:
1856 twoaday 193 virt_key = (int)wparam;
1857     key = (winpt_key_t)keyedit_uid_proc.opaque;
1858     if (!key || !key->key_pair)
1859     break;
1860    
1861 werner 36 switch (virt_key) {
1862     case VK_DELETE:
1863     SendDlgItemMessage (keyedit_uid_proc.dlg, IDC_KEYEDIT_CMD,
1864     CB_SETCURSEL, CMD_DELUID, 0);
1865     send_cmd_id (keyedit_uid_proc.dlg, IDOK);
1866     break;
1867    
1868     case VK_INSERT:
1869     SendDlgItemMessage (keyedit_uid_proc.dlg, IDC_KEYEDIT_CMD,
1870     CB_SETCURSEL, CMD_ADDUID, 0);
1871     send_cmd_id (keyedit_uid_proc.dlg, IDOK);
1872     break;
1873     }
1874     }
1875 twoaday 193 return CallWindowProc (keyedit_uid_proc.old, dlg, msg, wparam, lparam);
1876     }
1877 werner 36
1878    
1879 twoaday 193 /* Enable the key @k when @enable is 1, disable it otherwise. */
1880 twoaday 165 static void
1881 twoaday 193 do_editkey_enable_disable (winpt_key_t k, HWND dlg,
1882     listview_ctrl_t lv, int enable)
1883 twoaday 165 {
1884     km_enable_disable_key (lv, dlg, 0, enable);
1885     k->update = 1;
1886     }
1887    
1888    
1889 twoaday 195 static void
1890 twoaday 208 do_editkey_minimize (winpt_key_t k, HWND dlg)
1891     {
1892     gpgme_error_t err;
1893     GpgKeyEdit *ke;
1894    
1895     ke = create_GpgKeyEdit (k->keyid);
1896     err = ke->minimizeKey ();
1897     if (err)
1898     msg_box (dlg, gpgme_strerror (err), _("Key Edit"), MB_ERR);
1899     else {
1900     msg_box (dlg, _("Finished to compact key."), _("Key Edit"), MB_OK);
1901     k->update = 1;
1902     }
1903     delete ke;
1904     }
1905    
1906    
1907     static void
1908 twoaday 195 do_editkey_clean (winpt_key_t k, HWND dlg)
1909     {
1910     gpgme_error_t err;
1911     GpgKeyEdit *ke;
1912    
1913 twoaday 200 ke = create_GpgKeyEdit (k->keyid);
1914 twoaday 195 err = ke->cleanKey ();
1915     if (err)
1916 twoaday 197 msg_box (dlg, gpgme_strerror (err), _("Key Edit"), MB_ERR);
1917     else {
1918 twoaday 195 msg_box (dlg, _("Finished to compact key."), _("Key Edit"), MB_OK);
1919 twoaday 197 k->update = 1;
1920     }
1921 twoaday 195 delete ke;
1922     }
1923    
1924    
1925 twoaday 193 /* Start the dialog to list and display the status of all
1926     signatures for this key. */
1927 twoaday 175 static void
1928     do_editkey_check (winpt_key_t k, HWND dlg)
1929     {
1930 twoaday 176 if (!k->ctx)
1931     get_pubkey (k->keyid, &k->ctx);
1932     if (!k->uid && k->ctx)
1933     k->uid = k->ctx->uids->uid;
1934 twoaday 175 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYSIG_TREE, dlg,
1935 twoaday 176 sigtree_dlg_proc, (LPARAM)k);
1936 twoaday 175 }
1937    
1938    
1939 twoaday 170 static int
1940     do_editkey_sign_userid (winpt_key_t k, HWND dlg, listview_ctrl_t lv, int mode)
1941     {
1942     gpgme_error_t err;
1943 twoaday 225 winpt_key_s signer;
1944 twoaday 170 GpgKeyEdit *ke;
1945     char *pass = NULL;
1946 twoaday 225 char *defkey;
1947     char email[64], name[128], valid[32];
1948 twoaday 170 int uid_index;
1949     int cancel = 0;
1950    
1951     uid_index = listview_get_curr_pos (lv);
1952     if (uid_index == -1) {
1953     msg_box (dlg, _("Please select a user ID."), _("Key Edit"), MB_ERR);
1954     return FALSE;
1955     }
1956 twoaday 225 listview_get_item_text (lv, uid_index, UID_COL_VALID, valid, sizeof (valid)-1);
1957     if (!strcmp (valid, _("Revoked")))
1958     return TRUE;
1959 twoaday 170 if (mode == CMD_SIGN) {
1960     cancel = msg_box (dlg, _("Do you really want to make this sig exportable?"),
1961     _("Key Edit"), MB_QUEST_ASK);
1962     if (cancel == IDNO)
1963     return FALSE;
1964     }
1965     listview_get_item_text (lv, uid_index, UID_COL_EMAIL, email, sizeof (email)-1);
1966     listview_get_item_text (lv, uid_index, UID_COL_NAME, name, sizeof (name)-1);
1967     uid_index = do_find_userid (k->keyid, email, name, NULL);
1968 twoaday 225
1969     defkey = get_gnupg_default_key ();
1970     memset (&signer, 0, sizeof (signer));
1971     if (winpt_get_seckey (defkey, &signer)) {
1972     log_debug ("do_editkey_sign_userid: no default secret key.\r\n");
1973     free_if_alloc (defkey);
1974     return FALSE;
1975     }
1976     if (signer.is_protected) {
1977     pass = request_key_passphrase (signer.ctx, _("Key Edit"), &cancel);
1978 twoaday 170 if (cancel)
1979     return FALSE;
1980     }
1981 twoaday 200 ke = create_GpgKeyEdit (k->keyid);
1982 twoaday 225 if (signer.is_protected)
1983 twoaday 175 ke->setPassphrase (pass);
1984 twoaday 176 else
1985     ke->setNoPassphrase (true);
1986 twoaday 225 ke->setLocalUser (signer.ctx);
1987 twoaday 170 err = ke->signUserid (uid_index,
1988     mode == CMD_SIGN? GPG_EDITKEY_SIGN : GPG_EDITKEY_LSIGN,
1989     0, NULL);
1990     if (!err) {
1991     msg_box (dlg, _("Key successfully signed."), _("Key Edit"), MB_OK);
1992     k->update = 1;
1993     }
1994     else
1995     msg_box (dlg, gpgme_strerror (err), _("Key Edit"), MB_ERR);
1996     delete ke;
1997     sfree_if_alloc (pass);
1998     return !err? TRUE : FALSE;
1999     }
2000    
2001    
2002     static int
2003     lookup_cmd (HWND dlg)
2004     {
2005     char buf[64];
2006     int i;
2007    
2008     i = SendDlgItemMessage (dlg, IDC_KEYEDIT_CMD, CB_GETCURSEL, 0, 0);
2009     if (i == LB_ERR)
2010     return LB_ERR;
2011     GetDlgItemText (dlg, IDC_KEYEDIT_CMD, buf, sizeof (buf)-1);
2012     for (i=0; cmdlist[i].name != NULL; i++) {
2013     if (!strcmp (buf, cmdlist[i].name))
2014     return cmdlist[i].id;
2015     }
2016     return LB_ERR;
2017     }
2018    
2019 twoaday 193
2020 twoaday 208
2021     gpgme_error_t key_get_revokers (winpt_key_t key, int reload,
2022     gpg_desig_rev_t *r_rev);
2023    
2024     /* Check if the key supports designated revokers and if
2025     secret keys exist to generate such a revoke cert. */
2026     static bool
2027     check_desig_rev (winpt_key_t key)
2028     {
2029     gpg_desig_rev_t rev, u;
2030     struct winpt_key_s sk;
2031    
2032     if (!key->ext->gloflags.has_desig_rev)
2033     return false;
2034     key_get_revokers (key, 0, &rev);
2035     for (u = rev; u; u = u->next) {
2036     memset (&sk, 0, sizeof (sk));
2037     if (!winpt_get_seckey (u->fpr+32, &sk))
2038     return true;
2039     }
2040     return false;
2041     }
2042    
2043    
2044     /* Use the gpg --desig-revoker command to create a revocation
2045     cert for a key that lists our key as a designated revoker. */
2046     static void
2047     gen_desig_revoke_cert (winpt_key_t key, HWND dlg)
2048     {
2049     const char *warn;
2050     char *inf, *p;
2051     int id;
2052    
2053     inf = km_key_get_info (key, 0);
2054     warn = _("Your keys is listed as a designated revoker for the key\n\n"
2055     "%s\n\n"
2056     "Are you sure you want to create a revocation certificate\n"
2057     "which allow to revoke the key listed above?");
2058     p = new char[strlen (inf)+1+strlen (warn)+1];
2059     sprintf (p, warn, inf);
2060     free_if_alloc (inf);
2061    
2062     id = msg_box (dlg, p, _("Key Edit"), MB_YESNO|MB_ICONWARNING);
2063     free_if_alloc (p);
2064     if (id == IDNO)
2065     return;
2066    
2067     key->internal = 1;
2068     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYREVOKE, dlg,
2069     key_revoke_dlg_proc, (LPARAM)key);
2070     }
2071    
2072    
2073 twoaday 133 /* Dialog box procedure for the edit key dialog. */
2074 werner 36 BOOL CALLBACK
2075     keyedit_main_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
2076     {
2077     static winpt_key_t k;
2078     static listview_ctrl_t lvsub = NULL, lvuid = NULL;
2079 twoaday 165 int cmd;
2080 werner 36 HWND item;
2081    
2082 twoaday 193 switch (msg) {
2083 werner 36 case WM_INITDIALOG:
2084     k = (winpt_key_t)lparam;
2085     if (!k)
2086     BUG (NULL);
2087 twoaday 170 do_init_cmdlist (dlg, k->key_pair);
2088 werner 36 lvsub = subkey_list_init (dlg, k);
2089     lvuid = userid_list_init (dlg, k);
2090 twoaday 193 item = GetDlgItem (dlg, IDC_KEYEDIT_KEYLIST);
2091     keyedit_subkey_proc.opaque = (void*)k;
2092 werner 36 keyedit_subkey_proc.dlg = dlg;
2093     keyedit_subkey_proc.current = (WNDPROC)subkey_subclass_proc;
2094 twoaday 193 keyedit_subkey_proc.old = (WNDPROC)GetWindowLong (item, GWL_WNDPROC);
2095     if (keyedit_subkey_proc.old) {
2096     if( !SetWindowLong (item, GWL_WNDPROC,
2097     (LONG)keyedit_subkey_proc.current)) {
2098     msg_box (dlg, _("Could not set subkey window procedure."),
2099     _("Key Edit"), MB_ERR);
2100     BUG (0);
2101 werner 36 }
2102     }
2103 twoaday 193 item = GetDlgItem (dlg, IDC_KEYEDIT_UIDLIST);
2104     keyedit_uid_proc.opaque = (void*)k;
2105 werner 36 keyedit_uid_proc.dlg = dlg;
2106     keyedit_uid_proc.current = (WNDPROC)uid_subclass_proc;
2107 twoaday 193 keyedit_uid_proc.old = (WNDPROC)GetWindowLong (item, GWL_WNDPROC);
2108     if (keyedit_uid_proc.old) {
2109     if (!SetWindowLong (item, GWL_WNDPROC,
2110     (LONG)keyedit_uid_proc.current)) {
2111     msg_box (dlg, _("Could not set user ID window procedure."),
2112     _("Key Edit"), MB_ERR);
2113     BUG (0);
2114 werner 36 }
2115     }
2116 twoaday 170 if (k->ctx->revoked) {
2117 werner 36 EnableWindow (GetDlgItem (dlg, IDC_KEYEDIT_CMD), FALSE);
2118     EnableWindow (GetDlgItem (dlg, IDOK), FALSE);
2119     }
2120     SetDlgItemText (dlg, IDC_KEYEDIT_CMDINF, _("Command>"));
2121 twoaday 117 SetDlgItemText (dlg, IDCANCEL, _("&Close"));
2122 twoaday 88 SetDlgItemText (dlg, IDC_KEYEDIT_HELP, _("&Help"));
2123 twoaday 208 SetDlgItemText (dlg, IDC_KEYEDIT_REVOKE, _("&Revoke..."));
2124     if (!check_desig_rev (k))
2125     ShowWindow (GetDlgItem (dlg, IDC_KEYEDIT_REVOKE), SW_HIDE);
2126 twoaday 88 SetWindowText (dlg, _("Key Edit"));
2127 twoaday 170 SetForegroundWindow (dlg);
2128     center_window (dlg, NULL);
2129 werner 36 return TRUE;
2130    
2131     case WM_DESTROY:
2132 twoaday 193 if (lvsub) {
2133     listview_release (lvsub);
2134 werner 36 lvsub = NULL;
2135     }
2136 twoaday 193 if (lvuid) {
2137     listview_release (lvuid);
2138 werner 36 lvuid = NULL;
2139     }
2140     break;
2141    
2142     case WM_NOTIFY:
2143     NMHDR * notify;
2144     notify = (NMHDR *)lparam;
2145 twoaday 218 if (!notify || notify->idFrom != IDC_KEYEDIT_UIDLIST)
2146     break;
2147     if (notify->code == NM_DBLCLK)
2148 werner 36 do_editkey_showpref (k, dlg, lvuid);
2149 twoaday 218 if (notify->code == NM_RCLICK && k->key_pair) {
2150     HMENU hm = LoadMenu (glob_hinst, MAKEINTRESOURCE (IDR_WINPT_KEYEDIT));
2151     HMENU popup = GetSubMenu (hm, 0);
2152     POINT p;
2153    
2154     GetCursorPos (&p);
2155     TrackPopupMenu (popup, TPM_RIGHTALIGN, p.x, p.y, 0, dlg, NULL);
2156     DestroyMenu (hm);
2157     DestroyMenu (popup);
2158     }
2159 werner 36 break;
2160    
2161     case WM_COMMAND:
2162 twoaday 218 switch (LOWORD (wparam)) {
2163 werner 36 case IDOK:
2164 twoaday 170 cmd = lookup_cmd (dlg);
2165 werner 36 if (cmd == LB_ERR) {
2166     msg_box( dlg, _("Please select a command."), _("Key Edit"), MB_INFO );
2167     return FALSE;
2168     }
2169     if (k->is_v3 && is_cmd_openpgp (cmd)) {
2170     msg_box (dlg, _("This command cannot be used with PGP 2 (v3) keys.\n"),
2171     _("Key Edit"), MB_ERR);
2172     return FALSE;
2173     }
2174     switch (cmd) {
2175     case CMD_SHOWPREF: do_editkey_showpref (k, dlg, lvuid); break;
2176     case CMD_DELKEY: do_editkey_delkey (k, dlg, lvsub); break;
2177     case CMD_ADDKEY: keyedit_add_subkey (k, dlg, lvsub); break;
2178     case CMD_EXPIRE: do_editkey_expire (k, dlg, lvsub); break;
2179     case CMD_REVKEY: do_editkey_revoke (k, dlg, lvsub); break;
2180     /*case CMD_SETPREF:do_editkey_setpref( k, dlg, lvuid ); break;*/
2181     case CMD_ADDUID: keyedit_add_userid( k, dlg, lvuid ); break;
2182     case CMD_ADDREVOKER: keyedit_add_revoker( k, dlg ); break;
2183     case CMD_ADDPHOTO: keyedit_add_photo( k, dlg ); break;
2184     case CMD_REVUID: do_editkey_revuid( k, dlg, lvuid ); break;
2185     case CMD_DELUID: do_editkey_deluid( k, dlg, lvuid ); break;
2186     case CMD_PASSWD: keyedit_change_passwd( k, dlg ); break;
2187     case CMD_PRIMARY: do_editkey_primary( k, dlg, lvuid ); break;
2188 twoaday 165 case CMD_ENABLE: do_editkey_enable_disable (k, dlg, lvsub, 1); break;
2189     case CMD_DISABLE: do_editkey_enable_disable (k, dlg, lvsub, 0); break;
2190 twoaday 175 case CMD_CHECK: do_editkey_check (k, dlg); break;
2191 twoaday 165 case CMD_TRUST: keyedit_change_ownertrust (k, dlg); break;
2192 twoaday 170 case CMD_SIGN:
2193     case CMD_LSIGN: do_editkey_sign_userid (k, dlg,
2194     lvuid, cmd);
2195     break;
2196 twoaday 212 case CMD_CLEAN: do_editkey_clean (k, dlg); break;
2197     case CMD_MINIMIZE: do_editkey_minimize (k, dlg); break;
2198 werner 36 }
2199 twoaday 218 break;
2200    
2201 werner 36 case IDCANCEL:
2202     EndDialog (dlg, FALSE);
2203     break;
2204    
2205     case IDC_KEYEDIT_HELP:
2206     do_show_help (dlg);
2207     break;
2208 twoaday 208
2209     case IDC_KEYEDIT_REVOKE:
2210     gen_desig_revoke_cert (k, dlg);
2211     break;
2212 twoaday 218
2213     case ID_KEYEDIT_UID_PRIM:
2214     do_editkey_primary (k, dlg, lvuid);
2215     break;
2216    
2217     case ID_KEYEDIT_UID_DEL:
2218     do_editkey_deluid (k, dlg, lvuid);
2219     break;
2220    
2221     case ID_KEYEDIT_UID_REV:
2222     do_editkey_revuid (k, dlg, lvuid);
2223     break;
2224 werner 36 }
2225     break;
2226     }
2227     return FALSE;
2228 twoaday 133 }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26