/[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 176 by twoaday, Mon Feb 13 09:38:03 2006 UTC revision 262 by twoaday, Sat Sep 30 10:24:34 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);  void remove_crit_file_attrs (const char *fname, int force);
46    BOOL user_is_admin (void);
47    extern "C" int  pcsc_available (void);
48    
49    /* Global variables. */
50  HINSTANCE glob_hinst;   /* global instance for the dialogs */  HINSTANCE glob_hinst;   /* global instance for the dialogs */
51  HWND glob_hwnd;         /* global window handle for the dialogs */  HWND glob_hwnd;         /* global window handle for the dialogs */
 HWND activ_hwnd;  
52  int scard_support = 0;  int scard_support = 0;
53  int debug = 0;  int debug = 0;
54  int mobile = 0;  int mobile_mode_active = 0;
55  int gpg_read_only = 0;  int gpg_read_only = 0;
56    int admin_user = 0;
57  char gpgver[3];  char gpgver[3];
58    /* End */
59    
60    
61  /* Load the key cache and rebuild the signature cache. */  /* Load the key cache and rebuild the signature cache. */
62  static void  int
63  update_keycache (HWND hwnd)  update_keycache (HWND hwnd)
64  {  {
65        int err;
66    
67      refresh_cache_s rcs = {0};      refresh_cache_s rcs = {0};
68      rcs.kr_reload = 0;      rcs.kr_reload = 0;
69      rcs.kr_update = 1;      rcs.kr_update = 1;
70      rcs.tr_update = 1;      rcs.tr_update = 1;
71      DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,      err = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,
72                      keycache_dlg_proc, (LPARAM)&rcs);                      keycache_dlg_proc, (LPARAM)&rcs);
73        if (err) {
74            char *cfg = get_gnupg_config ();
75            if (cfg && check_gnupg_options (cfg, 0) == WPTERR_FILE_EXIST)
76                msg_box (NULL, _("The gpg.conf contains at least one argument which points to a non-existing file."), "WinPT", MB_ERR);
77            free_if_alloc (cfg);
78            return -1;
79        }
80        return 0;
81  }  }
82    
83    
84  /* 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. */
85  void  void
86  gpg_set_debug_mode (int val)  gpg_set_debug_mode (int val)
87  {        {
88      if (val)      static char buf[256];
89          putenv ("GPGME_DEBUG=5:gpgme.dbg");      char tmp[128];
90        
91        /* XXX: no gpgme.dbg is created. */
92        if (val > 0) {
93            GetTempPath (sizeof (tmp)-1, tmp);
94            _snprintf (buf, sizeof (buf)-1, "GPGME_DEBUG=5:%sgpgme.dbg", tmp);
95            putenv (buf);
96        }
97      else      else
98          putenv ("GPGME_DEBUG=");          putenv ("GPGME_DEBUG=");
99  }  }
100    
101    
 /* 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;  
 }  
   
   
102  /* Initialize the gettext sub system. */  /* Initialize the gettext sub system. */
103  static void  static void
104  load_gettext (int prev_inst)  load_gettext (void)
105  {  {
106      char *nls = NULL;      char *nls = NULL;
107    
108      nls = get_gettext_lang ();      /* Return the name of the gettext language file. */
109        nls = get_reg_entry_mo ();
110      if (nls != NULL) {      if (nls != NULL) {
111          set_gettext_file ("winpt", nls);          set_gettext_file ("winpt", nls);
112          free_if_alloc (nls);          free_if_alloc (nls);
# Line 116  gpg_prefs_ok (void) Line 126  gpg_prefs_ok (void)
126          p = get_reg_entry_gpg ("gpgProgram");          p = get_reg_entry_gpg ("gpgProgram");
127          if (!p || file_exist_check (p) != 0) {          if (!p || file_exist_check (p) != 0) {
128              free_if_alloc (p);              free_if_alloc (p);
129                log_debug ("gpg_prefs_ok: could not locate gpg.exe");
130              return false;              return false;
131          }          }
132      }      }
# Line 126  gpg_prefs_ok (void) Line 137  gpg_prefs_ok (void)
137          p = get_reg_entry_gpg ("HomeDir");          p = get_reg_entry_gpg ("HomeDir");
138          if (!p || dir_exist_check (p) != 0) {          if (!p || dir_exist_check (p) != 0) {
139              free_if_alloc (p);              free_if_alloc (p);
140                log_debug ("gpg_prefs_ok: could not determine home directory");
141              return false;              return false;
142          }          }
143      }      }
# Line 206  static int Line 218  static int
218  check_default_key (gpg_keycache_t kc)  check_default_key (gpg_keycache_t kc)
219  {  {
220      gpgme_key_t key;      gpgme_key_t key;
221      gpgme_error_t err = GPG_ERR_NO_ERROR;      gpgme_error_t err = gpg_error (GPG_ERR_NO_ERROR);
222      char *defkey;      char *defkey;
223    
224      defkey = get_gnupg_default_key ();      defkey = get_gnupg_default_key ();
# Line 214  check_default_key (gpg_keycache_t kc) Line 226  check_default_key (gpg_keycache_t kc)
226          err = gpg_keycache_find_key (kc, defkey, 0, &key);          err = gpg_keycache_find_key (kc, defkey, 0, &key);
227      else      else
228          msg_box (NULL, _("No useable secret key found."),          msg_box (NULL, _("No useable secret key found."),
229                   _("WinPT Error"), MB_ERR);                   _("WinPT Warning"), MB_WARN);
230      free_if_alloc (defkey);      free_if_alloc (defkey);
231      return err? -1 : 0;      return err? -1 : 0;
232  }  }
# Line 258  get_prog_part (const char * fname, int u Line 270  get_prog_part (const char * fname, int u
270  static bool  static bool
271  check_crypto_engine (void)  check_crypto_engine (void)
272  {  {
273      int ma=0, mi=0, pa=0;      int ma = 0, mi = 0, pa = 0;
274      int rc;      int rc;
275    
276      rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);      rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);
# Line 275  check_crypto_engine (void) Line 287  check_crypto_engine (void)
287          return false;          return false;
288      }      }
289      /* We enable smartcard support for GPG: >= 2 or >= 1.4.3 */      /* We enable smartcard support for GPG: >= 2 or >= 1.4.3 */
290      if (ma > 1 || pa >= 3)          if ((ma > 1 || pa >= 4) && pcsc_available ())
291          scard_support = 1;          scard_support = 1;
292    
293      gpgver[0] = ma;      gpgver[0] = ma;
# Line 289  check_crypto_engine (void) Line 301  check_crypto_engine (void)
301     do not show any errors. */     do not show any errors. */
302  static int  static int
303  load_keyserver_conf (int quiet)  load_keyserver_conf (int quiet)
304  {  {    
305        const char *t, *conf;
306      char *buf;      char *buf;
     const char *t;  
307      int rc;      int rc;
308    
309      /* Create $APPDATA\winpt if needed. */      /* Create $APPDATA\winpt if needed. */
# Line 307  load_keyserver_conf (int quiet) Line 319  load_keyserver_conf (int quiet)
319      /* Check for $APPDATA\winpt\keyserver.conf */      /* Check for $APPDATA\winpt\keyserver.conf */
320      buf = make_special_filename (CSIDL_APPDATA, "winpt\\keyserver.conf", NULL);      buf = make_special_filename (CSIDL_APPDATA, "winpt\\keyserver.conf", NULL);
321    
322      if (!file_exist_check (get_prog_part ("keyserver.conf", 0)))      conf = get_prog_part ("keyserver.conf", 0);
323          t = get_prog_part ("keyserver.conf", 0);      if (!file_exist_check (conf))
324            t = conf;
325      else      else
326          t = "keyserver.conf";          t = "keyserver.conf";
327      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);  
328          if (!CopyFile (t, buf, FALSE)) {          if (!CopyFile (t, buf, FALSE)) {
329              MessageBox (NULL, _("Failed to copy the keyserver.conf"),              MessageBox (NULL, _("Failed to copy the keyserver.conf"),
330                          _("Keyserver"), MB_ERR);                          _("Keyserver"), MB_ERR);
# Line 360  check_for_empty_keyrings (bool pub_only) Line 371  check_for_empty_keyrings (bool pub_only)
371    
372    
373  /* Enable the mobility mode. */  /* Enable the mobility mode. */
374  static void  static int
375  enable_mobile_mode (void)  enable_mobile_mode (void)
376  {  {
377        if (dir_exist_check ("temp") != 0) {
378            if (!CreateDirectory ("temp", NULL)) {
379                MessageBox (NULL, "Could not create mobile temp directory",
380                            "WinPT Mobile Error", MB_ERR);
381                return -1;
382            }
383        }
384    
385      memset (&reg_prefs, 0, sizeof (reg_prefs));      memset (&reg_prefs, 0, sizeof (reg_prefs));
386      reg_prefs.always_trust = 0;      reg_prefs.always_trust = 0;
387      reg_prefs.auto_backup = 0;      reg_prefs.auto_backup = 0;
# Line 370  enable_mobile_mode (void) Line 389  enable_mobile_mode (void)
389      reg_prefs.expert = 0;      reg_prefs.expert = 0;
390      reg_prefs.kserv_conf = m_strdup ("keyserver.conf");      reg_prefs.kserv_conf = m_strdup ("keyserver.conf");
391      reg_prefs.no_zip_mmedia = 1;      reg_prefs.no_zip_mmedia = 1;
     reg_prefs.use_tmpfiles = 1;  
392      reg_prefs.word_wrap = 80;      reg_prefs.word_wrap = 80;
393      reg_prefs.use_viewer = 0; /* XXX */      reg_prefs.use_viewer = 0; /* XXX */
394        return 0;
395    }
396    
397    
398    void
399    set_default_keyserver (void)
400    {
401        char *host = get_reg_entry_keyserver ("Default");
402        char *str_port = get_reg_entry_keyserver ("Default_Port");
403        WORD port = HKP_PORT;
404    
405        if (!host)
406            keyserver_set_default (NULL, 0);
407        else {
408            if (str_port && *str_port)
409                port = atoi (str_port);
410            keyserver_set_default (host, port);
411        }
412        free_if_alloc (host);
413        free_if_alloc (str_port);
414    }
415    
416    
417    /* Display info message that WinPT is now in debug mode. */
418    void
419    winpt_debug_msg (void)
420    {      
421        char output[512];
422        char temp[128];
423            
424        GetTempPath (sizeof temp -1, temp);
425        _snprintf (output, sizeof output - 1,
426            "The GPGME output file is %sgpgme.dbg\n"
427            "The WinPT output file is %swinpt.log\n", temp, temp);
428        MessageBox (NULL, output, "WinPT now runs in DEBUG MODE", MB_INFO);
429    }
430    
431    
432    /* Search for insecure ElGamal keys and return the
433       number of founded keys. */
434    static int
435    count_insecure_elgkeys (void)
436    {
437        gpg_keycache_t pc;
438        gpgme_key_t key;
439        int n = 0;
440    
441        pc = keycache_get_ctx (1);
442        while (!gpg_keycache_next_key (pc, 0, &key)) {
443            if (key->subkeys->pubkey_algo == GPGME_PK_ELG)
444                n++;
445        }
446        gpg_keycache_rewind (pc);
447        return n;
448  }  }
449    
450    
# Line 385  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 457  WinMain (HINSTANCE hinst, HINSTANCE hpre
457      MSG msg;      MSG msg;
458      HWND hwnd = NULL;      HWND hwnd = NULL;
459      WORD ver[3], ptdver[4];      WORD ver[3], ptdver[4];
460        const char *s;
461      int rc, ec, created = 0;      int rc, ec, created = 0;
462      int first_start = 0, start_gpgprefs = 0;      int first_start = 0, start_gpgprefs = 0;
463      int winpt_inst_found = 0;      int winpt_inst_found = 0;
464      int start_manager = 0;      int start_manager = 0;    
     const char *s;  
465    
466      glob_hinst = hinst;      glob_hinst = hinst;
467      if (cmdline && stristr (cmdline, "--stop")) {      if (cmdline && stristr (cmdline, "--stop")) {
# Line 399  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 471  WinMain (HINSTANCE hinst, HINSTANCE hpre
471          return 0;          return 0;
472      }      }
473    
     /*  
     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);  
     }  
     */  
   
474      #ifdef _DEBUG      #ifdef _DEBUG
475      gpg_set_debug_mode (1);      gpg_set_debug_mode (1);
476      debug = 1;      debug = 1;
477      #endif      #endif
478    
479      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]);
480      get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],      ec = get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],
481                                   &ptdver[2], &ptdver[3]);                                   &ptdver[2], &ptdver[3]);
482      /* XXX      
483      if (ptdver[0] != ver[0] || ptdver[1] != ver[1]|| ptdver[2] != ver[2]) {      if (!ec && (ptdver[0] != ver[0] || ptdver[1] != ver[1]|| ptdver[2] != ver[2])) {
484          log_box (_("WinPT Error"), MB_ERR,          log_box (_("WinPT Error"), MB_ERR,
485                   _("The PTD.dll file has a different version than WinPT.exe\n"                   _("The PTD.dll file has a different version than WinPT.exe\n"
486                     "Please update the PTD.dll to version %d.%d.%d"),                     "Please update the PTD.dll to version %d.%d.%d"),
487                     ver[0], ver[1], ver[2]);                     ver[0], ver[1], ver[2]);
488          return 0;          return 0;
489      }      }
     */  
