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

Contents of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 181 - (show annotations)
Tue Mar 14 11:01:22 2006 UTC (18 years, 11 months ago) by twoaday
File size: 19259 byte(s)
2006-03-12  Timo Schulz  <ts@g10code.de>
 
        * wptGPG.cpp (gnupg_load_config): Search for 'ask-cert-expire'.
        * wptKeyPropsDlg.cpp (display_key_info): Automatically update
        sym algorithm preferences if needed.
        * wptKeysignDlg.cpp (date_is_today): New.
        (keysign_dlg_proc): Only allow to set cert expire date if
        the option was found.
        * wptGPGPrefsDlg.cpp (gpgprefs_dlg_proc): Allow to set
        'ask-cert-expire'.
         


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26