/[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 137 by twoaday, Mon Jan 9 14:01:51 2006 UTC revision 208 by twoaday, Mon May 1 12:22:18 2006 UTC
# 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 39  Line 40 
40  #include "wptContext.h"  #include "wptContext.h"
41  #include "wptCardEdit.h"  #include "wptCardEdit.h"
42  #include "wptCrypto.h"  #include "wptCrypto.h"
43    #include "wptUTF8.h"
44    
45    void remove_crit_file_attrs (const char *fname, int force);
46    BOOL user_is_admin (void);
47    
48    /* Global variables. */
49  HINSTANCE glob_hinst;   /* global instance for the dialogs */  HINSTANCE glob_hinst;   /* global instance for the dialogs */
50  HWND glob_hwnd;         /* global window handle for the dialogs */  HWND glob_hwnd;         /* global window handle for the dialogs */
 HWND activ_hwnd;  
51  int scard_support = 0;  int scard_support = 0;
52  int debug = 0;  int debug = 0;
53  int mobile = 0;  int mobile_mode_active = 0;
54  int gpg_read_only = 0;  int gpg_read_only = 0;
55    int admin_user = 0;
56  char gpgver[3];  char gpgver[3];
57    /* End */
58    
59    
60  /* Load the key cache and rebuild the signature cache. */  /* Load the key cache and rebuild the signature cache. */
61  static void  void
62  update_keycache (HWND hwnd)  update_keycache (HWND hwnd)
63  {  {
64      refresh_cache_s rcs = {0};      refresh_cache_s rcs = {0};
# Line 60  update_keycache (HWND hwnd) Line 67  update_keycache (HWND hwnd)
67      rcs.tr_update = 1;      rcs.tr_update = 1;
68      DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,      DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,
69                      keycache_dlg_proc, (LPARAM)&rcs);                      keycache_dlg_proc, (LPARAM)&rcs);
70        /* XXX: the dialog return 0 when an error occurs.
71                in this case figure out if the gpg env is OK
72                and supress dialogs to configure gpg. */
73  }  }
74    
75    
76  /* 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. */
77  void  void
78  gpg_set_debug_mode (int val)  gpg_set_debug_mode (int val)
79  {        {
80      if (val)      static char buf[256];
81          putenv ("GPGME_DEBUG=5:gpgme.dbg");      char tmp[128];
82        
83        /* XXX: no gpgme.dbg is created. */
84        if (val > 0) {
85            GetTempPath (sizeof (tmp)-1, tmp);
86            _snprintf (buf, sizeof (buf)-1, "GPGME_DEBUG=5:%sgpgme.dbg", tmp);
87            putenv (buf);
88        }
89      else      else
90          putenv ("GPGME_DEBUG=");          putenv ("GPGME_DEBUG=");
91  }  }
92    
93    
 /* Return the name of the gettext language file. */  
 static char*  
 get_gettext_lang (void)  
 {      
     char *fname;  
     fname = get_reg_entry_mo ();  
     if (!fname)  
         return NULL;  
     return fname;  
 }  
   
   
