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

Diff of /trunk/Src/WinPT.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 128 by twoaday, Mon Dec 19 13:05:59 2005 UTC revision 172 by twoaday, Mon Jan 30 13:47:35 2006 UTC
# Line 1  Line 1 
1  /* WinPT.cpp - Windows Privacy Tray (WinPT)  /* WinPT.cpp - Windows Privacy Tray (WinPT)
2   *      Copyright (C) 2000-2005 Timo Schulz   *      Copyright (C) 2000-2006 Timo Schulz
3   *   *
4   * This file is part of WinPT.   * This file is part of WinPT.
5   *   *
# Line 22  Line 22 
22  #endif  #endif
23    
24  #include <windows.h>  #include <windows.h>
25    #include <shlobj.h>
26    
27  #include "resource.h"  #include "resource.h"
28  #include "wptTypes.h"  #include "wptTypes.h"
# Line 40  Line 41 
41  #include "wptCardEdit.h"  #include "wptCardEdit.h"
42  #include "wptCrypto.h"  #include "wptCrypto.h"
43    
44  #define MIN_GPG_VER   "1.4.2"   /* Minimal GPG version. */  void remove_crit_file_attrs (const char *fname, int force);
 #define MIN_GPGME_VER "1.2.0"   /* Minimal GPGME version. */  
45    
46    
47  HINSTANCE glob_hinst;   /* global instance for the dialogs */  HINSTANCE glob_hinst;   /* global instance for the dialogs */
48  HWND glob_hwnd;         /* global window handle for the dialogs */  HWND glob_hwnd;         /* global window handle for the dialogs */
49  HWND activ_hwnd;  HWND activ_hwnd;
 LOCK mo_file;  
