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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 271 - (hide annotations)
Sun Nov 5 08:57:45 2006 UTC (18 years, 3 months ago) by twoaday
File size: 21329 byte(s)


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26