94  /* Initialize the gettext sub system. */  /* Initialize the gettext sub system. */
95  static void  static void
96  load_gettext (int prev_inst)  load_gettext (void)
97  {  {
98      char *nls = NULL;      char *nls = NULL;
99    
100      nls = get_gettext_lang ();      /* Return the name of the gettext language file. */
101        nls = get_reg_entry_mo ();
102      if (nls != NULL) {      if (nls != NULL) {
103          set_gettext_file ("winpt", nls);          set_gettext_file ("winpt", nls);
104          free_if_alloc (nls);          free_if_alloc (nls);
# Line 100  load_gettext (int prev_inst) Line 106  load_gettext (int prev_inst)
106  }  }
107    
108    
109    /* Return true if the GPG environment is useable. */
110    static bool
111    gpg_prefs_ok (void)
112    {
113        char *p;
114    
115        p = get_reg_entry_gpg4win ("gpg.exe");
116        if (!p || file_exist_check (p) != 0) {
117            free_if_alloc (p);
118            p = get_reg_entry_gpg ("gpgProgram");
119            if (!p || file_exist_check (p) != 0) {
120                free_if_alloc (p);
121                log_debug ("gpg_prefs_ok: could not locate gpg.exe");
122                return false;
123            }
124        }
125        free_if_alloc (p);
126        p = get_reg_entry_gpg4win (NULL);    
127        if (!p || dir_exist_check (p) != 0) {
128            free_if_alloc (p);
129            p = get_reg_entry_gpg ("HomeDir");
130            if (!p || dir_exist_check (p) != 0) {
131                free_if_alloc (p);
132                log_debug ("gpg_prefs_ok: could not determine home directory");
133                return false;
134            }
135        }
136        free_if_alloc (p);
137        return true;
138    }
139    
140    
141    /* Check gpg files if they are read-only and ask the user
142       if this should be corrected. */
143    static void
144    check_readonly_attr (const char *homedir)
145    {
146        const char *files[] = {"pubring.gpg", "secring.gpg", "trustdb.gpg", NULL};
147        char *file;
148        int i;
149    
150        for (i=0; files[i] != NULL; i++) {
151            file = make_filename (homedir, files[i], NULL);
152            remove_crit_file_attrs (file, 0);
153            free_if_alloc (file);
154        }
155    }
156    
157    
158  /* Load the GPG environment. On the first start, some  /* Load the GPG environment. On the first start, some
159     checks are performed to find out in what state GPG is.     checks are performed to find out in what state GPG is.
160     Return value: 0  everything OK.     Return value: 0  everything OK.
# Line 120  load_gpg_env (void) Line 175  load_gpg_env (void)
175          return (1);          return (1);
176      }      }
177      free_if_alloc (p);      free_if_alloc (p);
178      p = multi_gnupg_path (0);  
179        p = get_reg_entry_gpg ("HomeDir");
180        if (!p || dir_exist_check (p) != 0) {
181            free_if_alloc (p);
182            p = multi_gnupg_path (0);
183        }
184      if (p && dir_exist_check (p)) {      if (p && dir_exist_check (p)) {
185          memset (&sec_attr, 0, sizeof (sec_attr));          memset (&sec_attr, 0, sizeof (sec_attr));
186          sec_attr.nLength = sizeof (sec_attr);          sec_attr.nLength = sizeof (sec_attr);
# Line 131  load_gpg_env (void) Line 191  load_gpg_env (void)
191              return (2);              return (2);
192          }          }
193      }      }
194        check_readonly_attr (p);
195      pkr = make_filename (p, "pubring", "gpg");      pkr = make_filename (p, "pubring", "gpg");
196      free_if_alloc (p);      free_if_alloc (p);
197      if (!pkr)      if (!pkr)
# Line 149  static int Line 210  static int
210  check_default_key (gpg_keycache_t kc)  check_default_key (gpg_keycache_t kc)
211  {  {
212      gpgme_key_t key;      gpgme_key_t key;
213      gpgme_error_t err = GPG_ERR_NO_ERROR;      gpgme_error_t err = gpg_error (GPG_ERR_NO_ERROR);
214      char *defkey;      char *defkey;
215    
216      defkey = get_gnupg_default_key ();      defkey = get_gnupg_default_key ();
# Line 201  get_prog_part (const char * fname, int u Line 262  get_prog_part (const char * fname, int u
262  static bool  static bool
263  check_crypto_engine (void)  check_crypto_engine (void)
264  {  {
265      int ma=0, mi=0, pa=0;      int ma = 0, mi = 0, pa = 0;
266      int rc;      int rc;
267    
268      rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);      rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);
# Line 233  check_crypto_engine (void) Line 294  check_crypto_engine (void)
294  static int  static int
295  load_keyserver_conf (int quiet)  load_keyserver_conf (int quiet)
296  {  {
297      const char *t;      char *buf;
298        const char *t, *conf;
299      int rc;      int rc;
300    
301      if (reg_prefs.kserv_conf)      /* Create $APPDATA\winpt if needed. */
302          t = reg_prefs.kserv_conf;      buf = make_special_filename (CSIDL_APPDATA, "winpt", NULL);
303      else if (!file_exist_check (get_prog_part ("keyserver.conf", 0)))      if (buf && dir_exist_check (buf) && !CreateDirectory (buf, NULL)) {
304          t = get_prog_part ("keyserver.conf", 0);          MessageBox (NULL, _("Failed to create WinPT directory"),
305      else                      _("Keyserver"), MB_ERR);
306            free_if_alloc (buf);
307            return -1;
308        }
309        free_if_alloc (buf);
310    
311        /* Check for $APPDATA\winpt\keyserver.conf */
312        buf = make_special_filename (CSIDL_APPDATA, "winpt\\keyserver.conf", NULL);
313    
314        conf = get_prog_part ("keyserver.conf", 0);
315        if (!file_exist_check (conf))
316            t = conf;
317        else
318          t = "keyserver.conf";          t = "keyserver.conf";
319        if (file_exist_check (t) == 0 && file_exist_check (buf) != 0) {
320            if (!CopyFile (t, buf, FALSE)) {
321                MessageBox (NULL, _("Failed to copy the keyserver.conf"),
322                            _("Keyserver"), MB_ERR);
323                free_if_alloc (buf);
324                return -1;
325            }
326            t = buf;
327        }
328        else
329            t = buf;
330        
331      rc = kserver_load_conf (t);      rc = kserver_load_conf (t);
332      if (rc && !quiet)      if (rc && !quiet)
333          msg_box (NULL, winpt_strerror (rc), _("Keyserver"), MB_ERR);          msg_box (NULL, winpt_strerror (rc), _("Keyserver"), MB_ERR);
334        else {
335            free_if_alloc (reg_prefs.kserv_conf);
336            reg_prefs.kserv_conf = m_strdup (t);
337        }
338        free_if_alloc (buf);
339      return rc;      return rc;
340  }  }
341    
# Line 272  check_for_empty_keyrings (bool pub_only) Line 363  check_for_empty_keyrings (bool pub_only)
363    
364    
365  /* Enable the mobility mode. */  /* Enable the mobility mode. */
366  static void  static int
367  enable_mobile_mode (void)  enable_mobile_mode (void)
368  {  {
369        if (dir_exist_check ("temp") != 0) {
370            if (!CreateDirectory ("temp", NULL)) {
371                MessageBox (NULL, "Could not create mobile temp directory",
372                            "WinPT Mobile Error", MB_ERR);
373                return -1;
374            }
375        }
376    
377      memset (&reg_prefs, 0, sizeof (reg_prefs));      memset (&reg_prefs, 0, sizeof (reg_prefs));
378      reg_prefs.always_trust = 0;      reg_prefs.always_trust = 0;
379      reg_prefs.auto_backup = 0;      reg_prefs.auto_backup = 0;
380      reg_prefs.cache_time = 0;      reg_prefs.cache_time = 0;
381      reg_prefs.expert = 0;      reg_prefs.expert = 0;
     reg_prefs.keylist_mode = 1;  
382      reg_prefs.kserv_conf = m_strdup ("keyserver.conf");      reg_prefs.kserv_conf = m_strdup ("keyserver.conf");
383      reg_prefs.no_zip_mmedia = 1;      reg_prefs.no_zip_mmedia = 1;
384      reg_prefs.use_tmpfiles = 1;      reg_prefs.use_tmpfiles = 1;
385      reg_prefs.word_wrap = 80;      reg_prefs.word_wrap = 80;
386      reg_prefs.use_viewer = 0; /* XXX */      reg_prefs.use_viewer = 0; /* XXX */
387        return 0;
388  }  }
389    
390    
391    void
392    set_default_keyserver (void)
393    {
394        char *host = get_reg_entry_keyserver ("Default");
395        char *str_port = get_reg_entry_keyserver ("Default_Port");
396        WORD port = HKP_PORT;
397    
398        if (!host)
399            keyserver_set_default (NULL, 0);
400        else {
401            if (str_port && *str_port)
402                port = atoi (str_port);
403            keyserver_set_default (host, port);
404        }
405        free_if_alloc (host);
406        free_if_alloc (str_port);
407    }
408    
409    
410    /* Display info message that WinPT is now in debug mode. */
411    void
412    winpt_debug_msg (void)
413    {      
414        char output[512];
415        char temp[128];
416            
417        GetTempPath (sizeof temp -1, temp);
418        _snprintf (output, sizeof output - 1,
419            "The GPGME output file is %sgpgme.dbg\n"
420            "The WinPT output file is %swinpt.log\n", temp, temp);
421        MessageBox (NULL, output, "WinPT now runs in DEBUG MODE", MB_INFO);
422    }
423    
424    
425    #include "wptKeyManager.h"
426    
427  /* Main entry point. */  /* Main entry point. */
428  int WINAPI  int WINAPI
429  WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)  WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
# Line 297  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 432  WinMain (HINSTANCE hinst, HINSTANCE hpre
432      HACCEL accel_tab;      HACCEL accel_tab;
433      MSG msg;      MSG msg;
434      HWND hwnd = NULL;      HWND hwnd = NULL;
435      WORD ver[3], ptdver[4];      /*WORD ver[3], ptdver[4];*/
436      int rc, ec, created = 0;      int rc, ec, created = 0;
437      int first_start = 0, start_gpgprefs = 0;      int first_start = 0, start_gpgprefs = 0;
438      int winpt_inst_found = 0;      int winpt_inst_found = 0;
# Line 312  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 447  WinMain (HINSTANCE hinst, HINSTANCE hpre
447          return 0;          return 0;
448      }      }
449    
     /*  
     OSVERSIONINFO osinf;  
     memset (&osinf, 0, sizeof (osinf));  
     if (GetVersionEx (&osinf) &&  
         osinf.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS &&  
         osinf.dwMinorVersion == 0) {  
         msg_box (NULL, "WinPT propably does not work on Windows 95 without restrictions",  
                  "WinPT Warning", MB_INFO);  
     }  
     */  
   
