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

Annotation of /trunk/Src/wptKeygenDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 190 - (hide annotations)
Mon Mar 27 10:05:14 2006 UTC (18 years, 11 months ago) by twoaday
File size: 20127 byte(s)
2006-03-26  Timo Schulz  <ts@g10code.de>
 
        * wptSigTreeDlg.cpp (sigtree_load): Always use UTF8.
        * wptMainProc.cpp (winpt_main_proc): Reload key cache
        when the GPG settings were changed.
        * wptKeygenDlg.cpp (keygen_wizard_dlg_proc,
        keygen_dlg_proc): Improved check for the email address.
        * wptKeyEditDlgs.cpp (keyedit_adduid_dlg_proc): Likewise.
        * wptKeyserverDlg.cpp (keyserver_dlg_proc): Modified design.
         


1 werner 36 /* wptKeygenDlg.cpp - Key Generation dialog
2     * Copyright (C) 2000-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     #ifdef HAVE_CONFIG_H
21     #include <config.h>
22     #endif
23    
24     #include <windows.h>
25    
26 werner 47 #include "resource.h"
27 werner 36 #include "wptTypes.h"
28     #include "wptNLS.h"
29     #include "wptGPG.h"
30     #include "wptCommonCtl.h"
31     #include "wptContext.h" /* for passphrase_s */
32     #include "wptDlgs.h"
33     #include "wptW32API.h"
34     #include "wptVersion.h"
35     #include "wptErrors.h"
36     #include "wptUTF8.h"
37    
38     /* All valid key generation combination. */
39     enum gpg_keytype_t {
40     GPG_KEYGEN_NONE = 0,
41     GPG_KEYGEN_DSA_ELG = 1,
42     GPG_KEYGEN_DSA_RSA = 2,
43     GPG_KEYGEN_DSA_SIG = 3,
44     GPG_KEYGEN_RSA_SIG = 4,
45     GPG_KEYGEN_RSA = 5,
46     GPG_KEYGEN_RSA_RSA = 6 /*PGP*/
47     };
48    
49    
50     static const char key_params[] =
51     "<GnupgKeyParms format=\"internal\">\n"
52     "Key-Type: %s\n"
53     "Key-Usage: sign\n"
54     "Key-Length: %d\n"
55     "Subkey-Type: %s\n"
56     "Subkey-Length: %d\n"
57     "Name-Real: %s\n"
58     "Name-Email: %s\n"
59     "Expire-Date: %s\n"
60     "Passphrase: %s\n"
61     "</GnupgKeyParms>\n";
62    
63     static const char key_params_with_comment[] =
64     "<GnupgKeyParms format=\"internal\">\n"
65     "Key-Type: %s\n"
66     "Key-Usage: sign\n"
67     "Key-Length: %d\n"
68     "Subkey-Type: %s\n"
69     "Subkey-Length: %d\n"
70     "Name-Real: %s\n"
71     "Name-Comment: %s\n"
72     "Name-Email: %s\n"
73     "Expire-Date: %s\n"
74     "Passphrase: %s\n"
75     "</GnupgKeyParms>\n";
76    
77     static const char key_params_one[] =
78     "<GnupgKeyParms format=\"internal\">\n"
79     "Key-Type: %s\n"
80     "Key-Length: %d\n"
81     "Key-Usage: %s\n"
82     "Name-Real: %s\n"
83     "Name-Email: %s\n"
84     "Expire-Date: %s\n"
85     "Passphrase: %s\n"
86     "</GnupgKeyParms>\n";
87    
88     static const char key_params_one_with_comment[] =
89     "<GnupgKeyParms format=\"internal\">\n"
90     "Key-Type: %s\n"
91     "Key-Length: %d\n"
92     "Key-Usage: %s\n"
93     "Name-Real: %s\n"
94     "Name-Email: %s\n"
95     "Name-Comment: %s\n"
96     "Expire-Date: %s\n"
97     "Passphrase: %s\n"
98     "</GnupgKeyParms>\n";
99    
100    
101     /* Generate the GPG specific genkey params with the given information.
102     @keytype: See valid combinations.
103     @bits: Length in bits.
104     @user: user-ID name
105     @comment: comment for the user-ID.
106     @email: email address.
107     @expdata: date of expiration or NULL.
108     @passphrase: the actual passphrase.
109     Return value: the gen. params. */
110     static char*
111     gpg_genkey_params (int keytype, int bits,
112     const char *user, const char *comment, const char *email,
113     const char *expdate, const char *passphrase)
114     {
115     char *p = NULL;
116     int addsize = strlen ("sign encrypt");
117     int size = 0;
118    
119     if (keytype == GPG_KEYGEN_NONE)
120     return NULL;
121    
122 twoaday 130 size = strlen (user) + strlen (email) + strlen (passphrase) + addsize + 48;
123     if (comment && *comment)
124     size += strlen (key_params_with_comment) + strlen (comment);
125     else
126     size += strlen (key_params);
127     if (expdate)
128     size += strlen (expdate) + 1;
129     p = (char *)malloc (size+1);
130     if (!p)
131     BUG (0);
132     /* XXX: simply the whole switch-case code. */
133     if (comment && *comment) {
134 werner 36 switch( keytype ) {
135     case GPG_KEYGEN_DSA_ELG:
136     sprintf (p, key_params_with_comment,
137     "DSA", 1024, "ELG-E", bits, user, comment, email,
138     expdate ? expdate : "0", passphrase);
139     break;
140    
141     case GPG_KEYGEN_DSA_RSA:
142     sprintf( p, key_params_with_comment,
143     "DSA", 1024, "RSA", bits, user, comment, email,
144     expdate ? expdate : "0", passphrase );
145     break;
146    
147     case GPG_KEYGEN_DSA_SIG:
148     sprintf( p, key_params_one_with_comment,
149     "DSA", 1024, "sign",
150     user, comment, email,
151     expdate ? expdate : "0", passphrase );
152     break;
153    
154     case GPG_KEYGEN_RSA_SIG:
155     sprintf( p, key_params_one_with_comment,
156     "RSA", bits, "sign",
157     user, comment, email,
158     expdate ? expdate : "0", passphrase );
159     break;
160    
161     case GPG_KEYGEN_RSA:
162     sprintf( p, key_params_one_with_comment,
163     "RSA", bits, "sign encrypt",
164     user, comment, email,
165     expdate ? expdate : "0", passphrase );
166     break;
167    
168     case GPG_KEYGEN_RSA_RSA:
169     sprintf( p, key_params_with_comment,
170     "RSA", bits, "RSA", bits, user, comment, email,
171     expdate? expdate : "0", passphrase );
172     break;
173    
174     default:
175     if (p)
176     free (p);
177     p = NULL;
178     break;
179     }
180     }
181     else {
182     switch ( keytype ) {
183     case GPG_KEYGEN_DSA_ELG:
184     sprintf( p, key_params,
185     "DSA", 1024, "ELG-E", bits, user, email,
186     expdate ? expdate : "0", passphrase );
187     break;
188    
189     case GPG_KEYGEN_DSA_RSA:
190     sprintf( p, key_params,
191     "DSA", 1024, "RSA", bits, user, email,
192     expdate ? expdate : "0", passphrase );
193     break;
194    
195     case GPG_KEYGEN_DSA_SIG:
196     sprintf( p, key_params_one,
197     "DSA", 1024, "sign",
198     user, email,
199     expdate ? expdate : "0", passphrase );
200     break;
201    
202     case GPG_KEYGEN_RSA_SIG:
203     sprintf( p, key_params_one,
204     "RSA", bits, "sign",
205     user, email,
206     expdate ? expdate : "0", passphrase );
207     break;
208    
209     case GPG_KEYGEN_RSA:
210     sprintf( p, key_params_one,
211     "RSA", bits, "sign encrypt",
212     user, email,
213     expdate ? expdate : "0", passphrase );
214     break;
215    
216     case GPG_KEYGEN_RSA_RSA:
217     sprintf( p, key_params,
218     "RSA", bits, "RSA", bits, user, email,
219     expdate? expdate : "0", passphrase );
220     break;
221    
222     default:
223     if (p)
224     free (p);
225     p = NULL;
226     break;
227     }
228     }
229     return p;
230 twoaday 32 }
231 werner 36
232    
233     /* Generate a key with the given params @params. @prog_cb is a user defined
234     progress callback which is called during the generation.
235     @fpr will store the fingerprint of the generated key.
236     Return value: 0 on success. */
237     gpgme_error_t
238     gpg_genkey (const char *params, gpgme_progress_cb_t prog_cb, char **fpr)
239     {
240     gpgme_error_t err = 0;
241     gpgme_ctx_t ctx;
242     gpgme_genkey_result_t res;
243    
244     err = gpgme_new(&ctx);
245     if (err)
246     return err;
247     if (prog_cb)
248     gpgme_set_progress_cb (ctx, prog_cb, NULL);
249     err = gpgme_op_genkey (ctx, params, NULL, NULL);
250     if (!err) {
251     res = gpgme_op_genkey_result (ctx);
252     *fpr = res->fpr? strdup (res->fpr) : NULL;
253     }
254     gpgme_release (ctx);
255     return err;
256     }
257    
258    
259    
260     /* Clear all dialog fields. */
261     static void
262     clear_dlg_fields (HWND dlg)
263     {
264     SetDlgItemText (dlg, IDC_KEYGEN_SUBKEYBITS, "");
265     SetDlgItemText (dlg, IDC_KEYGEN_NAME, "");
266     SetDlgItemText (dlg, IDC_KEYGEN_EMAIL, "");
267     SetDlgItemText (dlg, IDC_KEYGEN_COMMENT, "");
268     SetDlgItemText (dlg, IDC_KEYGEN_EXPDATE, "");
269     SetDlgItemText (dlg, IDC_KEYGEN_PASSPHRASE, "");
270     SetDlgItemText (dlg, IDC_KEYGEN_PWDCHECK, "");
271     }
272    
273    
274     /* Ask the user if a keyring backup is wanted and if so,
275     backup both keyrings to the selected folder. @dlg is
276     the handle of the parent window.*/
277     static void
278     backup_keyrings (HWND dlg)
279     {
280 twoaday 130 const char *name;
281     char *path = NULL;
282     char *keyring = NULL;
283 werner 36 int id;
284    
285     path = get_gnupg_path ();
286     if (!path)
287     BUG (dlg);
288     id = msg_box (dlg,
289     _("It is STRONGLY recommend that you backup your keyrings because they both "
290     "contain VERY important data.\nRemember that your hard disk can crash or the "
291     "files can be deleted by accident; so it is a good\nidea to store them on "
292     "a different mass stoarge like a floppy or CDR!\n\n"
293     "Backup your keyrings now?"),
294     _("WARNING - Important hint" ), MB_YESNO);
295     if (id == IDYES) {
296 twoaday 130 name = get_filesave_dlg (dlg, _("Destination for Public Keyring"),
297     NULL, "pubring.gpg");
298 werner 36 if( name ) {
299 twoaday 130 keyring = make_filename (path, "pubring", "gpg");
300     if( !CopyFile (keyring, name, FALSE))
301     log_box (_("Key Generation"), MB_ERR,
302     _("Could not copy %s -> %s"), keyring, name);
303     free_if_alloc (keyring);
304 werner 36 }
305 twoaday 130 name = get_filesave_dlg (dlg, _("Destination for Secret Keyring"),
306     NULL, "secring.gpg");
307 werner 36 if( name ) {
308 twoaday 130 keyring = make_filename (path, "secring", "gpg");
309     if (!CopyFile (keyring, name, FALSE))
310     log_box (_("Key Generation"), MB_ERR,
311     _("Could not copy %s -> %s"), keyring, name);
312     free_if_alloc (keyring);
313 werner 36 }
314     }
315 twoaday 130 free_if_alloc (path);
316 werner 36 }
317    
318    
319     /* Fill in all valid GPG algorithms. */
320     static void
321     fill_keytype_box (HWND dlg)
322     {
323 twoaday 130 HWND cb = GetDlgItem (dlg, IDC_KEYGEN_KEYTYPE);
324 werner 36
325 twoaday 130 #define addstr(cb, str) \
326     SendMessage ((cb), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)(str))
327     addstr (cb, _("DSA and ELG (default)"));
328     addstr (cb, _("DSA and RSA"));
329     addstr (cb, _("DSA sign only"));
330     addstr (cb, _("RSA sign only"));
331     addstr (cb, _("RSA sign and encrypt"));
332     addstr (cb, _("RSA and RSA (PGP)") );
333     SendMessage (cb, CB_SETCURSEL, 0, 0);
334 werner 36 #undef addstr
335     }
336    
337    
338     /* Check that the given date lies not in the past.
339     Return value: 1 on success. */
340     int
341     keygen_check_date (SYSTEMTIME *st)
342     {
343     SYSTEMTIME t;
344    
345     GetSystemTime (&t);
346     if (st->wYear > t.wYear || st->wMonth > t.wMonth)
347     return 1;
348     else if (st->wYear < t.wYear || st->wMonth < t.wMonth || st->wDay < t.wDay)
349 twoaday 130 return 0;
350 werner 36 return 1;
351     }
352    
353    
354     /* Dialog box procedure for key generation. */
355     BOOL CALLBACK
356     keygen_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
357     {
358     static genkey_s *ctx;
359     SYSTEMTIME st;
360     gpgme_error_t err;
361     char name[128] = {0}, email[128] = {0}, comment[128] = {0};
362 twoaday 130 char *pwd;
363 werner 36 char t[64], *expire = NULL, *fpr=NULL;
364 twoaday 130 int bits, use_comment, keytype = 0;
365     int cancel = 0;
366     char *p;
367 werner 36
368     switch ( msg ) {
369     case WM_INITDIALOG:
370 twoaday 73 if (lparam != 0)
371 werner 36 ctx = (genkey_s *)lparam;
372 twoaday 130 SetWindowText (dlg, _("Key Generation"));
373     SetDlgItemText(dlg, IDC_KEYGEN_INFO,
374 werner 36 _("NOTE: Key generation can be a lengthy process! Please wait until "
375 twoaday 130 "you get the message that key generation was finished."));
376     SetDlgItemText (dlg, IDC_KEYGEN_SUBKEYINF, _("Subkey size in &bits"));
377     SetDlgItemText (dlg, IDC_KEYGEN_NAMEINF, _("&Real name"));
378     SetDlgItemText (dlg, IDC_KEYGEN_COMMINF, _("&Comment (optional)"));
379     SetDlgItemText (dlg, IDC_KEYGEN_EMAILINF, _("Email &address"));
380     SetDlgItemText (dlg, IDC_KEYGEN_EXPINF, _("&Expire date"));
381     SetDlgItemText (dlg, IDC_KEYGEN_KEYTYPEINF, _("Key &type"));
382 werner 36 SetDlgItemText (dlg, IDC_KEYGEN_EXPNEVER, _("&Never"));
383 twoaday 101 SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
384 werner 36
385 twoaday 130 SetDlgItemInt (dlg, IDC_KEYGEN_SUBKEYBITS, DFAULT_KEYSIZE, FALSE);
386 werner 36 CheckDlgButton (dlg, IDC_KEYGEN_HIDEPWD, BST_CHECKED);
387     CheckDlgButton (dlg, IDC_KEYGEN_EXPNEVER, BST_CHECKED);
388     EnableWindow (GetDlgItem (dlg, IDC_KEYGEN_EXPDATE), FALSE);
389     fill_keytype_box (dlg);
390     center_window (dlg, NULL);
391     SetForegroundWindow (dlg);
392     return TRUE;
393    
394     case WM_SYSCOMMAND:
395 twoaday 130 if (LOWORD (wparam) == SC_CLOSE)
396 werner 36 EndDialog (dlg, TRUE);
397     return FALSE;
398    
399     case WM_COMMAND:
400     if (HIWORD (wparam) == BN_CLICKED &&
401     LOWORD (wparam) == IDC_KEYGEN_EXPNEVER) {
402     int never = IsDlgButtonChecked (dlg, IDC_KEYGEN_EXPNEVER);
403     EnableWindow (GetDlgItem (dlg, IDC_KEYGEN_EXPDATE), !never);
404     }
405    
406 twoaday 130 switch (LOWORD (wparam)) {
407 werner 36 case IDOK:
408     bits = GetDlgItemInt (dlg, IDC_KEYGEN_SUBKEYBITS, NULL, FALSE);
409     if (bits < 1024 || bits > 4096) {
410     msg_box (dlg, _("Invalid value. Allowed values 1024-4096 bits."),
411     _("Key Generation"), MB_ERR);
412     return FALSE;
413     }
414     if (bits > DFAULT_KEYSIZE) {
415 twoaday 130 int id = msg_box (dlg, _("Do you really need such a large key?"),
416 werner 36 _("Key Generation"), MB_YESNO);
417     if (id == IDNO)
418     bits = DFAULT_KEYSIZE;
419     }
420 twoaday 130 if (!GetDlgItemText (dlg, IDC_KEYGEN_NAME, name, sizeof (name) - 1)) {
421     msg_box( dlg, _("Please enter the name."), _("Key Generation"), MB_ERR);
422 werner 36 return FALSE;
423     }
424     if (strchr (name, '@')) {
425     msg_box (dlg, _("Please do not enter the email address in the name field."),
426     _("Key Generation"), MB_INFO);
427     return FALSE;
428     }
429 twoaday 130 if (!GetDlgItemText (dlg, IDC_KEYGEN_EMAIL, email, sizeof (email) -1)
430 twoaday 190 || check_email_address (email)) {
431 twoaday 130 msg_box (dlg, _("Please enter a valid email address."),
432     _("Key Generation"), MB_ERR);
433 werner 36 return FALSE;
434     }
435 twoaday 130 use_comment = GetDlgItemText(dlg, IDC_KEYGEN_COMMENT,
436     comment, sizeof (comment) -1);
437     if (use_comment > 0 && strchr (comment, '@')) {
438     msg_box (dlg, _("Please do NOT enter the email address in the comment field."),
439     _("Key Generation"), MB_INFO);
440 werner 36 return FALSE;
441     }
442     keytype = SendDlgItemMessage (dlg, IDC_KEYGEN_KEYTYPE, CB_GETCURSEL, 0, 0) + 1;
443     if (IsDlgButtonChecked (dlg, IDC_KEYGEN_EXPNEVER))
444     expire = NULL;
445     else {
446     DateTime_GetSystemtime (GetDlgItem (dlg, IDC_KEYGEN_EXPDATE), &st);
447     _snprintf (t, DIM (t)-1, "%04d-%02d-%02d", st.wYear, st.wMonth, st.wDay);
448     expire = t;
449     }
450 twoaday 130
451     pwd = request_passphrase2 (_("Key Generation"), PASSDLG_STRICT, &cancel);
452     if (cancel) {
453     sfree_if_alloc (pwd);
454     return FALSE;
455     }
456     if (!pwd) {
457     msg_box (dlg, _("Please enter the passphrase."),
458     _("Key Generation"), MB_ERR);
459 werner 36 return FALSE;
460     }
461 twoaday 130
462     if (!use_comment && !strlen (comment)) {
463 werner 36 char *utf8_name;
464 twoaday 187 utf8_name = native_to_utf8 (name);
465 twoaday 130 if (!utf8_name)
466     BUG (0);
467     p = gpg_genkey_params (keytype, bits, utf8_name, NULL,
468     email, expire, pwd);
469     safe_free (utf8_name);
470 werner 36 }
471     else {
472     char *utf8_name, *utf8_comment;
473 twoaday 187 utf8_name = native_to_utf8 (name);
474     utf8_comment = native_to_utf8 (comment);
475 twoaday 190 if( !utf8_name || !utf8_comment )
476 twoaday 130 BUG (0);
477     p = gpg_genkey_params (keytype, bits, utf8_name, utf8_comment,
478     email, expire, pwd);
479     safe_free (utf8_name);
480     safe_free (utf8_comment);
481 werner 36 }
482 twoaday 130 keygen_cb_dlg_create ();
483 werner 36 err = gpg_genkey (p, keygen_cb, &fpr);
484 twoaday 130 sfree_if_alloc (pwd);
485 twoaday 115 if (p) {
486 werner 36 wipememory (p, strlen (p)); /* burn the passphrase! */
487     free (p);
488     }
489     keygen_cb_dlg_destroy ();
490     keygen_cb (NULL, NULL, 0, 0, 0); /* flush */
491 twoaday 115 if (err) {
492 twoaday 130 safe_free (fpr);
493 twoaday 115 msg_box (dlg, gpgme_strerror (err), _("Key Generation"), MB_ERR);
494 werner 36 return FALSE;
495     }
496 twoaday 115 status_box (dlg, _("Key Generation completed"), _("GnuPG Status"));
497 werner 36
498     keycache_update (0, fpr);
499     keycache_update (1, fpr);
500 twoaday 150 safe_free (fpr);
501 werner 36
502     clear_dlg_fields (dlg);
503     backup_keyrings (dlg);
504 twoaday 150 if (ctx)
505     ctx->cancel = 0;
506 werner 36 EndDialog (dlg, TRUE);
507     return TRUE;
508    
509     case IDCANCEL:
510 twoaday 150 if (ctx)
511     ctx->cancel = 1;
512     EndDialog (dlg, FALSE);
513 werner 36 return FALSE;
514     }
515     break;
516     }
517    
518     return FALSE;
519     }
520    
521    
522     BOOL CALLBACK
523     keygen_wizard_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
524     {
525     static genkey_s *ctx;
526     static int pubkey_algo = GPG_KEYGEN_DSA_ELG;
527     gpgme_error_t err;
528     char name[128], email[128];
529     char * utf8_name, * p, *fpr=NULL;
530     char * pass = NULL;
531     int cancel = 0;
532    
533    
534     switch( msg ) {
535     case WM_INITDIALOG:
536     ctx = (genkey_s *)lparam;
537     if (!ctx || (ctx && ctx->interactive == 0))
538     EnableWindow (GetDlgItem (dlg, IDC_KEYWIZARD_EXPERT), FALSE);
539     SetDlgItemText (dlg, IDC_KEYWIZARD_USERSA, _("&Prefer RSA keys"));
540     SetDlgItemText (dlg, IDC_KEYWIZARD_NAMEINF, _("Real name:"));
541     SetDlgItemText (dlg, IDC_KEYWIZARD_EMAILINF, _("Email address:"));
542     SetDlgItemText (dlg, IDC_KEYWIZARD_TITLEINF, _("Name and E-Mail Assignment"));
543     SetDlgItemText (dlg, IDC_KEYWIZARD_TEXT1INF, _("Every key pair must have a name associated with it. The name and\nemail address let your correspondents that your public key they are\nusing belongs to us."));
544     SetDlgItemText (dlg, IDC_KEYWIZARD_TEXT2INF, _("By accosiating an email address with your key pair, you will enable WinPT to assist your correspondents in selecting the correct public\nkey when communicating with you."));
545     SetWindowText (dlg, _("Key Generation Wizard"));
546 twoaday 105 SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
547     SetDlgItemText (dlg, IDC_KEYWIZARD_EXPERT, _("E&xpert"));
548 werner 36 SetForegroundWindow (dlg);
549     center_window (dlg, NULL);
550     break;
551    
552     case WM_SYSCOMMAND:
553     if( LOWORD( wparam ) == SC_CLOSE )
554     EndDialog( dlg, FALSE );
555    
556     case WM_COMMAND:
557     switch( LOWORD( wparam ) ) {
558     case IDC_KEYWIZARD_EXPERT:
559     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYGEN, dlg,
560 twoaday 73 keygen_dlg_proc, 0);
561 werner 36 EndDialog (dlg, TRUE);
562     break;
563    
564     case IDOK:
565     if( !GetDlgItemText( dlg, IDC_KEYWIZARD_NAME, name, sizeof name-1 ) ) {
566     msg_box( dlg, _("Please enter the name."),
567     _("Key Generation Wizard"), MB_ERR );
568     return FALSE;
569     }
570     if (strchr (name, '@')) {
571     msg_box (dlg, _("Please do not enter the email address in the name field."),
572     _("Key Generation Wizard"), MB_WARN);
573     return FALSE;
574     }
575 twoaday 190 if (!GetDlgItemText(dlg, IDC_KEYWIZARD_EMAIL, email, sizeof email-1 )
576     || check_email_address (email)) {
577     msg_box (dlg, _("Please enter a valid email address."),
578     _("Key Generation Wizard"), MB_ERR);
579 werner 36 return FALSE;
580     }
581     if (strchr (email, '<') || strchr (email, '>')) {
582     msg_box (dlg, _("Please do not add '<' or '>' to the email address."),
583     _("Key Generation Wizard"), MB_WARN);
584     return FALSE;
585     }
586     pass = request_passphrase2 (_("Key Generation"), PASSDLG_STRICT, &cancel);
587     if (cancel)
588     return FALSE;
589 twoaday 187 utf8_name = native_to_utf8 (name);
590 twoaday 190 if (!utf8_name)
591     BUG (0);
592 werner 36 if (IsDlgButtonChecked (dlg, IDC_KEYWIZARD_USERSA))
593     pubkey_algo = GPG_KEYGEN_DSA_RSA;
594     p = gpg_genkey_params (pubkey_algo, DFAULT_KEYSIZE, utf8_name,
595     NULL, email, NULL, pass);
596     free( utf8_name );
597     keygen_cb_dlg_create();
598     err = gpg_genkey (p, keygen_cb, &fpr);
599     keygen_cb_dlg_destroy();
600     keygen_cb( NULL, NULL, 0, 0, 0 );
601     if( p ) {
602     memset( p, 0, strlen( p ) );
603     free( p );
604     }
605     sfree_if_alloc (pass);
606     if( err ) {
607     msg_box( dlg, gpgme_strerror( err ), _("Key Generation Wizard"), MB_ERR );
608     if (fpr)
609     free (fpr);
610     return FALSE;
611     }
612     status_box( dlg, _("Key Generation completed"), _("GnuPG Status") );
613    
614     keycache_update (0, fpr);
615     keycache_update (1, fpr);
616 twoaday 150 safe_free (fpr);
617    
618 werner 36 backup_keyrings (dlg);
619 twoaday 150 if (ctx)
620     ctx->cancel = 0;
621 werner 36 EndDialog (dlg, TRUE);
622     break;
623    
624     case IDCANCEL:
625 twoaday 150 if (ctx)
626     ctx->cancel = 1;
627     EndDialog (dlg, FALSE);
628 werner 36 break;
629     }
630     break;
631     }
632     return FALSE;
633     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26