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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 417 - (hide annotations)
Thu Feb 16 19:50:32 2012 UTC (13 years ago) by twoaday
File size: 20007 byte(s)


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26