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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 181 - (hide annotations)
Tue Mar 14 11:01:22 2006 UTC (18 years, 11 months ago) by twoaday
File size: 19259 byte(s)
2006-03-12  Timo Schulz  <ts@g10code.de>
 
        * wptGPG.cpp (gnupg_load_config): Search for 'ask-cert-expire'.
        * wptKeyPropsDlg.cpp (display_key_info): Automatically update
        sym algorithm preferences if needed.
        * wptKeysignDlg.cpp (date_is_today): New.
        (keysign_dlg_proc): Only allow to set cert expire date if
        the option was found.
        * wptGPGPrefsDlg.cpp (gpgprefs_dlg_proc): Allow to set
        'ask-cert-expire'.
         


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26