/[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 154 by twoaday, Wed Jan 18 12:38:46 2006 UTC revision 218 by twoaday, Wed May 24 07:53:24 2006 UTC
# Line 40  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 62  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 102  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 122  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 133  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 151  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 159  check_default_key (gpg_keycache_t kc) Line 218  check_default_key (gpg_keycache_t kc)
218          err = gpg_keycache_find_key (kc, defkey, 0, &key);          err = gpg_keycache_find_key (kc, defkey, 0, &key);
219      else      else
220          msg_box (NULL, _("No useable secret key found."),          msg_box (NULL, _("No useable secret key found."),
221                   _("WinPT Error"), MB_ERR);                   _("WinPT Warning"), MB_WARN);
222      free_if_alloc (defkey);      free_if_alloc (defkey);
223      return err? -1 : 0;      return err? -1 : 0;
224  }  }
# Line 203  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 220  check_crypto_engine (void) Line 279  check_crypto_engine (void)
279          return false;          return false;
280      }      }
281      /* We enable smartcard support for GPG: >= 2 or >= 1.4.3 */      /* We enable smartcard support for GPG: >= 2 or >= 1.4.3 */
282      if (ma > 1 || pa >= 3)          if (ma > 1 || pa >= 3)
283          scard_support = 1;          scard_support = 1;
284    
285      gpgver[0] = ma;      gpgver[0] = ma;
# Line 236  static int Line 295  static int
295  load_keyserver_conf (int quiet)  load_keyserver_conf (int quiet)
296  {  {
297      char *buf;      char *buf;
298      const char *t;      const char *t, *conf;
299      int rc;      int rc;
300    
301      /* Create $APPDATA\winpt if needed. */      /* Create $APPDATA\winpt if needed. */
# Line 252  load_keyserver_conf (int quiet) Line 311  load_keyserver_conf (int quiet)
311      /* Check for $APPDATA\winpt\keyserver.conf */      /* Check for $APPDATA\winpt\keyserver.conf */
312      buf = make_special_filename (CSIDL_APPDATA, "winpt\\keyserver.conf", NULL);      buf = make_special_filename (CSIDL_APPDATA, "winpt\\keyserver.conf", NULL);
313    
314      if (!file_exist_check (get_prog_part ("keyserver.conf", 0)))      conf = get_prog_part ("keyserver.conf", 0);
315          t = get_prog_part ("keyserver.conf", 0);      if (!file_exist_check (conf))
316            t = conf;
317      else      else
318          t = "keyserver.conf";          t = "keyserver.conf";
319      if (file_exist_check (t) == 0 && file_exist_check (buf) != 0) {      if (file_exist_check (t) == 0 && file_exist_check (buf) != 0) {
         log_box (_("Keyserver"), MB_INFO,  
                  _("keyserver.conf will be copied to \"%s\"\r\n"), buf);  
320          if (!CopyFile (t, buf, FALSE)) {          if (!CopyFile (t, buf, FALSE)) {
321              MessageBox (NULL, _("Failed to copy the keyserver.conf"),              MessageBox (NULL, _("Failed to copy the keyserver.conf"),
322                          _("Keyserver"), MB_ERR);                          _("Keyserver"), MB_ERR);
# Line 305  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;
     reg_prefs.use_tmpfiles = 1;  
384      reg_prefs.word_wrap = 80;      reg_prefs.word_wrap = 80;
385      reg_prefs.use_viewer = 0; /* XXX */      reg_prefs.use_viewer = 0; /* XXX */
386        return 0;
387    }
388    
389    
390    void
391    set_default_keyserver (void)
392    {
393        char *host = get_reg_entry_keyserver ("Default");
394        char *str_port = get_reg_entry_keyserver ("Default_Port");
395        WORD port = HKP_PORT;
396    
397        if (!host)
398            keyserver_set_default (NULL, 0);
399        else {
400            if (str_port && *str_port)
401                port = atoi (str_port);
402            keyserver_set_default (host, port);
403        }
404        free_if_alloc (host);
405        free_if_alloc (str_port);
406    }
407    
408    
409    /* Display info message that WinPT is now in debug mode. */
410    void
411    winpt_debug_msg (void)
412    {      
413        char output[512];
414        char temp[128];
415            
416        GetTempPath (sizeof temp -1, temp);
417        _snprintf (output, sizeof output - 1,
418            "The GPGME output file is %sgpgme.dbg\n"
419            "The WinPT output file is %swinpt.log\n", temp, temp);
420        MessageBox (NULL, output, "WinPT now runs in DEBUG MODE", MB_INFO);
421    }
422    
423    
424    /* Search for insecure ElGamal keys and return the
425       number of founded keys. */
426    static int
427    count_insecure_elgkeys (void)
428    {
429        gpg_keycache_t pc;
430        gpgme_key_t key;
431        int n = 0;
432    
433        pc = keycache_get_ctx (1);
434        while (!gpg_keycache_next_key (pc, 0, &key)) {
435            if (key->subkeys->pubkey_algo == GPGME_PK_ELG)
436                n++;
437        }
438        gpg_keycache_rewind (pc);
439        return n;
440  }  }
441    
442    
# Line 330  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 448  WinMain (HINSTANCE hinst, HINSTANCE hpre
448      HACCEL accel_tab;      HACCEL accel_tab;
449      MSG msg;      MSG msg;
450      HWND hwnd = NULL;      HWND hwnd = NULL;
451      WORD ver[3], ptdver[4];      /*WORD ver[3], ptdver[4];*/
452      int rc, ec, created = 0;      int rc, ec, created = 0;
453      int first_start = 0, start_gpgprefs = 0;      int first_start = 0, start_gpgprefs = 0;
454      int winpt_inst_found = 0;      int winpt_inst_found = 0;
# Line 345  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 463  WinMain (HINSTANCE hinst, HINSTANCE hpre
463          return 0;          return 0;
464      }      }
465    
     /*  
     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);  
     }  
     */  
   
466      #ifdef _DEBUG      #ifdef _DEBUG
467      gpg_set_debug_mode (1);      gpg_set_debug_mode (1);
468      debug = 1;      debug = 1;
469      #endif      #endif
470    
471        /* XXX
472      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]);
473      get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],      get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],
474                                   &ptdver[2], &ptdver[3]);                                   &ptdver[2], &ptdver[3]);
475      /* XXX      
476      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]) {
477          log_box (_("WinPT Error"), MB_ERR,          log_box (_("WinPT Error"), MB_ERR,
478                   _("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 394  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 502  WinMain (HINSTANCE hinst, HINSTANCE hpre
502      if (cmdline && stristr (cmdline, "--mobile")) {      if (cmdline && stristr (cmdline, "--mobile")) {
503          msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",          msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",
504                   "WinPT", MB_INFO);                   "WinPT", MB_INFO);
505          mobile = 1;          mobile_mode_active = 1;
506      }      }
507        
508        set_default_keyserver ();
509        load_gettext ();
510        admin_user = user_is_admin ();
511    
512      set_default_kserver ();      if (!mobile_mode_active) {
     load_gettext (winpt_inst_found);  
   
     if (!mobile) {  
513          regist_inst_gnupg (1);          regist_inst_gnupg (1);
514          regist_inst_winpt (1, &created);          regist_inst_winpt (1, &created);
515      }      }
516      else {      else {
517          enable_mobile_mode ();          if (enable_mobile_mode ())
518          /* XXX: ask for GPG path */              return 0;
519          created = 1; /* Disable registry writing */          created = 1; /* Disable registry writing */
520      }      }
521    
522      if (!created) {      if (!created) {
523          memset (&reg_prefs, 0, sizeof (reg_prefs));          memset (&reg_prefs, 0, sizeof (reg_prefs));
         reg_prefs.use_tmpfiles = 1; /* default */  
524          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 */
525          get_reg_winpt_prefs (&reg_prefs);          get_reg_winpt_prefs (&reg_prefs);
         if (!reg_prefs.no_hotkeys)  
             hotkeys_modify ();  
526          gnupg_load_config ();          gnupg_load_config ();
527      }      }
528    
# Line 431  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 537  WinMain (HINSTANCE hinst, HINSTANCE hpre
537                   winpt_strerror (rc));                   winpt_strerror (rc));
538          s = get_fileopen_dlg (GetActiveWindow (),          s = get_fileopen_dlg (GetActiveWindow (),
539                                _("Select GPG Public Keyring"),                                _("Select GPG Public Keyring"),
540                                _("GPG Keyrings (*.gpg)\0*.gpg\0\0"),                                "GPG Keyrings (*.gpg)\0*.gpg\0\0",
541                                NULL);                                NULL);
542          if (s != NULL) {          if (s != NULL) {
543              size_t n;              size_t n;
# Line 540  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 646  WinMain (HINSTANCE hinst, HINSTANCE hpre
646          return 0;          return 0;
647      }      }
648    
649      if (cmdline) {      if (cmdline && (stristr (cmdline, "--enable-debug") ||
650          if (stristr (cmdline, "--enable-debug") ||                      stristr (cmdline, "--debug"))) {
651              stristr (cmdline, "--debug")) {          gpg_set_debug_mode (1);
652              gpg_set_debug_mode (1);          winpt_debug_msg ();
653              winpt_debug_msg ();          debug = 1;
             debug = 1;  
         }  
654      }      }
655    
656      wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));      wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
# Line 590  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 694  WinMain (HINSTANCE hinst, HINSTANCE hpre
694      }      }
695    
696      if (first_start) {      if (first_start) {
         struct first_start_s fs;  
697          struct genkey_s c;          struct genkey_s c;
698            int choice;
699          HWND h;          HWND h;
700  start:  start:
701          h = GetDesktopWindow ();          h = GetDesktopWindow ();
702          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,          if (!gpg_prefs_ok ())
703                DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
704                              gpgprefs_dlg_proc, 0);                              gpgprefs_dlg_proc, 0);
705          DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,          choice = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
706                          first_run_dlg_proc, (LPARAM)&fs);                                   first_run_dlg_proc, 0);
707          switch (fs.choice) {          switch (choice) {
708          case SETUP_KEYGEN:          case SETUP_KEYGEN:
709              c.interactive = 1;              c.interactive = 1;
710              c.first_start = 1;              c.first_start = 1;
# Line 617  start: Line 722  start:
722              }              }
723              break;              break;
724    
725          case -1: /* Cancel/Abort. */          case 0: /* Cancel/Abort. */
726            default:
727              DestroyWindow (hwnd);              DestroyWindow (hwnd);
728              free_gnupg_table ();              free_gnupg_table ();
729              return 0;              return 0;
730          }          }
731          update_keycache (hwnd);          update_keycache (hwnd);
732          check_crypto_engine ();          if (!check_crypto_engine ()) {
733                DestroyWindow (hwnd);
734                free_gnupg_table ();
735                return 0;
736            }
737            if (!is_gpg4win_installed ()) {
738                select_language ();
739                load_gettext ();
740            }
741      }      }
742      else {      else {
743          gpg_keycache_t c;          gpg_keycache_t c, sec_c;
744          update_keycache (hwnd);          update_keycache (hwnd);
745          c = keycache_get_ctx (1);          c = keycache_get_ctx (1);
746          if (!c || !gpg_keycache_get_size (c)) {          if (!c || !gpg_keycache_get_size (c)) {
# Line 648  start: Line 762  start:
762                  return 0;                  return 0;
763              }              }
764          }          }
765          if (check_default_key (c)) {          sec_c = keycache_get_ctx (0);
766            if (check_default_key (sec_c)) {
767              char *p = get_gnupg_default_key ();              char *p = get_gnupg_default_key ();
768              log_box (_("WinPT Error"), MB_ERR,              log_box (_("WinPT Error"), MB_ERR,
769                       _("Default key from the GPG options file could not be found.\n"                       _("Default key (from the GPG config file) could not be found.\n"
770                         "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"
771                         "%s: public key not found."), p? p : "[null]");                         "%s: public key not found."), p? p : "[null]");
772              free_if_alloc (p);              set_gnupg_default_key (NULL);
             DestroyWindow (hwnd);  
             free_gnupg_table ();  
             return 0;  
773          }          }
774          if (count_insecure_elgkeys ())          if (count_insecure_elgkeys ())
775              DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,              DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,

Legend:
Removed from v.154  
changed lines
  Added in v.218

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26