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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 260 - (hide annotations)
Wed Aug 16 10:01:30 2006 UTC (18 years, 6 months ago) by twoaday
File size: 20619 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 154
48 twoaday 208 /* Global variables. */
49 werner 36 HINSTANCE glob_hinst; /* global instance for the dialogs */
50     HWND glob_hwnd; /* global window handle for the dialogs */
51     int scard_support = 0;
52     int debug = 0;
53 twoaday 190 int mobile_mode_active = 0;
54 werner 36 int gpg_read_only = 0;
55 twoaday 208 int admin_user = 0;
56 werner 36 char gpgver[3];
57 twoaday 208 /* End */
58 werner 36
59    
60     /* Load the key cache and rebuild the signature cache. */
61 twoaday 255 int
62 werner 36 update_keycache (HWND hwnd)
63     {
64 twoaday 255 int err;
65    
66 werner 36 refresh_cache_s rcs = {0};
67     rcs.kr_reload = 0;
68     rcs.kr_update = 1;
69     rcs.tr_update = 1;
70 twoaday 255 err = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,
71 werner 36 keycache_dlg_proc, (LPARAM)&rcs);
72 twoaday 255 if (err) {
73     char *cfg = get_gnupg_config ();
74     if (cfg && check_gnupg_options (cfg, 0) == WPTERR_FILE_EXIST)
75     msg_box (NULL, _("The gpg.conf contains at least one argument which points to a non-existing file."), "WinPT", MB_ERR);
76     free_if_alloc (cfg);
77     return -1;
78     }
79     return 0;
80 werner 36 }
81    
82    
83     /* Set GPGME debug mode. If @val is 0, the debug mode is disabled. */
84     void
85     gpg_set_debug_mode (int val)
86 twoaday 181 {
87 twoaday 190 static char buf[256];
88     char tmp[128];
89    
90     /* XXX: no gpgme.dbg is created. */
91     if (val > 0) {
92     GetTempPath (sizeof (tmp)-1, tmp);
93     _snprintf (buf, sizeof (buf)-1, "GPGME_DEBUG=5:%sgpgme.dbg", tmp);
94     putenv (buf);
95     }
96 werner 36 else
97     putenv ("GPGME_DEBUG=");
98     }
99    
100    
101     /* Initialize the gettext sub system. */
102     static void
103 twoaday 193 load_gettext (void)
104 werner 36 {
105     char *nls = NULL;
106    
107 twoaday 193 /* Return the name of the gettext language file. */
108     nls = get_reg_entry_mo ();
109 twoaday 137 if (nls != NULL) {
110 werner 36 set_gettext_file ("winpt", nls);
111     free_if_alloc (nls);
112     }
113     }
114    
115    
116 twoaday 167 /* Return true if the GPG environment is useable. */
117     static bool
118     gpg_prefs_ok (void)
119     {
120     char *p;
121    
122     p = get_reg_entry_gpg4win ("gpg.exe");
123     if (!p || file_exist_check (p) != 0) {
124     free_if_alloc (p);
125     p = get_reg_entry_gpg ("gpgProgram");
126     if (!p || file_exist_check (p) != 0) {
127     free_if_alloc (p);
128 twoaday 190 log_debug ("gpg_prefs_ok: could not locate gpg.exe");
129 twoaday 167 return false;
130     }
131     }
132     free_if_alloc (p);
133     p = get_reg_entry_gpg4win (NULL);
134     if (!p || dir_exist_check (p) != 0) {
135     free_if_alloc (p);
136     p = get_reg_entry_gpg ("HomeDir");
137     if (!p || dir_exist_check (p) != 0) {
138     free_if_alloc (p);
139 twoaday 190 log_debug ("gpg_prefs_ok: could not determine home directory");
140 twoaday 167 return false;
141     }
142     }
143     free_if_alloc (p);
144     return true;
145     }
146    
147    
148 twoaday 172 /* Check gpg files if they are read-only and ask the user
149     if this should be corrected. */
150     static void
151     check_readonly_attr (const char *homedir)
152     {
153     const char *files[] = {"pubring.gpg", "secring.gpg", "trustdb.gpg", NULL};
154     char *file;
155     int i;
156 twoaday 167
157 twoaday 172 for (i=0; files[i] != NULL; i++) {
158     file = make_filename (homedir, files[i], NULL);
159     remove_crit_file_attrs (file, 0);
160     free_if_alloc (file);
161     }
162     }
163    
164    
165 twoaday 128 /* Load the GPG environment. On the first start, some
166     checks are performed to find out in what state GPG is.
167     Return value: 0 everything OK.
168     >0 fatal error.
169     -1 public keyring is empty or does not exist. */
170     static int
171     load_gpg_env (void)
172     {
173     SECURITY_ATTRIBUTES sec_attr;
174     char *p;
175     char *pkr;
176    
177     p = get_reg_entry_gpg4win ("gpg.exe");
178     if (!p)
179     return (1);
180     if (file_exist_check (p)) {
181     free_if_alloc (p);
182     return (1);
183     }
184     free_if_alloc (p);
185 twoaday 167
186     p = get_reg_entry_gpg ("HomeDir");
187     if (!p || dir_exist_check (p) != 0) {
188     free_if_alloc (p);
189     p = multi_gnupg_path (0);
190     }
191 twoaday 128 if (p && dir_exist_check (p)) {
192     memset (&sec_attr, 0, sizeof (sec_attr));
193     sec_attr.nLength = sizeof (sec_attr);
194     if (!CreateDirectory (p, &sec_attr)) {
195     msg_box (NULL, _("Could not create GPG home directory"),
196     _("WinPT Error"), MB_ERR);
197     free_if_alloc (p);
198     return (2);
199     }
200     }
201 twoaday 172 check_readonly_attr (p);
202 twoaday 128 pkr = make_filename (p, "pubring", "gpg");
203     free_if_alloc (p);
204     if (!pkr)
205     return -1;
206     if (get_file_size (pkr) == 0) {
207     free_if_alloc (pkr);
208     return -1;
209     }
210     return 0;
211     }
212    
213 twoaday 133
214 werner 36 /* check if the default key from the gpg.conf file is available in the
215     keyring. if not, bail out because encryption won't work properly then. */
216     static int
217     check_default_key (gpg_keycache_t kc)
218     {
219     gpgme_key_t key;
220 twoaday 193 gpgme_error_t err = gpg_error (GPG_ERR_NO_ERROR);
221 twoaday 128 char *defkey;
222 werner 36
223     defkey = get_gnupg_default_key ();
224     if (defkey)
225     err = gpg_keycache_find_key (kc, defkey, 0, &key);
226 twoaday 66 else
227 twoaday 121 msg_box (NULL, _("No useable secret key found."),
228 twoaday 217 _("WinPT Warning"), MB_WARN);
229 werner 36 free_if_alloc (defkey);
230     return err? -1 : 0;
231     }
232    
233    
234     /* Return the WinPT program file name (with full pathname). */
235 twoaday 121 static const char*
236 werner 36 get_prog_part (const char * fname, int use_cwd)
237     {
238     static char program[512];
239     char currdir[256];
240     char *cmd = NULL;
241     int j;
242    
243     memset (currdir, 0, DIM (currdir));
244     memset (program, 0, DIM (program));
245    
246     if (use_cwd) {
247     GetCurrentDirectory (DIM (currdir)-1, currdir);
248     _snprintf (program, DIM (program)-1, "%s\\%s", currdir, fname);
249     }
250     else {
251     cmd = GetCommandLine ();
252     if (cmd == NULL)
253     return NULL;
254     strncpy (currdir, cmd, sizeof (currdir)-1);
255     j = strlen (currdir);
256     while (j--) {
257     if (currdir[j] == '\\')
258     break;
259     }
260     currdir[j] = 0;
261     _snprintf (program, DIM (program)-1, "%s\\%s", currdir + 1, fname);
262     }
263     return program;
264     }
265    
266    
267     /* Check that the underlying crypto engine fullfills the minimal
268     requirements so all commands work properly. */
269 twoaday 128 static bool
270 werner 36 check_crypto_engine (void)
271     {
272 twoaday 193 int ma = 0, mi = 0, pa = 0;
273 werner 36 int rc;
274    
275 twoaday 137 rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);
276 werner 36 if (rc == -1) {
277     msg_box (NULL, _("Could not read GnuPG version."),
278     _("WinPT Error"), MB_ERR);
279 twoaday 128 return false;
280 werner 36 }
281     else if (rc) {
282     log_box (_("WinPT Error"), MB_ERR,
283     _("Sorry, you need a newer GPG version.\n"
284 twoaday 137 "GPG version %d.%d.%d required GPG version "NEED_GPG_VERSION),
285 werner 36 ma, mi, pa);
286 twoaday 128 return false;
287 werner 36 }
288 twoaday 80 /* We enable smartcard support for GPG: >= 2 or >= 1.4.3 */
289 twoaday 193 if (ma > 1 || pa >= 3)
290 werner 36 scard_support = 1;
291    
292     gpgver[0] = ma;
293     gpgver[1] = mi;
294     gpgver[2] = pa;
295 twoaday 128 return true;
296 werner 36 }
297    
298    
299     /* Try to load the keyserver config file. If @quiet is 1
300     do not show any errors. */
301     static int
302     load_keyserver_conf (int quiet)
303 twoaday 248 {
304     const char *t, *conf;
305 twoaday 154 char *buf;
306 werner 36 int rc;
307    
308 twoaday 154 /* Create $APPDATA\winpt if needed. */
309     buf = make_special_filename (CSIDL_APPDATA, "winpt", NULL);
310     if (buf && dir_exist_check (buf) && !CreateDirectory (buf, NULL)) {
311     MessageBox (NULL, _("Failed to create WinPT directory"),
312     _("Keyserver"), MB_ERR);
313     free_if_alloc (buf);
314     return -1;
315     }
316     free_if_alloc (buf);
317    
318     /* Check for $APPDATA\winpt\keyserver.conf */
319     buf = make_special_filename (CSIDL_APPDATA, "winpt\\keyserver.conf", NULL);
320    
321 twoaday 193 conf = get_prog_part ("keyserver.conf", 0);
322     if (!file_exist_check (conf))
323     t = conf;
324 twoaday 154 else
325 werner 36 t = "keyserver.conf";
326 twoaday 154 if (file_exist_check (t) == 0 && file_exist_check (buf) != 0) {
327     if (!CopyFile (t, buf, FALSE)) {
328     MessageBox (NULL, _("Failed to copy the keyserver.conf"),
329     _("Keyserver"), MB_ERR);
330     free_if_alloc (buf);
331     return -1;
332     }
333     t = buf;
334     }
335     else
336     t = buf;
337    
338 werner 36 rc = kserver_load_conf (t);
339     if (rc && !quiet)
340     msg_box (NULL, winpt_strerror (rc), _("Keyserver"), MB_ERR);
341 twoaday 154 else {
342     free_if_alloc (reg_prefs.kserv_conf);
343     reg_prefs.kserv_conf = m_strdup (t);
344     }
345     free_if_alloc (buf);
346 werner 36 return rc;
347     }
348    
349    
350 twoaday 133 /* Check if both keyrings are empty. This indicates that
351     WinPT should offer to generate a key pair. */
352     static bool
353     check_for_empty_keyrings (bool pub_only)
354     {
355     char *p;
356     int n = 0;
357    
358     p = get_gnupg_keyring (1, 0);
359     if (file_exist_check (p) == 0 && get_file_size (p) == 0)
360     n++;
361     free_if_alloc (p);
362     if (pub_only)
363     return n == 1? true : false;
364     p = get_gnupg_keyring (0, 0);
365     if (file_exist_check (p) == 0 && get_file_size (p) == 0)
366     n++;
367     free_if_alloc (p);
368     return n==2? true : false;
369     }
370    
371    
372 werner 36 /* Enable the mobility mode. */
373 twoaday 190 static int
374 werner 36 enable_mobile_mode (void)
375     {
376 twoaday 190 if (dir_exist_check ("temp") != 0) {
377     if (!CreateDirectory ("temp", NULL)) {
378     MessageBox (NULL, "Could not create mobile temp directory",
379     "WinPT Mobile Error", MB_ERR);
380     return -1;
381     }
382     }
383    
384 werner 36 memset (&reg_prefs, 0, sizeof (reg_prefs));
385     reg_prefs.always_trust = 0;
386     reg_prefs.auto_backup = 0;
387     reg_prefs.cache_time = 0;
388     reg_prefs.expert = 0;
389     reg_prefs.kserv_conf = m_strdup ("keyserver.conf");
390     reg_prefs.no_zip_mmedia = 1;
391     reg_prefs.word_wrap = 80;
392     reg_prefs.use_viewer = 0; /* XXX */
393 twoaday 190 return 0;
394 werner 36 }
395    
396    
397 twoaday 181 void
398     set_default_keyserver (void)
399     {
400     char *host = get_reg_entry_keyserver ("Default");
401     char *str_port = get_reg_entry_keyserver ("Default_Port");
402     WORD port = HKP_PORT;
403    
404     if (!host)
405     keyserver_set_default (NULL, 0);
406     else {
407     if (str_port && *str_port)
408     port = atoi (str_port);
409     keyserver_set_default (host, port);
410     }
411     free_if_alloc (host);
412     free_if_alloc (str_port);
413     }
414    
415    
416 twoaday 190 /* Display info message that WinPT is now in debug mode. */
417     void
418     winpt_debug_msg (void)
419     {
420     char output[512];
421     char temp[128];
422    
423     GetTempPath (sizeof temp -1, temp);
424     _snprintf (output, sizeof output - 1,
425     "The GPGME output file is %sgpgme.dbg\n"
426     "The WinPT output file is %swinpt.log\n", temp, temp);
427     MessageBox (NULL, output, "WinPT now runs in DEBUG MODE", MB_INFO);
428     }
429    
430    
431 twoaday 217 /* Search for insecure ElGamal keys and return the
432     number of founded keys. */
433     static int
434     count_insecure_elgkeys (void)
435     {
436     gpg_keycache_t pc;
437     gpgme_key_t key;
438     int n = 0;
439 twoaday 208
440 twoaday 217 pc = keycache_get_ctx (1);
441     while (!gpg_keycache_next_key (pc, 0, &key)) {
442     if (key->subkeys->pubkey_algo == GPGME_PK_ELG)
443     n++;
444     }
445     gpg_keycache_rewind (pc);
446     return n;
447     }
448    
449    
450 werner 36 /* Main entry point. */
451     int WINAPI
452     WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
453     {
454     WNDCLASS wc = {0, winpt_main_proc, 0, 0, hinst, 0, 0, 0, 0, PGM_NAME};
455     HACCEL accel_tab;
456 twoaday 121 MSG msg;
457     HWND hwnd = NULL;
458 twoaday 248 WORD ver[3], ptdver[4];
459     const char *s;
460 twoaday 121 int rc, ec, created = 0;
461 werner 36 int first_start = 0, start_gpgprefs = 0;
462     int winpt_inst_found = 0;
463 twoaday 248 int start_manager = 0;
464 werner 36
465     glob_hinst = hinst;
466 twoaday 87 if (cmdline && stristr (cmdline, "--stop")) {
467     hwnd = FindWindow ("WinPT", "WinPT");
468     if (hwnd != NULL)
469     PostMessage (hwnd, WM_DESTROY, 0, 0);
470     return 0;
471     }
472 twoaday 121
473     #ifdef _DEBUG
474 werner 36 gpg_set_debug_mode (1);
475     debug = 1;
476 twoaday 121 #endif
477 werner 36
478 twoaday 121 get_file_version ("WinPT.exe", &ver[0], &ver[1], &ver[2], &ver[3]);
479 twoaday 248 ec = get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],
480 twoaday 121 &ptdver[2], &ptdver[3]);
481 twoaday 193
482 twoaday 248 if (!ec && (ptdver[0] != ver[0] || ptdver[1] != ver[1]|| ptdver[2] != ver[2])) {
483 twoaday 121 log_box (_("WinPT Error"), MB_ERR,
484     _("The PTD.dll file has a different version than WinPT.exe\n"
485     "Please update the PTD.dll to version %d.%d.%d"),
486     ver[0], ver[1], ver[2]);
487     return 0;
488     }
489 twoaday 128
490 werner 36 if (gpg_md_selftest ()) {
491     msg_box (NULL, _("Cryptographic selftest failed."),
492     _("WinPT Error"), MB_ERR);
493     return 0;
494     }
495    
496 twoaday 137 s = gpgme_check_version (NEED_GPGME_VERSION);
497 werner 36 if (!s || !*s) {
498 twoaday 137 msg_box (NULL, _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),
499 werner 36 _("WinPT Error"), MB_ERR);
500     return 0;
501     }
502    
503     CreateMutex (NULL, TRUE, PGM_NAME);
504     if (GetLastError () == ERROR_ALREADY_EXISTS)
505     winpt_inst_found = 1;
506    
507     if (cmdline && stristr (cmdline, "--mobile")) {
508     msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",
509     "WinPT", MB_INFO);
510 twoaday 190 mobile_mode_active = 1;
511 werner 36 }
512 twoaday 190
513 twoaday 181 set_default_keyserver ();
514 twoaday 193 load_gettext ();
515 twoaday 208 admin_user = user_is_admin ();
516 werner 36
517 twoaday 190 if (!mobile_mode_active) {
518 werner 36 regist_inst_gnupg (1);
519     regist_inst_winpt (1, &created);
520     }
521     else {
522 twoaday 190 if (enable_mobile_mode ())
523     return 0;
524 werner 36 created = 1; /* Disable registry writing */
525     }
526    
527     if (!created) {
528     memset (&reg_prefs, 0, sizeof (reg_prefs));
529     reg_prefs.fm.progress = 0; /* XXX: fix the bug and enable it again */
530     get_reg_winpt_prefs (&reg_prefs);
531 twoaday 41 gnupg_load_config ();
532 werner 36 }
533    
534 twoaday 128 if (is_gpg4win_installed ())
535     load_gpg_env (); /* XXX: check return code. */
536    
537 werner 36 rc = gnupg_check_homedir ();
538     if (rc) {
539     log_box (_("WinPT Error"), MB_ERR,
540     _("GPG home directory is not set correctly.\n"
541     "Please check the GPG registry settings:\n%s."),
542     winpt_strerror (rc));
543 werner 48 s = get_fileopen_dlg (GetActiveWindow (),
544 twoaday 121 _("Select GPG Public Keyring"),
545 twoaday 167 "GPG Keyrings (*.gpg)\0*.gpg\0\0",
546 twoaday 121 NULL);
547 werner 36 if (s != NULL) {
548     size_t n;
549 twoaday 121 char *p = strrchr (s, '\\');
550 werner 36 if (!p)
551     BUG (0);
552     n = p - s;
553     if (n) {
554 twoaday 121 char *file = new char[n+1];
555 werner 36 if (!file)
556     BUG (NULL);
557     memset (file, 0, n);
558     memcpy (file, s, n);
559     file[n] = '\0';
560     set_reg_entry_gpg ("HomeDir", file);
561     free_if_alloc (file);
562     gnupg_check_homedir (); /* change gpgProgram if needed */
563     }
564     }
565     else {
566 twoaday 231 msg_box (NULL, _("GPG home directory could not be determined."),
567 werner 36 _("WinPT Error"), MB_ERR);
568     goto start;
569     }
570     }
571    
572     rc = check_gnupg_prog ();
573     if (rc) {
574     if (msg_box (NULL, _("Could not find the GPG binary (gpg.exe).\n"
575     "Do you want to start the GPG preferences to "
576     "correct this problem?"), _("WinPT Error"),
577     MB_INFO|MB_YESNO) == IDYES)
578     start_gpgprefs = 1;
579 twoaday 121 else {
580 werner 36 msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
581     return 0;
582     }
583     }
584    
585     rc = gnupg_access_files ();
586     if (!start_gpgprefs && rc) {
587     if (rc == WPTERR_GPG_KEYRINGS || rc == WPTERR_GPG_OPT_KEYRINGS) {
588     ec = msg_box (NULL,
589     _("Could not access and/or find the public and secret keyring.\n"
590     "If this is an accident, quit the program and fix it.\n\n"
591 twoaday 248 "Continue if you want WinPT to offer you more choices.\n"),
592 werner 36 "WinPT", MB_INFO|MB_YESNO);
593     if (ec == IDYES)
594     first_start = 1;
595     }
596     if (!first_start) {
597     msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
598     return 0;
599     }
600     }
601 twoaday 133 if (check_for_empty_keyrings (false))
602     first_start = 1;
603 werner 36
604     if (!first_start) {
605     rc = gpg_check_permissions (1);
606     if (rc && rc == 2)
607     gpg_read_only = 1;
608     else if (rc)
609     return 0;
610     }
611 twoaday 121
612 werner 36 init_gnupg_table ();
613    
614 twoaday 121 if (fm_parse_command_line (cmdline) > 0) {
615 werner 36 free_gnupg_table ();
616     return 0;
617     }
618    
619     if (cmdline && stristr (cmdline, "--wipe-freespace")) {
620     dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_SPACE_SECDEL,
621 twoaday 73 GetDesktopWindow(), space_wipefrees_dlg_proc, 0,
622 werner 36 _("Wipe Free Space"), IDS_WINPT_SPACE_SECDEL);
623     free_gnupg_table ();
624     return 0;
625     }
626    
627     load_keyserver_conf (cmdline? 1 : 0);
628    
629     if (cmdline && (stristr (cmdline, "--keymanager")
630     || stristr (cmdline, "--cardmanager"))) {
631 twoaday 102 /* If an instance of WinPT is running, just send the command
632     to open the key manager. Otherwise start a new instance.
633     */
634     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