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

Contents of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 208 - (show annotations)
Mon May 1 12:22:18 2006 UTC (18 years, 10 months ago) by twoaday
File size: 19892 byte(s)
See ChangeLog.


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26