450      #ifdef _DEBUG      #ifdef _DEBUG
451      gpg_set_debug_mode (1);      gpg_set_debug_mode (1);
452      debug = 1;      debug = 1;
453      #endif      #endif
454    
455        /* XXX
456      get_file_version ("WinPT.exe", &ver[0], &ver[1], &ver[2], &ver[3]);      get_file_version ("WinPT.exe", &ver[0], &ver[1], &ver[2], &ver[3]);
457      get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],      get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],
458                                   &ptdver[2], &ptdver[3]);                                   &ptdver[2], &ptdver[3]);
459      /* XXX      
460      if (ptdver[0] != ver[0] || ptdver[1] != ver[1]|| ptdver[2] != ver[2]) {      if (ptdver[0] != ver[0] || ptdver[1] != ver[1]|| ptdver[2] != ver[2]) {
461          log_box (_("WinPT Error"), MB_ERR,          log_box (_("WinPT Error"), MB_ERR,
462                   _("The PTD.dll file has a different version than WinPT.exe\n"                   _("The PTD.dll file has a different version than WinPT.exe\n"
# Line 361  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 486  WinMain (HINSTANCE hinst, HINSTANCE hpre
486      if (cmdline && stristr (cmdline, "--mobile")) {      if (cmdline && stristr (cmdline, "--mobile")) {
487          msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",          msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",
488                   "WinPT", MB_INFO);                   "WinPT", MB_INFO);
489          mobile = 1;          mobile_mode_active = 1;
490      }      }
491        
492        set_default_keyserver ();
493        load_gettext ();
494        admin_user = user_is_admin ();
495    
496      set_default_kserver ();      if (!mobile_mode_active) {
     load_gettext (winpt_inst_found);  
   
     if (!mobile) {  
497          regist_inst_gnupg (1);          regist_inst_gnupg (1);
498          regist_inst_winpt (1, &created);          regist_inst_winpt (1, &created);
499      }      }
500      else {      else {
501          enable_mobile_mode ();          if (enable_mobile_mode ())
502          /* XXX: ask for GPG path */              return 0;
503          created = 1; /* Disable registry writing */          created = 1; /* Disable registry writing */
504      }      }
505    
# Line 382  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 508  WinMain (HINSTANCE hinst, HINSTANCE hpre
508          reg_prefs.use_tmpfiles = 1; /* default */          reg_prefs.use_tmpfiles = 1; /* default */
509          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 */
510          get_reg_winpt_prefs (&reg_prefs);          get_reg_winpt_prefs (&reg_prefs);
         if (!reg_prefs.no_hotkeys)  
             hotkeys_modify ();  