490    
491      if (gpg_md_selftest ()) {      if (gpg_md_selftest ()) {
492          msg_box (NULL, _("Cryptographic selftest failed."),          msg_box (NULL, _("Cryptographic selftest failed."),
# Line 448  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 508  WinMain (HINSTANCE hinst, HINSTANCE hpre
508      if (cmdline && stristr (cmdline, "--mobile")) {      if (cmdline && stristr (cmdline, "--mobile")) {
509          msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",          msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",
510                   "WinPT", MB_INFO);                   "WinPT", MB_INFO);
511          mobile = 1;          mobile_mode_active = 1;
512      }      }
513        
514        set_default_keyserver ();
515        load_gettext ();
516        admin_user = user_is_admin ();
517    
518      set_default_kserver ();      if (!mobile_mode_active) {
     load_gettext (winpt_inst_found);  
   
     if (!mobile) {  
519          regist_inst_gnupg (1);          regist_inst_gnupg (1);
520          regist_inst_winpt (1, &created);          regist_inst_winpt (1, &created);
521      }      }
522      else {      else {
523          enable_mobile_mode ();          if (enable_mobile_mode ())
524          /* XXX: ask for GPG path */              return 0;
525          created = 1; /* Disable registry writing */          created = 1; /* Disable registry writing */
526      }      }
527    
528      if (!created) {      if (!created) {
529          memset (&reg_prefs, 0, sizeof (reg_prefs));          memset (&reg_prefs, 0, sizeof (reg_prefs));
         reg_prefs.use_tmpfiles = 1; /* default */  
530          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 */
531          get_reg_winpt_prefs (&reg_prefs);          get_reg_winpt_prefs (&reg_prefs);
         if (!reg_prefs.no_hotkeys)  
             hotkeys_modify ();  
532          gnupg_load_config ();          gnupg_load_config ();
533      }      }
534    
# Line 506  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 564  WinMain (HINSTANCE hinst, HINSTANCE hpre
564              }              }
565          }          }
566          else {          else {
567              msg_box (NULL, _("GPG home directory could not be determited."),              msg_box (NULL, _("GPG home directory could not be determined."),
568                       _("WinPT Error"), MB_ERR);                       _("WinPT Error"), MB_ERR);
569              goto start;              goto start;
570          }          }
# Line 531  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 589  WinMain (HINSTANCE hinst, HINSTANCE hpre
589              ec = msg_box (NULL,              ec = msg_box (NULL,
590                  _("Could not access and/or find the public and secret keyring.\n"                  _("Could not access and/or find the public and secret keyring.\n"
591                    "If this is an accident, quit the program and fix it.\n\n"                    "If this is an accident, quit the program and fix it.\n\n"
592                    "Continue if you want that WinPT offers you more choices.\n"),                    "Continue if you want WinPT to offer you more choices.\n"),
593                    "WinPT", MB_INFO|MB_YESNO);                    "WinPT", MB_INFO|MB_YESNO);
594              if (ec == IDYES)              if (ec == IDYES)
595                  first_start = 1;                  first_start = 1;
# Line 594  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 652  WinMain (HINSTANCE hinst, HINSTANCE hpre
652          return 0;          return 0;
653      }      }
654    
655      if (cmdline) {      if (cmdline && (stristr (cmdline, "--enable-debug") ||
656          if (stristr (cmdline, "--enable-debug") ||                      stristr (cmdline, "--debug"))) {
657              stristr (cmdline, "--debug")) {          gpg_set_debug_mode (1);
658              gpg_set_debug_mode (1);          winpt_debug_msg ();
659              winpt_debug_msg ();          debug = 1;
             debug = 1;  
         }  
660      }      }
661    
662      wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));      wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
# Line 672  start: Line 728  start:
728              }              }
729              break;              break;
730    
731            case SETUP_CARDGEN:
732                rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN,
733                                     h, card_keygen_dlg_proc, 0);
734                if (!rc)
735                    goto start;
736                break;
737    
738          case 0: /* Cancel/Abort. */          case 0: /* Cancel/Abort. */
739          default:          default:
740              DestroyWindow (hwnd);              DestroyWindow (hwnd);
# Line 682  start: Line 745  start:
745          if (!check_crypto_engine ()) {          if (!check_crypto_engine ()) {
746              DestroyWindow (hwnd);              DestroyWindow (hwnd);
747              free_gnupg_table ();              free_gnupg_table ();
748                keycache_release (1);
749              return 0;              return 0;
750          }          }
751            if (!is_gpg4win_installed ()) {
752                select_language ();
753                load_gettext ();
754            }
755      }      }
756      else {      else {
757          gpg_keycache_t c, sec_c;          gpg_keycache_t c, sec_c;
758          update_keycache (hwnd);          if (update_keycache (hwnd)) {
759                DestroyWindow (hwnd);
760                free_gnupg_table ();
761                keycache_release (1);
762                return 0;
763            }
764          c = keycache_get_ctx (1);          c = keycache_get_ctx (1);
765          if (!c || !gpg_keycache_get_size (c)) {          if (!gpg_keycache_get_size (c)) {
             gnupg_display_error ();  
766              msg_box (hwnd, _("The keycache was not initialized or is empty.\n"              msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
767                               "Please check your GPG config (keyrings, pathes...)"),                               "Please check your GPG config (keyrings, pathes...)"),
768                               _("WinPT Error"), MB_ERR);                               _("WinPT Error"), MB_ERR);
769              ec = msg_box (NULL, _("It seems that GPG is not set properly.\n"              ec = msg_box (NULL, _("It seems that GPG is not configured properly.\n"
770                                    "Do you want to start the GPG preferences dialog?"),                                    "Do you want to start the GPG preferences dialog?"),
771                              "WinPT", MB_INFO|MB_YESNO);                              "WinPT", MB_INFO|MB_YESNO);
772              if (ec == IDYES) {              if (ec == IDYES) {
# Line 705  start: Line 777  start:
777              else {              else {
778                  DestroyWindow (hwnd);                  DestroyWindow (hwnd);
779                  free_gnupg_table ();                  free_gnupg_table ();
780                    keycache_release (1);
781                  return 0;                  return 0;
782              }              }
783          }          }
# Line 715  start: Line 788  start:
788                       _("Default key (from the GPG config file) could not be found.\n"                       _("Default key (from the GPG config file) could not be found.\n"
789                         "Please check your gpg.conf or set a new default key to correct it:\n\n"                         "Please check your gpg.conf or set a new default key to correct it:\n\n"
790                         "%s: public key not found."), p? p : "[null]");                         "%s: public key not found."), p? p : "[null]");
791              free_if_alloc (p);              set_gnupg_default_key (NULL);
             DestroyWindow (hwnd);  
             free_gnupg_table ();  
             return 0;  
792          }          }
793          if (count_insecure_elgkeys ())          if (count_insecure_elgkeys ())
794              DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,              DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,

Legend:
Removed from v.176  
changed lines
  Added in v.262

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26