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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 355 - (hide annotations)
Sat Dec 3 18:59:01 2011 UTC (13 years, 2 months ago) by twoaday
File size: 19132 byte(s)
2011-12-04  Timo Schulz  <twoaday@gmx.net>

        * WinPT.cpp (get_file_version): New.
	Improved error handling.
		

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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26