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

Contents of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 248 - (show annotations)
Fri Jul 28 11:11:09 2006 UTC (18 years, 7 months ago) by twoaday
File size: 20174 byte(s)
Prepare 1.0.0pre2 release.


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 const char *t, *conf;
298 char *buf;
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.word_wrap = 80;
385 reg_prefs.use_viewer = 0; /* XXX */
386 return 0;
387 }
388
389
390 void
391 set_default_keyserver (void)
392 {
393 char *host = get_reg_entry_keyserver ("Default");
394 char *str_port = get_reg_entry_keyserver ("Default_Port");
395 WORD port = HKP_PORT;
396
397 if (!host)
398 keyserver_set_default (NULL, 0);
399 else {
400 if (str_port && *str_port)
401 port = atoi (str_port);
402 keyserver_set_default (host, port);
403 }
404 free_if_alloc (host);
405 free_if_alloc (str_port);
406 }
407
408
409 /* Display info message that WinPT is now in debug mode. */
410 void
411 winpt_debug_msg (void)
412 {
413 char output[512];
414 char temp[128];
415
416 GetTempPath (sizeof temp -1, temp);
417 _snprintf (output, sizeof output - 1,
418 "The GPGME output file is %sgpgme.dbg\n"
419 "The WinPT output file is %swinpt.log\n", temp, temp);
420 MessageBox (NULL, output, "WinPT now runs in DEBUG MODE", MB_INFO);
421 }
422
423
424 /* Search for insecure ElGamal keys and return the
425 number of founded keys. */
426 static int
427 count_insecure_elgkeys (void)
428 {
429 gpg_keycache_t pc;
430 gpgme_key_t key;
431 int n = 0;
432
433 pc = keycache_get_ctx (1);
434 while (!gpg_keycache_next_key (pc, 0, &key)) {
435 if (key->subkeys->pubkey_algo == GPGME_PK_ELG)
436 n++;
437 }
438 gpg_keycache_rewind (pc);
439 return n;
440 }
441
442
443 /* Main entry point. */
444 int WINAPI
445 WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
446 {
447 WNDCLASS wc = {0, winpt_main_proc, 0, 0, hinst, 0, 0, 0, 0, PGM_NAME};
448 HACCEL accel_tab;
449 MSG msg;
450 HWND hwnd = NULL;
451 WORD ver[3], ptdver[4];
452 const char *s;
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
458 glob_hinst = hinst;
459 if (cmdline && stristr (cmdline, "--stop")) {
460 hwnd = FindWindow ("WinPT", "WinPT");
461 if (hwnd != NULL)
462 PostMessage (hwnd, WM_DESTROY, 0, 0);
463 return 0;
464 }
465
466 #ifdef _DEBUG
467 gpg_set_debug_mode (1);
468 debug = 1;
469 #endif
470
471 get_file_version ("WinPT.exe", &ver[0], &ver[1], &ver[2], &ver[3]);
472 ec = get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],
473 &ptdver[2], &ptdver[3]);
474
475 if (!ec && (ptdver[0] != ver[0] || ptdver[1] != ver[1]|| ptdver[2] != ver[2])) {
476 log_box (_("WinPT Error"), MB_ERR,
477 _("The PTD.dll file has a different version than WinPT.exe\n"
478 "Please update the PTD.dll to version %d.%d.%d"),
479 ver[0], ver[1], ver[2]);
480 return 0;
481 }
482
483 if (gpg_md_selftest ()) {
484 msg_box (NULL, _("Cryptographic selftest failed."),
485 _("WinPT Error"), MB_ERR);
486 return 0;
487 }
488
489 s = gpgme_check_version (NEED_GPGME_VERSION);
490 if (!s || !*s) {
491 msg_box (NULL, _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),
492 _("WinPT Error"), MB_ERR);
493 return 0;
494 }
495
496 CreateMutex (NULL, TRUE, PGM_NAME);
497 if (GetLastError () == ERROR_ALREADY_EXISTS)
498 winpt_inst_found = 1;
499
500 if (cmdline && stristr (cmdline, "--mobile")) {
501 msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",
502 "WinPT", MB_INFO);
503 mobile_mode_active = 1;
504 }
505
506 set_default_keyserver ();
507 load_gettext ();
508 admin_user = user_is_admin ();
509
510 if (!mobile_mode_active) {
511 regist_inst_gnupg (1);
512 regist_inst_winpt (1, &created);
513 }
514 else {
515 if (enable_mobile_mode ())
516 return 0;
517 created = 1; /* Disable registry writing */
518 }
519
520 if (!created) {
521 memset (&reg_prefs, 0, sizeof (reg_prefs));
522 reg_prefs.fm.progress = 0; /* XXX: fix the bug and enable it again */
523 get_reg_winpt_prefs (&reg_prefs);
524 gnupg_load_config ();
525 }
526
527 if (is_gpg4win_installed ())
528 load_gpg_env (); /* XXX: check return code. */
529
530 rc = gnupg_check_homedir ();
531 if (rc) {
532 log_box (_("WinPT Error"), MB_ERR,
533 _("GPG home directory is not set correctly.\n"
534 "Please check the GPG registry settings:\n%s."),
535 winpt_strerror (rc));
536 s = get_fileopen_dlg (GetActiveWindow (),
537 _("Select GPG Public Keyring"),
538 "GPG Keyrings (*.gpg)\0*.gpg\0\0",
539 NULL);
540 if (s != NULL) {
541 size_t n;
542 char *p = strrchr (s, '\\');
543 if (!p)
544 BUG (0);
545 n = p - s;
546 if (n) {
547 char *file = new char[n+1];
548 if (!file)
549 BUG (NULL);
550 memset (file, 0, n);
551 memcpy (file, s, n);
552 file[n] = '\0';
553 set_reg_entry_gpg ("HomeDir", file);
554 free_if_alloc (file);
555 gnupg_check_homedir (); /* change gpgProgram if needed */
556 }
557 }
558 else {
559 msg_box (NULL, _("GPG home directory could not be determined."),
560 _("WinPT Error"), MB_ERR);
561 goto start;
562 }
563 }
564
565 rc = check_gnupg_prog ();
566 if (rc) {
567 if (msg_box (NULL, _("Could not find the GPG binary (gpg.exe).\n"
568 "Do you want to start the GPG preferences to "
569 "correct this problem?"), _("WinPT Error"),
570 MB_INFO|MB_YESNO) == IDYES)
571 start_gpgprefs = 1;
572 else {
573 msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
574 return 0;
575 }
576 }
577
578 rc = gnupg_access_files ();
579 if (!start_gpgprefs && rc) {
580 if (rc == WPTERR_GPG_KEYRINGS || rc == WPTERR_GPG_OPT_KEYRINGS) {
581 ec = msg_box (NULL,
582 _("Could not access and/or find the public and secret keyring.\n"
583 "If this is an accident, quit the program and fix it.\n\n"
584 "Continue if you want WinPT to offer you more choices.\n"),
585 "WinPT", MB_INFO|MB_YESNO);
586 if (ec == IDYES)
587 first_start = 1;
588 }
589 if (!first_start) {
590 msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
591 return 0;
592 }
593 }
594 if (check_for_empty_keyrings (false))
595 first_start = 1;
596
597 if (!first_start) {
598 rc = gpg_check_permissions (1);
599 if (rc && rc == 2)
600 gpg_read_only = 1;
601 else if (rc)
602 return 0;
603 }
604
605 init_gnupg_table ();
606
607 if (fm_parse_command_line (cmdline) > 0) {
608 free_gnupg_table ();
609 return 0;
610 }
611
612 if (cmdline && stristr (cmdline, "--wipe-freespace")) {
613 dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_SPACE_SECDEL,
614 GetDesktopWindow(), space_wipefrees_dlg_proc, 0,
615 _("Wipe Free Space"), IDS_WINPT_SPACE_SECDEL);
616 free_gnupg_table ();
617 return 0;
618 }
619
620 load_keyserver_conf (cmdline? 1 : 0);
621
622 if (cmdline && (stristr (cmdline, "--keymanager")
623 || stristr (cmdline, "--cardmanager"))) {
624 /* If an instance of WinPT is running, just send the command
625 to open the key manager. Otherwise start a new instance.
626 */
627 HWND tray = FindWindow ("WinPT", "WinPT");
628 if (stristr (cmdline, "keymanager"))
629 start_manager = ID_WINPT_KEY;
630 else
631 start_manager = ID_WINPT_CARD;
632 if (tray != NULL) {
633 PostMessage (tray, WM_COMMAND, start_manager, 0);
634 free_gnupg_table ();
635 return 0;
636 }
637 }
638
639 /* If we found another WinPT instance, just quit to avoid it
640 will be executed twice. */
641 if (winpt_inst_found) {
642 log_debug ("%s", "WinMain: WinPT is already running.");
643 free_gnupg_table ();
644 return 0;
645 }
646
647 if (cmdline && (stristr (cmdline, "--enable-debug") ||
648 stristr (cmdline, "--debug"))) {
649 gpg_set_debug_mode (1);
650 winpt_debug_msg ();
651 debug = 1;
652 }
653
654 wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
655 rc = RegisterClass (&wc);
656 if (rc == FALSE) {
657 msg_box (NULL, _("Could not register window class"),
658 _("WinPT Error"), MB_ERR);
659 free_gnupg_table ();
660 return 0;
661 }
662
663 hwnd = CreateWindow (PGM_NAME,
664 PGM_NAME,
665 0, 0, 0, 0, 0,
666 NULL,
667 NULL,
668 hinst,
669 NULL);
670 if (hwnd == NULL) {
671 msg_box (NULL, _("Could not create window"), _("WinPT Error"), MB_ERR);
672 free_gnupg_table ();
673 return 0;
674 }
675 glob_hwnd = hwnd;
676 UpdateWindow (hwnd);
677
678 if (!first_start && !start_gpgprefs) {
679 gnupg_backup_options ();
680 if (!check_crypto_engine ()) {
681 DestroyWindow (hwnd);
682 free_gnupg_table ();
683 return 0;
684 }
685 }
686
687 if (start_gpgprefs) {
688 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
689 gpgprefs_dlg_proc, 0);
690 if (check_for_empty_keyrings (true))
691 first_start = 1; /* The public keyring is empty! */
692 }
693
694 if (first_start) {
695 struct genkey_s c;
696 int choice;
697 HWND h;
698 start:
699 h = GetDesktopWindow ();
700 if (!gpg_prefs_ok ())
701 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
702 gpgprefs_dlg_proc, 0);
703 choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
704 first_run_dlg_proc, 0);
705 switch (choice) {
706 case SETUP_KEYGEN:
707 c.interactive = 1;
708 c.first_start = 1;
709 rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD,
710 h, keygen_wizard_dlg_proc, (LPARAM)&c);
711 if (!rc)
712 goto start;
713 break;
714
715 case SETUP_IMPORT:
716 rc = gnupg_copy_keyrings ();
717 if (rc) {
718 msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
719 goto start;
720 }
721 break;
722
723 case 0: /* Cancel/Abort. */
724 default:
725 DestroyWindow (hwnd);
726 free_gnupg_table ();
727 return 0;
728 }
729 update_keycache (hwnd);
730 if (!check_crypto_engine ()) {
731 DestroyWindow (hwnd);
732 free_gnupg_table ();
733 return 0;
734 }
735 if (!is_gpg4win_installed ()) {
736 select_language ();
737 load_gettext ();
738 }
739 }
740 else {
741 gpg_keycache_t c, sec_c;
742 update_keycache (hwnd);
743 c = keycache_get_ctx (1);
744 if (!c || !gpg_keycache_get_size (c)) {
745 gnupg_display_error ();
746 msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
747 "Please check your GPG config (keyrings, pathes...)"),
748 _("WinPT Error"), MB_ERR);
749 ec = msg_box (NULL, _("It seems that GPG is not configured properly.\n"
750 "Do you want to start the GPG preferences dialog?"),
751 "WinPT", MB_INFO|MB_YESNO);
752 if (ec == IDYES) {
753 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
754 gpgprefs_dlg_proc, 0);
755 update_keycache (hwnd);
756 }
757 else {
758 DestroyWindow (hwnd);
759 free_gnupg_table ();
760 return 0;
761 }
762 }
763 sec_c = keycache_get_ctx (0);
764 if (check_default_key (sec_c)) {
765 char *p = get_gnupg_default_key ();
766 log_box (_("WinPT Error"), MB_ERR,
767 _("Default key (from the GPG config file) could not be found.\n"
768 "Please check your gpg.conf or set a new default key to correct it:\n\n"
769 "%s: public key not found."), p? p : "[null]");
770 set_gnupg_default_key (NULL);
771 }
772 if (count_insecure_elgkeys ())
773 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,
774 elgamal_warn_dlg_proc, 0);
775 }
776
777 if (start_manager)
778 PostMessage (hwnd, WM_COMMAND, start_manager, 0);
779
780 accel_tab = LoadAccelerators (glob_hinst, (LPCTSTR)IDR_WINPT_ACCELERATOR);
781 keyring_check_last_access (); /* init */
782 while (GetMessage (&msg, hwnd, 0, 0)) {
783 if (!TranslateAccelerator (msg.hwnd, accel_tab, &msg)) {
784 TranslateMessage (&msg);
785 DispatchMessage (&msg);
786 }
787 }
788
789 return 0;
790 }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26