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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 415 - (hide annotations)
Sat Feb 11 16:51:01 2012 UTC (13 years ago) by twoaday
File size: 19637 byte(s)
2012-02-11  Timo Schulz  <twoaday@gmx.net>

        * WinPT.cpp (WinMain): Switch to disable hooking.
        * wptMainProc.cpp (winpt_main_proc): Handle it here.
	

1 werner 36 /* WinPT.cpp - Windows Privacy Tray (WinPT)
2 twoaday 328 * Copyright (C) 2000-2009 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 werner 42 #ifdef HAVE_CONFIG_H
17     #include <config.h>
18     #endif
19    
20 werner 36 #include <windows.h>
21 twoaday 154 #include <shlobj.h>
22 werner 36
23 werner 47 #include "resource.h"
24 werner 36 #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 werner 48 #include "wptCrypto.h"
39 twoaday 190 #include "wptUTF8.h"
40 werner 36
41 twoaday 172 void remove_crit_file_attrs (const char *fname, int force);
42 twoaday 154
43 twoaday 208 /* Global variables. */
44 werner 36 HINSTANCE glob_hinst; /* global instance for the dialogs */
45     HWND glob_hwnd; /* global window handle for the dialogs */
46     int scard_support = 0;
47 twoaday 415 int disable_hook = 0;
48 werner 36 int debug = 0;
49     int gpg_read_only = 0;
50     char gpgver[3];
51 twoaday 208 /* End */
52 werner 36
53    
54 twoaday 355 /* Retrieve the product verion of the given file @fname.
55     Format: MAJOR.MINOR.PATCH1.PATCH2
56     Return value: 0 on success. */
57     int
58     get_file_version (const char *fname, WORD *major, WORD *minor, WORD *patch1, WORD *patch2)
59     {
60     VS_FIXEDFILEINFO *inf;
61     char file[MAX_PATH+1] = {0};
62     LPVOID buf, data;
63     DWORD size;
64     UINT qlen;
65     int err = 0;
66    
67     strncpy (file, fname, MAX_PATH);
68     size = GetFileVersionInfoSize (file, NULL);
69     if (!size)
70     return -1;
71    
72     buf = (LPVOID)new char[size];
73     if (!buf)
74     BUG (NULL);
75     if (!GetFileVersionInfo (file, 0, size, buf)) {
76     err = -1;
77     goto fail;
78     }
79    
80     qlen = 0;
81     VerQueryValue (buf, (char*)"\\", &data, &qlen);
82     if (!qlen) {
83     err = -1;
84     goto fail;
85     }
86    
87     inf = (VS_FIXEDFILEINFO*)data;
88     *major = HIWORD (inf->dwProductVersionMS);
89     *minor = LOWORD (inf->dwProductVersionMS);
90     *patch1 = HIWORD (inf->dwProductVersionLS);
91     *patch2 = LOWORD (inf->dwProductVersionLS);
92    
93     fail:
94     delete [](char*)buf;
95     return err;
96     }
97    
98    
99 werner 36 /* Load the key cache and rebuild the signature cache. */
100 twoaday 255 int
101 werner 36 update_keycache (HWND hwnd)
102     {
103 twoaday 273 refresh_cache_s rcs;
104 twoaday 255
105 twoaday 273 /* no need to rebuild the sig cache each time. */
106     memset (&rcs, 0, sizeof (rcs));
107     rcs.kring_update = 1;
108 twoaday 407 int err = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,
109 werner 36 keycache_dlg_proc, (LPARAM)&rcs);
110 twoaday 255 if (err) {
111 twoaday 270 char *cfgf = get_gnupg_config ();
112     if (cfgf && check_gnupg_options (cfgf, 0) == WPTERR_FILE_EXIST)
113 twoaday 328 msg_box (GetDesktopWindow (),
114     _("The gpg.conf contains at least one argument which points to a non-existing file."), "WinPT", MB_ERR);
115 twoaday 270 free_if_alloc (cfgf);
116 twoaday 255 return -1;
117     }
118     return 0;
119 werner 36 }
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 twoaday 181 {
126 twoaday 328 static char buf[MAX_PATH+1];
127 twoaday 190
128     /* XXX: no gpgme.dbg is created. */
129     if (val > 0) {
130 twoaday 407 char tmp[128];
131 twoaday 271 GetTempPath (DIM (tmp)-1, tmp);
132     _snprintf (buf, DIM (buf)-1, "GPGME_DEBUG=5:%sgpgme.dbg", tmp);
133 twoaday 190 putenv (buf);
134     }
135 werner 36 else
136     putenv ("GPGME_DEBUG=");
137     }
138    
139    
140 twoaday 167 /* Return true if the GPG environment is useable. */
141     static bool
142     gpg_prefs_ok (void)
143     {
144 twoaday 328 char *p = get_reg_entry_gpg4win ("gpg.exe");
145 twoaday 167 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 twoaday 190 log_debug ("gpg_prefs_ok: could not locate gpg.exe");
151 twoaday 167 return false;
152     }
153     }
154     free_if_alloc (p);
155 twoaday 270 p = get_reg_entry_gpg4win (NULL);
156 twoaday 167 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 twoaday 190 log_debug ("gpg_prefs_ok: could not determine home directory");
162 twoaday 167 return false;
163     }
164     }
165     free_if_alloc (p);
166     return true;
167     }
168    
169    
170 twoaday 172 /* 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 twoaday 407
177     log_debug("check if there are gpg files with a read-only attribute");
178 twoaday 328 for (int i=0; files[i] != NULL; i++) {
179     char *file = make_filename (homedir, files[i], NULL);
180 twoaday 172 remove_crit_file_attrs (file, 0);
181     free_if_alloc (file);
182     }
183     }
184    
185    
186 twoaday 128 /* Load the GPG environment. On the first start, some
187     checks are performed to find out in what state GPG is.
188     Return value: 0 everything OK.
189     >0 fatal error.
190     -1 public keyring is empty or does not exist. */
191     static int
192     load_gpg_env (void)
193     {
194     SECURITY_ATTRIBUTES sec_attr;
195     char *p;
196     char *pkr;
197 twoaday 270 int err = 0;
198 twoaday 128
199     p = get_reg_entry_gpg4win ("gpg.exe");
200     if (!p)
201     return (1);
202     if (file_exist_check (p)) {
203     free_if_alloc (p);
204     return (1);
205     }
206     free_if_alloc (p);
207 twoaday 167
208     p = get_reg_entry_gpg ("HomeDir");
209     if (!p || dir_exist_check (p) != 0) {
210     free_if_alloc (p);
211     p = multi_gnupg_path (0);
212     }
213 twoaday 128 if (p && dir_exist_check (p)) {
214     memset (&sec_attr, 0, sizeof (sec_attr));
215     sec_attr.nLength = sizeof (sec_attr);
216     if (!CreateDirectory (p, &sec_attr)) {
217 twoaday 328 msg_box (GetDesktopWindow (),
218     _("Could not create GPG home directory"),
219 twoaday 128 _("WinPT Error"), MB_ERR);
220     free_if_alloc (p);
221     return (2);
222     }
223     }
224 twoaday 172 check_readonly_attr (p);
225 twoaday 128 pkr = make_filename (p, "pubring", "gpg");
226     free_if_alloc (p);
227 twoaday 270 if (get_file_size (pkr) == 0)
228     err = -1;
229     free_if_alloc (pkr);
230     return err;
231 twoaday 128 }
232    
233 twoaday 133
234 werner 36 /* check if the default key from the gpg.conf file is available in the
235     keyring. if not, bail out because encryption won't work properly then. */
236     static int
237 twoaday 273 check_default_key (void)
238 werner 36 {
239     gpgme_key_t key;
240 twoaday 193 gpgme_error_t err = gpg_error (GPG_ERR_NO_ERROR);
241 twoaday 273 gpg_keycache_t kc;
242 twoaday 128 char *defkey;
243 werner 36
244 twoaday 273 kc = keycache_get_ctx (0);
245 werner 36 defkey = get_gnupg_default_key ();
246 twoaday 328 if (defkey != NULL) {
247 werner 36 err = gpg_keycache_find_key (kc, defkey, 0, &key);
248 twoaday 273 if (err) {
249     free_if_alloc (defkey);
250     return -1;
251     }
252     }
253     else {
254     /* Actually this is just a warning but we still continue. */
255 twoaday 328 msg_box (GetDesktopWindow (), _("No useable secret key found."),
256 twoaday 217 _("WinPT Warning"), MB_WARN);
257 twoaday 273 return 0;
258     }
259    
260     /* Because the secret key listing has no information
261     about the validity/status, we need to check the public key. */
262     kc = keycache_get_ctx (1);
263     if (!gpg_keycache_find_key (kc, defkey, 0, &key) &&
264     (key->revoked || key->expired)) {
265 twoaday 328 msg_box (GetDesktopWindow (), _("Default secret key is unuseable"),
266 twoaday 273 _("WinPT Warning"), MB_ERR);
267     free_if_alloc (defkey);
268     return -1;
269     }
270 werner 36 free_if_alloc (defkey);
271 twoaday 273 return 0;
272 werner 36 }
273    
274    
275     /* Check that the underlying crypto engine fullfills the minimal
276     requirements so all commands work properly. */
277 twoaday 128 static bool
278 werner 36 check_crypto_engine (void)
279     {
280 twoaday 193 int ma = 0, mi = 0, pa = 0;
281 werner 36 int rc;
282    
283 twoaday 137 rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);
284 werner 36 if (rc == -1) {
285 twoaday 328 msg_box (GetDesktopWindow (), _("Could not read GnuPG version."),
286 werner 36 _("WinPT Error"), MB_ERR);
287 twoaday 128 return false;
288 werner 36 }
289     else if (rc) {
290     log_box (_("WinPT Error"), MB_ERR,
291 twoaday 278 _("A newer GPG version is needed.\n"
292     "Current GPG version %d.%d.%d, required "NEED_GPG_VERSION),
293 werner 36 ma, mi, pa);
294 twoaday 128 return false;
295 werner 36 }
296 twoaday 328
297     // TODO: smart card support needs to be revamped
298     // and adjusted according to newer OpenPGP cards.
299     /*
300 twoaday 262 if ((ma > 1 || pa >= 4) && pcsc_available ())
301 werner 36 scard_support = 1;
302 twoaday 328 */
303     scard_support = 0;
304    
305 werner 36 gpgver[0] = ma;
306     gpgver[1] = mi;
307     gpgver[2] = pa;
308 twoaday 128 return true;
309 werner 36 }
310    
311    
312    
313 twoaday 133 /* Check if both keyrings are empty. This indicates that
314     WinPT should offer to generate a key pair. */
315     static bool
316     check_for_empty_keyrings (bool pub_only)
317     {
318     char *p;
319 twoaday 328 int n;
320 twoaday 133
321 twoaday 328 n=0;
322 twoaday 133 p = get_gnupg_keyring (1, 0);
323     if (file_exist_check (p) == 0 && get_file_size (p) == 0)
324     n++;
325     free_if_alloc (p);
326     if (pub_only)
327     return n == 1? true : false;
328     p = get_gnupg_keyring (0, 0);
329     if (file_exist_check (p) == 0 && get_file_size (p) == 0)
330     n++;
331     free_if_alloc (p);
332     return n==2? true : false;
333     }
334    
335    
336 twoaday 271
337 twoaday 190 /* Display info message that WinPT is now in debug mode. */
338     void
339     winpt_debug_msg (void)
340     {
341     char output[512];
342 twoaday 328 char temp[MAX_PATH+1];
343 twoaday 190
344 twoaday 407 GetTempPath (DIM (temp) - 1, temp);
345 twoaday 271 _snprintf (output, DIM (output)-1,
346 twoaday 190 "The GPGME output file is %sgpgme.dbg\n"
347     "The WinPT output file is %swinpt.log\n", temp, temp);
348     MessageBox (NULL, output, "WinPT now runs in DEBUG MODE", MB_INFO);
349     }
350    
351    
352 twoaday 217 /* Search for insecure ElGamal keys and return the
353     number of founded keys. */
354     static int
355     count_insecure_elgkeys (void)
356     {
357     gpg_keycache_t pc;
358     gpgme_key_t key;
359 twoaday 208
360 twoaday 407 int n = 0;
361 twoaday 217 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 twoaday 337 /* 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 twoaday 409
379 twoaday 337 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 werner 36 /* 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 twoaday 121 MSG msg;
400     HWND hwnd = NULL;
401 twoaday 248 WORD ver[3], ptdver[4];
402 twoaday 337
403 twoaday 248 const char *s;
404 twoaday 121 int rc, ec, created = 0;
405 werner 36 int first_start = 0, start_gpgprefs = 0;
406     int winpt_inst_found = 0;
407 twoaday 248 int start_manager = 0;
408 twoaday 409
409     log_debug("check OS version");
410 twoaday 337 if (!check_os_version ())
411 twoaday 271 return 0;
412 twoaday 337
413 werner 36 glob_hinst = hinst;
414 twoaday 337
415     /* Allow to shutdown the process, for instance by an installer */
416 twoaday 87 if (cmdline && stristr (cmdline, "--stop")) {
417     hwnd = FindWindow ("WinPT", "WinPT");
418 twoaday 409 if (hwnd != NULL) {
419     log_debug("shutdown an existing WinPT process");
420 twoaday 87 PostMessage (hwnd, WM_DESTROY, 0, 0);
421 twoaday 409 }
422 twoaday 87 return 0;
423 twoaday 415 }
424    
425     /* KLUDGE: test if the hooking is causing problems with some AV programs */
426     if (cmdline && stristr (cmdline, "--disable-hook"))
427     disable_hook = 1;
428    
429 twoaday 121
430 twoaday 407 log_debug("check PTD and GPGME version");
431 twoaday 328 get_file_version ("winpt.exe", &ver[0], &ver[1], &ver[2], &ver[3]);
432 twoaday 337 ec = get_file_version ("PTD.dll", &ptdver[0], &ptdver[1], &ptdver[2], &ptdver[3]);
433     if (!ec && (ptdver[0] != ver[0] || ptdver[1] != ver[1] || ptdver[2] != ver[2])) {
434 twoaday 121 log_box (_("WinPT Error"), MB_ERR,
435     _("The PTD.dll file has a different version than WinPT.exe\n"
436     "Please update the PTD.dll to version %d.%d.%d"),
437     ver[0], ver[1], ver[2]);
438     return 0;
439     }
440 twoaday 128
441 twoaday 137 s = gpgme_check_version (NEED_GPGME_VERSION);
442 werner 36 if (!s || !*s) {
443 twoaday 337 msg_box (GetDesktopWindow (),
444 twoaday 328 _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),
445 werner 36 _("WinPT Error"), MB_ERR);
446     return 0;
447     }
448    
449     CreateMutex (NULL, TRUE, PGM_NAME);
450     if (GetLastError () == ERROR_ALREADY_EXISTS)
451     winpt_inst_found = 1;
452 twoaday 190
453 twoaday 328 gettext_set_user_domain ();
454 werner 36
455 twoaday 271 regist_inst_gnupg (1);
456     regist_inst_winpt (1, &created);
457 werner 36
458     if (!created) {
459     memset (&reg_prefs, 0, sizeof (reg_prefs));
460 twoaday 271 get_reg_winpt_prefs (&reg_prefs);
461 twoaday 328 reg_prefs.fm.progress = 0; /* TODO: fix the bug and enable it again */
462 twoaday 273 if (gnupg_load_config () == -2)
463 twoaday 328 msg_box (GetDesktopWindow (),
464     _("The gpg.conf file contains the 'textmode' option\n"
465     "which leads to broken binary output during decryption.\n"
466     "If this is on purpose, just continue otherwise the option should be disabled."),
467     _("WinPT Error"), MB_ERR);
468 werner 36 }
469    
470 twoaday 407 if (is_gpg4win_installed ()) {
471     log_debug("gpg4win: load gpg environment");
472 twoaday 328 load_gpg_env (); /* TODO: check return code. */
473 twoaday 407 }
474 twoaday 128
475 werner 36 rc = gnupg_check_homedir ();
476 twoaday 407 if (rc) {
477 werner 36 log_box (_("WinPT Error"), MB_ERR,
478     _("GPG home directory is not set correctly.\n"
479     "Please check the GPG registry settings:\n%s."),
480     winpt_strerror (rc));
481 werner 48 s = get_fileopen_dlg (GetActiveWindow (),
482 twoaday 121 _("Select GPG Public Keyring"),
483 twoaday 167 "GPG Keyrings (*.gpg)\0*.gpg\0\0",
484 twoaday 121 NULL);
485 twoaday 407
486     char * p;
487     if (s != NULL && (p = strrchr (s, '\\'))) {
488 twoaday 271 char *path = substr (s, 0, (p-s));
489    
490     set_reg_entry_gpg ("HomeDir", path);
491     free_if_alloc (path);
492 werner 36 }
493     else {
494 twoaday 328 msg_box (GetDesktopWindow (),
495     _("GPG home directory could not be determined."),
496 werner 36 _("WinPT Error"), MB_ERR);
497     goto start;
498     }
499     }
500    
501     rc = check_gnupg_prog ();
502     if (rc) {
503 twoaday 328 if (msg_box (GetDesktopWindow (),
504     _("Could not find the GPG binary (gpg.exe).\n"
505     "Do you want to start the GPG preferences to "
506     "correct this problem?"), _("WinPT Error"),
507     MB_INFO|MB_YESNO) == IDYES)
508 werner 36 start_gpgprefs = 1;
509 twoaday 121 else {
510 twoaday 328 msg_box (GetDesktopWindow (),
511     winpt_strerror (rc), _("WinPT Error"), MB_ERR);
512 werner 36 return 0;
513     }
514     }
515    
516     rc = gnupg_access_files ();
517     if (!start_gpgprefs && rc) {
518     if (rc == WPTERR_GPG_KEYRINGS || rc == WPTERR_GPG_OPT_KEYRINGS) {
519 twoaday 328 ec = msg_box (GetDesktopWindow (),
520 werner 36 _("Could not access and/or find the public and secret keyring.\n"
521     "If this is an accident, quit the program and fix it.\n\n"
522 twoaday 248 "Continue if you want WinPT to offer you more choices.\n"),
523 werner 36 "WinPT", MB_INFO|MB_YESNO);
524     if (ec == IDYES)
525     first_start = 1;
526     }
527     if (!first_start) {
528 twoaday 328 msg_box (GetDesktopWindow (), winpt_strerror (rc), _("WinPT Error"), MB_ERR);
529 werner 36 return 0;
530     }
531     }
532 twoaday 133 if (check_for_empty_keyrings (false))
533     first_start = 1;
534 werner 36
535     if (!first_start) {
536     rc = gpg_check_permissions (1);
537 twoaday 271 if (rc && rc == 2) /* 2 means read-only mode. */
538 werner 36 gpg_read_only = 1;
539     else if (rc)
540     return 0;
541     }
542 twoaday 121
543 werner 36 init_gnupg_table ();
544    
545 twoaday 121 if (fm_parse_command_line (cmdline) > 0) {
546 werner 36 free_gnupg_table ();
547     return 0;
548     }
549    
550 twoaday 328 rc = kserver_load_conf ();
551     if (rc)
552     msg_box (GetDesktopWindow (), winpt_strerror (rc),
553     _("Keyserver"), MB_ERR);
554 werner 36
555     if (cmdline && (stristr (cmdline, "--keymanager")
556     || stristr (cmdline, "--cardmanager"))) {
557 twoaday 102 /* If an instance of WinPT is running, just send the command
558 twoaday 270 to open the key manager. Otherwise start a new instance. */
559 twoaday 102 HWND tray = FindWindow ("WinPT", "WinPT");
560 twoaday 121 if (stristr (cmdline, "keymanager"))
561     start_manager = ID_WINPT_KEY;
562     else
563     start_manager = ID_WINPT_CARD;
564 twoaday 102 if (tray != NULL) {
565 twoaday 121 PostMessage (tray, WM_COMMAND, start_manager, 0);
566 twoaday 102 free_gnupg_table ();
567     return 0;
568     }
569 werner 36 }
570    
571     /* If we found another WinPT instance, just quit to avoid it
572     will be executed twice. */
573     if (winpt_inst_found) {
574     log_debug ("%s", "WinMain: WinPT is already running.");
575     free_gnupg_table ();
576     return 0;
577     }
578    
579 twoaday 190 if (cmdline && (stristr (cmdline, "--enable-debug") ||
580     stristr (cmdline, "--debug"))) {
581     gpg_set_debug_mode (1);
582     winpt_debug_msg ();
583     debug = 1;
584 werner 36 }
585    
586     wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
587     rc = RegisterClass (&wc);
588     if (rc == FALSE) {
589 twoaday 337 msg_box (GetDesktopWindow (), _("Could not register window class"),
590 werner 36 _("WinPT Error"), MB_ERR);
591     free_gnupg_table ();
592     return 0;
593     }
594    
595     hwnd = CreateWindow (PGM_NAME,
596     PGM_NAME,
597     0, 0, 0, 0, 0,
598     NULL,
599     NULL,
600     hinst,
601     NULL);
602     if (hwnd == NULL) {
603 twoaday 337 msg_box (GetDesktopWindow (),
604 twoaday 328 _("Could not create window"),
605     _("WinPT Error"), MB_ERR);
606 werner 36 free_gnupg_table ();
607     return 0;
608     }
609     glob_hwnd = hwnd;
610     UpdateWindow (hwnd);
611    
612     if (!first_start && !start_gpgprefs) {
613 twoaday 407 log_debug("backup gpg config file and check back-end");
614 werner 36 gnupg_backup_options ();
615 twoaday 128 if (!check_crypto_engine ()) {
616 werner 36 DestroyWindow (hwnd);
617     free_gnupg_table ();
618     return 0;
619     }
620     }
621    
622     if (start_gpgprefs) {
623     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
624 twoaday 41 gpgprefs_dlg_proc, 0);
625 twoaday 133 if (check_for_empty_keyrings (true))
626 twoaday 271 first_start = 1; /* The public keyring is empty. */
627 werner 36 }
628    
629     if (first_start) {
630     struct genkey_s c;
631 twoaday 167 int choice;
632 werner 36 HWND h;
633     start:
634     h = GetDesktopWindow ();
635 twoaday 167 if (!gpg_prefs_ok ())
636     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
637 twoaday 41 gpgprefs_dlg_proc, 0);
638 twoaday 167 choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
639     first_run_dlg_proc, 0);
640     switch (choice) {
641 werner 36 case SETUP_KEYGEN:
642     c.interactive = 1;
643     c.first_start = 1;
644     rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD,
645     h, keygen_wizard_dlg_proc, (LPARAM)&c);
646     if (!rc)
647     goto start;
648     break;
649    
650     case SETUP_IMPORT:
651     rc = gnupg_copy_keyrings ();
652     if (rc) {
653     msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
654     goto start;
655     }
656     break;
657    
658 twoaday 333 case SETUP_EXISTING:
659     rc = gnupg_import_keypair ();
660     if (rc) {
661     msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
662     goto start;
663     }
664     break;
665    
666 twoaday 260 case SETUP_CARDGEN:
667     rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN,
668     h, card_keygen_dlg_proc, 0);
669     if (!rc)
670     goto start;
671     break;
672    
673 twoaday 167 case 0: /* Cancel/Abort. */
674     default:
675 werner 36 DestroyWindow (hwnd);
676     free_gnupg_table ();
677     return 0;
678     }
679     update_keycache (hwnd);
680 twoaday 167 if (!check_crypto_engine ()) {
681     DestroyWindow (hwnd);
682     free_gnupg_table ();
683 twoaday 255 keycache_release (1);
684 twoaday 167 return 0;
685     }
686 werner 36 }
687     else {
688 twoaday 273 gpg_keycache_t c;
689 twoaday 255 if (update_keycache (hwnd)) {
690     DestroyWindow (hwnd);
691     free_gnupg_table ();
692     keycache_release (1);
693     return 0;
694     }
695 twoaday 271 /* XXX: rewrite this part. */
696 werner 36 c = keycache_get_ctx (1);
697 twoaday 255 if (!gpg_keycache_get_size (c)) {
698 werner 36 msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
699     "Please check your GPG config (keyrings, pathes...)"),
700     _("WinPT Error"), MB_ERR);
701 twoaday 328 ec = msg_box (GetDesktopWindow (),
702     _("It seems that GPG is not configured properly.\n"
703     "Do you want to start the GPG preferences dialog?"),
704     "WinPT", MB_INFO|MB_YESNO);
705 werner 36 if (ec == IDYES) {
706     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
707 twoaday 41 gpgprefs_dlg_proc, 0);
708 werner 36 update_keycache (hwnd);
709     }
710     else {
711     DestroyWindow (hwnd);
712     free_gnupg_table ();
713 twoaday 255 keycache_release (1);
714 werner 36 return 0;
715     }
716 twoaday 273 }
717     if (check_default_key ()) {
718 twoaday 121 char *p = get_gnupg_default_key ();
719 twoaday 273 log_box (_("WinPT Error"), MB_ERR,
720     _("Default key (from the GPG config file) could not be found or is unuseable.\n"
721     "The default key will be resetted and can be set later in the Key Manager again.\n\n"
722     "%s: secret key not found."), p? p : "?");
723 twoaday 197 set_gnupg_default_key (NULL);
724 twoaday 273 free_if_alloc (p);
725 werner 36 }
726     if (count_insecure_elgkeys ())
727     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,
728 twoaday 41 elgamal_warn_dlg_proc, 0);
729 werner 36 }
730 twoaday 328
731 twoaday 121 if (start_manager)
732     PostMessage (hwnd, WM_COMMAND, start_manager, 0);
733    
734 werner 36 accel_tab = LoadAccelerators (glob_hinst, (LPCTSTR)IDR_WINPT_ACCELERATOR);
735     keyring_check_last_access (); /* init */
736     while (GetMessage (&msg, hwnd, 0, 0)) {
737     if (!TranslateAccelerator (msg.hwnd, accel_tab, &msg)) {
738     TranslateMessage (&msg);
739     DispatchMessage (&msg);
740     }
741     }
742 twoaday 328
743 werner 36 return 0;
744     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26