50  int scard_support = 0;  int scard_support = 0;
51  int debug = 0;  int debug = 0;
52  int mobile = 0;  int mobile = 0;
# Line 96  static void Line 95  static void
95  load_gettext (int prev_inst)  load_gettext (int prev_inst)
96  {  {
97      char *nls = NULL;      char *nls = NULL;
     char *file = NULL;  
98    
99      nls = get_gettext_lang ();      nls = get_gettext_lang ();
100      if (nls) {      if (nls != NULL) {
101          set_gettext_file ("winpt", nls);          set_gettext_file ("winpt", nls);
         file = make_filename (nls, "winpt", "mo");  
         if (!file_exist_check (nls) && init_file_lock (&mo_file, file))  {  
             if (!prev_inst)  
                 msg_box (NULL, _("Could not initizalize file lock.\n"  
                                  "Native Language Support"),  
                          _("WinPT Error"), MB_ERR);  
         }  
102          free_if_alloc (nls);          free_if_alloc (nls);
103        }
104    }
105    
106    
107    /* Return true if the GPG environment is useable. */
108    static bool
109    gpg_prefs_ok (void)
110    {
111        char *p;
112    
113        p = get_reg_entry_gpg4win ("gpg.exe");
114        if (!p || file_exist_check (p) != 0) {
115            free_if_alloc (p);
116            p = get_reg_entry_gpg ("gpgProgram");
117            if (!p || file_exist_check (p) != 0) {
118                free_if_alloc (p);
119                return false;
120            }
121        }
122        free_if_alloc (p);
123        p = get_reg_entry_gpg4win (NULL);    
124        if (!p || dir_exist_check (p) != 0) {
125            free_if_alloc (p);
126            p = get_reg_entry_gpg ("HomeDir");
127            if (!p || dir_exist_check (p) != 0) {
128                free_if_alloc (p);
129                return false;
130            }
131        }
132        free_if_alloc (p);
133        return true;
134    }
135    
136    
137    /* Check gpg files if they are read-only and ask the user
138       if this should be corrected. */
139    static void
140    check_readonly_attr (const char *homedir)
141    {
142        const char *files[] = {"pubring.gpg", "secring.gpg", "trustdb.gpg", NULL};
143        char *file;
144        int i;
145    
146        for (i=0; files[i] != NULL; i++) {
147            file = make_filename (homedir, files[i], NULL);
148            remove_crit_file_attrs (file, 0);
149          free_if_alloc (file);          free_if_alloc (file);
150      }      }
151  }  }
# Line 134  load_gpg_env (void) Line 171  load_gpg_env (void)
171          return (1);          return (1);
172      }      }
173      free_if_alloc (p);      free_if_alloc (p);
174      p = multi_gnupg_path (0);  
175        p = get_reg_entry_gpg ("HomeDir");
176        if (!p || dir_exist_check (p) != 0) {
177            free_if_alloc (p);
178            p = multi_gnupg_path (0);
179        }
180      if (p && dir_exist_check (p)) {      if (p && dir_exist_check (p)) {
181          memset (&sec_attr, 0, sizeof (sec_attr));          memset (&sec_attr, 0, sizeof (sec_attr));
182          sec_attr.nLength = sizeof (sec_attr);          sec_attr.nLength = sizeof (sec_attr);
# Line 145  load_gpg_env (void) Line 187  load_gpg_env (void)
187              return (2);              return (2);
188          }          }
189      }      }
190        check_readonly_attr (p);
191      pkr = make_filename (p, "pubring", "gpg");      pkr = make_filename (p, "pubring", "gpg");
192      free_if_alloc (p);      free_if_alloc (p);
193      if (!pkr)      if (!pkr)
# Line 156  load_gpg_env (void) Line 199  load_gpg_env (void)
199      return 0;      return 0;
200  }  }
201    
202    
203  /* check if the default key from the gpg.conf file is available in the  /* check if the default key from the gpg.conf file is available in the
204     keyring. if not, bail out because encryption won't work properly then. */     keyring. if not, bail out because encryption won't work properly then. */
205  static int  static int
# Line 214  get_prog_part (const char * fname, int u Line 258  get_prog_part (const char * fname, int u
258  static bool  static bool
259  check_crypto_engine (void)  check_crypto_engine (void)
260  {  {
261      int ma=1, mi=4, pa=2; /* GPG 1.4.2 */      int ma=0, mi=0, pa=0;
262      int rc;      int rc;
263    
264      rc = check_gnupg_engine (&ma, &mi, &pa);      rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);
265      if (rc == -1) {      if (rc == -1) {
266          msg_box (NULL, _("Could not read GnuPG version."),          msg_box (NULL, _("Could not read GnuPG version."),
267                   _("WinPT Error"), MB_ERR);                   _("WinPT Error"), MB_ERR);
# Line 226  check_crypto_engine (void) Line 270  check_crypto_engine (void)
270      else if (rc) {      else if (rc) {
271          log_box (_("WinPT Error"), MB_ERR,          log_box (_("WinPT Error"), MB_ERR,
272                   _("Sorry, you need a newer GPG version.\n"                   _("Sorry, you need a newer GPG version.\n"
273                     "GPG version %d.%d.%d required GPG version "MIN_GPG_VER),                     "GPG version %d.%d.%d required GPG version "NEED_GPG_VERSION),
274                     ma, mi, pa);                     ma, mi, pa);
275          return false;          return false;
276      }      }
# Line 246  check_crypto_engine (void) Line 290  check_crypto_engine (void)
290  static int  static int
291  load_keyserver_conf (int quiet)  load_keyserver_conf (int quiet)
292  {  {
293        char *buf;
294      const char *t;      const char *t;
295      int rc;      int rc;
296    
297      if (reg_prefs.kserv_conf)      /* Create $APPDATA\winpt if needed. */
298          t = reg_prefs.kserv_conf;      buf = make_special_filename (CSIDL_APPDATA, "winpt", NULL);
299      else if (!file_exist_check (get_prog_part ("keyserver.conf", 0)))      if (buf && dir_exist_check (buf) && !CreateDirectory (buf, NULL)) {
300            MessageBox (NULL, _("Failed to create WinPT directory"),
301                        _("Keyserver"), MB_ERR);
302            free_if_alloc (buf);
303            return -1;
304        }
305        free_if_alloc (buf);
306    
307        /* Check for $APPDATA\winpt\keyserver.conf */
308        buf = make_special_filename (CSIDL_APPDATA, "winpt\\keyserver.conf", NULL);
309    
310        if (!file_exist_check (get_prog_part ("keyserver.conf", 0)))
311          t = get_prog_part ("keyserver.conf", 0);          t = get_prog_part ("keyserver.conf", 0);
312      else      else
313          t = "keyserver.conf";          t = "keyserver.conf";
314        if (file_exist_check (t) == 0 && file_exist_check (buf) != 0) {
315            //log_box (_("Keyserver"), MB_INFO,
316            //       _("keyserver.conf will be copied to \"%s\"\r\n"), buf);
317            if (!CopyFile (t, buf, FALSE)) {
318                MessageBox (NULL, _("Failed to copy the keyserver.conf"),
319                            _("Keyserver"), MB_ERR);
320                free_if_alloc (buf);
321                return -1;
322            }
323            t = buf;
324        }
325        else
326            t = buf;
327        
328      rc = kserver_load_conf (t);      rc = kserver_load_conf (t);
329      if (rc && !quiet)      if (rc && !quiet)
330          msg_box (NULL, winpt_strerror (rc), _("Keyserver"), MB_ERR);          msg_box (NULL, winpt_strerror (rc), _("Keyserver"), MB_ERR);
331        else {
332            free_if_alloc (reg_prefs.kserv_conf);
333            reg_prefs.kserv_conf = m_strdup (t);
334        }
335        free_if_alloc (buf);
336      return rc;      return rc;
337  }  }
338    
339    
340    /* Check if both keyrings are empty. This indicates that
341       WinPT should offer to generate a key pair. */
342    static bool
343    check_for_empty_keyrings (bool pub_only)
344    {
345        char *p;
346        int n = 0;
347    
348        p = get_gnupg_keyring (1, 0);
349        if (file_exist_check (p) == 0 && get_file_size (p) == 0)
350            n++;
351        free_if_alloc (p);
352        if (pub_only)
353            return n == 1? true : false;
354        p = get_gnupg_keyring (0, 0);
355        if (file_exist_check (p) == 0 && get_file_size (p) == 0)
356            n++;
357        free_if_alloc (p);
358        return n==2? true : false;
359    }
360    
361    
362  /* Enable the mobility mode. */  /* Enable the mobility mode. */
363  static void  static void
364  enable_mobile_mode (void)  enable_mobile_mode (void)
# Line 338  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 435  WinMain (HINSTANCE hinst, HINSTANCE hpre
435          return 0;          return 0;
436      }      }
437    
438      s = gpgme_check_version (MIN_GPGME_VER);      s = gpgme_check_version (NEED_GPGME_VERSION);
439      if (!s || !*s) {      if (!s || !*s) {
440          msg_box (NULL, _("A newer GPGME version is needed; at least "MIN_GPGME_VER),          msg_box (NULL, _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),
441                   _("WinPT Error"), MB_ERR);                   _("WinPT Error"), MB_ERR);
442          return 0;          return 0;
443      }      }
# Line 377  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 474  WinMain (HINSTANCE hinst, HINSTANCE hpre
474              hotkeys_modify ();              hotkeys_modify ();
475          gnupg_load_config ();          gnupg_load_config ();
476      }      }
477        else { /* default settings. */
478            reg_prefs.keylist_mode = 1;
479        }
480    
481      if (is_gpg4win_installed ())      if (is_gpg4win_installed ())
482          load_gpg_env (); /* XXX: check return code. */          load_gpg_env (); /* XXX: check return code. */
# Line 389  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 489  WinMain (HINSTANCE hinst, HINSTANCE hpre
489                   winpt_strerror (rc));                   winpt_strerror (rc));
490          s = get_fileopen_dlg (GetActiveWindow (),          s = get_fileopen_dlg (GetActiveWindow (),
491                                _("Select GPG Public Keyring"),                                _("Select GPG Public Keyring"),
492                                _("GPG Keyrings (*.gpg)\0*.gpg\0\0"),                                "GPG Keyrings (*.gpg)\0*.gpg\0\0",
493                                NULL);                                NULL);
494          if (s != NULL) {          if (s != NULL) {
495              size_t n;              size_t n;
# Line 445  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 545  WinMain (HINSTANCE hinst, HINSTANCE hpre
545              return 0;              return 0;
546          }          }
547      }      }
548        if (check_for_empty_keyrings (false))
549            first_start = 1;
550    
551      if (!first_start) {      if (!first_start) {
552          rc = gpg_check_permissions (1);          rc = gpg_check_permissions (1);
# Line 539  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 641  WinMain (HINSTANCE hinst, HINSTANCE hpre
641      }      }
642            
643      if (start_gpgprefs) {      if (start_gpgprefs) {
         char *ring;  
644          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
645                          gpgprefs_dlg_proc, 0);                          gpgprefs_dlg_proc, 0);
646          ring = get_gnupg_keyring (0, !NO_STRICT);          if (check_for_empty_keyrings (true))
647          if (gnupg_access_keyring (0) == -1 && get_file_size (ring) == 0)              first_start = 1; /* The public keyring is empty! */
             first_start = 1; /* The keyring is empty! */  
         free_if_alloc (ring);  
