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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 262 - (hide annotations)
Sat Sep 30 10:24:34 2006 UTC (18 years, 5 months ago) by twoaday
File size: 20681 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     char *cfg = get_gnupg_config ();
75     if (cfg && check_gnupg_options (cfg, 0) == WPTERR_FILE_EXIST)
76     msg_box (NULL, _("The gpg.conf contains at least one argument which points to a non-existing file."), "WinPT", MB_ERR);
77     free_if_alloc (cfg);
78     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     char *nls = NULL;
107    
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     p = get_reg_entry_gpg4win (NULL);
135     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    
178     p = get_reg_entry_gpg4win ("gpg.exe");
179     if (!p)
180     return (1);
181     if (file_exist_check (p)) {
182     free_if_alloc (p);
183     return (1);
184     }
185     free_if_alloc (p);
186 twoaday 167
187     p = get_reg_entry_gpg ("HomeDir");
188     if (!p || dir_exist_check (p) != 0) {
189     free_if_alloc (p);
190     p = multi_gnupg_path (0);
191     }
192 twoaday 128 if (p && dir_exist_check (p)) {
193     memset (&sec_attr, 0, sizeof (sec_attr));
194     sec_attr.nLength = sizeof (sec_attr);
195     if (!CreateDirectory (p, &sec_attr)) {
196     msg_box (NULL, _("Could not create GPG home directory"),
197     _("WinPT Error"), MB_ERR);
198     free_if_alloc (p);
199     return (2);
200     }
201     }
202 twoaday 172 check_readonly_attr (p);
203 twoaday 128 pkr = make_filename (p, "pubring", "gpg");
204     free_if_alloc (p);
205     if (!pkr)
206     return -1;
207     if (get_file_size (pkr) == 0) {
208     free_if_alloc (pkr);
209     return -1;
210     }
211     return 0;
212     }
213    
214 twoaday 133
215 werner 36 /* check if the default key from the gpg.conf file is available in the
216     keyring. if not, bail out because encryption won't work properly then. */
217     static int
218     check_default_key (gpg_keycache_t kc)
219     {
220     gpgme_key_t key;
221 twoaday 193 gpgme_error_t err = gpg_error (GPG_ERR_NO_ERROR);
222 twoaday 128 char *defkey;
223 werner 36
224     defkey = get_gnupg_default_key ();
225     if (defkey)
226     err = gpg_keycache_find_key (kc, defkey, 0, &key);
227 twoaday 66 else
228 twoaday 121 msg_box (NULL, _("No useable secret key found."),
229 twoaday 217 _("WinPT Warning"), MB_WARN);
230 werner 36 free_if_alloc (defkey);
231     return err? -1 : 0;
232     }
233    
234    
235     /* Return the WinPT program file name (with full pathname). */
236 twoaday 121 static const char*
237 werner 36 get_prog_part (const char * fname, int use_cwd)
238     {
239     static char program[512];
240     char currdir[256];
241     char *cmd = NULL;
242     int j;
243    
244     memset (currdir, 0, DIM (currdir));
245     memset (program, 0, DIM (program));
246    
247     if (use_cwd) {
248     GetCurrentDirectory (DIM (currdir)-1, currdir);
249     _snprintf (program, DIM (program)-1, "%s\\%s", currdir, fname);
250     }
251     else {
252     cmd = GetCommandLine ();
253     if (cmd == NULL)
254     return NULL;
255     strncpy (currdir, cmd, sizeof (currdir)-1);
256     j = strlen (currdir);
257     while (j--) {
258     if (currdir[j] == '\\')
259     break;
260     }
261     currdir[j] = 0;
262     _snprintf (program, DIM (program)-1, "%s\\%s", currdir + 1, fname);
263     }
264     return program;
265     }
266    
267    
268     /* Check that the underlying crypto engine fullfills the minimal
269     requirements so all commands work properly. */
270 twoaday 128 static bool
271 werner 36 check_crypto_engine (void)
272     {
273 twoaday 193 int ma = 0, mi = 0, pa = 0;
274 werner 36 int rc;
275    
276 twoaday 137 rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);
277 werner 36 if (rc == -1) {
278     msg_box (NULL, _("Could not read GnuPG version."),
279     _("WinPT Error"), MB_ERR);
280 twoaday 128 return false;
281 werner 36 }
282     else if (rc) {
283     log_box (_("WinPT Error"), MB_ERR,
284     _("Sorry, you need a newer GPG version.\n"
285 twoaday 137 "GPG version %d.%d.%d required GPG version "NEED_GPG_VERSION),
286 werner 36 ma, mi, pa);
287 twoaday 128 return false;
288 werner 36 }
289 twoaday 80 /* We enable smartcard support for GPG: >= 2 or >= 1.4.3 */
290 twoaday 262 if ((ma > 1 || pa >= 4) && pcsc_available ())
291 werner 36 scard_support = 1;
292    
293     gpgver[0] = ma;
294     gpgver[1] = mi;
295     gpgver[2] = pa;
296 twoaday 128 return true;
297 werner 36 }
298    
299    
300     /* Try to load the keyserver config file. If @quiet is 1
301     do not show any errors. */
302     static int
303     load_keyserver_conf (int quiet)
304 twoaday 248 {
305     const char *t, *conf;
306 twoaday 154 char *buf;
307 werner 36 int rc;
308    
309 twoaday 154 /* Create $APPDATA\winpt if needed. */
310     buf = make_special_filename (CSIDL_APPDATA, "winpt", NULL);
311     if (buf && dir_exist_check (buf) && !CreateDirectory (buf, NULL)) {
312     MessageBox (NULL, _("Failed to create WinPT directory"),
313     _("Keyserver"), MB_ERR);
314     free_if_alloc (buf);
315     return -1;
316     }
317     free_if_alloc (buf);
318    
319     /* Check for $APPDATA\winpt\keyserver.conf */
320     buf = make_special_filename (CSIDL_APPDATA, "winpt\\keyserver.conf", NULL);
321    
322 twoaday 193 conf = get_prog_part ("keyserver.conf", 0);
323     if (!file_exist_check (conf))
324     t = conf;
325 twoaday 154 else
326 werner 36 t = "keyserver.conf";
327 twoaday 154 if (file_exist_check (t) == 0 && file_exist_check (buf) != 0) {
328     if (!CopyFile (t, buf, FALSE)) {
329     MessageBox (NULL, _("Failed to copy the keyserver.conf"),
330     _("Keyserver"), MB_ERR);
331     free_if_alloc (buf);
332     return -1;
333     }
334     t = buf;
335     }
336     else
337     t = buf;
338    
339 werner 36 rc = kserver_load_conf (t);
340     if (rc && !quiet)
341     msg_box (NULL, winpt_strerror (rc), _("Keyserver"), MB_ERR);
342 twoaday 154 else {
343     free_if_alloc (reg_prefs.kserv_conf);
344     reg_prefs.kserv_conf = m_strdup (t);
345     }
346     free_if_alloc (buf);
347 werner 36 return rc;
348     }
349    
350    
351 twoaday 133 /* Check if both keyrings are empty. This indicates that
352     WinPT should offer to generate a key pair. */
353     static bool
354     check_for_empty_keyrings (bool pub_only)
355     {
356     char *p;
357     int n = 0;
358    
359     p = get_gnupg_keyring (1, 0);
360     if (file_exist_check (p) == 0 && get_file_size (p) == 0)
361     n++;
362     free_if_alloc (p);
363     if (pub_only)
364     return n == 1? true : false;
365     p = get_gnupg_keyring (0, 0);
366     if (file_exist_check (p) == 0 && get_file_size (p) == 0)
367     n++;
368     free_if_alloc (p);
369     return n==2? true : false;
370     }
371    
372    
373 werner 36 /* Enable the mobility mode. */
374 twoaday 190 static int
375 werner 36 enable_mobile_mode (void)
376     {
377 twoaday 190 if (dir_exist_check ("temp") != 0) {
378     if (!CreateDirectory ("temp", NULL)) {
379     MessageBox (NULL, "Could not create mobile temp directory",
380     "WinPT Mobile Error", MB_ERR);
381     return -1;
382     }
383     }
384    
385 werner 36 memset (&reg_prefs, 0, sizeof (reg_prefs));
386     reg_prefs.always_trust = 0;
387     reg_prefs.auto_backup = 0;
388     reg_prefs.cache_time = 0;
389     reg_prefs.expert = 0;
390     reg_prefs.kserv_conf = m_strdup ("keyserver.conf");
391     reg_prefs.no_zip_mmedia = 1;
392     reg_prefs.word_wrap = 80;
393     reg_prefs.use_viewer = 0; /* XXX */
394 twoaday 190 return 0;
395 werner 36 }
396    
397    
398 twoaday 181 void
399     set_default_keyserver (void)
400     {
401     char *host = get_reg_entry_keyserver ("Default");
402     char *str_port = get_reg_entry_keyserver ("Default_Port");
403     WORD port = HKP_PORT;
404    
405     if (!host)
406     keyserver_set_default (NULL, 0);
407     else {
408     if (str_port && *str_port)
409     port = atoi (str_port);
410     keyserver_set_default (host, port);
411     }
412     free_if_alloc (host);
413     free_if_alloc (str_port);
414     }
415    
416    
417 twoaday 190 /* Display info message that WinPT is now in debug mode. */
418     void
419     winpt_debug_msg (void)
420     {
421     char output[512];
422     char temp[128];
423    
424     GetTempPath (sizeof temp -1, temp);
425     _snprintf (output, sizeof output - 1,
426     "The GPGME output file is %sgpgme.dbg\n"
427     "The WinPT output file is %swinpt.log\n", temp, temp);
428     MessageBox (NULL, output, "WinPT now runs in DEBUG MODE", MB_INFO);
429     }
430    
431    
432 twoaday 217 /* Search for insecure ElGamal keys and return the
433     number of founded keys. */
434     static int
435     count_insecure_elgkeys (void)
436     {
437     gpg_keycache_t pc;
438     gpgme_key_t key;
439     int n = 0;
440 twoaday 208
441 twoaday 217 pc = keycache_get_ctx (1);
442     while (!gpg_keycache_next_key (pc, 0, &key)) {
443     if (key->subkeys->pubkey_algo == GPGME_PK_ELG)
444     n++;
445     }
446     gpg_keycache_rewind (pc);
447     return n;
448     }
449    
450    
451 werner 36 /* Main entry point. */
452     int WINAPI
453     WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
454     {
455     WNDCLASS wc = {0, winpt_main_proc, 0, 0, hinst, 0, 0, 0, 0, PGM_NAME};
456     HACCEL accel_tab;
457 twoaday 121 MSG msg;
458     HWND hwnd = NULL;
459 twoaday 248 WORD ver[3], ptdver[4];
460     const char *s;
461 twoaday 121 int rc, ec, created = 0;
462 werner 36 int first_start = 0, start_gpgprefs = 0;
463     int winpt_inst_found = 0;
464 twoaday 248 int start_manager = 0;
465 werner 36
466     glob_hinst = hinst;
467 twoaday 87 if (cmdline && stristr (cmdline, "--stop")) {
468     hwnd = FindWindow ("WinPT", "WinPT");
469     if (hwnd != NULL)
470     PostMessage (hwnd, WM_DESTROY, 0, 0);
471     return 0;
472     }
473 twoaday 121
474     #ifdef _DEBUG
475 werner 36 gpg_set_debug_mode (1);
476     debug = 1;
477 twoaday 121 #endif
478 werner 36
479 twoaday 121 get_file_version ("WinPT.exe", &ver[0], &ver[1], &ver[2], &ver[3]);
480 twoaday 248 ec = get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],
481 twoaday 121 &ptdver[2], &ptdver[3]);
482 twoaday 193
483 twoaday 248 if (!ec && (ptdver[0] != ver[0] || ptdver[1] != ver[1]|| 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     if (n) {
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     to open the key manager. Otherwise start a new instance.
634     */
635     HWND tray = FindWindow ("WinPT", "WinPT");
636 twoaday 121 if (stristr (cmdline, "keymanager"))
637     start_manager = ID_WINPT_KEY;
638     else
639     start_manager = ID_WINPT_CARD;
640 twoaday 102 if (tray != NULL) {
641 twoaday 121 PostMessage (tray, WM_COMMAND, start_manager, 0);
642 twoaday 102 free_gnupg_table ();
643     return 0;
644     }
645 werner 36 }
646    
647     /* If we found another WinPT instance, just quit to avoid it
648     will be executed twice. */
649     if (winpt_inst_found) {
650     log_debug ("%s", "WinMain: WinPT is already running.");
651     free_gnupg_table ();
652     return 0;
653     }
654    
655 twoaday 190 if (cmdline && (stristr (cmdline, "--enable-debug") ||
656     stristr (cmdline, "--debug"))) {
657     gpg_set_debug_mode (1);
658     winpt_debug_msg ();
659     debug = 1;
660 werner 36 }
661    
662     wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
663     rc = RegisterClass (&wc);
664     if (rc == FALSE) {
665     msg_box (NULL, _("Could not register window class"),
666     _("WinPT Error"), MB_ERR);
667     free_gnupg_table ();
668     return 0;
669     }
670    
671     hwnd = CreateWindow (PGM_NAME,
672     PGM_NAME,
673     0, 0, 0, 0, 0,
674     NULL,
675     NULL,
676     hinst,
677     NULL);
678     if (hwnd == NULL) {
679     msg_box (NULL, _("Could not create window"), _("WinPT Error"), MB_ERR);
680     free_gnupg_table ();
681     return 0;
682     }
683     glob_hwnd = hwnd;
684     UpdateWindow (hwnd);
685    
686     if (!first_start && !start_gpgprefs) {
687     gnupg_backup_options ();
688 twoaday 128 if (!check_crypto_engine ()) {
689 werner 36 DestroyWindow (hwnd);
690     free_gnupg_table ();
691     return 0;
692     }
693     }
694    
695     if (start_gpgprefs) {
696     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
697 twoaday 41 gpgprefs_dlg_proc, 0);
698 twoaday 133 if (check_for_empty_keyrings (true))
699     first_start = 1; /* The public keyring is empty! */
700 werner 36 }
701    
702     if (first_start) {
703     struct genkey_s c;
704 twoaday 167 int choice;
705 werner 36 HWND h;
706     start:
707     h = GetDesktopWindow ();
708 twoaday 167 if (!gpg_prefs_ok ())
709     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
710 twoaday 41 gpgprefs_dlg_proc, 0);
711 twoaday 167 choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
712     first_run_dlg_proc, 0);
713     switch (choice) {
714 werner 36 case SETUP_KEYGEN:
715     c.interactive = 1;
716     c.first_start = 1;
717     rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD,
718     h, keygen_wizard_dlg_proc, (LPARAM)&c);
719     if (!rc)
720     goto start;
721     break;
722    
723     case SETUP_IMPORT:
724     rc = gnupg_copy_keyrings ();
725     if (rc) {
726     msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
727     goto start;
728     }
729     break;
730    
731 twoaday 260 case SETUP_CARDGEN:
732     rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN,
733     h, card_keygen_dlg_proc, 0);
734     if (!rc)
735     goto start;
736     break;
737    
738 twoaday 167 case 0: /* Cancel/Abort. */
739     default:
740 werner 36 DestroyWindow (hwnd);
741     free_gnupg_table ();
742     return 0;
743     }
744     update_keycache (hwnd);
745 twoaday 167 if (!check_crypto_engine ()) {
746     DestroyWindow (hwnd);
747     free_gnupg_table ();
748 twoaday 255 keycache_release (1);
749 twoaday 167 return 0;
750     }
751 twoaday 193 if (!is_gpg4win_installed ()) {
752     select_language ();
753     load_gettext ();
754     }
755 werner 36 }
756     else {
757 twoaday 174 gpg_keycache_t c, sec_c;
758 twoaday 255 if (update_keycache (hwnd)) {
759     DestroyWindow (hwnd);
760     free_gnupg_table ();
761     keycache_release (1);
762     return 0;
763     }
764 werner 36 c = keycache_get_ctx (1);
765 twoaday 255 if (!gpg_keycache_get_size (c)) {
766 werner 36 msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
767     "Please check your GPG config (keyrings, pathes...)"),
768     _("WinPT Error"), MB_ERR);
769 twoaday 248 ec = msg_box (NULL, _("It seems that GPG is not configured properly.\n"
770 werner 36 "Do you want to start the GPG preferences dialog?"),
771     "WinPT", MB_INFO|MB_YESNO);
772     if (ec == IDYES) {
773     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
774 twoaday 41 gpgprefs_dlg_proc, 0);
775 werner 36 update_keycache (hwnd);
776     }
777     else {
778     DestroyWindow (hwnd);
779     free_gnupg_table ();
780 twoaday 255 keycache_release (1);
781 werner 36 return 0;
782     }
783     }
784 twoaday 174 sec_c = keycache_get_ctx (0);
785     if (check_default_key (sec_c)) {
786 twoaday 121 char *p = get_gnupg_default_key ();
787 werner 36 log_box (_("WinPT Error"), MB_ERR,
788 twoaday 174 _("Default key (from the GPG config file) could not be found.\n"
789     "Please check your gpg.conf or set a new default key to correct it:\n\n"
790 werner 36 "%s: public key not found."), p? p : "[null]");
791 twoaday 197 set_gnupg_default_key (NULL);
792 werner 36 }
793     if (count_insecure_elgkeys ())
794     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,
795 twoaday 41 elgamal_warn_dlg_proc, 0);
796 werner 36 }
797    
798 twoaday 121 if (start_manager)
799     PostMessage (hwnd, WM_COMMAND, start_manager, 0);
800    
801 werner 36 accel_tab = LoadAccelerators (glob_hinst, (LPCTSTR)IDR_WINPT_ACCELERATOR);
802     keyring_check_last_access (); /* init */
803     while (GetMessage (&msg, hwnd, 0, 0)) {
804     if (!TranslateAccelerator (msg.hwnd, accel_tab, &msg)) {
805     TranslateMessage (&msg);
806     DispatchMessage (&msg);
807     }
808     }
809    
810     return 0;
811     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26