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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 226 - (hide annotations)
Mon Jun 12 13:40:21 2006 UTC (18 years, 8 months ago) by twoaday
File size: 20166 byte(s)
Prepare new release.


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26