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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 407 - (hide annotations)
Mon Feb 6 19:26:03 2012 UTC (13 years ago) by twoaday
File size: 19390 byte(s)
2012-02-06  Timo Schulz  <twoaday@gmx.net>

        * wptNLS.cpp (gettext_free_current_domain): Replace free()
	        with safe_free():
        * WinPT.cpp: Use log_debug to improve bug tracking capabilities.


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26