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

Contents of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 407 - (show annotations)
Mon Feb 6 19:26:03 2012 UTC (13 years ago) by twoaday
File size: 19390 byte(s)
2012-02-06  Timo Schulz  <twoaday@gmx.net>

        * wptNLS.cpp (gettext_free_current_domain): Replace free()
	        with safe_free():
        * WinPT.cpp: Use log_debug to improve bug tracking capabilities.


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26