648      }      }
649    
650      if (first_start) {      if (first_start) {
         struct first_start_s fs;  
651          struct genkey_s c;          struct genkey_s c;
652            int choice;
653          HWND h;          HWND h;
654  start:  start:
655          h = GetDesktopWindow ();          h = GetDesktopWindow ();
656          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,          if (!gpg_prefs_ok ())
657                DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
658                              gpgprefs_dlg_proc, 0);                              gpgprefs_dlg_proc, 0);
659          DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,          choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
660                          first_run_dlg_proc, (LPARAM)&fs);                                   first_run_dlg_proc, 0);
661          switch (fs.choice) {          switch (choice) {
662          case SETUP_KEYGEN:          case SETUP_KEYGEN:
663              c.interactive = 1;              c.interactive = 1;
664              c.first_start = 1;              c.first_start = 1;
# Line 576  start: Line 676  start:
676              }              }
677              break;              break;
678    
679          case -1:          case 0: /* Cancel/Abort. */
680            default:
681              DestroyWindow (hwnd);              DestroyWindow (hwnd);
682              free_gnupg_table ();              free_gnupg_table ();
683              return 0;              return 0;
684          }          }
685          update_keycache (hwnd);          update_keycache (hwnd);
686          check_crypto_engine ();          if (!check_crypto_engine ()) {
687                DestroyWindow (hwnd);
688                free_gnupg_table ();
689                return 0;
690            }
691      }      }
692      else {      else {
693          gpg_keycache_t c;          gpg_keycache_t c;

Legend:
Removed from v.128  
changed lines
  Added in v.172

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26