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

Contents of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 355 - (show annotations)
Sat Dec 3 18:59:01 2011 UTC (13 years, 2 months ago) by twoaday
File size: 19132 byte(s)
2011-12-04  Timo Schulz  <twoaday@gmx.net>

        * WinPT.cpp (get_file_version): New.
	Improved error handling.
		

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 int err;
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 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 char tmp[128];
128
129 /* XXX: no gpgme.dbg is created. */
130 if (val > 0) {
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 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 int n;
359
360 n=0;
361 pc = keycache_get_ctx (1);
362 while (!gpg_keycache_next_key (pc, 0, &key)) {
363 if (key->subkeys->pubkey_algo == GPGME_PK_ELG)
364 n++;
365 }
366 gpg_keycache_rewind (pc);
367 return n;
368 }
369
370
371 /* Return 1 if the current OS version is at least Windows XP */
372 static int
373 check_os_version (void)
374 {
375 OSVERSIONINFOA osver;
376 memset (&osver, 0, sizeof (osver));
377 osver.dwOSVersionInfoSize = sizeof (osver);
378
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 get_file_version ("winpt.exe", &ver[0], &ver[1], &ver[2], &ver[3]);
423 ec = get_file_version ("PTD.dll", &ptdver[0], &ptdver[1], &ptdver[2], &ptdver[3]);
424 if (!ec && (ptdver[0] != ver[0] || ptdver[1] != ver[1] || ptdver[2] != ver[2])) {
425 log_box (_("WinPT Error"), MB_ERR,
426 _("The PTD.dll file has a different version than WinPT.exe\n"
427 "Please update the PTD.dll to version %d.%d.%d"),
428 ver[0], ver[1], ver[2]);
429 return 0;
430 }
431
432 s = gpgme_check_version (NEED_GPGME_VERSION);
433 if (!s || !*s) {
434 msg_box (GetDesktopWindow (),
435 _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),
436 _("WinPT Error"), MB_ERR);
437 return 0;
438 }
439
440 CreateMutex (NULL, TRUE, PGM_NAME);
441 if (GetLastError () == ERROR_ALREADY_EXISTS)
442 winpt_inst_found = 1;
443
444 gettext_set_user_domain ();
445
446 regist_inst_gnupg (1);
447 regist_inst_winpt (1, &created);
448
449 if (!created) {
450 memset (&reg_prefs, 0, sizeof (reg_prefs));
451 get_reg_winpt_prefs (&reg_prefs);
452 reg_prefs.fm.progress = 0; /* TODO: fix the bug and enable it again */
453 if (gnupg_load_config () == -2)
454 msg_box (GetDesktopWindow (),
455 _("The gpg.conf file contains the 'textmode' option\n"
456 "which leads to broken binary output during decryption.\n"
457 "If this is on purpose, just continue otherwise the option should be disabled."),
458 _("WinPT Error"), MB_ERR);
459 }
460
461 if (is_gpg4win_installed ())
462 load_gpg_env (); /* TODO: check return code. */
463
464 rc = gnupg_check_homedir ();
465 if (rc) {
466 char *p;
467
468 log_box (_("WinPT Error"), MB_ERR,
469 _("GPG home directory is not set correctly.\n"
470 "Please check the GPG registry settings:\n%s."),
471 winpt_strerror (rc));
472 s = get_fileopen_dlg (GetActiveWindow (),
473 _("Select GPG Public Keyring"),
474 "GPG Keyrings (*.gpg)\0*.gpg\0\0",
475 NULL);
476 if (s != NULL && (p=strrchr (s, '\\'))) {
477 char *path = substr (s, 0, (p-s));
478
479 set_reg_entry_gpg ("HomeDir", path);
480 free_if_alloc (path);
481 }
482 else {
483 msg_box (GetDesktopWindow (),
484 _("GPG home directory could not be determined."),
485 _("WinPT Error"), MB_ERR);
486 goto start;
487 }
488 }
489
490 rc = check_gnupg_prog ();
491 if (rc) {
492 if (msg_box (GetDesktopWindow (),
493 _("Could not find the GPG binary (gpg.exe).\n"
494 "Do you want to start the GPG preferences to "
495 "correct this problem?"), _("WinPT Error"),
496 MB_INFO|MB_YESNO) == IDYES)
497 start_gpgprefs = 1;
498 else {
499 msg_box (GetDesktopWindow (),
500 winpt_strerror (rc), _("WinPT Error"), MB_ERR);
501 return 0;
502 }
503 }
504
505 rc = gnupg_access_files ();
506 if (!start_gpgprefs && rc) {
507 if (rc == WPTERR_GPG_KEYRINGS || rc == WPTERR_GPG_OPT_KEYRINGS) {
508 ec = msg_box (GetDesktopWindow (),
509 _("Could not access and/or find the public and secret keyring.\n"
510 "If this is an accident, quit the program and fix it.\n\n"
511 "Continue if you want WinPT to offer you more choices.\n"),
512 "WinPT", MB_INFO|MB_YESNO);
513 if (ec == IDYES)
514 first_start = 1;
515 }
516 if (!first_start) {
517 msg_box (GetDesktopWindow (), winpt_strerror (rc), _("WinPT Error"), MB_ERR);
518 return 0;
519 }
520 }
521 if (check_for_empty_keyrings (false))
522 first_start = 1;
523
524 if (!first_start) {
525 rc = gpg_check_permissions (1);
526 if (rc && rc == 2) /* 2 means read-only mode. */
527 gpg_read_only = 1;
528 else if (rc)
529 return 0;
530 }
531
532 init_gnupg_table ();
533
534 if (fm_parse_command_line (cmdline) > 0) {
535 free_gnupg_table ();
536 return 0;
537 }
538
539 rc = kserver_load_conf ();
540 if (rc)
541 msg_box (GetDesktopWindow (), winpt_strerror (rc),
542 _("Keyserver"), MB_ERR);
543
544 if (cmdline && (stristr (cmdline, "--keymanager")
545 || stristr (cmdline, "--cardmanager"))) {
546 /* If an instance of WinPT is running, just send the command
547 to open the key manager. Otherwise start a new instance. */
548 HWND tray = FindWindow ("WinPT", "WinPT");
549 if (stristr (cmdline, "keymanager"))
550 start_manager = ID_WINPT_KEY;
551 else
552 start_manager = ID_WINPT_CARD;
553 if (tray != NULL) {
554 PostMessage (tray, WM_COMMAND, start_manager, 0);
555 free_gnupg_table ();
556 return 0;
557 }
558 }
559
560 /* If we found another WinPT instance, just quit to avoid it
561 will be executed twice. */
562 if (winpt_inst_found) {
563 log_debug ("%s", "WinMain: WinPT is already running.");
564 free_gnupg_table ();
565 return 0;
566 }
567
568 if (cmdline && (stristr (cmdline, "--enable-debug") ||
569 stristr (cmdline, "--debug"))) {
570 gpg_set_debug_mode (1);
571 winpt_debug_msg ();
572 debug = 1;
573 }
574
575 wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
576 rc = RegisterClass (&wc);
577 if (rc == FALSE) {
578 msg_box (GetDesktopWindow (), _("Could not register window class"),
579 _("WinPT Error"), MB_ERR);
580 free_gnupg_table ();
581 return 0;
582 }
583
584 hwnd = CreateWindow (PGM_NAME,
585 PGM_NAME,
586 0, 0, 0, 0, 0,
587 NULL,
588 NULL,
589 hinst,
590 NULL);
591 if (hwnd == NULL) {
592 msg_box (GetDesktopWindow (),
593 _("Could not create window"),
594 _("WinPT Error"), MB_ERR);
595 free_gnupg_table ();
596 return 0;
597 }
598 glob_hwnd = hwnd;
599 UpdateWindow (hwnd);
600
601 if (!first_start && !start_gpgprefs) {
602 gnupg_backup_options ();
603 if (!check_crypto_engine ()) {
604 DestroyWindow (hwnd);
605 free_gnupg_table ();
606 return 0;
607 }
608 }
609
610 if (start_gpgprefs) {
611 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
612 gpgprefs_dlg_proc, 0);
613 if (check_for_empty_keyrings (true))
614 first_start = 1; /* The public keyring is empty. */
615 }
616
617 if (first_start) {
618 struct genkey_s c;
619 int choice;
620 HWND h;
621 start:
622 h = GetDesktopWindow ();
623 if (!gpg_prefs_ok ())
624 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
625 gpgprefs_dlg_proc, 0);
626 choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
627 first_run_dlg_proc, 0);
628 switch (choice) {
629 case SETUP_KEYGEN:
630 c.interactive = 1;
631 c.first_start = 1;
632 rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD,
633 h, keygen_wizard_dlg_proc, (LPARAM)&c);
634 if (!rc)
635 goto start;
636 break;
637
638 case SETUP_IMPORT:
639 rc = gnupg_copy_keyrings ();
640 if (rc) {
641 msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
642 goto start;
643 }
644 break;
645
646 case SETUP_EXISTING:
647 rc = gnupg_import_keypair ();
648 if (rc) {
649 msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
650 goto start;
651 }
652 break;
653
654 case SETUP_CARDGEN:
655 rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN,
656 h, card_keygen_dlg_proc, 0);
657 if (!rc)
658 goto start;
659 break;
660
661 case 0: /* Cancel/Abort. */
662 default:
663 DestroyWindow (hwnd);
664 free_gnupg_table ();
665 return 0;
666 }
667 update_keycache (hwnd);
668 if (!check_crypto_engine ()) {
669 DestroyWindow (hwnd);
670 free_gnupg_table ();
671 keycache_release (1);
672 return 0;
673 }
674 }
675 else {
676 gpg_keycache_t c;
677 if (update_keycache (hwnd)) {
678 DestroyWindow (hwnd);
679 free_gnupg_table ();
680 keycache_release (1);
681 return 0;
682 }
683 /* XXX: rewrite this part. */
684 c = keycache_get_ctx (1);
685 if (!gpg_keycache_get_size (c)) {
686 msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
687 "Please check your GPG config (keyrings, pathes...)"),
688 _("WinPT Error"), MB_ERR);
689 ec = msg_box (GetDesktopWindow (),
690 _("It seems that GPG is not configured properly.\n"
691 "Do you want to start the GPG preferences dialog?"),
692 "WinPT", MB_INFO|MB_YESNO);
693 if (ec == IDYES) {
694 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
695 gpgprefs_dlg_proc, 0);
696 update_keycache (hwnd);
697 }
698 else {
699 DestroyWindow (hwnd);
700 free_gnupg_table ();
701 keycache_release (1);
702 return 0;
703 }
704 }
705 if (check_default_key ()) {
706 char *p = get_gnupg_default_key ();
707 log_box (_("WinPT Error"), MB_ERR,
708 _("Default key (from the GPG config file) could not be found or is unuseable.\n"
709 "The default key will be resetted and can be set later in the Key Manager again.\n\n"
710 "%s: secret key not found."), p? p : "?");
711 set_gnupg_default_key (NULL);
712 free_if_alloc (p);
713 }
714 if (count_insecure_elgkeys ())
715 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,
716 elgamal_warn_dlg_proc, 0);
717 }
718
719 if (start_manager)
720 PostMessage (hwnd, WM_COMMAND, start_manager, 0);
721
722 accel_tab = LoadAccelerators (glob_hinst, (LPCTSTR)IDR_WINPT_ACCELERATOR);
723 keyring_check_last_access (); /* init */
724 while (GetMessage (&msg, hwnd, 0, 0)) {
725 if (!TranslateAccelerator (msg.hwnd, accel_tab, &msg)) {
726 TranslateMessage (&msg);
727 DispatchMessage (&msg);
728 }
729 }
730
731 return 0;
732 }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26