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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


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

       * wptGPG.cpp (check_keyring): Improved error checking.
       * wptFileManager.cpp: Removed obsolete code.
		

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 twoaday 409
378 twoaday 337 if (!GetVersionEx (&osver)) {
379     MessageBox (NULL, _("Could not read the OS version."), _("WinPT Error"), MB_ERR);
380     return 0;
381     }
382    
383     if (osver.dwMajorVersion < 5 ||
384     (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 0)) {
385     MessageBox (NULL, _("WinPT requires Windows XP or higher."), _("WinPT Error"), MB_ERR);
386     return 0;
387     }
388    
389     return 1;
390     }
391    
392 werner 36 /* Main entry point. */
393     int WINAPI
394     WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
395     {
396     WNDCLASS wc = {0, winpt_main_proc, 0, 0, hinst, 0, 0, 0, 0, PGM_NAME};
397     HACCEL accel_tab;
398 twoaday 121 MSG msg;
399     HWND hwnd = NULL;
400 twoaday 248 WORD ver[3], ptdver[4];
401 twoaday 337
402 twoaday 248 const char *s;
403 twoaday 121 int rc, ec, created = 0;
404 werner 36 int first_start = 0, start_gpgprefs = 0;
405     int winpt_inst_found = 0;
406 twoaday 248 int start_manager = 0;
407 twoaday 409
408     log_debug("check OS version");
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 twoaday 409 if (hwnd != NULL) {
418     log_debug("shutdown an existing WinPT process");
419 twoaday 87 PostMessage (hwnd, WM_DESTROY, 0, 0);
420 twoaday 409 }
421 twoaday 87 return 0;
422 twoaday 328 }
423 twoaday 121
424 twoaday 407 log_debug("check PTD and GPGME version");
425 twoaday 328 get_file_version ("winpt.exe", &ver[0], &ver[1], &ver[2], &ver[3]);
426 twoaday 337 ec = get_file_version ("PTD.dll", &ptdver[0], &ptdver[1], &ptdver[2], &ptdver[3]);
427     if (!ec && (ptdver[0] != ver[0] || ptdver[1] != ver[1] || ptdver[2] != ver[2])) {
428 twoaday 121 log_box (_("WinPT Error"), MB_ERR,
429     _("The PTD.dll file has a different version than WinPT.exe\n"
430     "Please update the PTD.dll to version %d.%d.%d"),
431     ver[0], ver[1], ver[2]);
432     return 0;
433     }
434 twoaday 128
435 twoaday 137 s = gpgme_check_version (NEED_GPGME_VERSION);
436 werner 36 if (!s || !*s) {
437 twoaday 337 msg_box (GetDesktopWindow (),
438 twoaday 328 _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),
439 werner 36 _("WinPT Error"), MB_ERR);
440     return 0;
441     }
442    
443     CreateMutex (NULL, TRUE, PGM_NAME);
444     if (GetLastError () == ERROR_ALREADY_EXISTS)
445     winpt_inst_found = 1;
446 twoaday 190
447 twoaday 328 gettext_set_user_domain ();
448 werner 36
449 twoaday 271 regist_inst_gnupg (1);
450     regist_inst_winpt (1, &created);
451 werner 36
452     if (!created) {
453     memset (&reg_prefs, 0, sizeof (reg_prefs));
454 twoaday 271 get_reg_winpt_prefs (&reg_prefs);
455 twoaday 328 reg_prefs.fm.progress = 0; /* TODO: fix the bug and enable it again */
456 twoaday 273 if (gnupg_load_config () == -2)
457 twoaday 328 msg_box (GetDesktopWindow (),
458     _("The gpg.conf file contains the 'textmode' option\n"
459     "which leads to broken binary output during decryption.\n"
460     "If this is on purpose, just continue otherwise the option should be disabled."),
461     _("WinPT Error"), MB_ERR);
462 werner 36 }
463    
464 twoaday 407 if (is_gpg4win_installed ()) {
465     log_debug("gpg4win: load gpg environment");
466 twoaday 328 load_gpg_env (); /* TODO: check return code. */
467 twoaday 407 }
468 twoaday 128
469 werner 36 rc = gnupg_check_homedir ();
470 twoaday 407 if (rc) {
471 werner 36 log_box (_("WinPT Error"), MB_ERR,
472     _("GPG home directory is not set correctly.\n"
473     "Please check the GPG registry settings:\n%s."),
474     winpt_strerror (rc));
475 werner 48 s = get_fileopen_dlg (GetActiveWindow (),
476 twoaday 121 _("Select GPG Public Keyring"),
477 twoaday 167 "GPG Keyrings (*.gpg)\0*.gpg\0\0",
478 twoaday 121 NULL);
479 twoaday 407
480     char * p;
481     if (s != NULL && (p = strrchr (s, '\\'))) {
482 twoaday 271 char *path = substr (s, 0, (p-s));
483    
484     set_reg_entry_gpg ("HomeDir", path);
485     free_if_alloc (path);
486 werner 36 }
487     else {
488 twoaday 328 msg_box (GetDesktopWindow (),
489     _("GPG home directory could not be determined."),
490 werner 36 _("WinPT Error"), MB_ERR);
491     goto start;
492     }
493     }
494    
495     rc = check_gnupg_prog ();
496     if (rc) {
497 twoaday 328 if (msg_box (GetDesktopWindow (),
498     _("Could not find the GPG binary (gpg.exe).\n"
499     "Do you want to start the GPG preferences to "
500     "correct this problem?"), _("WinPT Error"),
501     MB_INFO|MB_YESNO) == IDYES)
502 werner 36 start_gpgprefs = 1;
503 twoaday 121 else {
504 twoaday 328 msg_box (GetDesktopWindow (),
505     winpt_strerror (rc), _("WinPT Error"), MB_ERR);
506 werner 36 return 0;
507     }
508     }
509    
510     rc = gnupg_access_files ();
511     if (!start_gpgprefs && rc) {
512     if (rc == WPTERR_GPG_KEYRINGS || rc == WPTERR_GPG_OPT_KEYRINGS) {
513 twoaday 328 ec = msg_box (GetDesktopWindow (),
514 werner 36 _("Could not access and/or find the public and secret keyring.\n"
515     "If this is an accident, quit the program and fix it.\n\n"
516 twoaday 248 "Continue if you want WinPT to offer you more choices.\n"),
517 werner 36 "WinPT", MB_INFO|MB_YESNO);
518     if (ec == IDYES)
519     first_start = 1;
520     }
521     if (!first_start) {
522 twoaday 328 msg_box (GetDesktopWindow (), winpt_strerror (rc), _("WinPT Error"), MB_ERR);
523 werner 36 return 0;
524     }
525     }
526 twoaday 133 if (check_for_empty_keyrings (false))
527     first_start = 1;
528 werner 36
529     if (!first_start) {
530     rc = gpg_check_permissions (1);
531 twoaday 271 if (rc && rc == 2) /* 2 means read-only mode. */
532 werner 36 gpg_read_only = 1;
533     else if (rc)
534     return 0;
535     }
536 twoaday 121
537 werner 36 init_gnupg_table ();
538    
539 twoaday 121 if (fm_parse_command_line (cmdline) > 0) {
540 werner 36 free_gnupg_table ();
541     return 0;
542     }
543    
544 twoaday 328 rc = kserver_load_conf ();
545     if (rc)
546     msg_box (GetDesktopWindow (), winpt_strerror (rc),
547     _("Keyserver"), MB_ERR);
548 werner 36
549     if (cmdline && (stristr (cmdline, "--keymanager")
550     || stristr (cmdline, "--cardmanager"))) {
551 twoaday 102 /* If an instance of WinPT is running, just send the command
552 twoaday 270 to open the key manager. Otherwise start a new instance. */
553 twoaday 102 HWND tray = FindWindow ("WinPT", "WinPT");
554 twoaday 121 if (stristr (cmdline, "keymanager"))
555     start_manager = ID_WINPT_KEY;
556     else
557     start_manager = ID_WINPT_CARD;
558 twoaday 102 if (tray != NULL) {
559 twoaday 121 PostMessage (tray, WM_COMMAND, start_manager, 0);
560 twoaday 102 free_gnupg_table ();
561     return 0;
562     }
563 werner 36 }
564    
565     /* If we found another WinPT instance, just quit to avoid it
566     will be executed twice. */
567     if (winpt_inst_found) {
568     log_debug ("%s", "WinMain: WinPT is already running.");
569     free_gnupg_table ();
570     return 0;
571     }
572    
573 twoaday 190 if (cmdline && (stristr (cmdline, "--enable-debug") ||
574     stristr (cmdline, "--debug"))) {
575     gpg_set_debug_mode (1);
576     winpt_debug_msg ();
577     debug = 1;
578 werner 36 }
579    
580     wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
581     rc = RegisterClass (&wc);
582     if (rc == FALSE) {
583 twoaday 337 msg_box (GetDesktopWindow (), _("Could not register window class"),
584 werner 36 _("WinPT Error"), MB_ERR);
585     free_gnupg_table ();
586     return 0;
587     }
588    
589     hwnd = CreateWindow (PGM_NAME,
590     PGM_NAME,
591     0, 0, 0, 0, 0,
592     NULL,
593     NULL,
594     hinst,
595     NULL);
596     if (hwnd == NULL) {
597 twoaday 337 msg_box (GetDesktopWindow (),
598 twoaday 328 _("Could not create window"),
599     _("WinPT Error"), MB_ERR);
600 werner 36 free_gnupg_table ();
601     return 0;
602     }
603     glob_hwnd = hwnd;
604     UpdateWindow (hwnd);
605    
606     if (!first_start && !start_gpgprefs) {
607 twoaday 407 log_debug("backup gpg config file and check back-end");
608 werner 36 gnupg_backup_options ();
609 twoaday 128 if (!check_crypto_engine ()) {
610 werner 36 DestroyWindow (hwnd);
611     free_gnupg_table ();
612     return 0;
613     }
614     }
615    
616     if (start_gpgprefs) {
617     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
618 twoaday 41 gpgprefs_dlg_proc, 0);
619 twoaday 133 if (check_for_empty_keyrings (true))
620 twoaday 271 first_start = 1; /* The public keyring is empty. */
621 werner 36 }
622    
623     if (first_start) {
624     struct genkey_s c;
625 twoaday 167 int choice;
626 werner 36 HWND h;
627     start:
628     h = GetDesktopWindow ();
629 twoaday 167 if (!gpg_prefs_ok ())
630     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
631 twoaday 41 gpgprefs_dlg_proc, 0);
632 twoaday 167 choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
633     first_run_dlg_proc, 0);
634     switch (choice) {
635 werner 36 case SETUP_KEYGEN:
636     c.interactive = 1;
637     c.first_start = 1;
638     rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD,
639     h, keygen_wizard_dlg_proc, (LPARAM)&c);
640     if (!rc)
641     goto start;
642     break;
643    
644     case SETUP_IMPORT:
645     rc = gnupg_copy_keyrings ();
646     if (rc) {
647     msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
648     goto start;
649     }
650     break;
651    
652 twoaday 333 case SETUP_EXISTING:
653     rc = gnupg_import_keypair ();
654     if (rc) {
655     msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
656     goto start;
657     }
658     break;
659    
660 twoaday 260 case SETUP_CARDGEN:
661     rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN,
662     h, card_keygen_dlg_proc, 0);
663     if (!rc)
664     goto start;
665     break;
666    
667 twoaday 167 case 0: /* Cancel/Abort. */
668     default:
669 werner 36 DestroyWindow (hwnd);
670     free_gnupg_table ();
671     return 0;
672     }
673     update_keycache (hwnd);
674 twoaday 167 if (!check_crypto_engine ()) {
675     DestroyWindow (hwnd);
676     free_gnupg_table ();
677 twoaday 255 keycache_release (1);
678 twoaday 167 return 0;
679     }
680 werner 36 }
681     else {
682 twoaday 273 gpg_keycache_t c;
683 twoaday 255 if (update_keycache (hwnd)) {
684     DestroyWindow (hwnd);
685     free_gnupg_table ();
686     keycache_release (1);
687     return 0;
688     }
689 twoaday 271 /* XXX: rewrite this part. */
690 werner 36 c = keycache_get_ctx (1);
691 twoaday 255 if (!gpg_keycache_get_size (c)) {
692 werner 36 msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
693     "Please check your GPG config (keyrings, pathes...)"),
694     _("WinPT Error"), MB_ERR);
695 twoaday 328 ec = msg_box (GetDesktopWindow (),
696     _("It seems that GPG is not configured properly.\n"
697     "Do you want to start the GPG preferences dialog?"),
698     "WinPT", MB_INFO|MB_YESNO);
699 werner 36 if (ec == IDYES) {
700     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
701 twoaday 41 gpgprefs_dlg_proc, 0);
702 werner 36 update_keycache (hwnd);
703     }
704     else {
705     DestroyWindow (hwnd);
706     free_gnupg_table ();
707 twoaday 255 keycache_release (1);
708 werner 36 return 0;
709     }
710 twoaday 273 }
711     if (check_default_key ()) {
712 twoaday 121 char *p = get_gnupg_default_key ();
713 twoaday 273 log_box (_("WinPT Error"), MB_ERR,
714     _("Default key (from the GPG config file) could not be found or is unuseable.\n"
715     "The default key will be resetted and can be set later in the Key Manager again.\n\n"
716     "%s: secret key not found."), p? p : "?");
717 twoaday 197 set_gnupg_default_key (NULL);
718 twoaday 273 free_if_alloc (p);
719 werner 36 }
720     if (count_insecure_elgkeys ())
721     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,
722 twoaday 41 elgamal_warn_dlg_proc, 0);
723 werner 36 }
724 twoaday 328
725 twoaday 121 if (start_manager)
726     PostMessage (hwnd, WM_COMMAND, start_manager, 0);
727    
728 werner 36 accel_tab = LoadAccelerators (glob_hinst, (LPCTSTR)IDR_WINPT_ACCELERATOR);
729     keyring_check_last_access (); /* init */
730     while (GetMessage (&msg, hwnd, 0, 0)) {
731     if (!TranslateAccelerator (msg.hwnd, accel_tab, &msg)) {
732     TranslateMessage (&msg);
733     DispatchMessage (&msg);
734     }
735     }
736 twoaday 328
737 werner 36 return 0;
738     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26