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

Contents of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 417 - (show annotations)
Thu Feb 16 19:50:32 2012 UTC (13 years ago) by twoaday
File size: 20007 byte(s)


1 /* WinPT.cpp - Windows Privacy Tray (WinPT)
2 * Copyright (C) 2000-2009, 2012 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 #ifdef HAVE_CONFIG_H
17 #include <config.h>
18 #endif
19
20 #include <windows.h>
21 #include <shlobj.h>
22
23 #include "resource.h"
24 #include "wptTypes.h"
25 #include "wptW32API.h"
26 #include "wptVersion.h"
27 #include "wptErrors.h"
28 #include "wptGPG.h"
29 #include "wptRegistry.h"
30 #include "wptCommonCtl.h"
31 #include "wptDlgs.h"
32 #include "wptNLS.h"
33 #include "wptKeyserver.h"
34 #include "wptCard.h"
35 #include "wptFileManager.h"
36 #include "wptContext.h"
37 #include "wptCardEdit.h"
38 #include "wptCrypto.h"
39 #include "wptUTF8.h"
40
41 void remove_crit_file_attrs (const char *fname, int force);
42
43 /* Global variables. */
44 HINSTANCE glob_hinst; /* global instance for the dialogs */
45 HWND glob_hwnd; /* global window handle for the dialogs */
46 int scard_support = 0;
47 int disable_hook = 0;
48 int debug = 0;
49 int gpg_read_only = 0;
50 char gpgver[3];
51 /* End */
52
53
54 /* Retrieve the product verion of the given file @fname.
55 Format: MAJOR.MINOR.PATCH1.PATCH2
56 Return value: 0 on success. */
57 int
58 get_file_version (const char *fname, WORD *major, WORD *minor, WORD *patch1, WORD *patch2)
59 {
60 VS_FIXEDFILEINFO *inf;
61 char file[MAX_PATH+1] = {0};
62 LPVOID buf, data;
63 DWORD size;
64 UINT qlen;
65 int err = 0;
66
67 strncpy (file, fname, MAX_PATH);
68 size = GetFileVersionInfoSize (file, NULL);
69 if (!size)
70 return -1;
71
72 buf = (LPVOID)new char[size];
73 if (!buf)
74 BUG (NULL);
75 if (!GetFileVersionInfo (file, 0, size, buf)) {
76 err = -1;
77 goto fail;
78 }
79
80 qlen = 0;
81 VerQueryValue (buf, (char*)"\\", &data, &qlen);
82 if (!qlen) {
83 err = -1;
84 goto fail;
85 }
86
87 inf = (VS_FIXEDFILEINFO*)data;
88 *major = HIWORD (inf->dwProductVersionMS);
89 *minor = LOWORD (inf->dwProductVersionMS);
90 *patch1 = HIWORD (inf->dwProductVersionLS);
91 *patch2 = LOWORD (inf->dwProductVersionLS);
92
93 fail:
94 delete [](char*)buf;
95 return err;
96 }
97
98
99 /* Load the key cache and rebuild the signature cache. */
100 int
101 update_keycache (HWND hwnd)
102 {
103 refresh_cache_s rcs;
104
105 /* no need to rebuild the sig cache each time. */
106 memset (&rcs, 0, sizeof (rcs));
107 rcs.kring_update = 1;
108 int err = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,
109 keycache_dlg_proc, (LPARAM)&rcs);
110 if (err) {
111 char *cfgf = get_gnupg_config ();
112 if (cfgf && check_gnupg_options (cfgf, 0) == WPTERR_FILE_EXIST)
113 msg_box (GetDesktopWindow (),
114 _("The gpg.conf contains at least one argument which points to a non-existing file."), "WinPT", MB_ERR);
115 free_if_alloc (cfgf);
116 return -1;
117 }
118 return 0;
119 }
120
121
122 /* Set GPGME debug mode. If @val is 0, the debug mode is disabled. */
123 void
124 gpg_set_debug_mode (int val)
125 {
126 static char buf[MAX_PATH+1];
127
128 /* XXX: no gpgme.dbg is created. */
129 if (val > 0) {
130 char tmp[128];
131 GetTempPath (DIM (tmp)-1, tmp);
132 _snprintf (buf, DIM (buf)-1, "GPGME_DEBUG=5:%sgpgme.dbg", tmp);
133 putenv (buf);
134 }
135 else
136 putenv ("GPGME_DEBUG=");
137 }
138
139
140 /* Return true if the GPG environment is useable. */
141 static bool
142 gpg_prefs_ok (void)
143 {
144 char *p = get_reg_entry_gpg4win ("gpg.exe");
145 if (!p || file_exist_check (p) != 0) {
146 free_if_alloc (p);
147 p = get_reg_entry_gpg ("gpgProgram");
148 if (!p || file_exist_check (p) != 0) {
149 free_if_alloc (p);
150 log_debug ("gpg_prefs_ok: could not locate gpg.exe");
151 return false;
152 }
153 }
154 free_if_alloc (p);
155 p = get_reg_entry_gpg4win (NULL);
156 if (!p || dir_exist_check (p) != 0) {
157 free_if_alloc (p);
158 p = get_reg_entry_gpg ("HomeDir");
159 if (!p || dir_exist_check (p) != 0) {
160 free_if_alloc (p);
161 log_debug ("gpg_prefs_ok: could not determine home directory");
162 return false;
163 }
164 }
165 free_if_alloc (p);
166 return true;
167 }
168
169
170 /* Check gpg files if they are read-only and ask the user
171 if this should be corrected. */
172 static void
173 check_readonly_attr (const char *homedir)
174 {
175 const char *files[] = {"pubring.gpg", "secring.gpg", "trustdb.gpg", NULL};
176
177 log_debug("check if there are gpg files with a read-only attribute");
178 for (int i=0; files[i] != NULL; i++) {
179 char *file = make_filename (homedir, files[i], NULL);
180 remove_crit_file_attrs (file, 0);
181 free_if_alloc (file);
182 }
183 }
184
185
186 /* Load the GPG environment. On the first start, some
187 checks are performed to find out in what state GPG is.
188 Return value: 0 everything OK.
189 >0 fatal error.
190 -1 public keyring is empty or does not exist. */
191 static int
192 load_gpg_env (void)
193 {
194 SECURITY_ATTRIBUTES sec_attr;
195 char *p;
196 char *pkr;
197 int err = 0;
198
199 p = get_reg_entry_gpg4win ("gpg.exe");
200 if (!p)
201 return (1);
202 if (file_exist_check (p)) {
203 free_if_alloc (p);
204 return (1);
205 }
206 free_if_alloc (p);
207
208 p = get_reg_entry_gpg ("HomeDir");
209 if (!p || dir_exist_check (p) != 0) {
210 free_if_alloc (p);
211 p = multi_gnupg_path (0);
212 }
213 if (p && dir_exist_check (p)) {
214 memset (&sec_attr, 0, sizeof (sec_attr));
215 sec_attr.nLength = sizeof (sec_attr);
216 if (!CreateDirectory (p, &sec_attr)) {
217 msg_box (GetDesktopWindow (),
218 _("Could not create GPG home directory"),
219 _("WinPT Error"), MB_ERR);
220 free_if_alloc (p);
221 return (2);
222 }
223 }
224 check_readonly_attr (p);
225 pkr = make_filename (p, "pubring", "gpg");
226 free_if_alloc (p);
227 if (get_file_size (pkr) == 0)
228 err = -1;
229 free_if_alloc (pkr);
230 return err;
231 }
232
233
234 /* check if the default key from the gpg.conf file is available in the
235 keyring. if not, bail out because encryption won't work properly then. */
236 static int
237 check_default_key (void)
238 {
239 gpgme_key_t key;
240 gpgme_error_t err = gpg_error (GPG_ERR_NO_ERROR);
241 gpg_keycache_t kc;
242 char *defkey;
243
244 kc = keycache_get_ctx (0);
245 defkey = get_gnupg_default_key ();
246 if (defkey != NULL) {
247 err = gpg_keycache_find_key (kc, defkey, 0, &key);
248 if (err) {
249 free_if_alloc (defkey);
250 return -1;
251 }
252 }
253 else {
254 /* Actually this is just a warning but we still continue. */
255 msg_box (GetDesktopWindow (), _("No useable secret key found."),
256 _("WinPT Warning"), MB_WARN);
257 return 0;
258 }
259
260 /* Because the secret key listing has no information
261 about the validity/status, we need to check the public key. */
262 kc = keycache_get_ctx (1);
263 if (!gpg_keycache_find_key (kc, defkey, 0, &key) &&
264 (key->revoked || key->expired)) {
265 msg_box (GetDesktopWindow (), _("Default secret key is unuseable"),
266 _("WinPT Warning"), MB_ERR);
267 free_if_alloc (defkey);
268 return -1;
269 }
270 free_if_alloc (defkey);
271 return 0;
272 }
273
274
275 /* Check that the underlying crypto engine fullfills the minimal
276 requirements so all commands work properly. */
277 static bool
278 check_crypto_engine (void)
279 {
280 int ma = 0, mi = 0, pa = 0;
281 int rc;
282
283 rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);
284 if (rc == -1) {
285 msg_box (GetDesktopWindow (), _("Could not read GnuPG version."),
286 _("WinPT Error"), MB_ERR);
287 return false;
288 }
289 else if (rc) {
290 log_box (_("WinPT Error"), MB_ERR,
291 _("A newer GPG version is needed.\n"
292 "Current GPG version %d.%d.%d, required "NEED_GPG_VERSION),
293 ma, mi, pa);
294 return false;
295 }
296
297 // TODO: smart card support needs to be revamped
298 // and adjusted according to newer OpenPGP cards.
299 /*
300 if ((ma > 1 || pa >= 4) && pcsc_available ())
301 scard_support = 1;
302 */
303 scard_support = 0;
304
305 gpgver[0] = ma;
306 gpgver[1] = mi;
307 gpgver[2] = pa;
308 return true;
309 }
310
311
312
313 /* Check if both keyrings are empty. This indicates that
314 WinPT should offer to generate a key pair. */
315 static bool
316 check_for_empty_keyrings (bool pub_only)
317 {
318 int n = 0;
319 char *p = get_gnupg_keyring (1, 0);
320 if (file_exist_check (p) == 0 && get_file_size (p) == 0)
321 n++;
322 free_if_alloc (p);
323 if (pub_only)
324 return n == 1? true : false;
325 p = get_gnupg_keyring (0, 0);
326 if (file_exist_check (p) == 0 && get_file_size (p) == 0)
327 n++;
328 free_if_alloc (p);
329 return n == 2? true : false;
330 }
331
332
333
334 /* Display info message that WinPT is now in debug mode. */
335 void
336 winpt_debug_msg (void)
337 {
338 char output[512];
339 char temp[MAX_PATH+1];
340
341 GetTempPath (DIM (temp) - 1, temp);
342 _snprintf (output, DIM (output)-1,
343 "The GPGME output file is %sgpgme.dbg\n"
344 "The WinPT output file is %swinpt-%08lx.log\n", temp, temp, GetCurrentProcessId());
345 MessageBox (NULL, output, "WinPT now runs in DEBUG MODE", MB_INFO);
346 }
347
348
349 /* Search for insecure ElGamal keys and return the
350 number of founded keys. */
351 static int
352 count_insecure_elgkeys (void)
353 {
354 gpgme_key_t key;
355
356 int n = 0;
357 gpg_keycache_t pc = keycache_get_ctx (1);
358 while (!gpg_keycache_next_key (pc, 0, &key)) {
359 if (key->subkeys->pubkey_algo == GPGME_PK_ELG)
360 n++;
361 }
362 gpg_keycache_rewind (pc);
363 return n;
364 }
365
366
367 /* Return 1 if the current OS version is at least Windows XP */
368 static int
369 check_os_version (void)
370 {
371 OSVERSIONINFOA osver;
372 memset (&osver, 0, sizeof (osver));
373 osver.dwOSVersionInfoSize = sizeof (osver);
374
375 if (!GetVersionEx (&osver)) {
376 MessageBox (NULL, _("Could not read the OS version."), _("WinPT Error"), MB_ERR);
377 return 0;
378 }
379
380 if (osver.dwMajorVersion < 5 ||
381 (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 0)) {
382 MessageBox (NULL, _("WinPT requires Windows XP or higher."), _("WinPT Error"), MB_ERR);
383 return 0;
384 }
385
386 return 1;
387 }
388
389 /* Main entry point. */
390 int WINAPI
391 WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
392 {
393 WNDCLASS wc = {0, winpt_main_proc, 0, 0, hinst, 0, 0, 0, 0, PGM_NAME};
394 HACCEL accel_tab;
395 MSG msg;
396 HWND hwnd = NULL;
397 WORD ver[3], ptdver[4];
398
399 const char *s;
400 int rc, ec, created = 0;
401 int first_start = 0, start_gpgprefs = 0;
402 int winpt_inst_found = 0;
403 int start_manager = 0;
404
405 log_debug("check OS version");
406 if (!check_os_version ())
407 return 0;
408
409 glob_hinst = hinst;
410
411 /* Check as early as possible for debug flags and activate
412 the debug mode if requested */
413 if (cmdline && (stristr (cmdline, "--enable-debug") ||
414 stristr (cmdline, "--debug"))) {
415 //gpg_set_debug_mode (1);
416 winpt_debug_msg ();
417 debug = 1;
418 }
419
420 /* Allow to shutdown the process, for instance by an installer */
421 if (cmdline && stristr (cmdline, "--stop")) {
422 hwnd = FindWindow ("WinPT", "WinPT");
423 if (hwnd != NULL) {
424 log_debug ("shutdown an existing WinPT process");
425 PostMessage (hwnd, WM_DESTROY, 0, 0);
426 }
427 return 0;
428 }
429
430 /* KLUDGE: test if the hooking is causing problems with some AV programs */
431 if (cmdline && stristr (cmdline, "--disable-hook")) {
432 log_debug ("disable current window hooks");
433 disable_hook = 1;
434 }
435
436
437 log_debug("check PTD and GPGME version");
438 get_file_version ("winpt.exe", &ver[0], &ver[1], &ver[2], &ver[3]);
439 ec = get_file_version ("PTD.dll", &ptdver[0], &ptdver[1], &ptdver[2], &ptdver[3]);
440 if (!ec && (ptdver[0] != ver[0] || ptdver[1] != ver[1] || ptdver[2] != ver[2])) {
441 log_box (_("WinPT Error"), MB_ERR,
442 _("The PTD.dll file has a different version than WinPT.exe\n"
443 "Please update the PTD.dll to version %d.%d.%d"),
444 ver[0], ver[1], ver[2]);
445 return 0;
446 }
447
448 s = gpgme_check_version (NEED_GPGME_VERSION);
449 if (!s || !*s) {
450 msg_box (GetDesktopWindow (),
451 _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),
452 _("WinPT Error"), MB_ERR);
453 return 0;
454 }
455
456 CreateMutex (NULL, TRUE, PGM_NAME);
457 if (GetLastError () == ERROR_ALREADY_EXISTS) {
458 log_debug ("Found running WinPT instance");
459 winpt_inst_found = 1;
460 }
461
462 gettext_set_user_domain ();
463
464 regist_inst_gnupg (1);
465 regist_inst_winpt (1, &created);
466
467 if (!created) {
468 memset (&reg_prefs, 0, sizeof (reg_prefs));
469 get_reg_winpt_prefs (&reg_prefs);
470 reg_prefs.fm.progress = 0; /* TODO: fix the bug and enable it again */
471 if (gnupg_load_config () == -2)
472 msg_box (GetDesktopWindow (),
473 _("The gpg.conf file contains the 'textmode' option\n"
474 "which leads to broken binary output during decryption.\n"
475 "If this is on purpose, just continue otherwise the option should be disabled."),
476 _("WinPT Error"), MB_ERR);
477 }
478
479 if (is_gpg4win_installed ()) {
480 log_debug ("gpg4win: load gpg environment");
481 load_gpg_env (); /* TODO: check return code. */
482 }
483
484 rc = gnupg_check_homedir ();
485 if (rc) {
486 log_box (_("WinPT Error"), MB_ERR,
487 _("GPG home directory is not set correctly.\n"
488 "Please check the GPG registry settings:\n%s."),
489 winpt_strerror (rc));
490 s = get_fileopen_dlg (GetActiveWindow (),
491 _("Select GPG Public Keyring"),
492 "GPG Keyrings (*.gpg)\0*.gpg\0\0",
493 NULL);
494
495 char * p;
496 if (s != NULL && (p = strrchr (s, '\\'))) {
497 char *path = substr (s, 0, (p-s));
498
499 set_reg_entry_gpg ("HomeDir", path);
500 free_if_alloc (path);
501 }
502 else {
503 msg_box (GetDesktopWindow (),
504 _("GPG home directory could not be determined."),
505 _("WinPT Error"), MB_ERR);
506 goto start;
507 }
508 }
509
510 rc = check_gnupg_prog ();
511 if (rc) {
512 if (msg_box (GetDesktopWindow (),
513 _("Could not find the GPG binary (gpg.exe).\n"
514 "Do you want to start the GPG preferences to "
515 "correct this problem?"), _("WinPT Error"),
516 MB_INFO|MB_YESNO) == IDYES)
517 start_gpgprefs = 1;
518 else {
519 msg_box (GetDesktopWindow (),
520 winpt_strerror (rc), _("WinPT Error"), MB_ERR);
521 return 0;
522 }
523 }
524
525 rc = gnupg_access_files ();
526 if (!start_gpgprefs && rc) {
527 if (rc == WPTERR_GPG_KEYRINGS || rc == WPTERR_GPG_OPT_KEYRINGS) {
528 ec = msg_box (GetDesktopWindow (),
529 _("Could not access and/or find the public and secret keyring.\n"
530 "If this is an accident, quit the program and fix it.\n\n"
531 "Continue if you want WinPT to offer you more choices.\n"),
532 "WinPT", MB_INFO|MB_YESNO);
533 if (ec == IDYES)
534 first_start = 1;
535 }
536 if (!first_start) {
537 msg_box (GetDesktopWindow (), winpt_strerror (rc), _("WinPT Error"), MB_ERR);
538 return 0;
539 }
540 }
541 if (check_for_empty_keyrings (false)) {
542 log_debug ("found empty keyrings, assume first start");
543 first_start = 1;
544 }
545
546 if (!first_start) {
547 rc = gpg_check_permissions (1);
548 if (rc && rc == 2) /* 2 means read-only mode. */
549 gpg_read_only = 1;
550 else if (rc)
551 return 0;
552 }
553
554 init_gnupg_table ();
555
556 if (fm_parse_command_line (cmdline) > 0) {
557 log_debug ("processed arguments with File Manager, exiting...");
558 free_gnupg_table ();
559 return 0;
560 }
561
562 rc = kserver_load_conf ();
563 if (rc)
564 msg_box (GetDesktopWindow (), winpt_strerror (rc),
565 _("Keyserver"), MB_ERR);
566
567 if (cmdline && (stristr (cmdline, "--keymanager")
568 || stristr (cmdline, "--cardmanager"))) {
569 /* If an instance of WinPT is running, just send the command
570 to open the key manager. Otherwise start a new instance. */
571 HWND tray = FindWindow ("WinPT", "WinPT");
572 if (stristr (cmdline, "keymanager"))
573 start_manager = ID_WINPT_KEY;
574 else
575 start_manager = ID_WINPT_CARD;
576 if (tray != NULL) {
577 PostMessage (tray, WM_COMMAND, start_manager, 0);
578 free_gnupg_table ();
579 return 0;
580 }
581 }
582
583 /* If we found another WinPT instance, just quit to avoid it
584 will be executed twice. */
585 if (winpt_inst_found) {
586 log_debug ("%s", "WinMain: WinPT is already running.");
587 free_gnupg_table ();
588 return 0;
589 }
590
591 wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
592 rc = RegisterClass (&wc);
593 if (rc == FALSE) {
594 msg_box (GetDesktopWindow (), _("Could not register window class"),
595 _("WinPT Error"), MB_ERR);
596 free_gnupg_table ();
597 return 0;
598 }
599
600 hwnd = CreateWindow (PGM_NAME,
601 PGM_NAME,
602 0, 0, 0, 0, 0,
603 NULL,
604 NULL,
605 hinst,
606 NULL);
607 if (hwnd == NULL) {
608 msg_box (GetDesktopWindow (),
609 _("Could not create window"),
610 _("WinPT Error"), MB_ERR);
611 free_gnupg_table ();
612 return 0;
613 }
614 glob_hwnd = hwnd;
615 UpdateWindow (hwnd);
616
617 if (!first_start && !start_gpgprefs) {
618 log_debug("backup gpg config file and check back-end");
619 gnupg_backup_options ();
620 if (!check_crypto_engine ()) {
621 DestroyWindow (hwnd);
622 free_gnupg_table ();
623 return 0;
624 }
625 }
626
627 if (start_gpgprefs) {
628 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
629 gpgprefs_dlg_proc, 0);
630 if (check_for_empty_keyrings (true))
631 first_start = 1; /* The public keyring is empty. */
632 }
633
634 if (first_start) {
635 struct genkey_s c;
636 int choice;
637 HWND h;
638 start:
639 h = GetDesktopWindow ();
640 if (!gpg_prefs_ok ())
641 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
642 gpgprefs_dlg_proc, 0);
643 choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
644 first_run_dlg_proc, 0);
645 switch (choice) {
646 case SETUP_KEYGEN:
647 c.interactive = 1;
648 c.first_start = 1;
649 rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD,
650 h, keygen_wizard_dlg_proc, (LPARAM)&c);
651 if (!rc)
652 goto start;
653 break;
654
655 case SETUP_IMPORT:
656 rc = gnupg_copy_keyrings ();
657 if (rc) {
658 msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
659 goto start;
660 }
661 break;
662
663 case SETUP_EXISTING:
664 rc = gnupg_import_keypair ();
665 if (rc) {
666 msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
667 goto start;
668 }
669 break;
670
671 case SETUP_CARDGEN:
672 rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN,
673 h, card_keygen_dlg_proc, 0);
674 if (!rc)
675 goto start;
676 break;
677
678 case 0: /* Cancel/Abort. */
679 default:
680 DestroyWindow (hwnd);
681 free_gnupg_table ();
682 return 0;
683 }
684 update_keycache (hwnd);
685 if (!check_crypto_engine ()) {
686 DestroyWindow (hwnd);
687 free_gnupg_table ();
688 keycache_release (1);
689 return 0;
690 }
691 }
692 else {
693 gpg_keycache_t c;
694 if (update_keycache (hwnd)) {
695 DestroyWindow (hwnd);
696 free_gnupg_table ();
697 keycache_release (1);
698 return 0;
699 }
700 /* XXX: rewrite this part. */
701 c = keycache_get_ctx (1);
702 if (!gpg_keycache_get_size (c)) {
703 msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
704 "Please check your GPG config (keyrings, pathes...)"),
705 _("WinPT Error"), MB_ERR);
706 ec = msg_box (GetDesktopWindow (),
707 _("It seems that GPG is not configured properly.\n"
708 "Do you want to start the GPG preferences dialog?"),
709 "WinPT", MB_INFO|MB_YESNO);
710 if (ec == IDYES) {
711 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
712 gpgprefs_dlg_proc, 0);
713 update_keycache (hwnd);
714 }
715 else {
716 DestroyWindow (hwnd);
717 free_gnupg_table ();
718 keycache_release (1);
719 return 0;
720 }
721 }
722 if (check_default_key ()) {
723 char *p = get_gnupg_default_key ();
724 log_box (_("WinPT Error"), MB_ERR,
725 _("Default key (from the GPG config file) could not be found or is unuseable.\n"
726 "The default key will be resetted and can be set later in the Key Manager again.\n\n"
727 "%s: secret key not found."), p? p : "?");
728 set_gnupg_default_key (NULL);
729 free_if_alloc (p);
730 }
731 if (count_insecure_elgkeys ())
732 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,
733 elgamal_warn_dlg_proc, 0);
734 }
735
736 if (start_manager)
737 PostMessage (hwnd, WM_COMMAND, start_manager, 0);
738
739 accel_tab = LoadAccelerators (glob_hinst, (LPCTSTR)IDR_WINPT_ACCELERATOR);
740 keyring_check_last_access (); /* init */
741 while (GetMessage (&msg, hwnd, 0, 0)) {
742 if (!TranslateAccelerator (msg.hwnd, accel_tab, &msg)) {
743 TranslateMessage (&msg);
744 DispatchMessage (&msg);
745 }
746 }
747
748 return 0;
749 }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26