511          gnupg_load_config ();          gnupg_load_config ();
512      }      }
513    
# Line 398  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 522  WinMain (HINSTANCE hinst, HINSTANCE hpre
522                   winpt_strerror (rc));                   winpt_strerror (rc));
523          s = get_fileopen_dlg (GetActiveWindow (),          s = get_fileopen_dlg (GetActiveWindow (),
524                                _("Select GPG Public Keyring"),                                _("Select GPG Public Keyring"),
525                                _("GPG Keyrings (*.gpg)\0*.gpg\0\0"),                                "GPG Keyrings (*.gpg)\0*.gpg\0\0",
526                                NULL);                                NULL);
527          if (s != NULL) {          if (s != NULL) {
528              size_t n;              size_t n;
# Line 507  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 631  WinMain (HINSTANCE hinst, HINSTANCE hpre
631          return 0;          return 0;
632      }      }
633    
634      if (cmdline) {      if (cmdline && (stristr (cmdline, "--enable-debug") ||
635          if (stristr (cmdline, "--enable-debug") ||                      stristr (cmdline, "--debug"))) {
636              stristr (cmdline, "--debug")) {          gpg_set_debug_mode (1);
637              gpg_set_debug_mode (1);          winpt_debug_msg ();
638              winpt_debug_msg ();          debug = 1;
             debug = 1;  
         }  
639      }      }
640    
641      wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));      wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
# Line 557  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 679  WinMain (HINSTANCE hinst, HINSTANCE hpre
679      }      }
680    
681      if (first_start) {      if (first_start) {
         struct first_start_s fs;  
682          struct genkey_s c;          struct genkey_s c;
683            int choice;
684          HWND h;          HWND h;
685  start:  start:
686          h = GetDesktopWindow ();          h = GetDesktopWindow ();
687          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,          if (!gpg_prefs_ok ())
688                DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
689                              gpgprefs_dlg_proc, 0);                              gpgprefs_dlg_proc, 0);
690          DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,          choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
691                          first_run_dlg_proc, (LPARAM)&fs);                                   first_run_dlg_proc, 0);
692          switch (fs.choice) {          switch (choice) {
693          case SETUP_KEYGEN:          case SETUP_KEYGEN:
694              c.interactive = 1;              c.interactive = 1;
695              c.first_start = 1;              c.first_start = 1;
# Line 584  start: Line 707  start:
707              }              }
708              break;              break;
709    
710          case -1: /* Cancel/Abort. */          case 0: /* Cancel/Abort. */
711            default:
712              DestroyWindow (hwnd);              DestroyWindow (hwnd);
713              free_gnupg_table ();              free_gnupg_table ();
714              return 0;              return 0;
715          }          }
716          update_keycache (hwnd);          update_keycache (hwnd);
717          check_crypto_engine ();          if (!check_crypto_engine ()) {
718                DestroyWindow (hwnd);
719                free_gnupg_table ();
720                return 0;
721            }
722            if (!is_gpg4win_installed ()) {
723                select_language ();
724                load_gettext ();
725            }
726      }      }
727      else {      else {
728          gpg_keycache_t c;          gpg_keycache_t c, sec_c;
729          update_keycache (hwnd);          update_keycache (hwnd);
730          c = keycache_get_ctx (1);          c = keycache_get_ctx (1);
731          if (!c || !gpg_keycache_get_size (c)) {          if (!c || !gpg_keycache_get_size (c)) {
# Line 615  start: Line 747  start:
747                  return 0;                  return 0;
748              }              }
749          }          }
750          if (check_default_key (c)) {          sec_c = keycache_get_ctx (0);
751            if (check_default_key (sec_c)) {
752              char *p = get_gnupg_default_key ();              char *p = get_gnupg_default_key ();
753              log_box (_("WinPT Error"), MB_ERR,              log_box (_("WinPT Error"), MB_ERR,
754                       _("Default key from the GPG options file could not be found.\n"                       _("Default key (from the GPG config file) could not be found.\n"
755                         "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"
756                         "%s: public key not found."), p? p : "[null]");                         "%s: public key not found."), p? p : "[null]");
757              free_if_alloc (p);              set_gnupg_default_key (NULL);
             DestroyWindow (hwnd);  
             free_gnupg_table ();  
             return 0;  
758          }          }
759          if (count_insecure_elgkeys ())          if (count_insecure_elgkeys ())
760              DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,              DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,

Legend:
Removed from v.137  
changed lines
  Added in v.208

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26