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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 208 - (hide annotations)
Mon May 1 12:22:18 2006 UTC (18 years, 10 months ago) by twoaday
File size: 19892 byte(s)
See ChangeLog.


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     _("WinPT Error"), MB_ERR);
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.use_tmpfiles = 1;
385     reg_prefs.word_wrap = 80;
386     reg_prefs.use_viewer = 0; /* XXX */
387 twoaday 190 return 0;
388 werner 36 }
389    
390    
391 twoaday 181 void
392     set_default_keyserver (void)
393     {
394     char *host = get_reg_entry_keyserver ("Default");
395     char *str_port = get_reg_entry_keyserver ("Default_Port");
396     WORD port = HKP_PORT;
397    
398     if (!host)
399     keyserver_set_default (NULL, 0);
400     else {
401     if (str_port && *str_port)
402     port = atoi (str_port);
403     keyserver_set_default (host, port);
404     }
405     free_if_alloc (host);
406     free_if_alloc (str_port);
407     }
408    
409    
410 twoaday 190 /* Display info message that WinPT is now in debug mode. */
411     void
412     winpt_debug_msg (void)
413     {
414     char output[512];
415     char temp[128];
416    
417     GetTempPath (sizeof temp -1, temp);
418     _snprintf (output, sizeof output - 1,
419     "The GPGME output file is %sgpgme.dbg\n"
420     "The WinPT output file is %swinpt.log\n", temp, temp);
421     MessageBox (NULL, output, "WinPT now runs in DEBUG MODE", MB_INFO);
422     }
423    
424    
425 twoaday 208 #include "wptKeyManager.h"
426    
427 werner 36 /* Main entry point. */
428     int WINAPI
429     WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
430     {
431     WNDCLASS wc = {0, winpt_main_proc, 0, 0, hinst, 0, 0, 0, 0, PGM_NAME};
432     HACCEL accel_tab;
433 twoaday 121 MSG msg;
434     HWND hwnd = NULL;
435 twoaday 193 /*WORD ver[3], ptdver[4];*/
436 twoaday 121 int rc, ec, created = 0;
437 werner 36 int first_start = 0, start_gpgprefs = 0;
438     int winpt_inst_found = 0;
439 twoaday 121 int start_manager = 0;
440 twoaday 208 const char *s;
441 werner 36
442     glob_hinst = hinst;
443 twoaday 87 if (cmdline && stristr (cmdline, "--stop")) {
444     hwnd = FindWindow ("WinPT", "WinPT");
445     if (hwnd != NULL)
446     PostMessage (hwnd, WM_DESTROY, 0, 0);
447     return 0;
448     }
449 twoaday 121
450     #ifdef _DEBUG
451 werner 36 gpg_set_debug_mode (1);
452     debug = 1;
453 twoaday 121 #endif
454 werner 36
455 twoaday 193 /* XXX
456 twoaday 121 get_file_version ("WinPT.exe", &ver[0], &ver[1], &ver[2], &ver[3]);
457     get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],
458     &ptdver[2], &ptdver[3]);
459 twoaday 193
460 twoaday 121 if (ptdver[0] != ver[0] || ptdver[1] != ver[1]|| ptdver[2] != ver[2]) {
461     log_box (_("WinPT Error"), MB_ERR,
462     _("The PTD.dll file has a different version than WinPT.exe\n"
463     "Please update the PTD.dll to version %d.%d.%d"),
464     ver[0], ver[1], ver[2]);
465     return 0;
466     }
467     */
468 twoaday 128
469 werner 36 if (gpg_md_selftest ()) {
470     msg_box (NULL, _("Cryptographic selftest failed."),
471     _("WinPT Error"), MB_ERR);
472     return 0;
473     }
474    
475 twoaday 137 s = gpgme_check_version (NEED_GPGME_VERSION);
476 werner 36 if (!s || !*s) {
477 twoaday 137 msg_box (NULL, _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),
478 werner 36 _("WinPT Error"), MB_ERR);
479     return 0;
480     }
481    
482     CreateMutex (NULL, TRUE, PGM_NAME);
483     if (GetLastError () == ERROR_ALREADY_EXISTS)
484     winpt_inst_found = 1;
485    
486     if (cmdline && stristr (cmdline, "--mobile")) {
487     msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",
488     "WinPT", MB_INFO);
489 twoaday 190 mobile_mode_active = 1;
490 werner 36 }
491 twoaday 190
492 twoaday 181 set_default_keyserver ();
493 twoaday 193 load_gettext ();
494 twoaday 208 admin_user = user_is_admin ();
495 werner 36
496 twoaday 190 if (!mobile_mode_active) {
497 werner 36 regist_inst_gnupg (1);
498     regist_inst_winpt (1, &created);
499     }
500     else {
501 twoaday 190 if (enable_mobile_mode ())
502     return 0;
503 werner 36 created = 1; /* Disable registry writing */
504     }
505    
506     if (!created) {
507     memset (&reg_prefs, 0, sizeof (reg_prefs));
508     reg_prefs.use_tmpfiles = 1; /* default */
509     reg_prefs.fm.progress = 0; /* XXX: fix the bug and enable it again */
510     get_reg_winpt_prefs (&reg_prefs);
511 twoaday 41 gnupg_load_config ();
512 werner 36 }
513    
514 twoaday 128 if (is_gpg4win_installed ())
515     load_gpg_env (); /* XXX: check return code. */
516    
517 werner 36 rc = gnupg_check_homedir ();
518     if (rc) {
519     log_box (_("WinPT Error"), MB_ERR,
520     _("GPG home directory is not set correctly.\n"
521     "Please check the GPG registry settings:\n%s."),
522     winpt_strerror (rc));
523 werner 48 s = get_fileopen_dlg (GetActiveWindow (),
524 twoaday 121 _("Select GPG Public Keyring"),
525 twoaday 167 "GPG Keyrings (*.gpg)\0*.gpg\0\0",
526 twoaday 121 NULL);
527 werner 36 if (s != NULL) {
528     size_t n;
529 twoaday 121 char *p = strrchr (s, '\\');
530 werner 36 if (!p)
531     BUG (0);
532     n = p - s;
533     if (n) {
534 twoaday 121 char *file = new char[n+1];
535 werner 36 if (!file)
536     BUG (NULL);
537     memset (file, 0, n);
538     memcpy (file, s, n);
539     file[n] = '\0';
540     set_reg_entry_gpg ("HomeDir", file);
541     free_if_alloc (file);
542     gnupg_check_homedir (); /* change gpgProgram if needed */
543     }
544     }
545     else {
546     msg_box (NULL, _("GPG home directory could not be determited."),
547     _("WinPT Error"), MB_ERR);
548     goto start;
549     }
550     }
551    
552     rc = check_gnupg_prog ();
553     if (rc) {
554     if (msg_box (NULL, _("Could not find the GPG binary (gpg.exe).\n"
555     "Do you want to start the GPG preferences to "
556     "correct this problem?"), _("WinPT Error"),
557     MB_INFO|MB_YESNO) == IDYES)
558     start_gpgprefs = 1;
559 twoaday 121 else {
560 werner 36 msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
561     return 0;
562     }
563     }
564    
565     rc = gnupg_access_files ();
566     if (!start_gpgprefs && rc) {
567     if (rc == WPTERR_GPG_KEYRINGS || rc == WPTERR_GPG_OPT_KEYRINGS) {
568     ec = msg_box (NULL,
569     _("Could not access and/or find the public and secret keyring.\n"
570     "If this is an accident, quit the program and fix it.\n\n"
571     "Continue if you want that WinPT offers you more choices.\n"),
572     "WinPT", MB_INFO|MB_YESNO);
573     if (ec == IDYES)
574     first_start = 1;
575     }
576     if (!first_start) {
577     msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
578     return 0;
579     }
580     }
581 twoaday 133 if (check_for_empty_keyrings (false))
582     first_start = 1;
583 werner 36
584     if (!first_start) {
585     rc = gpg_check_permissions (1);
586     if (rc && rc == 2)
587     gpg_read_only = 1;
588     else if (rc)
589     return 0;
590     }
591 twoaday 121
592 werner 36 init_gnupg_table ();
593    
594 twoaday 121 if (fm_parse_command_line (cmdline) > 0) {
595 werner 36 free_gnupg_table ();
596     return 0;
597     }
598    
599     if (cmdline && stristr (cmdline, "--wipe-freespace")) {
600     dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_SPACE_SECDEL,
601 twoaday 73 GetDesktopWindow(), space_wipefrees_dlg_proc, 0,
602 werner 36 _("Wipe Free Space"), IDS_WINPT_SPACE_SECDEL);
603     free_gnupg_table ();
604     return 0;
605     }
606    
607     load_keyserver_conf (cmdline? 1 : 0);
608    
609     if (cmdline && (stristr (cmdline, "--keymanager")
610     || stristr (cmdline, "--cardmanager"))) {
611 twoaday 102 /* If an instance of WinPT is running, just send the command
612     to open the key manager. Otherwise start a new instance.
613     */
614     HWND tray = FindWindow ("WinPT", "WinPT");
615 twoaday 121 if (stristr (cmdline, "keymanager"))
616     start_manager = ID_WINPT_KEY;
617     else
618     start_manager = ID_WINPT_CARD;
619 twoaday 102 if (tray != NULL) {
620 twoaday 121 PostMessage (tray, WM_COMMAND, start_manager, 0);
621 twoaday 102 free_gnupg_table ();
622     return 0;
623     }
624 werner 36 }
625    
626     /* If we found another WinPT instance, just quit to avoid it
627     will be executed twice. */
628     if (winpt_inst_found) {
629     log_debug ("%s", "WinMain: WinPT is already running.");
630     free_gnupg_table ();
631     return 0;
632     }
633    
634 twoaday 190 if (cmdline && (stristr (cmdline, "--enable-debug") ||
635     stristr (cmdline, "--debug"))) {
636     gpg_set_debug_mode (1);
637     winpt_debug_msg ();
638     debug = 1;
639 werner 36 }
640    
641     wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
642     rc = RegisterClass (&wc);
643     if (rc == FALSE) {
644     msg_box (NULL, _("Could not register window class"),
645     _("WinPT Error"), MB_ERR);
646     free_gnupg_table ();
647     return 0;
648     }
649    
650     hwnd = CreateWindow (PGM_NAME,
651     PGM_NAME,
652     0, 0, 0, 0, 0,
653     NULL,
654     NULL,
655     hinst,
656     NULL);
657     if (hwnd == NULL) {
658     msg_box (NULL, _("Could not create window"), _("WinPT Error"), MB_ERR);
659     free_gnupg_table ();
660     return 0;
661     }
662     glob_hwnd = hwnd;
663     UpdateWindow (hwnd);
664    
665     if (!first_start && !start_gpgprefs) {
666     gnupg_backup_options ();
667 twoaday 128 if (!check_crypto_engine ()) {
668 werner 36 DestroyWindow (hwnd);
669     free_gnupg_table ();
670     return 0;
671     }
672     }
673    
674     if (start_gpgprefs) {
675     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
676 twoaday 41 gpgprefs_dlg_proc, 0);
677 twoaday 133 if (check_for_empty_keyrings (true))
678     first_start = 1; /* The public keyring is empty! */
679 werner 36 }
680    
681     if (first_start) {
682     struct genkey_s c;
683 twoaday 167 int choice;
684 werner 36 HWND h;
685     start:
686     h = GetDesktopWindow ();
687 twoaday 167 if (!gpg_prefs_ok ())
688     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
689 twoaday 41 gpgprefs_dlg_proc, 0);
690 twoaday 167 choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
691     first_run_dlg_proc, 0);
692     switch (choice) {
693 werner 36 case SETUP_KEYGEN:
694     c.interactive = 1;
695     c.first_start = 1;
696     rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD,
697     h, keygen_wizard_dlg_proc, (LPARAM)&c);
698     if (!rc)
699     goto start;
700     break;
701    
702     case SETUP_IMPORT:
703     rc = gnupg_copy_keyrings ();
704     if (rc) {
705     msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
706     goto start;
707     }
708     break;
709    
710 twoaday 167 case 0: /* Cancel/Abort. */
711     default:
712 werner 36 DestroyWindow (hwnd);
713     free_gnupg_table ();
714     return 0;
715     }
716     update_keycache (hwnd);
717 twoaday 167 if (!check_crypto_engine ()) {
718     DestroyWindow (hwnd);
719     free_gnupg_table ();
720     return 0;
721     }
722 twoaday 193 if (!is_gpg4win_installed ()) {
723     select_language ();
724     load_gettext ();
725     }
726 werner 36 }
727     else {
728 twoaday 174 gpg_keycache_t c, sec_c;
729 werner 36 update_keycache (hwnd);
730     c = keycache_get_ctx (1);
731     if (!c || !gpg_keycache_get_size (c)) {
732     gnupg_display_error ();
733     msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
734     "Please check your GPG config (keyrings, pathes...)"),
735     _("WinPT Error"), MB_ERR);
736     ec = msg_box (NULL, _("It seems that GPG is not set properly.\n"
737     "Do you want to start the GPG preferences dialog?"),
738     "WinPT", MB_INFO|MB_YESNO);
739     if (ec == IDYES) {
740     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
741 twoaday 41 gpgprefs_dlg_proc, 0);
742 werner 36 update_keycache (hwnd);
743     }
744     else {
745     DestroyWindow (hwnd);
746     free_gnupg_table ();
747     return 0;
748     }
749     }
750 twoaday 174 sec_c = keycache_get_ctx (0);
751     if (check_default_key (sec_c)) {
752 twoaday 121 char *p = get_gnupg_default_key ();
753 werner 36 log_box (_("WinPT Error"), MB_ERR,
754 twoaday 174 _("Default key (from the GPG config file) could not be found.\n"
755     "Please check your gpg.conf or set a new default key to correct it:\n\n"
756 werner 36 "%s: public key not found."), p? p : "[null]");
757 twoaday 197 set_gnupg_default_key (NULL);
758 werner 36 }
759     if (count_insecure_elgkeys ())
760     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,
761 twoaday 41 elgamal_warn_dlg_proc, 0);
762 werner 36 }
763    
764 twoaday 121 if (start_manager)
765     PostMessage (hwnd, WM_COMMAND, start_manager, 0);
766    
767 werner 36 accel_tab = LoadAccelerators (glob_hinst, (LPCTSTR)IDR_WINPT_ACCELERATOR);
768     keyring_check_last_access (); /* init */
769     while (GetMessage (&msg, hwnd, 0, 0)) {
770     if (!TranslateAccelerator (msg.hwnd, accel_tab, &msg)) {
771     TranslateMessage (&msg);
772     DispatchMessage (&msg);
773     }
774     }
775    
776     return 0;
777     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26