/[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 181 by twoaday, Tue Mar 14 11:01:22 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 71  update_keycache (HWND hwnd) Line 70  update_keycache (HWND hwnd)
70  /* Set GPGME debug mode. If @val is 0, the debug mode is disabled. */  /* Set GPGME debug mode. If @val is 0, the debug mode is disabled. */
71  void  void
72  gpg_set_debug_mode (int val)  gpg_set_debug_mode (int val)
73  {        {
74        /* XXX: create the file in $user\$temp */
75      if (val)      if (val)
76          putenv ("GPGME_DEBUG=5:gpgme.dbg");          putenv ("GPGME_DEBUG=5:gpgme.dbg");
77      else      else
# Line 96  static void Line 96  static void
96  load_gettext (int prev_inst)  load_gettext (int prev_inst)
97  {  {
98      char *nls = NULL;      char *nls = NULL;
     char *file = NULL;  
99    
100      nls = get_gettext_lang ();      nls = get_gettext_lang ();
101      if (nls) {      if (nls != NULL) {
102          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);  
         }  
103          free_if_alloc (nls);          free_if_alloc (nls);
104        }
105    }
106    
107    
108    /* 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    /* 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    
147        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);          free_if_alloc (file);
151      }      }
152  }  }
# Line 134  load_gpg_env (void) Line 172  load_gpg_env (void)
172          return (1);          return (1);
173      }      }
174      free_if_alloc (p);      free_if_alloc (p);
175      p = multi_gnupg_path (0);  
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      if (p && dir_exist_check (p)) {      if (p && dir_exist_check (p)) {
182          memset (&sec_attr, 0, sizeof (sec_attr));          memset (&sec_attr, 0, sizeof (sec_attr));
183          sec_attr.nLength = sizeof (sec_attr);          sec_attr.nLength = sizeof (sec_attr);
# Line 145  load_gpg_env (void) Line 188  load_gpg_env (void)
188              return (2);              return (2);
189          }          }
190      }      }
191        check_readonly_attr (p);
192      pkr = make_filename (p, "pubring", "gpg");      pkr = make_filename (p, "pubring", "gpg");
193      free_if_alloc (p);      free_if_alloc (p);
194      if (!pkr)      if (!pkr)
# Line 156  load_gpg_env (void) Line 200  load_gpg_env (void)
200      return 0;      return 0;
201  }  }
202    
203    
204  /* 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
205     keyring. if not, bail out because encryption won't work properly then. */     keyring. if not, bail out because encryption won't work properly then. */
206  static int  static int
# Line 214  get_prog_part (const char * fname, int u Line 259  get_prog_part (const char * fname, int u
259  static bool  static bool
260  check_crypto_engine (void)  check_crypto_engine (void)
261  {  {
262      int ma=1, mi=4, pa=2; /* GPG 1.4.2 */      int ma=0, mi=0, pa=0;
263      int rc;      int rc;
264    
265      rc = check_gnupg_engine (&ma, &mi, &pa);      rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);
266      if (rc == -1) {      if (rc == -1) {
267          msg_box (NULL, _("Could not read GnuPG version."),          msg_box (NULL, _("Could not read GnuPG version."),
268                   _("WinPT Error"), MB_ERR);                   _("WinPT Error"), MB_ERR);
# Line 226  check_crypto_engine (void) Line 271  check_crypto_engine (void)
271      else if (rc) {      else if (rc) {
272          log_box (_("WinPT Error"), MB_ERR,          log_box (_("WinPT Error"), MB_ERR,
273                   _("Sorry, you need a newer GPG version.\n"                   _("Sorry, you need a newer GPG version.\n"
274                     "GPG version %d.%d.%d required GPG version "MIN_GPG_VER),                     "GPG version %d.%d.%d required GPG version "NEED_GPG_VERSION),
275                     ma, mi, pa);                     ma, mi, pa);
276          return false;          return false;
277      }      }
# Line 246  check_crypto_engine (void) Line 291  check_crypto_engine (void)
291  static int  static int
292  load_keyserver_conf (int quiet)  load_keyserver_conf (int quiet)
293  {  {
294        char *buf;
295      const char *t;      const char *t;
296      int rc;      int rc;
297    
298      if (reg_prefs.kserv_conf)      /* Create $APPDATA\winpt if needed. */
299          t = reg_prefs.kserv_conf;      buf = make_special_filename (CSIDL_APPDATA, "winpt", NULL);
300      else if (!file_exist_check (get_prog_part ("keyserver.conf", 0)))      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          t = get_prog_part ("keyserver.conf", 0);          t = get_prog_part ("keyserver.conf", 0);
313      else      else
314          t = "keyserver.conf";          t = "keyserver.conf";
315        if (file_exist_check (t) == 0 && file_exist_check (buf) != 0) {
316            //log_box (_("Keyserver"), MB_INFO,
317            //       _("keyserver.conf will be copied to \"%s\"\r\n"), buf);
318            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      rc = kserver_load_conf (t);      rc = kserver_load_conf (t);
330      if (rc && !quiet)      if (rc && !quiet)
331          msg_box (NULL, winpt_strerror (rc), _("Keyserver"), MB_ERR);          msg_box (NULL, winpt_strerror (rc), _("Keyserver"), MB_ERR);
332        else {
333            free_if_alloc (reg_prefs.kserv_conf);
334            reg_prefs.kserv_conf = m_strdup (t);
335        }
336        free_if_alloc (buf);
337      return rc;      return rc;
338  }  }
339    
340    
341    /* 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  /* Enable the mobility mode. */  /* Enable the mobility mode. */
364  static void  static void
365  enable_mobile_mode (void)  enable_mobile_mode (void)
# Line 271  enable_mobile_mode (void) Line 369  enable_mobile_mode (void)
369      reg_prefs.auto_backup = 0;      reg_prefs.auto_backup = 0;
370      reg_prefs.cache_time = 0;      reg_prefs.cache_time = 0;
371      reg_prefs.expert = 0;      reg_prefs.expert = 0;
     reg_prefs.keylist_mode = 1;  
372      reg_prefs.kserv_conf = m_strdup ("keyserver.conf");      reg_prefs.kserv_conf = m_strdup ("keyserver.conf");
373      reg_prefs.no_zip_mmedia = 1;      reg_prefs.no_zip_mmedia = 1;
374      reg_prefs.use_tmpfiles = 1;      reg_prefs.use_tmpfiles = 1;
# Line 280  enable_mobile_mode (void) Line 377  enable_mobile_mode (void)
377  }  }
378    
379    
380    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  /* Main entry point. */  /* Main entry point. */
400  int WINAPI  int WINAPI
401  WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)  WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
# Line 338  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 454  WinMain (HINSTANCE hinst, HINSTANCE hpre
454          return 0;          return 0;
455      }      }
456    
457      s = gpgme_check_version (MIN_GPGME_VER);      s = gpgme_check_version (NEED_GPGME_VERSION);
458      if (!s || !*s) {      if (!s || !*s) {
459          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),
460                   _("WinPT Error"), MB_ERR);                   _("WinPT Error"), MB_ERR);
461          return 0;          return 0;
462      }      }
# Line 355  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 471  WinMain (HINSTANCE hinst, HINSTANCE hpre
471          mobile = 1;          mobile = 1;
472      }      }
473    
474      set_default_kserver ();      set_default_keyserver ();
475      load_gettext (winpt_inst_found);      load_gettext (winpt_inst_found);
476    
477      if (!mobile) {      if (!mobile) {
# Line 373  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 489  WinMain (HINSTANCE hinst, HINSTANCE hpre
489          reg_prefs.use_tmpfiles = 1; /* default */          reg_prefs.use_tmpfiles = 1; /* default */
490          reg_prefs.fm.progress = 0; /* XXX: fix the bug and enable it again */          reg_prefs.fm.progress = 0; /* XXX: fix the bug and enable it again */
491          get_reg_winpt_prefs (&reg_prefs);          get_reg_winpt_prefs (&reg_prefs);
         if (!reg_prefs.no_hotkeys)  
             hotkeys_modify ();  
492          gnupg_load_config ();          gnupg_load_config ();
493      }      }
494    
# Line 389  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 503  WinMain (HINSTANCE hinst, HINSTANCE hpre
503                   winpt_strerror (rc));                   winpt_strerror (rc));
504          s = get_fileopen_dlg (GetActiveWindow (),          s = get_fileopen_dlg (GetActiveWindow (),
505                                _("Select GPG Public Keyring"),                                _("Select GPG Public Keyring"),
506                                _("GPG Keyrings (*.gpg)\0*.gpg\0\0"),                                "GPG Keyrings (*.gpg)\0*.gpg\0\0",
507                                NULL);                                NULL);
508          if (s != NULL) {          if (s != NULL) {
509              size_t n;              size_t n;
# Line 445  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 559  WinMain (HINSTANCE hinst, HINSTANCE hpre
559              return 0;              return 0;
560          }          }
561      }      }
562        if (check_for_empty_keyrings (false))
563            first_start = 1;
564    
565      if (!first_start) {      if (!first_start) {
566          rc = gpg_check_permissions (1);          rc = gpg_check_permissions (1);
# Line 539  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 655  WinMain (HINSTANCE hinst, HINSTANCE hpre
655      }      }
656            
657      if (start_gpgprefs) {      if (start_gpgprefs) {
         char *ring;  
658          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
659                          gpgprefs_dlg_proc, 0);                          gpgprefs_dlg_proc, 0);
660          ring = get_gnupg_keyring (0, !NO_STRICT);          if (check_for_empty_keyrings (true))
661          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);  
662      }      }
663    
664      if (first_start) {      if (first_start) {
         struct first_start_s fs;  
665          struct genkey_s c;          struct genkey_s c;
666            int choice;
667          HWND h;          HWND h;
668  start:  start:
669          h = GetDesktopWindow ();          h = GetDesktopWindow ();
670          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,          if (!gpg_prefs_ok ())
671                DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
672                              gpgprefs_dlg_proc, 0);                              gpgprefs_dlg_proc, 0);
673          DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,          choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
674                          first_run_dlg_proc, (LPARAM)&fs);                                   first_run_dlg_proc, 0);
675          switch (fs.choice) {          switch (choice) {
676          case SETUP_KEYGEN:          case SETUP_KEYGEN:
677              c.interactive = 1;              c.interactive = 1;
678              c.first_start = 1;              c.first_start = 1;
# Line 576  start: Line 690  start:
690              }              }
691              break;              break;
692    
693          case -1:          case 0: /* Cancel/Abort. */
694            default:
695              DestroyWindow (hwnd);              DestroyWindow (hwnd);
696              free_gnupg_table ();              free_gnupg_table ();
697              return 0;              return 0;
698          }          }
699          update_keycache (hwnd);          update_keycache (hwnd);
700          check_crypto_engine ();          if (!check_crypto_engine ()) {
701                DestroyWindow (hwnd);
702                free_gnupg_table ();
703                return 0;
704            }
705      }      }
706      else {      else {
707          gpg_keycache_t c;          gpg_keycache_t c, sec_c;
708          update_keycache (hwnd);          update_keycache (hwnd);
709          c = keycache_get_ctx (1);          c = keycache_get_ctx (1);
710          if (!c || !gpg_keycache_get_size (c)) {          if (!c || !gpg_keycache_get_size (c)) {
# Line 607  start: Line 726  start:
726                  return 0;                  return 0;
727              }              }
728          }          }
729          if (check_default_key (c)) {          sec_c = keycache_get_ctx (0);
730            if (check_default_key (sec_c)) {
731              char *p = get_gnupg_default_key ();              char *p = get_gnupg_default_key ();
732              log_box (_("WinPT Error"), MB_ERR,              log_box (_("WinPT Error"), MB_ERR,
733                       _("Default key from the GPG options file could not be found.\n"                       _("Default key (from the GPG config file) could not be found.\n"
734                         "Please check your gpg.conf (options) to correct this:\n\n"                         "Please check your gpg.conf or set a new default key to correct it:\n\n"
735                         "%s: public key not found."), p? p : "[null]");                         "%s: public key not found."), p? p : "[null]");
736              free_if_alloc (p);              free_if_alloc (p);
737              DestroyWindow (hwnd);              DestroyWindow (hwnd);

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26