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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 190 - (hide annotations)
Mon Mar 27 10:05:14 2006 UTC (18 years, 11 months ago) by twoaday
File size: 20162 byte(s)
2006-03-26  Timo Schulz  <ts@g10code.de>
 
        * wptSigTreeDlg.cpp (sigtree_load): Always use UTF8.
        * wptMainProc.cpp (winpt_main_proc): Reload key cache
        when the GPG settings were changed.
        * wptKeygenDlg.cpp (keygen_wizard_dlg_proc,
        keygen_dlg_proc): Improved check for the email address.
        * wptKeyEditDlgs.cpp (keyedit_adduid_dlg_proc): Likewise.
        * wptKeyserverDlg.cpp (keyserver_dlg_proc): Modified design.
         


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 154
47 twoaday 172
48 werner 36 HINSTANCE glob_hinst; /* global instance for the dialogs */
49     HWND glob_hwnd; /* global window handle for the dialogs */
50     HWND activ_hwnd;
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     char gpgver[3];
56    
57    
58     /* Load the key cache and rebuild the signature cache. */
59 twoaday 190 void
60 werner 36 update_keycache (HWND hwnd)
61     {
62     refresh_cache_s rcs = {0};
63     rcs.kr_reload = 0;
64     rcs.kr_update = 1;
65     rcs.tr_update = 1;
66     DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,
67     keycache_dlg_proc, (LPARAM)&rcs);
68     }
69    
70    
71     /* Set GPGME debug mode. If @val is 0, the debug mode is disabled. */
72     void
73     gpg_set_debug_mode (int val)
74 twoaday 181 {
75 twoaday 190 static char buf[256];
76     char tmp[128];
77    
78     /* XXX: no gpgme.dbg is created. */
79     if (val > 0) {
80     GetTempPath (sizeof (tmp)-1, tmp);
81     _snprintf (buf, sizeof (buf)-1, "GPGME_DEBUG=5:%sgpgme.dbg", tmp);
82     putenv (buf);
83     }
84 werner 36 else
85     putenv ("GPGME_DEBUG=");
86     }
87    
88    
89     /* Return the name of the gettext language file. */
90     static char*
91     get_gettext_lang (void)
92     {
93     char *fname;
94     fname = get_reg_entry_mo ();
95     if (!fname)
96     return NULL;
97     return fname;
98     }
99    
100    
101     /* Initialize the gettext sub system. */
102     static void
103     load_gettext (int prev_inst)
104     {
105     char *nls = NULL;
106    
107     nls = get_gettext_lang ();
108 twoaday 137 if (nls != NULL) {
109 werner 36 set_gettext_file ("winpt", nls);
110     free_if_alloc (nls);
111     }
112     }
113    
114    
115 twoaday 167 /* Return true if the GPG environment is useable. */
116     static bool
117     gpg_prefs_ok (void)
118     {
119     char *p;
120    
121     p = get_reg_entry_gpg4win ("gpg.exe");
122     if (!p || file_exist_check (p) != 0) {
123     free_if_alloc (p);
124     p = get_reg_entry_gpg ("gpgProgram");
125     if (!p || file_exist_check (p) != 0) {
126     free_if_alloc (p);
127 twoaday 190 log_debug ("gpg_prefs_ok: could not locate gpg.exe");
128 twoaday 167 return false;
129     }
130     }
131     free_if_alloc (p);
132     p = get_reg_entry_gpg4win (NULL);
133     if (!p || dir_exist_check (p) != 0) {
134     free_if_alloc (p);
135     p = get_reg_entry_gpg ("HomeDir");
136     if (!p || dir_exist_check (p) != 0) {
137     free_if_alloc (p);
138 twoaday 190 log_debug ("gpg_prefs_ok: could not determine home directory");
139 twoaday 167 return false;
140     }
141     }
142     free_if_alloc (p);
143     return true;
144     }
145    
146    
147 twoaday 172 /* Check gpg files if they are read-only and ask the user
148     if this should be corrected. */
149     static void
150     check_readonly_attr (const char *homedir)
151     {
152     const char *files[] = {"pubring.gpg", "secring.gpg", "trustdb.gpg", NULL};
153     char *file;
154     int i;
155 twoaday 167
156 twoaday 172 for (i=0; files[i] != NULL; i++) {
157     file = make_filename (homedir, files[i], NULL);
158     remove_crit_file_attrs (file, 0);
159     free_if_alloc (file);
160     }
161     }
162    
163    
164 twoaday 128 /* Load the GPG environment. On the first start, some
165     checks are performed to find out in what state GPG is.
166     Return value: 0 everything OK.
167     >0 fatal error.
168     -1 public keyring is empty or does not exist. */
169     static int
170     load_gpg_env (void)
171     {
172     SECURITY_ATTRIBUTES sec_attr;
173     char *p;
174     char *pkr;
175    
176     p = get_reg_entry_gpg4win ("gpg.exe");
177     if (!p)
178     return (1);
179     if (file_exist_check (p)) {
180     free_if_alloc (p);
181     return (1);
182     }
183     free_if_alloc (p);
184 twoaday 167
185     p = get_reg_entry_gpg ("HomeDir");
186     if (!p || dir_exist_check (p) != 0) {
187     free_if_alloc (p);
188     p = multi_gnupg_path (0);
189     }
190 twoaday 128 if (p && dir_exist_check (p)) {
191     memset (&sec_attr, 0, sizeof (sec_attr));
192     sec_attr.nLength = sizeof (sec_attr);
193     if (!CreateDirectory (p, &sec_attr)) {
194     msg_box (NULL, _("Could not create GPG home directory"),
195     _("WinPT Error"), MB_ERR);
196     free_if_alloc (p);
197     return (2);
198     }
199     }
200 twoaday 172 check_readonly_attr (p);
201 twoaday 128 pkr = make_filename (p, "pubring", "gpg");
202     free_if_alloc (p);
203     if (!pkr)
204     return -1;
205     if (get_file_size (pkr) == 0) {
206     free_if_alloc (pkr);
207     return -1;
208     }
209     return 0;
210     }
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     gpgme_error_t err = 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     _("WinPT Error"), MB_ERR);
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     static char program[512];
238     char currdir[256];
239     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     if (cmd == NULL)
252     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 137 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 80 /* We enable smartcard support for GPG: >= 2 or >= 1.4.3 */
288 twoaday 154 if (ma > 1 || pa >= 3)
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     {
303 twoaday 154 char *buf;
304 twoaday 121 const char *t;
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     if (!file_exist_check (get_prog_part ("keyserver.conf", 0)))
321 werner 36 t = get_prog_part ("keyserver.conf", 0);
322 twoaday 154 else
323 werner 36 t = "keyserver.conf";
324 twoaday 154 if (file_exist_check (t) == 0 && file_exist_check (buf) != 0) {
325 twoaday 159 //log_box (_("Keyserver"), MB_INFO,
326     // _("keyserver.conf will be copied to \"%s\"\r\n"), buf);
327 twoaday 154 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.use_tmpfiles = 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 werner 36 /* Main entry point. */
433     int WINAPI
434     WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
435     {
436     WNDCLASS wc = {0, winpt_main_proc, 0, 0, hinst, 0, 0, 0, 0, PGM_NAME};
437     HACCEL accel_tab;
438 twoaday 121 MSG msg;
439     HWND hwnd = NULL;
440     WORD ver[3], ptdver[4];
441     int rc, ec, created = 0;
442 werner 36 int first_start = 0, start_gpgprefs = 0;
443     int winpt_inst_found = 0;
444 twoaday 121 int start_manager = 0;
445 werner 36 const char *s;
446    
447     glob_hinst = hinst;
448 twoaday 87 if (cmdline && stristr (cmdline, "--stop")) {
449     hwnd = FindWindow ("WinPT", "WinPT");
450     if (hwnd != NULL)
451     PostMessage (hwnd, WM_DESTROY, 0, 0);
452     return 0;
453     }
454 twoaday 121
455     /*
456     OSVERSIONINFO osinf;
457     memset (&osinf, 0, sizeof (osinf));
458     if (GetVersionEx (&osinf) &&
459     osinf.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS &&
460     osinf.dwMinorVersion == 0) {
461     msg_box (NULL, "WinPT propably does not work on Windows 95 without restrictions",
462     "WinPT Warning", MB_INFO);
463     }
464     */
465    
466     #ifdef _DEBUG
467 werner 36 gpg_set_debug_mode (1);
468     debug = 1;
469 twoaday 121 #endif
470 werner 36
471 twoaday 121 get_file_version ("WinPT.exe", &ver[0], &ver[1], &ver[2], &ver[3]);
472     get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],
473     &ptdver[2], &ptdver[3]);
474     /* XXX
475     if (ptdver[0] != ver[0] || ptdver[1] != ver[1]|| ptdver[2] != ver[2]) {
476     log_box (_("WinPT Error"), MB_ERR,
477     _("The PTD.dll file has a different version than WinPT.exe\n"
478     "Please update the PTD.dll to version %d.%d.%d"),
479     ver[0], ver[1], ver[2]);
480     return 0;
481     }
482     */
483 twoaday 128
484 werner 36 if (gpg_md_selftest ()) {
485     msg_box (NULL, _("Cryptographic selftest failed."),
486     _("WinPT Error"), MB_ERR);
487     return 0;
488     }
489    
490 twoaday 137 s = gpgme_check_version (NEED_GPGME_VERSION);
491 werner 36 if (!s || !*s) {
492 twoaday 137 msg_box (NULL, _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),
493 werner 36 _("WinPT Error"), MB_ERR);
494     return 0;
495     }
496    
497     CreateMutex (NULL, TRUE, PGM_NAME);
498     if (GetLastError () == ERROR_ALREADY_EXISTS)
499     winpt_inst_found = 1;
500    
501     if (cmdline && stristr (cmdline, "--mobile")) {
502     msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",
503     "WinPT", MB_INFO);
504 twoaday 190 mobile_mode_active = 1;
505 werner 36 }
506 twoaday 190
507 twoaday 181 set_default_keyserver ();
508 twoaday 121 load_gettext (winpt_inst_found);
509 werner 36
510 twoaday 190 if (!mobile_mode_active) {
511 werner 36 regist_inst_gnupg (1);
512     regist_inst_winpt (1, &created);
513     }
514     else {
515 twoaday 190 if (enable_mobile_mode ())
516     return 0;
517 werner 36 created = 1; /* Disable registry writing */
518     }
519    
520     if (!created) {
521     memset (&reg_prefs, 0, sizeof (reg_prefs));
522     reg_prefs.use_tmpfiles = 1; /* default */
523     reg_prefs.fm.progress = 0; /* XXX: fix the bug and enable it again */
524     get_reg_winpt_prefs (&reg_prefs);
525 twoaday 41 gnupg_load_config ();
526 werner 36 }
527    
528 twoaday 128 if (is_gpg4win_installed ())
529     load_gpg_env (); /* XXX: check return code. */
530    
531 werner 36 rc = gnupg_check_homedir ();
532     if (rc) {
533     log_box (_("WinPT Error"), MB_ERR,
534     _("GPG home directory is not set correctly.\n"
535     "Please check the GPG registry settings:\n%s."),
536     winpt_strerror (rc));
537 werner 48 s = get_fileopen_dlg (GetActiveWindow (),
538 twoaday 121 _("Select GPG Public Keyring"),
539 twoaday 167 "GPG Keyrings (*.gpg)\0*.gpg\0\0",
540 twoaday 121 NULL);
541 werner 36 if (s != NULL) {
542     size_t n;
543 twoaday 121 char *p = strrchr (s, '\\');
544 werner 36 if (!p)
545     BUG (0);
546     n = p - s;
547     if (n) {
548 twoaday 121 char *file = new char[n+1];
549 werner 36 if (!file)
550     BUG (NULL);
551     memset (file, 0, n);
552     memcpy (file, s, n);
553     file[n] = '\0';
554     set_reg_entry_gpg ("HomeDir", file);
555     free_if_alloc (file);
556     gnupg_check_homedir (); /* change gpgProgram if needed */
557     }
558     }
559     else {
560     msg_box (NULL, _("GPG home directory could not be determited."),
561     _("WinPT Error"), MB_ERR);
562     goto start;
563     }
564     }
565    
566     rc = check_gnupg_prog ();
567     if (rc) {
568     if (msg_box (NULL, _("Could not find the GPG binary (gpg.exe).\n"
569     "Do you want to start the GPG preferences to "
570     "correct this problem?"), _("WinPT Error"),
571     MB_INFO|MB_YESNO) == IDYES)
572     start_gpgprefs = 1;
573 twoaday 121 else {
574 werner 36 msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
575     return 0;
576     }
577     }
578    
579     rc = gnupg_access_files ();
580     if (!start_gpgprefs && rc) {
581     if (rc == WPTERR_GPG_KEYRINGS || rc == WPTERR_GPG_OPT_KEYRINGS) {
582     ec = msg_box (NULL,
583     _("Could not access and/or find the public and secret keyring.\n"
584     "If this is an accident, quit the program and fix it.\n\n"
585     "Continue if you want that WinPT offers you more choices.\n"),
586     "WinPT", MB_INFO|MB_YESNO);
587     if (ec == IDYES)
588     first_start = 1;
589     }
590     if (!first_start) {
591     msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
592     return 0;
593     }
594     }
595 twoaday 133 if (check_for_empty_keyrings (false))
596     first_start = 1;
597 werner 36
598     if (!first_start) {
599     rc = gpg_check_permissions (1);
600     if (rc && rc == 2)
601     gpg_read_only = 1;
602     else if (rc)
603     return 0;
604     }
605 twoaday 121
606 werner 36 init_gnupg_table ();
607    
608 twoaday 121 if (fm_parse_command_line (cmdline) > 0) {
609 werner 36 free_gnupg_table ();
610     return 0;
611     }
612    
613     if (cmdline && stristr (cmdline, "--wipe-freespace")) {
614     dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_SPACE_SECDEL,
615 twoaday 73 GetDesktopWindow(), space_wipefrees_dlg_proc, 0,
616 werner 36 _("Wipe Free Space"), IDS_WINPT_SPACE_SECDEL);
617     free_gnupg_table ();
618     return 0;
619     }
620    
621     load_keyserver_conf (cmdline? 1 : 0);
622    
623     if (cmdline && (stristr (cmdline, "--keymanager")
624     || stristr (cmdline, "--cardmanager"))) {
625 twoaday 102 /* If an instance of WinPT is running, just send the command
626     to open the key manager. Otherwise start a new instance.
627     */
628     HWND tray = FindWindow ("WinPT", "WinPT");
629 twoaday 121 if (stristr (cmdline, "keymanager"))
630     start_manager = ID_WINPT_KEY;
631     else
632     start_manager = ID_WINPT_CARD;
633 twoaday 102 if (tray != NULL) {
634 twoaday 121 PostMessage (tray, WM_COMMAND, start_manager, 0);
635 twoaday 102 free_gnupg_table ();
636     return 0;
637     }
638 werner 36 }
639    
640     /* If we found another WinPT instance, just quit to avoid it
641     will be executed twice. */
642     if (winpt_inst_found) {
643     log_debug ("%s", "WinMain: WinPT is already running.");
644     free_gnupg_table ();
645     return 0;
646     }
647    
648 twoaday 190 if (cmdline && (stristr (cmdline, "--enable-debug") ||
649     stristr (cmdline, "--debug"))) {
650     gpg_set_debug_mode (1);
651     winpt_debug_msg ();
652     debug = 1;
653 werner 36 }
654    
655     wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
656     rc = RegisterClass (&wc);
657     if (rc == FALSE) {
658     msg_box (NULL, _("Could not register window class"),
659     _("WinPT Error"), MB_ERR);
660     free_gnupg_table ();
661     return 0;
662     }
663    
664     hwnd = CreateWindow (PGM_NAME,
665     PGM_NAME,
666     0, 0, 0, 0, 0,
667     NULL,
668     NULL,
669     hinst,
670     NULL);
671     if (hwnd == NULL) {
672     msg_box (NULL, _("Could not create window"), _("WinPT Error"), MB_ERR);
673     free_gnupg_table ();
674     return 0;
675     }
676     glob_hwnd = hwnd;
677     UpdateWindow (hwnd);
678    
679     if (!first_start && !start_gpgprefs) {
680     gnupg_backup_options ();
681 twoaday 128 if (!check_crypto_engine ()) {
682 werner 36 DestroyWindow (hwnd);
683     free_gnupg_table ();
684     return 0;
685     }
686     }
687    
688     if (start_gpgprefs) {
689     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
690 twoaday 41 gpgprefs_dlg_proc, 0);
691 twoaday 133 if (check_for_empty_keyrings (true))
692     first_start = 1; /* The public keyring is empty! */
693 werner 36 }
694    
695     if (first_start) {
696     struct genkey_s c;
697 twoaday 167 int choice;
698 werner 36 HWND h;
699     start:
700     h = GetDesktopWindow ();
701 twoaday 167 if (!gpg_prefs_ok ())
702     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
703 twoaday 41 gpgprefs_dlg_proc, 0);
704 twoaday 167 choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
705     first_run_dlg_proc, 0);
706     switch (choice) {
707 werner 36 case SETUP_KEYGEN:
708     c.interactive = 1;
709     c.first_start = 1;
710     rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD,
711     h, keygen_wizard_dlg_proc, (LPARAM)&c);
712     if (!rc)
713     goto start;
714     break;
715    
716     case SETUP_IMPORT:
717     rc = gnupg_copy_keyrings ();
718     if (rc) {
719     msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
720     goto start;
721     }
722     break;
723    
724 twoaday 167 case 0: /* Cancel/Abort. */
725     default:
726 werner 36 DestroyWindow (hwnd);
727     free_gnupg_table ();
728     return 0;
729     }
730     update_keycache (hwnd);
731 twoaday 167 if (!check_crypto_engine ()) {
732     DestroyWindow (hwnd);
733     free_gnupg_table ();
734     return 0;
735     }
736 werner 36 }
737     else {
738 twoaday 174 gpg_keycache_t c, sec_c;
739 werner 36 update_keycache (hwnd);
740     c = keycache_get_ctx (1);
741     if (!c || !gpg_keycache_get_size (c)) {
742     gnupg_display_error ();
743     msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
744     "Please check your GPG config (keyrings, pathes...)"),
745     _("WinPT Error"), MB_ERR);
746     ec = msg_box (NULL, _("It seems that GPG is not set properly.\n"
747     "Do you want to start the GPG preferences dialog?"),
748     "WinPT", MB_INFO|MB_YESNO);
749     if (ec == IDYES) {
750     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
751 twoaday 41 gpgprefs_dlg_proc, 0);
752 werner 36 update_keycache (hwnd);
753     }
754     else {
755     DestroyWindow (hwnd);
756     free_gnupg_table ();
757     return 0;
758     }
759     }
760 twoaday 174 sec_c = keycache_get_ctx (0);
761     if (check_default_key (sec_c)) {
762 twoaday 121 char *p = get_gnupg_default_key ();
763 werner 36 log_box (_("WinPT Error"), MB_ERR,
764 twoaday 174 _("Default key (from the GPG config file) could not be found.\n"
765     "Please check your gpg.conf or set a new default key to correct it:\n\n"
766 werner 36 "%s: public key not found."), p? p : "[null]");
767     free_if_alloc (p);
768     DestroyWindow (hwnd);
769     free_gnupg_table ();
770     return 0;
771     }
772     if (count_insecure_elgkeys ())
773     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,
774 twoaday 41 elgamal_warn_dlg_proc, 0);
775 werner 36 }
776    
777 twoaday 121 if (start_manager)
778     PostMessage (hwnd, WM_COMMAND, start_manager, 0);
779    
780 werner 36 accel_tab = LoadAccelerators (glob_hinst, (LPCTSTR)IDR_WINPT_ACCELERATOR);
781     keyring_check_last_access (); /* init */
782     while (GetMessage (&msg, hwnd, 0, 0)) {
783     if (!TranslateAccelerator (msg.hwnd, accel_tab, &msg)) {
784     TranslateMessage (&msg);
785     DispatchMessage (&msg);
786     }
787     }
788    
789     return 0;
790     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26