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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 270 - (hide annotations)
Sat Oct 21 18:08:57 2006 UTC (18 years, 4 months ago) by twoaday
File size: 20678 byte(s)


1 werner 36 /* WinPT.cpp - Windows Privacy Tray (WinPT)
2 twoaday 133 * Copyright (C) 2000-2006 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     * You should have received a copy of the GNU General Public License
17     * along with WinPT; if not, write to the Free Software Foundation,
18     * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19     */
20 werner 42 #ifdef HAVE_CONFIG_H
21     #include <config.h>
22     #endif
23    
24 werner 36 #include <windows.h>
25 twoaday 154 #include <shlobj.h>
26 werner 36
27 werner 47 #include "resource.h"
28 werner 36 #include "wptTypes.h"
29     #include "wptW32API.h"
30     #include "wptVersion.h"
31     #include "wptErrors.h"
32     #include "wptGPG.h"
33     #include "wptRegistry.h"
34     #include "wptCommonCtl.h"
35     #include "wptDlgs.h"
36     #include "wptNLS.h"
37     #include "wptKeyserver.h"
38     #include "wptCard.h"
39     #include "wptFileManager.h"
40     #include "wptContext.h"
41     #include "wptCardEdit.h"
42 werner 48 #include "wptCrypto.h"
43 twoaday 190 #include "wptUTF8.h"
44 werner 36
45 twoaday 172 void remove_crit_file_attrs (const char *fname, int force);
46 twoaday 208 BOOL user_is_admin (void);
47 twoaday 262 extern "C" int pcsc_available (void);
48 twoaday 154
49 twoaday 208 /* Global variables. */
50 werner 36 HINSTANCE glob_hinst; /* global instance for the dialogs */
51     HWND glob_hwnd; /* global window handle for the dialogs */
52     int scard_support = 0;
53     int debug = 0;
54 twoaday 190 int mobile_mode_active = 0;
55 werner 36 int gpg_read_only = 0;
56 twoaday 208 int admin_user = 0;
57 werner 36 char gpgver[3];
58 twoaday 208 /* End */
59 werner 36
60    
61     /* Load the key cache and rebuild the signature cache. */
62 twoaday 255 int
63 werner 36 update_keycache (HWND hwnd)
64     {
65 twoaday 255 int err;
66    
67 werner 36 refresh_cache_s rcs = {0};
68     rcs.kr_reload = 0;
69     rcs.kr_update = 1;
70     rcs.tr_update = 1;
71 twoaday 255 err = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,
72 werner 36 keycache_dlg_proc, (LPARAM)&rcs);
73 twoaday 255 if (err) {
74 twoaday 270 char *cfgf = get_gnupg_config ();
75     if (cfgf && check_gnupg_options (cfgf, 0) == WPTERR_FILE_EXIST)
76 twoaday 255 msg_box (NULL, _("The gpg.conf contains at least one argument which points to a non-existing file."), "WinPT", MB_ERR);
77 twoaday 270 free_if_alloc (cfgf);
78 twoaday 255 return -1;
79     }
80     return 0;
81 werner 36 }
82    
83    
84     /* Set GPGME debug mode. If @val is 0, the debug mode is disabled. */
85     void
86     gpg_set_debug_mode (int val)
87 twoaday 181 {
88 twoaday 190 static char buf[256];
89     char tmp[128];
90    
91     /* XXX: no gpgme.dbg is created. */
92     if (val > 0) {
93     GetTempPath (sizeof (tmp)-1, tmp);
94     _snprintf (buf, sizeof (buf)-1, "GPGME_DEBUG=5:%sgpgme.dbg", tmp);
95     putenv (buf);
96     }
97 werner 36 else
98     putenv ("GPGME_DEBUG=");
99     }
100    
101    
102     /* Initialize the gettext sub system. */
103     static void
104 twoaday 193 load_gettext (void)
105 werner 36 {
106 twoaday 270 char *nls;
107 werner 36
108 twoaday 193 /* Return the name of the gettext language file. */
109     nls = get_reg_entry_mo ();
110 twoaday 137 if (nls != NULL) {
111 werner 36 set_gettext_file ("winpt", nls);
112     free_if_alloc (nls);
113     }
114     }
115    
116    
117 twoaday 167 /* Return true if the GPG environment is useable. */
118     static bool
119     gpg_prefs_ok (void)
120     {
121     char *p;
122    
123     p = get_reg_entry_gpg4win ("gpg.exe");
124     if (!p || file_exist_check (p) != 0) {
125     free_if_alloc (p);
126     p = get_reg_entry_gpg ("gpgProgram");
127     if (!p || file_exist_check (p) != 0) {
128     free_if_alloc (p);
129 twoaday 190 log_debug ("gpg_prefs_ok: could not locate gpg.exe");
130 twoaday 167 return false;
131     }
132     }
133     free_if_alloc (p);
134 twoaday 270 p = get_reg_entry_gpg4win (NULL);
135 twoaday 167 if (!p || dir_exist_check (p) != 0) {
136     free_if_alloc (p);
137     p = get_reg_entry_gpg ("HomeDir");
138     if (!p || dir_exist_check (p) != 0) {
139     free_if_alloc (p);
140 twoaday 190 log_debug ("gpg_prefs_ok: could not determine home directory");
141 twoaday 167 return false;
142     }
143     }
144     free_if_alloc (p);
145     return true;
146     }
147    
148    
149 twoaday 172 /* Check gpg files if they are read-only and ask the user
150     if this should be corrected. */
151     static void
152     check_readonly_attr (const char *homedir)
153     {
154     const char *files[] = {"pubring.gpg", "secring.gpg", "trustdb.gpg", NULL};
155     char *file;
156     int i;
157 twoaday 167
158 twoaday 172 for (i=0; files[i] != NULL; i++) {
159     file = make_filename (homedir, files[i], NULL);
160     remove_crit_file_attrs (file, 0);
161     free_if_alloc (file);
162     }
163     }
164    
165    
166 twoaday 128 /* Load the GPG environment. On the first start, some
167     checks are performed to find out in what state GPG is.
168     Return value: 0 everything OK.
169     >0 fatal error.
170     -1 public keyring is empty or does not exist. */
171     static int
172     load_gpg_env (void)
173     {
174     SECURITY_ATTRIBUTES sec_attr;
175     char *p;
176     char *pkr;
177 twoaday 270 int err = 0;
178 twoaday 128
179     p = get_reg_entry_gpg4win ("gpg.exe");
180     if (!p)
181     return (1);
182     if (file_exist_check (p)) {
183     free_if_alloc (p);
184     return (1);
185     }
186     free_if_alloc (p);
187 twoaday 167
188     p = get_reg_entry_gpg ("HomeDir");
189     if (!p || dir_exist_check (p) != 0) {
190     free_if_alloc (p);
191     p = multi_gnupg_path (0);
192     }
193 twoaday 128 if (p && dir_exist_check (p)) {
194     memset (&sec_attr, 0, sizeof (sec_attr));
195     sec_attr.nLength = sizeof (sec_attr);
196     if (!CreateDirectory (p, &sec_attr)) {
197     msg_box (NULL, _("Could not create GPG home directory"),
198     _("WinPT Error"), MB_ERR);
199     free_if_alloc (p);
200     return (2);
201     }
202     }
203 twoaday 172 check_readonly_attr (p);
204 twoaday 128 pkr = make_filename (p, "pubring", "gpg");
205     free_if_alloc (p);
206 twoaday 270 if (get_file_size (pkr) == 0)
207     err = -1;
208     free_if_alloc (pkr);
209     return err;
210 twoaday 128 }
211    
212 twoaday 133
213 werner 36 /* check if the default key from the gpg.conf file is available in the
214     keyring. if not, bail out because encryption won't work properly then. */
215     static int
216     check_default_key (gpg_keycache_t kc)
217     {
218     gpgme_key_t key;
219 twoaday 193 gpgme_error_t err = gpg_error (GPG_ERR_NO_ERROR);
220 twoaday 128 char *defkey;
221 werner 36
222     defkey = get_gnupg_default_key ();
223     if (defkey)
224     err = gpg_keycache_find_key (kc, defkey, 0, &key);
225 twoaday 66 else
226 twoaday 121 msg_box (NULL, _("No useable secret key found."),
227 twoaday 217 _("WinPT Warning"), MB_WARN);
228 werner 36 free_if_alloc (defkey);
229     return err? -1 : 0;
230     }
231    
232    
233     /* Return the WinPT program file name (with full pathname). */
234 twoaday 121 static const char*
235 werner 36 get_prog_part (const char * fname, int use_cwd)
236     {
237 twoaday 270 static char program[2*MAX_PATH+1];
238     char currdir[MAX_PATH+1];
239 werner 36 char *cmd = NULL;
240     int j;
241    
242     memset (currdir, 0, DIM (currdir));
243     memset (program, 0, DIM (program));
244    
245     if (use_cwd) {
246     GetCurrentDirectory (DIM (currdir)-1, currdir);
247     _snprintf (program, DIM (program)-1, "%s\\%s", currdir, fname);
248     }
249     else {
250     cmd = GetCommandLine ();
251 twoaday 270 if (!cmd)
252 werner 36 return NULL;
253     strncpy (currdir, cmd, sizeof (currdir)-1);
254     j = strlen (currdir);
255     while (j--) {
256     if (currdir[j] == '\\')
257     break;
258     }
259     currdir[j] = 0;
260     _snprintf (program, DIM (program)-1, "%s\\%s", currdir + 1, fname);
261     }
262     return program;
263     }
264    
265    
266     /* Check that the underlying crypto engine fullfills the minimal
267     requirements so all commands work properly. */
268 twoaday 128 static bool
269 werner 36 check_crypto_engine (void)
270     {
271 twoaday 193 int ma = 0, mi = 0, pa = 0;
272 werner 36 int rc;
273    
274 twoaday 137 rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);
275 werner 36 if (rc == -1) {
276     msg_box (NULL, _("Could not read GnuPG version."),
277     _("WinPT Error"), MB_ERR);
278 twoaday 128 return false;
279 werner 36 }
280     else if (rc) {
281     log_box (_("WinPT Error"), MB_ERR,
282     _("Sorry, you need a newer GPG version.\n"
283 twoaday 137 "GPG version %d.%d.%d required GPG version "NEED_GPG_VERSION),
284 werner 36 ma, mi, pa);
285 twoaday 128 return false;
286 werner 36 }
287 twoaday 270 /* Enable smart card support for GPG 2 or >= 1.4 */
288 twoaday 262 if ((ma > 1 || pa >= 4) && pcsc_available ())
289 werner 36 scard_support = 1;
290    
291     gpgver[0] = ma;
292     gpgver[1] = mi;
293     gpgver[2] = pa;
294 twoaday 128 return true;
295 werner 36 }
296    
297    
298     /* Try to load the keyserver config file. If @quiet is 1
299     do not show any errors. */
300     static int
301     load_keyserver_conf (int quiet)
302 twoaday 248 {
303     const char *t, *conf;
304 twoaday 154 char *buf;
305 werner 36 int rc;
306    
307 twoaday 154 /* Create $APPDATA\winpt if needed. */
308     buf = make_special_filename (CSIDL_APPDATA, "winpt", NULL);
309     if (buf && dir_exist_check (buf) && !CreateDirectory (buf, NULL)) {
310     MessageBox (NULL, _("Failed to create WinPT directory"),
311     _("Keyserver"), MB_ERR);
312     free_if_alloc (buf);
313     return -1;
314     }
315     free_if_alloc (buf);
316    
317     /* Check for $APPDATA\winpt\keyserver.conf */
318     buf = make_special_filename (CSIDL_APPDATA, "winpt\\keyserver.conf", NULL);
319    
320 twoaday 193 conf = get_prog_part ("keyserver.conf", 0);
321     if (!file_exist_check (conf))
322     t = conf;
323 twoaday 154 else
324 werner 36 t = "keyserver.conf";
325 twoaday 154 if (file_exist_check (t) == 0 && file_exist_check (buf) != 0) {
326     if (!CopyFile (t, buf, FALSE)) {
327     MessageBox (NULL, _("Failed to copy the keyserver.conf"),
328     _("Keyserver"), MB_ERR);
329     free_if_alloc (buf);
330     return -1;
331     }
332     t = buf;
333     }
334     else
335     t = buf;
336    
337 werner 36 rc = kserver_load_conf (t);
338     if (rc && !quiet)
339     msg_box (NULL, winpt_strerror (rc), _("Keyserver"), MB_ERR);
340 twoaday 154 else {
341     free_if_alloc (reg_prefs.kserv_conf);
342     reg_prefs.kserv_conf = m_strdup (t);
343     }
344     free_if_alloc (buf);
345 werner 36 return rc;
346     }
347    
348    
349 twoaday 133 /* Check if both keyrings are empty. This indicates that
350     WinPT should offer to generate a key pair. */
351     static bool
352     check_for_empty_keyrings (bool pub_only)
353     {
354     char *p;
355     int n = 0;
356    
357     p = get_gnupg_keyring (1, 0);
358     if (file_exist_check (p) == 0 && get_file_size (p) == 0)
359     n++;
360     free_if_alloc (p);
361     if (pub_only)
362     return n == 1? true : false;
363     p = get_gnupg_keyring (0, 0);
364     if (file_exist_check (p) == 0 && get_file_size (p) == 0)
365     n++;
366     free_if_alloc (p);
367     return n==2? true : false;
368     }
369    
370    
371 werner 36 /* Enable the mobility mode. */
372 twoaday 190 static int
373 werner 36 enable_mobile_mode (void)
374     {
375 twoaday 190 if (dir_exist_check ("temp") != 0) {
376     if (!CreateDirectory ("temp", NULL)) {
377     MessageBox (NULL, "Could not create mobile temp directory",
378     "WinPT Mobile Error", MB_ERR);
379     return -1;
380     }
381     }
382    
383 werner 36 memset (&reg_prefs, 0, sizeof (reg_prefs));
384     reg_prefs.always_trust = 0;
385     reg_prefs.auto_backup = 0;
386     reg_prefs.cache_time = 0;
387     reg_prefs.expert = 0;
388     reg_prefs.kserv_conf = m_strdup ("keyserver.conf");
389     reg_prefs.no_zip_mmedia = 1;
390     reg_prefs.word_wrap = 80;
391     reg_prefs.use_viewer = 0; /* XXX */
392 twoaday 190 return 0;
393 werner 36 }
394    
395    
396 twoaday 181 void
397     set_default_keyserver (void)
398     {
399     char *host = get_reg_entry_keyserver ("Default");
400     char *str_port = get_reg_entry_keyserver ("Default_Port");
401     WORD port = HKP_PORT;
402    
403     if (!host)
404     keyserver_set_default (NULL, 0);
405     else {
406     if (str_port && *str_port)
407     port = atoi (str_port);
408     keyserver_set_default (host, port);
409     }
410     free_if_alloc (host);
411     free_if_alloc (str_port);
412     }
413    
414    
415 twoaday 190 /* Display info message that WinPT is now in debug mode. */
416     void
417     winpt_debug_msg (void)
418     {
419     char output[512];
420     char temp[128];
421    
422     GetTempPath (sizeof temp -1, temp);
423     _snprintf (output, sizeof output - 1,
424     "The GPGME output file is %sgpgme.dbg\n"
425     "The WinPT output file is %swinpt.log\n", temp, temp);
426     MessageBox (NULL, output, "WinPT now runs in DEBUG MODE", MB_INFO);
427     }
428    
429    
430 twoaday 217 /* Search for insecure ElGamal keys and return the
431     number of founded keys. */
432     static int
433     count_insecure_elgkeys (void)
434     {
435     gpg_keycache_t pc;
436     gpgme_key_t key;
437     int n = 0;
438 twoaday 208
439 twoaday 217 pc = keycache_get_ctx (1);
440     while (!gpg_keycache_next_key (pc, 0, &key)) {
441     if (key->subkeys->pubkey_algo == GPGME_PK_ELG)
442     n++;
443     }
444     gpg_keycache_rewind (pc);
445     return n;
446     }
447    
448    
449 werner 36 /* Main entry point. */
450     int WINAPI
451     WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
452     {
453     WNDCLASS wc = {0, winpt_main_proc, 0, 0, hinst, 0, 0, 0, 0, PGM_NAME};
454     HACCEL accel_tab;
455 twoaday 121 MSG msg;
456     HWND hwnd = NULL;
457 twoaday 248 WORD ver[3], ptdver[4];
458     const char *s;
459 twoaday 121 int rc, ec, created = 0;
460 werner 36 int first_start = 0, start_gpgprefs = 0;
461     int winpt_inst_found = 0;
462 twoaday 248 int start_manager = 0;
463 werner 36
464     glob_hinst = hinst;
465 twoaday 87 if (cmdline && stristr (cmdline, "--stop")) {
466     hwnd = FindWindow ("WinPT", "WinPT");
467     if (hwnd != NULL)
468     PostMessage (hwnd, WM_DESTROY, 0, 0);
469     return 0;
470     }
471 twoaday 121
472     #ifdef _DEBUG
473 werner 36 gpg_set_debug_mode (1);
474     debug = 1;
475 twoaday 121 #endif
476 werner 36
477 twoaday 121 get_file_version ("WinPT.exe", &ver[0], &ver[1], &ver[2], &ver[3]);
478 twoaday 248 ec = get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],
479 twoaday 121 &ptdver[2], &ptdver[3]);
480 twoaday 193
481 twoaday 270 if (!ec && (ptdver[0] != ver[0] ||
482     ptdver[1] != ver[1] ||
483     ptdver[2] != ver[2])) {
484 twoaday 121 log_box (_("WinPT Error"), MB_ERR,
485     _("The PTD.dll file has a different version than WinPT.exe\n"
486     "Please update the PTD.dll to version %d.%d.%d"),
487     ver[0], ver[1], ver[2]);
488     return 0;
489     }
490 twoaday 128
491 werner 36 if (gpg_md_selftest ()) {
492     msg_box (NULL, _("Cryptographic selftest failed."),
493     _("WinPT Error"), MB_ERR);
494     return 0;
495     }
496    
497 twoaday 137 s = gpgme_check_version (NEED_GPGME_VERSION);
498 werner 36 if (!s || !*s) {
499 twoaday 137 msg_box (NULL, _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),
500 werner 36 _("WinPT Error"), MB_ERR);
501     return 0;
502     }
503    
504     CreateMutex (NULL, TRUE, PGM_NAME);
505     if (GetLastError () == ERROR_ALREADY_EXISTS)
506     winpt_inst_found = 1;
507    
508     if (cmdline && stristr (cmdline, "--mobile")) {
509     msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",
510     "WinPT", MB_INFO);
511 twoaday 190 mobile_mode_active = 1;
512 werner 36 }
513 twoaday 190
514 twoaday 181 set_default_keyserver ();
515 twoaday 193 load_gettext ();
516 twoaday 208 admin_user = user_is_admin ();
517 werner 36
518 twoaday 190 if (!mobile_mode_active) {
519 werner 36 regist_inst_gnupg (1);
520     regist_inst_winpt (1, &created);
521     }
522     else {
523 twoaday 190 if (enable_mobile_mode ())
524     return 0;
525 werner 36 created = 1; /* Disable registry writing */
526     }
527    
528     if (!created) {
529     memset (&reg_prefs, 0, sizeof (reg_prefs));
530     reg_prefs.fm.progress = 0; /* XXX: fix the bug and enable it again */
531     get_reg_winpt_prefs (&reg_prefs);
532 twoaday 41 gnupg_load_config ();
533 werner 36 }
534    
535 twoaday 128 if (is_gpg4win_installed ())
536     load_gpg_env (); /* XXX: check return code. */
537    
538 werner 36 rc = gnupg_check_homedir ();
539     if (rc) {
540     log_box (_("WinPT Error"), MB_ERR,
541     _("GPG home directory is not set correctly.\n"
542     "Please check the GPG registry settings:\n%s."),
543     winpt_strerror (rc));
544 werner 48 s = get_fileopen_dlg (GetActiveWindow (),
545 twoaday 121 _("Select GPG Public Keyring"),
546 twoaday 167 "GPG Keyrings (*.gpg)\0*.gpg\0\0",
547 twoaday 121 NULL);
548 werner 36 if (s != NULL) {
549     size_t n;
550 twoaday 121 char *p = strrchr (s, '\\');
551 werner 36 if (!p)
552     BUG (0);
553     n = p - s;
554 twoaday 270 if (n > 0) {
555 twoaday 121 char *file = new char[n+1];
556 werner 36 if (!file)
557     BUG (NULL);
558     memset (file, 0, n);
559     memcpy (file, s, n);
560     file[n] = '\0';
561     set_reg_entry_gpg ("HomeDir", file);
562     free_if_alloc (file);
563     gnupg_check_homedir (); /* change gpgProgram if needed */
564     }
565     }
566     else {
567 twoaday 231 msg_box (NULL, _("GPG home directory could not be determined."),
568 werner 36 _("WinPT Error"), MB_ERR);
569     goto start;
570     }
571     }
572    
573     rc = check_gnupg_prog ();
574     if (rc) {
575     if (msg_box (NULL, _("Could not find the GPG binary (gpg.exe).\n"
576     "Do you want to start the GPG preferences to "
577     "correct this problem?"), _("WinPT Error"),
578     MB_INFO|MB_YESNO) == IDYES)
579     start_gpgprefs = 1;
580 twoaday 121 else {
581 werner 36 msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
582     return 0;
583     }
584     }
585    
586     rc = gnupg_access_files ();
587     if (!start_gpgprefs && rc) {
588     if (rc == WPTERR_GPG_KEYRINGS || rc == WPTERR_GPG_OPT_KEYRINGS) {
589     ec = msg_box (NULL,
590     _("Could not access and/or find the public and secret keyring.\n"
591     "If this is an accident, quit the program and fix it.\n\n"
592 twoaday 248 "Continue if you want WinPT to offer you more choices.\n"),
593 werner 36 "WinPT", MB_INFO|MB_YESNO);
594     if (ec == IDYES)
595     first_start = 1;
596     }
597     if (!first_start) {
598     msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
599     return 0;
600     }
601     }
602 twoaday 133 if (check_for_empty_keyrings (false))
603     first_start = 1;
604 werner 36
605     if (!first_start) {
606     rc = gpg_check_permissions (1);
607     if (rc && rc == 2)
608     gpg_read_only = 1;
609     else if (rc)
610     return 0;
611     }
612 twoaday 121
613 werner 36 init_gnupg_table ();
614    
615 twoaday 121 if (fm_parse_command_line (cmdline) > 0) {
616 werner 36 free_gnupg_table ();
617     return 0;
618     }
619    
620     if (cmdline && stristr (cmdline, "--wipe-freespace")) {
621     dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_SPACE_SECDEL,
622 twoaday 73 GetDesktopWindow(), space_wipefrees_dlg_proc, 0,
623 werner 36 _("Wipe Free Space"), IDS_WINPT_SPACE_SECDEL);
624     free_gnupg_table ();
625     return 0;
626     }
627    
628     load_keyserver_conf (cmdline? 1 : 0);
629    
630     if (cmdline && (stristr (cmdline, "--keymanager")
631     || stristr (cmdline, "--cardmanager"))) {
632 twoaday 102 /* If an instance of WinPT is running, just send the command
633 twoaday 270 to open the key manager. Otherwise start a new instance. */
634 twoaday 102 HWND tray = FindWindow ("WinPT", "WinPT");
635 twoaday 121 if (stristr (cmdline, "keymanager"))
636     start_manager = ID_WINPT_KEY;
637     else
638     start_manager = ID_WINPT_CARD;
639 twoaday 102 if (tray != NULL) {
640 twoaday 121 PostMessage (tray, WM_COMMAND, start_manager, 0);
641 twoaday 102 free_gnupg_table ();
642     return 0;
643     }
644 werner 36 }
645    
646     /* If we found another WinPT instance, just quit to avoid it
647     will be executed twice. */
648     if (winpt_inst_found) {
649     log_debug ("%s", "WinMain: WinPT is already running.");
650     free_gnupg_table ();
651     return 0;
652     }
653    
654 twoaday 190 if (cmdline && (stristr (cmdline, "--enable-debug") ||
655     stristr (cmdline, "--debug"))) {
656     gpg_set_debug_mode (1);
657     winpt_debug_msg ();
658     debug = 1;
659 werner 36 }
660    
661     wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
662     rc = RegisterClass (&wc);
663     if (rc == FALSE) {
664     msg_box (NULL, _("Could not register window class"),
665     _("WinPT Error"), MB_ERR);
666     free_gnupg_table ();
667     return 0;
668     }
669    
670     hwnd = CreateWindow (PGM_NAME,
671     PGM_NAME,
672     0, 0, 0, 0, 0,
673     NULL,
674     NULL,
675     hinst,
676     NULL);
677     if (hwnd == NULL) {
678     msg_box (NULL, _("Could not create window"), _("WinPT Error"), MB_ERR);
679     free_gnupg_table ();
680     return 0;
681     }
682     glob_hwnd = hwnd;
683     UpdateWindow (hwnd);
684    
685     if (!first_start && !start_gpgprefs) {
686     gnupg_backup_options ();
687 twoaday 128 if (!check_crypto_engine ()) {
688 werner 36 DestroyWindow (hwnd);
689     free_gnupg_table ();
690     return 0;
691     }
692     }
693    
694     if (start_gpgprefs) {
695     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
696 twoaday 41 gpgprefs_dlg_proc, 0);
697 twoaday 133 if (check_for_empty_keyrings (true))
698     first_start = 1; /* The public keyring is empty! */
699 werner 36 }
700    
701     if (first_start) {
702     struct genkey_s c;
703 twoaday 167 int choice;
704 werner 36 HWND h;
705     start:
706     h = GetDesktopWindow ();
707 twoaday 167 if (!gpg_prefs_ok ())
708     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
709 twoaday 41 gpgprefs_dlg_proc, 0);
710 twoaday 167 choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
711     first_run_dlg_proc, 0);
712     switch (choice) {
713 werner 36 case SETUP_KEYGEN:
714     c.interactive = 1;
715     c.first_start = 1;
716     rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD,
717     h, keygen_wizard_dlg_proc, (LPARAM)&c);
718     if (!rc)
719     goto start;
720     break;
721    
722     case SETUP_IMPORT:
723     rc = gnupg_copy_keyrings ();
724     if (rc) {
725     msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
726     goto start;
727     }
728     break;
729    
730 twoaday 260 case SETUP_CARDGEN:
731     rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN,
732     h, card_keygen_dlg_proc, 0);
733     if (!rc)
734     goto start;
735     break;
736    
737 twoaday 167 case 0: /* Cancel/Abort. */
738     default:
739 werner 36 DestroyWindow (hwnd);
740     free_gnupg_table ();
741     return 0;
742     }
743     update_keycache (hwnd);
744 twoaday 167 if (!check_crypto_engine ()) {
745     DestroyWindow (hwnd);
746     free_gnupg_table ();
747 twoaday 255 keycache_release (1);
748 twoaday 167 return 0;
749     }
750 twoaday 193 if (!is_gpg4win_installed ()) {
751     select_language ();
752     load_gettext ();
753     }
754 werner 36 }
755     else {
756 twoaday 174 gpg_keycache_t c, sec_c;
757 twoaday 255 if (update_keycache (hwnd)) {
758     DestroyWindow (hwnd);
759     free_gnupg_table ();
760     keycache_release (1);
761     return 0;
762     }
763 werner 36 c = keycache_get_ctx (1);
764 twoaday 255 if (!gpg_keycache_get_size (c)) {
765 werner 36 msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
766     "Please check your GPG config (keyrings, pathes...)"),
767     _("WinPT Error"), MB_ERR);
768 twoaday 248 ec = msg_box (NULL, _("It seems that GPG is not configured properly.\n"
769 werner 36 "Do you want to start the GPG preferences dialog?"),
770     "WinPT", MB_INFO|MB_YESNO);
771     if (ec == IDYES) {
772     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
773 twoaday 41 gpgprefs_dlg_proc, 0);
774 werner 36 update_keycache (hwnd);
775     }
776     else {
777     DestroyWindow (hwnd);
778     free_gnupg_table ();
779 twoaday 255 keycache_release (1);
780 werner 36 return 0;
781     }
782     }
783 twoaday 174 sec_c = keycache_get_ctx (0);
784     if (check_default_key (sec_c)) {
785 twoaday 121 char *p = get_gnupg_default_key ();
786 werner 36 log_box (_("WinPT Error"), MB_ERR,
787 twoaday 174 _("Default key (from the GPG config file) could not be found.\n"
788     "Please check your gpg.conf or set a new default key to correct it:\n\n"
789 werner 36 "%s: public key not found."), p? p : "[null]");
790 twoaday 197 set_gnupg_default_key (NULL);
791 werner 36 }
792     if (count_insecure_elgkeys ())
793     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,
794 twoaday 41 elgamal_warn_dlg_proc, 0);
795 werner 36 }
796    
797 twoaday 121 if (start_manager)
798     PostMessage (hwnd, WM_COMMAND, start_manager, 0);
799    
800 werner 36 accel_tab = LoadAccelerators (glob_hinst, (LPCTSTR)IDR_WINPT_ACCELERATOR);
801     keyring_check_last_access (); /* init */
802     while (GetMessage (&msg, hwnd, 0, 0)) {
803     if (!TranslateAccelerator (msg.hwnd, accel_tab, &msg)) {
804     TranslateMessage (&msg);
805     DispatchMessage (&msg);
806     }
807     }
808    
809     return 0;
810     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26