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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 419 - (hide annotations)
Sat Mar 3 19:56:06 2012 UTC (12 years, 11 months ago) by twoaday
File size: 19902 byte(s)
2012-03-03  Timo Schulz  <twoaday@gmx.net>

        * WinPT.cpp (get_file_version): Improved error checking.
	(gpg_set_debug_mode): Likewise.
		

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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26