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

Annotation of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 197 - (hide annotations)
Mon Apr 10 07:38:06 2006 UTC (18 years, 10 months ago) by twoaday
File size: 19617 byte(s)
2006-04-09  Timo Schulz  <ts@g10code.de>
 
        * wptGPGPrefsDlg.cpp (gpgprefs_dlg_proc): Only return true
        if the homedir value was changed.
        * wptGPG.cpp (default_key_from_cache): Only return secret key
        if public part is available.
        (set_gnupg_default_key): Fix NULL problem.
        * wptKeyEditDlgs.cpp (do_editkey_clean): Set update flag.
        * wptFileCBS.cpp (write_cb, read_cb): Better error handling.
        * wptFileManagerDlg.cpp (file_manager_dlg_proc): Handle
        'always-on-top' correctly.
        * wptKeylist.cpp (keylist_get_recipients): Allocate enough
        mem to hold all possible keys.
        (keylist_enum_keys): Likewise.


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26