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

Contents of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 217 - (show annotations)
Mon May 22 14:21:39 2006 UTC (18 years, 9 months ago) by twoaday
File size: 20245 byte(s)
2005-05-20  Timo Schulz  <ts@g10code.de>
                                                                                
        * wptKeyPropsDlg.cpp (keyprops_load_photo): avoid expensive
        process call when no photo is available.
        (keyprops_dlg_proc): avoid static data.
        * wptFileManager.cpp (fm_add_sig_stat): Free memory in case
        of on demand key requests.
        (show_verify_result): Likewise.
        (secret_key_available): Likewise.
        (fm_decrypt, fm_sign): Handle the new on demand key request
        mode and free all memory.


1 /* WinPT.cpp - Windows Privacy Tray (WinPT)
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 <shlobj.h>
26
27 #include "resource.h"
28 #include "wptTypes.h"
29 #include "wptW32API.h"
30 #include "wptVersion.h"
31 #include "wptErrors.h"
32 #include "wptGPG.h"
33 #include "wptRegistry.h"
34 #include "wptCommonCtl.h"
35 #include "wptDlgs.h"
36 #include "wptNLS.h"
37 #include "wptKeyserver.h"
38 #include "wptCard.h"
39 #include "wptFileManager.h"
40 #include "wptContext.h"
41 #include "wptCardEdit.h"
42 #include "wptCrypto.h"
43 #include "wptUTF8.h"
44
45 void remove_crit_file_attrs (const char *fname, int force);
46 BOOL user_is_admin (void);
47
48 /* Global variables. */
49 HINSTANCE glob_hinst; /* global instance for the dialogs */
50 HWND glob_hwnd; /* global window handle for the dialogs */
51 int scard_support = 0;
52 int debug = 0;
53 int mobile_mode_active = 0;
54 int gpg_read_only = 0;
55 int admin_user = 0;
56 char gpgver[3];
57 /* End */
58
59
60 /* Load the key cache and rebuild the signature cache. */
61 void
62 update_keycache (HWND hwnd)
63 {
64 refresh_cache_s rcs = {0};
65 rcs.kr_reload = 0;
66 rcs.kr_update = 1;
67 rcs.tr_update = 1;
68 DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,
69 keycache_dlg_proc, (LPARAM)&rcs);
70 /* XXX: the dialog return 0 when an error occurs.
71 in this case figure out if the gpg env is OK
72 and supress dialogs to configure gpg. */
73 }
74
75
76 /* Set GPGME debug mode. If @val is 0, the debug mode is disabled. */
77 void
78 gpg_set_debug_mode (int val)
79 {
80 static char buf[256];
81 char tmp[128];
82
83 /* XXX: no gpgme.dbg is created. */
84 if (val > 0) {
85 GetTempPath (sizeof (tmp)-1, tmp);
86 _snprintf (buf, sizeof (buf)-1, "GPGME_DEBUG=5:%sgpgme.dbg", tmp);
87 putenv (buf);
88 }
89 else
90 putenv ("GPGME_DEBUG=");
91 }
92
93
94 /* Initialize the gettext sub system. */
95 static void
96 load_gettext (void)
97 {
98 char *nls = NULL;
99
100 /* Return the name of the gettext language file. */
101 nls = get_reg_entry_mo ();
102 if (nls != NULL) {
103 set_gettext_file ("winpt", nls);
104 free_if_alloc (nls);
105 }
106 }
107
108
109 /* Return true if the GPG environment is useable. */
110 static bool
111 gpg_prefs_ok (void)
112 {
113 char *p;
114
115 p = get_reg_entry_gpg4win ("gpg.exe");
116 if (!p || file_exist_check (p) != 0) {
117 free_if_alloc (p);
118 p = get_reg_entry_gpg ("gpgProgram");
119 if (!p || file_exist_check (p) != 0) {
120 free_if_alloc (p);
121 log_debug ("gpg_prefs_ok: could not locate gpg.exe");
122 return false;
123 }
124 }
125 free_if_alloc (p);
126 p = get_reg_entry_gpg4win (NULL);
127 if (!p || dir_exist_check (p) != 0) {
128 free_if_alloc (p);
129 p = get_reg_entry_gpg ("HomeDir");
130 if (!p || dir_exist_check (p) != 0) {
131 free_if_alloc (p);
132 log_debug ("gpg_prefs_ok: could not determine home directory");
133 return false;
134 }
135 }
136 free_if_alloc (p);
137 return true;
138 }
139
140
141 /* Check gpg files if they are read-only and ask the user
142 if this should be corrected. */
143 static void
144 check_readonly_attr (const char *homedir)
145 {
146 const char *files[] = {"pubring.gpg", "secring.gpg", "trustdb.gpg", NULL};
147 char *file;
148 int i;
149
150 for (i=0; files[i] != NULL; i++) {
151 file = make_filename (homedir, files[i], NULL);
152 remove_crit_file_attrs (file, 0);
153 free_if_alloc (file);
154 }
155 }
156
157
158 /* Load the GPG environment. On the first start, some
159 checks are performed to find out in what state GPG is.
160 Return value: 0 everything OK.
161 >0 fatal error.
162 -1 public keyring is empty or does not exist. */
163 static int
164 load_gpg_env (void)
165 {
166 SECURITY_ATTRIBUTES sec_attr;
167 char *p;
168 char *pkr;
169
170 p = get_reg_entry_gpg4win ("gpg.exe");
171 if (!p)
172 return (1);
173 if (file_exist_check (p)) {
174 free_if_alloc (p);
175 return (1);
176 }
177 free_if_alloc (p);
178
179 p = get_reg_entry_gpg ("HomeDir");
180 if (!p || dir_exist_check (p) != 0) {
181 free_if_alloc (p);
182 p = multi_gnupg_path (0);
183 }
184 if (p && dir_exist_check (p)) {
185 memset (&sec_attr, 0, sizeof (sec_attr));
186 sec_attr.nLength = sizeof (sec_attr);
187 if (!CreateDirectory (p, &sec_attr)) {
188 msg_box (NULL, _("Could not create GPG home directory"),
189 _("WinPT Error"), MB_ERR);
190 free_if_alloc (p);
191 return (2);
192 }
193 }
194 check_readonly_attr (p);
195 pkr = make_filename (p, "pubring", "gpg");
196 free_if_alloc (p);
197 if (!pkr)
198 return -1;
199 if (get_file_size (pkr) == 0) {
200 free_if_alloc (pkr);
201 return -1;
202 }
203 return 0;
204 }
205
206
207 /* check if the default key from the gpg.conf file is available in the
208 keyring. if not, bail out because encryption won't work properly then. */
209 static int
210 check_default_key (gpg_keycache_t kc)
211 {
212 gpgme_key_t key;
213 gpgme_error_t err = gpg_error (GPG_ERR_NO_ERROR);
214 char *defkey;
215
216 defkey = get_gnupg_default_key ();
217 if (defkey)
218 err = gpg_keycache_find_key (kc, defkey, 0, &key);
219 else
220 msg_box (NULL, _("No useable secret key found."),
221 _("WinPT Warning"), MB_WARN);
222 free_if_alloc (defkey);
223 return err? -1 : 0;
224 }
225
226
227 /* Return the WinPT program file name (with full pathname). */
228 static const char*
229 get_prog_part (const char * fname, int use_cwd)
230 {
231 static char program[512];
232 char currdir[256];
233 char *cmd = NULL;
234 int j;
235
236 memset (currdir, 0, DIM (currdir));
237 memset (program, 0, DIM (program));
238
239 if (use_cwd) {
240 GetCurrentDirectory (DIM (currdir)-1, currdir);
241 _snprintf (program, DIM (program)-1, "%s\\%s", currdir, fname);
242 }
243 else {
244 cmd = GetCommandLine ();
245 if (cmd == NULL)
246 return NULL;
247 strncpy (currdir, cmd, sizeof (currdir)-1);
248 j = strlen (currdir);
249 while (j--) {
250 if (currdir[j] == '\\')
251 break;
252 }
253 currdir[j] = 0;
254 _snprintf (program, DIM (program)-1, "%s\\%s", currdir + 1, fname);
255 }
256 return program;
257 }
258
259
260 /* Check that the underlying crypto engine fullfills the minimal
261 requirements so all commands work properly. */
262 static bool
263 check_crypto_engine (void)
264 {
265 int ma = 0, mi = 0, pa = 0;
266 int rc;
267
268 rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);
269 if (rc == -1) {
270 msg_box (NULL, _("Could not read GnuPG version."),
271 _("WinPT Error"), MB_ERR);
272 return false;
273 }
274 else if (rc) {
275 log_box (_("WinPT Error"), MB_ERR,
276 _("Sorry, you need a newer GPG version.\n"
277 "GPG version %d.%d.%d required GPG version "NEED_GPG_VERSION),
278 ma, mi, pa);
279 return false;
280 }
281 /* We enable smartcard support for GPG: >= 2 or >= 1.4.3 */
282 if (ma > 1 || pa >= 3)
283 scard_support = 1;
284
285 gpgver[0] = ma;
286 gpgver[1] = mi;
287 gpgver[2] = pa;
288 return true;
289 }
290
291
292 /* Try to load the keyserver config file. If @quiet is 1
293 do not show any errors. */
294 static int
295 load_keyserver_conf (int quiet)
296 {
297 char *buf;
298 const char *t, *conf;
299 int rc;
300
301 /* Create $APPDATA\winpt if needed. */
302 buf = make_special_filename (CSIDL_APPDATA, "winpt", NULL);
303 if (buf && dir_exist_check (buf) && !CreateDirectory (buf, NULL)) {
304 MessageBox (NULL, _("Failed to create WinPT directory"),
305 _("Keyserver"), MB_ERR);
306 free_if_alloc (buf);
307 return -1;
308 }
309 free_if_alloc (buf);
310
311 /* Check for $APPDATA\winpt\keyserver.conf */
312 buf = make_special_filename (CSIDL_APPDATA, "winpt\\keyserver.conf", NULL);
313
314 conf = get_prog_part ("keyserver.conf", 0);
315 if (!file_exist_check (conf))
316 t = conf;
317 else
318 t = "keyserver.conf";
319 if (file_exist_check (t) == 0 && file_exist_check (buf) != 0) {
320 if (!CopyFile (t, buf, FALSE)) {
321 MessageBox (NULL, _("Failed to copy the keyserver.conf"),
322 _("Keyserver"), MB_ERR);
323 free_if_alloc (buf);
324 return -1;
325 }
326 t = buf;
327 }
328 else
329 t = buf;
330
331 rc = kserver_load_conf (t);
332 if (rc && !quiet)
333 msg_box (NULL, winpt_strerror (rc), _("Keyserver"), MB_ERR);
334 else {
335 free_if_alloc (reg_prefs.kserv_conf);
336 reg_prefs.kserv_conf = m_strdup (t);
337 }
338 free_if_alloc (buf);
339 return rc;
340 }
341
342
343 /* Check if both keyrings are empty. This indicates that
344 WinPT should offer to generate a key pair. */
345 static bool
346 check_for_empty_keyrings (bool pub_only)
347 {
348 char *p;
349 int n = 0;
350
351 p = get_gnupg_keyring (1, 0);
352 if (file_exist_check (p) == 0 && get_file_size (p) == 0)
353 n++;
354 free_if_alloc (p);
355 if (pub_only)
356 return n == 1? true : false;
357 p = get_gnupg_keyring (0, 0);
358 if (file_exist_check (p) == 0 && get_file_size (p) == 0)
359 n++;
360 free_if_alloc (p);
361 return n==2? true : false;
362 }
363
364
365 /* Enable the mobility mode. */
366 static int
367 enable_mobile_mode (void)
368 {
369 if (dir_exist_check ("temp") != 0) {
370 if (!CreateDirectory ("temp", NULL)) {
371 MessageBox (NULL, "Could not create mobile temp directory",
372 "WinPT Mobile Error", MB_ERR);
373 return -1;
374 }
375 }
376
377 memset (&reg_prefs, 0, sizeof (reg_prefs));
378 reg_prefs.always_trust = 0;
379 reg_prefs.auto_backup = 0;
380 reg_prefs.cache_time = 0;
381 reg_prefs.expert = 0;
382 reg_prefs.kserv_conf = m_strdup ("keyserver.conf");
383 reg_prefs.no_zip_mmedia = 1;
384 reg_prefs.use_tmpfiles = 1;
385 reg_prefs.word_wrap = 80;
386 reg_prefs.use_viewer = 0; /* XXX */
387 return 0;
388 }
389
390
391 void
392 set_default_keyserver (void)
393 {
394 char *host = get_reg_entry_keyserver ("Default");
395 char *str_port = get_reg_entry_keyserver ("Default_Port");
396 WORD port = HKP_PORT;
397
398 if (!host)
399 keyserver_set_default (NULL, 0);
400 else {
401 if (str_port && *str_port)
402 port = atoi (str_port);
403 keyserver_set_default (host, port);
404 }
405 free_if_alloc (host);
406 free_if_alloc (str_port);
407 }
408
409
410 /* Display info message that WinPT is now in debug mode. */
411 void
412 winpt_debug_msg (void)
413 {
414 char output[512];
415 char temp[128];
416
417 GetTempPath (sizeof temp -1, temp);
418 _snprintf (output, sizeof output - 1,
419 "The GPGME output file is %sgpgme.dbg\n"
420 "The WinPT output file is %swinpt.log\n", temp, temp);
421 MessageBox (NULL, output, "WinPT now runs in DEBUG MODE", MB_INFO);
422 }
423
424
425 /* Search for insecure ElGamal keys and return the
426 number of founded keys. */
427 static int
428 count_insecure_elgkeys (void)
429 {
430 gpg_keycache_t pc;
431 gpgme_key_t key;
432 int n = 0;
433
434 pc = keycache_get_ctx (1);
435 while (!gpg_keycache_next_key (pc, 0, &key)) {
436 if (key->subkeys->pubkey_algo == GPGME_PK_ELG)
437 n++;
438 }
439 gpg_keycache_rewind (pc);
440 return n;
441 }
442
443
444 /* Main entry point. */
445 int WINAPI
446 WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
447 {
448 WNDCLASS wc = {0, winpt_main_proc, 0, 0, hinst, 0, 0, 0, 0, PGM_NAME};
449 HACCEL accel_tab;
450 MSG msg;
451 HWND hwnd = NULL;
452 /*WORD ver[3], ptdver[4];*/
453 int rc, ec, created = 0;
454 int first_start = 0, start_gpgprefs = 0;
455 int winpt_inst_found = 0;
456 int start_manager = 0;
457 const char *s;
458
459 glob_hinst = hinst;
460 if (cmdline && stristr (cmdline, "--stop")) {
461 hwnd = FindWindow ("WinPT", "WinPT");
462 if (hwnd != NULL)
463 PostMessage (hwnd, WM_DESTROY, 0, 0);
464 return 0;
465 }
466
467 #ifdef _DEBUG
468 gpg_set_debug_mode (1);
469 debug = 1;
470 #endif
471
472 /* XXX
473 get_file_version ("WinPT.exe", &ver[0], &ver[1], &ver[2], &ver[3]);
474 get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],
475 &ptdver[2], &ptdver[3]);
476
477 if (ptdver[0] != ver[0] || ptdver[1] != ver[1]|| ptdver[2] != ver[2]) {
478 log_box (_("WinPT Error"), MB_ERR,
479 _("The PTD.dll file has a different version than WinPT.exe\n"
480 "Please update the PTD.dll to version %d.%d.%d"),
481 ver[0], ver[1], ver[2]);
482 return 0;
483 }
484 */
485
486 if (gpg_md_selftest ()) {
487 msg_box (NULL, _("Cryptographic selftest failed."),
488 _("WinPT Error"), MB_ERR);
489 return 0;
490 }
491
492 s = gpgme_check_version (NEED_GPGME_VERSION);
493 if (!s || !*s) {
494 msg_box (NULL, _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),
495 _("WinPT Error"), MB_ERR);
496 return 0;
497 }
498
499 CreateMutex (NULL, TRUE, PGM_NAME);
500 if (GetLastError () == ERROR_ALREADY_EXISTS)
501 winpt_inst_found = 1;
502
503 if (cmdline && stristr (cmdline, "--mobile")) {
504 msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",
505 "WinPT", MB_INFO);
506 mobile_mode_active = 1;
507 }
508
509 set_default_keyserver ();
510 load_gettext ();
511 admin_user = user_is_admin ();
512
513 if (!mobile_mode_active) {
514 regist_inst_gnupg (1);
515 regist_inst_winpt (1, &created);
516 }
517 else {
518 if (enable_mobile_mode ())
519 return 0;
520 created = 1; /* Disable registry writing */
521 }
522
523 if (!created) {
524 memset (&reg_prefs, 0, sizeof (reg_prefs));
525 reg_prefs.use_tmpfiles = 1; /* default */
526 reg_prefs.fm.progress = 0; /* XXX: fix the bug and enable it again */
527 get_reg_winpt_prefs (&reg_prefs);
528 gnupg_load_config ();
529 }
530
531 if (is_gpg4win_installed ())
532 load_gpg_env (); /* XXX: check return code. */
533
534 rc = gnupg_check_homedir ();
535 if (rc) {
536 log_box (_("WinPT Error"), MB_ERR,
537 _("GPG home directory is not set correctly.\n"
538 "Please check the GPG registry settings:\n%s."),
539 winpt_strerror (rc));
540 s = get_fileopen_dlg (GetActiveWindow (),
541 _("Select GPG Public Keyring"),
542 "GPG Keyrings (*.gpg)\0*.gpg\0\0",
543 NULL);
544 if (s != NULL) {
545 size_t n;
546 char *p = strrchr (s, '\\');
547 if (!p)
548 BUG (0);
549 n = p - s;
550 if (n) {
551 char *file = new char[n+1];
552 if (!file)
553 BUG (NULL);
554 memset (file, 0, n);
555 memcpy (file, s, n);
556 file[n] = '\0';
557 set_reg_entry_gpg ("HomeDir", file);
558 free_if_alloc (file);
559 gnupg_check_homedir (); /* change gpgProgram if needed */
560 }
561 }
562 else {
563 msg_box (NULL, _("GPG home directory could not be determited."),
564 _("WinPT Error"), MB_ERR);
565 goto start;
566 }
567 }
568
569 rc = check_gnupg_prog ();
570 if (rc) {
571 if (msg_box (NULL, _("Could not find the GPG binary (gpg.exe).\n"
572 "Do you want to start the GPG preferences to "
573 "correct this problem?"), _("WinPT Error"),
574 MB_INFO|MB_YESNO) == IDYES)
575 start_gpgprefs = 1;
576 else {
577 msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
578 return 0;
579 }
580 }
581
582 rc = gnupg_access_files ();
583 if (!start_gpgprefs && rc) {
584 if (rc == WPTERR_GPG_KEYRINGS || rc == WPTERR_GPG_OPT_KEYRINGS) {
585 ec = msg_box (NULL,
586 _("Could not access and/or find the public and secret keyring.\n"
587 "If this is an accident, quit the program and fix it.\n\n"
588 "Continue if you want that WinPT offers you more choices.\n"),
589 "WinPT", MB_INFO|MB_YESNO);
590 if (ec == IDYES)
591 first_start = 1;
592 }
593 if (!first_start) {
594 msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
595 return 0;
596 }
597 }
598 if (check_for_empty_keyrings (false))
599 first_start = 1;
600
601 if (!first_start) {
602 rc = gpg_check_permissions (1);
603 if (rc && rc == 2)
604 gpg_read_only = 1;
605 else if (rc)
606 return 0;
607 }
608
609 init_gnupg_table ();
610
611 if (fm_parse_command_line (cmdline) > 0) {
612 free_gnupg_table ();
613 return 0;
614 }
615
616 if (cmdline && stristr (cmdline, "--wipe-freespace")) {
617 dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_SPACE_SECDEL,
618 GetDesktopWindow(), space_wipefrees_dlg_proc, 0,
619 _("Wipe Free Space"), IDS_WINPT_SPACE_SECDEL);
620 free_gnupg_table ();
621 return 0;
622 }
623
624 load_keyserver_conf (cmdline? 1 : 0);
625
626 if (cmdline && (stristr (cmdline, "--keymanager")
627 || stristr (cmdline, "--cardmanager"))) {
628 /* If an instance of WinPT is running, just send the command
629 to open the key manager. Otherwise start a new instance.
630 */
631 HWND tray = FindWindow ("WinPT", "WinPT");
632 if (stristr (cmdline, "keymanager"))
633 start_manager = ID_WINPT_KEY;
634 else
635 start_manager = ID_WINPT_CARD;
636 if (tray != NULL) {
637 PostMessage (tray, WM_COMMAND, start_manager, 0);
638 free_gnupg_table ();
639 return 0;
640 }
641 }
642
643 /* If we found another WinPT instance, just quit to avoid it
644 will be executed twice. */
645 if (winpt_inst_found) {
646 log_debug ("%s", "WinMain: WinPT is already running.");
647 free_gnupg_table ();
648 return 0;
649 }
650
651 if (cmdline && (stristr (cmdline, "--enable-debug") ||
652 stristr (cmdline, "--debug"))) {
653 gpg_set_debug_mode (1);
654 winpt_debug_msg ();
655 debug = 1;
656 }
657
658 wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
659 rc = RegisterClass (&wc);
660 if (rc == FALSE) {
661 msg_box (NULL, _("Could not register window class"),
662 _("WinPT Error"), MB_ERR);
663 free_gnupg_table ();
664 return 0;
665 }
666
667 hwnd = CreateWindow (PGM_NAME,
668 PGM_NAME,
669 0, 0, 0, 0, 0,
670 NULL,
671 NULL,
672 hinst,
673 NULL);
674 if (hwnd == NULL) {
675 msg_box (NULL, _("Could not create window"), _("WinPT Error"), MB_ERR);
676 free_gnupg_table ();
677 return 0;
678 }
679 glob_hwnd = hwnd;
680 UpdateWindow (hwnd);
681
682 if (!first_start && !start_gpgprefs) {
683 gnupg_backup_options ();
684 if (!check_crypto_engine ()) {
685 DestroyWindow (hwnd);
686 free_gnupg_table ();
687 return 0;
688 }
689 }
690
691 if (start_gpgprefs) {
692 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
693 gpgprefs_dlg_proc, 0);
694 if (check_for_empty_keyrings (true))
695 first_start = 1; /* The public keyring is empty! */
696 }
697
698 if (first_start) {
699 struct genkey_s c;
700 int choice;
701 HWND h;
702 start:
703 h = GetDesktopWindow ();
704 if (!gpg_prefs_ok ())
705 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
706 gpgprefs_dlg_proc, 0);
707 choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
708 first_run_dlg_proc, 0);
709 switch (choice) {
710 case SETUP_KEYGEN:
711 c.interactive = 1;
712 c.first_start = 1;
713 rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD,
714 h, keygen_wizard_dlg_proc, (LPARAM)&c);
715 if (!rc)
716 goto start;
717 break;
718
719 case SETUP_IMPORT:
720 rc = gnupg_copy_keyrings ();
721 if (rc) {
722 msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
723 goto start;
724 }
725 break;
726
727 case 0: /* Cancel/Abort. */
728 default:
729 DestroyWindow (hwnd);
730 free_gnupg_table ();
731 return 0;
732 }
733 update_keycache (hwnd);
734 if (!check_crypto_engine ()) {
735 DestroyWindow (hwnd);
736 free_gnupg_table ();
737 return 0;
738 }
739 if (!is_gpg4win_installed ()) {
740 select_language ();
741 load_gettext ();
742 }
743 }
744 else {
745 gpg_keycache_t c, sec_c;
746 update_keycache (hwnd);
747 c = keycache_get_ctx (1);
748 if (!c || !gpg_keycache_get_size (c)) {
749 gnupg_display_error ();
750 msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
751 "Please check your GPG config (keyrings, pathes...)"),
752 _("WinPT Error"), MB_ERR);
753 ec = msg_box (NULL, _("It seems that GPG is not set properly.\n"
754 "Do you want to start the GPG preferences dialog?"),
755 "WinPT", MB_INFO|MB_YESNO);
756 if (ec == IDYES) {
757 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
758 gpgprefs_dlg_proc, 0);
759 update_keycache (hwnd);
760 }
761 else {
762 DestroyWindow (hwnd);
763 free_gnupg_table ();
764 return 0;
765 }
766 }
767 sec_c = keycache_get_ctx (0);
768 if (check_default_key (sec_c)) {
769 char *p = get_gnupg_default_key ();
770 log_box (_("WinPT Error"), MB_ERR,
771 _("Default key (from the GPG config file) could not be found.\n"
772 "Please check your gpg.conf or set a new default key to correct it:\n\n"
773 "%s: public key not found."), p? p : "[null]");
774 set_gnupg_default_key (NULL);
775 }
776 if (count_insecure_elgkeys ())
777 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,
778 elgamal_warn_dlg_proc, 0);
779 }
780
781 if (start_manager)
782 PostMessage (hwnd, WM_COMMAND, start_manager, 0);
783
784 accel_tab = LoadAccelerators (glob_hinst, (LPCTSTR)IDR_WINPT_ACCELERATOR);
785 keyring_check_last_access (); /* init */
786 while (GetMessage (&msg, hwnd, 0, 0)) {
787 if (!TranslateAccelerator (msg.hwnd, accel_tab, &msg)) {
788 TranslateMessage (&msg);
789 DispatchMessage (&msg);
790 }
791 }
792
793 return 0;
794 }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26