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

Contents of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 168 - (show annotations)
Fri Jan 27 10:08:10 2006 UTC (19 years, 1 month ago) by twoaday
File size: 18409 byte(s)
2006-01-27  Timo Schulz  <ts@g10code.de>
 
        * WinPT.cpp (WinMain): Set minimal list mode as default.
        * wptKeyCache.cpp (gpg_keycache_sync): Handle special v3 keys.
         

Prepare a new release.


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26