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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 248 - (hide annotations)
Fri Jul 28 11:11:09 2006 UTC (18 years, 7 months ago) by twoaday
File size: 20174 byte(s)
Prepare 1.0.0pre2 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 twoaday 248 {
297     const char *t, *conf;
298 twoaday 154 char *buf;
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 twoaday 248 WORD ver[3], ptdver[4];
452     const char *s;
453 twoaday 121 int rc, ec, created = 0;
454 werner 36 int first_start = 0, start_gpgprefs = 0;
455     int winpt_inst_found = 0;
456 twoaday 248 int start_manager = 0;
457 werner 36
458     glob_hinst = hinst;
459 twoaday 87 if (cmdline && stristr (cmdline, "--stop")) {
460     hwnd = FindWindow ("WinPT", "WinPT");
461     if (hwnd != NULL)
462     PostMessage (hwnd, WM_DESTROY, 0, 0);
463     return 0;
464     }
465 twoaday 121
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 twoaday 248 ec = get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],
473 twoaday 121 &ptdver[2], &ptdver[3]);
474 twoaday 193
475 twoaday 248 if (!ec && (ptdver[0] != ver[0] || ptdver[1] != ver[1]|| ptdver[2] != ver[2])) {
476 twoaday 121 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 twoaday 128
483 werner 36 if (gpg_md_selftest ()) {
484     msg_box (NULL, _("Cryptographic selftest failed."),
485     _("WinPT Error"), MB_ERR);
486     return 0;
487     }
488    
489 twoaday 137 s = gpgme_check_version (NEED_GPGME_VERSION);
490 werner 36 if (!s || !*s) {
491 twoaday 137 msg_box (NULL, _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),
492 werner 36 _("WinPT Error"), MB_ERR);
493     return 0;
494     }
495    
496     CreateMutex (NULL, TRUE, PGM_NAME);
497     if (GetLastError () == ERROR_ALREADY_EXISTS)
498     winpt_inst_found = 1;
499    
500     if (cmdline && stristr (cmdline, "--mobile")) {
501     msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",
502     "WinPT", MB_INFO);
503 twoaday 190 mobile_mode_active = 1;
504 werner 36 }
505 twoaday 190
506 twoaday 181 set_default_keyserver ();
507 twoaday 193 load_gettext ();
508 twoaday 208 admin_user = user_is_admin ();
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.fm.progress = 0; /* XXX: fix the bug and enable it again */
523     get_reg_winpt_prefs (&reg_prefs);
524 twoaday 41 gnupg_load_config ();
525 werner 36 }
526    
527 twoaday 128 if (is_gpg4win_installed ())
528     load_gpg_env (); /* XXX: check return code. */
529    
530 werner 36 rc = gnupg_check_homedir ();
531     if (rc) {
532     log_box (_("WinPT Error"), MB_ERR,
533     _("GPG home directory is not set correctly.\n"
534     "Please check the GPG registry settings:\n%s."),
535     winpt_strerror (rc));
536 werner 48 s = get_fileopen_dlg (GetActiveWindow (),
537 twoaday 121 _("Select GPG Public Keyring"),
538 twoaday 167 "GPG Keyrings (*.gpg)\0*.gpg\0\0",
539 twoaday 121 NULL);
540 werner 36 if (s != NULL) {
541     size_t n;
542 twoaday 121 char *p = strrchr (s, '\\');
543 werner 36 if (!p)
544     BUG (0);
545     n = p - s;
546     if (n) {
547 twoaday 121 char *file = new char[n+1];
548 werner 36 if (!file)
549     BUG (NULL);
550     memset (file, 0, n);
551     memcpy (file, s, n);
552     file[n] = '\0';
553     set_reg_entry_gpg ("HomeDir", file);
554     free_if_alloc (file);
555     gnupg_check_homedir (); /* change gpgProgram if needed */
556     }
557     }
558     else {
559 twoaday 231 msg_box (NULL, _("GPG home directory could not be determined."),
560 werner 36 _("WinPT Error"), MB_ERR);
561     goto start;
562     }
563     }
564    
565     rc = check_gnupg_prog ();
566     if (rc) {
567     if (msg_box (NULL, _("Could not find the GPG binary (gpg.exe).\n"
568     "Do you want to start the GPG preferences to "
569     "correct this problem?"), _("WinPT Error"),
570     MB_INFO|MB_YESNO) == IDYES)
571     start_gpgprefs = 1;
572 twoaday 121 else {
573 werner 36 msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
574     return 0;
575     }
576     }
577    
578     rc = gnupg_access_files ();
579     if (!start_gpgprefs && rc) {
580     if (rc == WPTERR_GPG_KEYRINGS || rc == WPTERR_GPG_OPT_KEYRINGS) {
581     ec = msg_box (NULL,
582     _("Could not access and/or find the public and secret keyring.\n"
583     "If this is an accident, quit the program and fix it.\n\n"
584 twoaday 248 "Continue if you want WinPT to offer you more choices.\n"),
585 werner 36 "WinPT", MB_INFO|MB_YESNO);
586     if (ec == IDYES)
587     first_start = 1;
588     }
589     if (!first_start) {
590     msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
591     return 0;
592     }
593     }
594 twoaday 133 if (check_for_empty_keyrings (false))
595     first_start = 1;
596 werner 36
597     if (!first_start) {
598     rc = gpg_check_permissions (1);
599     if (rc && rc == 2)
600     gpg_read_only = 1;
601     else if (rc)
602     return 0;
603     }
604 twoaday 121
605 werner 36 init_gnupg_table ();
606    
607 twoaday 121 if (fm_parse_command_line (cmdline) > 0) {
608 werner 36 free_gnupg_table ();
609     return 0;
610     }
611    
612     if (cmdline && stristr (cmdline, "--wipe-freespace")) {
613     dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_SPACE_SECDEL,
614 twoaday 73 GetDesktopWindow(), space_wipefrees_dlg_proc, 0,
615 werner 36 _("Wipe Free Space"), IDS_WINPT_SPACE_SECDEL);
616     free_gnupg_table ();
617     return 0;
618     }
619    
620     load_keyserver_conf (cmdline? 1 : 0);
621    
622     if (cmdline && (stristr (cmdline, "--keymanager")
623     || stristr (cmdline, "--cardmanager"))) {
624 twoaday 102 /* If an instance of WinPT is running, just send the command
625     to open the key manager. Otherwise start a new instance.
626     */
627     HWND tray = FindWindow ("WinPT", "WinPT");
628 twoaday 121 if (stristr (cmdline, "keymanager"))
629     start_manager = ID_WINPT_KEY;
630     else
631     start_manager = ID_WINPT_CARD;
632 twoaday 102 if (tray != NULL) {
633 twoaday 121 PostMessage (tray, WM_COMMAND, start_manager, 0);
634 twoaday 102 free_gnupg_table ();
635     return 0;
636     }
637 werner 36 }
638    
639     /* If we found another WinPT instance, just quit to avoid it
640     will be executed twice. */
641     if (winpt_inst_found) {
642     log_debug ("%s", "WinMain: WinPT is already running.");
643     free_gnupg_table ();
644     return 0;
645     }
646    
647 twoaday 190 if (cmdline && (stristr (cmdline, "--enable-debug") ||
648     stristr (cmdline, "--debug"))) {
649     gpg_set_debug_mode (1);
650     winpt_debug_msg ();
651     debug = 1;
652 werner 36 }
653    
654     wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
655     rc = RegisterClass (&wc);
656     if (rc == FALSE) {
657     msg_box (NULL, _("Could not register window class"),
658     _("WinPT Error"), MB_ERR);
659     free_gnupg_table ();
660     return 0;
661     }
662    
663     hwnd = CreateWindow (PGM_NAME,
664     PGM_NAME,
665     0, 0, 0, 0, 0,
666     NULL,
667     NULL,
668     hinst,
669     NULL);
670     if (hwnd == NULL) {
671     msg_box (NULL, _("Could not create window"), _("WinPT Error"), MB_ERR);
672     free_gnupg_table ();
673     return 0;
674     }
675     glob_hwnd = hwnd;
676     UpdateWindow (hwnd);
677    
678     if (!first_start && !start_gpgprefs) {
679     gnupg_backup_options ();
680 twoaday 128 if (!check_crypto_engine ()) {
681 werner 36 DestroyWindow (hwnd);
682     free_gnupg_table ();
683     return 0;
684     }
685     }
686    
687     if (start_gpgprefs) {
688     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
689 twoaday 41 gpgprefs_dlg_proc, 0);
690 twoaday 133 if (check_for_empty_keyrings (true))
691     first_start = 1; /* The public keyring is empty! */
692 werner 36 }
693    
694     if (first_start) {
695     struct genkey_s c;
696 twoaday 167 int choice;
697 werner 36 HWND h;
698     start:
699     h = GetDesktopWindow ();
700 twoaday 167 if (!gpg_prefs_ok ())
701     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
702 twoaday 41 gpgprefs_dlg_proc, 0);
703 twoaday 167 choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
704     first_run_dlg_proc, 0);
705     switch (choice) {
706 werner 36 case SETUP_KEYGEN:
707     c.interactive = 1;
708     c.first_start = 1;
709     rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD,
710     h, keygen_wizard_dlg_proc, (LPARAM)&c);
711     if (!rc)
712     goto start;
713     break;
714    
715     case SETUP_IMPORT:
716     rc = gnupg_copy_keyrings ();
717     if (rc) {
718     msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
719     goto start;
720     }
721     break;
722    
723 twoaday 167 case 0: /* Cancel/Abort. */
724     default:
725 werner 36 DestroyWindow (hwnd);
726     free_gnupg_table ();
727     return 0;
728     }
729     update_keycache (hwnd);
730 twoaday 167 if (!check_crypto_engine ()) {
731     DestroyWindow (hwnd);
732     free_gnupg_table ();
733     return 0;
734     }
735 twoaday 193 if (!is_gpg4win_installed ()) {
736     select_language ();
737     load_gettext ();
738     }
739 werner 36 }
740     else {
741 twoaday 174 gpg_keycache_t c, sec_c;
742 werner 36 update_keycache (hwnd);
743     c = keycache_get_ctx (1);
744     if (!c || !gpg_keycache_get_size (c)) {
745     gnupg_display_error ();
746     msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
747     "Please check your GPG config (keyrings, pathes...)"),
748     _("WinPT Error"), MB_ERR);
749 twoaday 248 ec = msg_box (NULL, _("It seems that GPG is not configured properly.\n"
750 werner 36 "Do you want to start the GPG preferences dialog?"),
751     "WinPT", MB_INFO|MB_YESNO);
752     if (ec == IDYES) {
753     DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
754 twoaday 41 gpgprefs_dlg_proc, 0);
755 werner 36 update_keycache (hwnd);
756     }
757     else {
758     DestroyWindow (hwnd);
759     free_gnupg_table ();
760     return 0;
761     }
762     }
763 twoaday 174 sec_c = keycache_get_ctx (0);
764     if (check_default_key (sec_c)) {
765 twoaday 121 char *p = get_gnupg_default_key ();
766 werner 36 log_box (_("WinPT Error"), MB_ERR,
767 twoaday 174 _("Default key (from the GPG config file) could not be found.\n"
768     "Please check your gpg.conf or set a new default key to correct it:\n\n"
769 werner 36 "%s: public key not found."), p? p : "[null]");
770 twoaday 197 set_gnupg_default_key (NULL);
771 werner 36 }
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