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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 176 - (hide annotations)
Mon Feb 13 09:38:03 2006 UTC (19 years ago) by twoaday
File size: 18864 byte(s)


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26