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

Contents of /trunk/Src/wptKeygenDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 278 - (show annotations)
Mon Jan 15 22:02:04 2007 UTC (18 years, 1 month ago) by twoaday
File size: 19732 byte(s)
See ChangeLog.


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26