/[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 2 by twoaday, Mon Jan 31 11:02:21 2005 UTC revision 30 by twoaday, Sat Oct 22 10:17:59 2005 UTC
# Line 17  Line 17 
17   * along with WinPT; if not, write to the Free Software Foundation,   * along with WinPT; if not, write to the Free Software Foundation,
18   * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA   * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19   */   */
   
20  #include <windows.h>  #include <windows.h>
21    
22  #include "../resource.h"  #include "../resource.h"
# Line 34  Line 33 
33  #include "wptCard.h"  #include "wptCard.h"
34  #include "wptFileManager.h"  #include "wptFileManager.h"
35  #include "wptContext.h"  #include "wptContext.h"
36    #include "wptCardEdit.h"
37    
38    
39    #define MIN_GPG_VER   "1.4.3"   /* Minimal GPG version. */
40    #define MIN_GPGME_VER "1.2.0"   /* Minimal GPGME version. */
41    
42    
43  HINSTANCE glob_hinst; /* global instance for the dialogs */  HINSTANCE glob_hinst;   /* global instance for the dialogs */
44  HWND glob_hwnd; /* global window handle for the dialogs */  HWND glob_hwnd;         /* global window handle for the dialogs */
45  HWND activ_hwnd;  HWND activ_hwnd;
46  LOCK mo_file;  LOCK mo_file;
47  int scard_support = 0;  int scard_support = 0;
48  int debug = 0;  int debug = 0;
49    int mobile = 0;
50  int gpg_read_only = 0;  int gpg_read_only = 0;
51  char gpgver[3];  char gpgver[3];
52    
53    
54    /* Load the key cache and rebuild the signature cache. */
55  static void  static void
56  update_keycache (HWND hwnd)  update_keycache (HWND hwnd)
57  {  {
# Line 54  update_keycache (HWND hwnd) Line 61  update_keycache (HWND hwnd)
61      rcs.tr_update = 1;      rcs.tr_update = 1;
62      DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,      DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,
63                      keycache_dlg_proc, (LPARAM)&rcs);                      keycache_dlg_proc, (LPARAM)&rcs);
64  } /* update_keycache */  }
65    
66    
67    /* Set GPGME debug mode. If @val is 0, the debug mode is disabled. */
68    void
69    gpg_set_debug_mode (int val)
70    {      
71        if (val)
72            putenv ("GPGME_DEBUG=5:gpgme.dbg");
73        else
74            putenv ("GPGME_DEBUG=");
75    }
76    
77    
78  static char *  /* Return the name of the gettext language file. */
79    static char*
80  get_gettext_lang (void)  get_gettext_lang (void)
81  {      {    
82      char * fname;      char *fname;
83      fname = get_reg_entry_mo ();      fname = get_reg_entry_mo ();
84      if (!fname)      if (!fname)
85          return NULL;          return NULL;
86      return fname;      return fname;
87  } /* get_gettext_lang */  }
88    
89    
90    /* Initialize the gettext sub system. */
91  static void  static void
92  load_gettext (void)  load_gettext (void)
93  {  {
94      char * nls = NULL;      char *nls = NULL;
95      char * file = NULL;      char *file = NULL;
96    
97      nls = get_gettext_lang ();      nls = get_gettext_lang ();
98      if (nls) {      if (nls) {
# Line 86  load_gettext (void) Line 106  load_gettext (void)
106          free_if_alloc (nls);          free_if_alloc (nls);
107          free_if_alloc (file);          free_if_alloc (file);
108      }      }
109  } /* load_gettext */  }
110    
111    
112  /* 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
113     keyring. if not, bail out because encryption won't work properly then. */     keyring. if not, bail out because encryption won't work properly then. */
114  static int  static int
115  check_default_key (gpgme_keycache_t kc)  check_default_key (gpg_keycache_t kc)
116  {  {
117      gpgme_key_t key;      gpgme_key_t key;
118      gpgme_error_t err = GPGME_No_Error;      gpgme_error_t err = GPG_ERR_NO_ERROR;
119      char * defkey;      char * defkey;
120    
121      defkey = get_gnupg_default_key ();      defkey = get_gnupg_default_key ();
122      if (defkey)      if (defkey)
123          err = gpgme_keycache_find_key (kc, defkey, 0, &key);          err = gpg_keycache_find_key (kc, defkey, 0, &key);
124      free_if_alloc (defkey);      free_if_alloc (defkey);
125      return err? -1 : 0;      return err? -1 : 0;
126  } /* check_default_key */  }
127    
128    
129  /* Return the WinPT program file name (with full pathname). */  /* Return the WinPT program file name (with full pathname). */
# Line 127  get_prog_part (const char * fname, int u Line 147  get_prog_part (const char * fname, int u
147              return NULL;              return NULL;
148          strncpy (currdir, cmd, 255);          strncpy (currdir, cmd, 255);
149          j = strlen (currdir);          j = strlen (currdir);
150          while (j--)          while (j--) {
         {        
151              if (currdir[j] == '\\')              if (currdir[j] == '\\')
152                  break;                            break;          
153          }          }
# Line 136  get_prog_part (const char * fname, int u Line 155  get_prog_part (const char * fname, int u
155          _snprintf (program, DIM (program)-1, "%s\\%s", currdir + 1, fname);          _snprintf (program, DIM (program)-1, "%s\\%s", currdir + 1, fname);
156      }      }
157      return program;      return program;
158  } /* get_prog_part */  }
159    
160    
161    /* Check that the underlying crypto engine fullfills the minimal
162       requirements so all commands work properly. */
163  static int  static int
164  check_crypto_engine (void)  check_crypto_engine (void)
165  {  {
166      int ma=1, mi=2, pa=4; /* GPG 1.2.4 */      int ma=1, mi=4, pa=3; /* GPG 1.4.3 */
167      int rc;      int rc;
168    
169      rc = check_gnupg_engine (&ma, &mi, &pa);      rc = check_gnupg_engine (&ma, &mi, &pa);
170      if (rc == -1) {      if (rc == -1) {
171          msg_box (NULL, _("Could not read GnuPG version."), _("WinPT Error"), MB_ERR);          msg_box (NULL, _("Could not read GnuPG version."),
172                     _("WinPT Error"), MB_ERR);
173          return rc;          return rc;
174      }      }
175      else if (rc) {      else if (rc) {
176          log_box (_("WinPT Error"), MB_ERR,          log_box (_("WinPT Error"), MB_ERR,
177                   _("Sorry, you need a newer GPG version.\n"                   _("Sorry, you need a newer GPG version.\n"
178                     "GPG version %d.%d.%d requred GPG version 1.2.4"),                     "GPG version %d.%d.%d required GPG version "MIN_GPG_VER),
179                     ma, mi, pa);                     ma, mi, pa);
180          return rc;          return rc;
181      }      }
182      /* We enable smartcard support for GPG: 1.9.x and >= 1.3.90 */      /* We enable smartcard support for GPG: 1.9 or >= 1.4 */
183      if (ma > 1 || mi >= 9 || mi > 3)      if (ma >= 1 && mi >= 4)
184          scard_support = 1;          scard_support = 1;
185    
186      gpgver[0] = ma;      gpgver[0] = ma;
187      gpgver[1] = mi;      gpgver[1] = mi;
188      gpgver[2] = pa;      gpgver[2] = pa;
189      return rc;      return rc;
190  } /* check_crypto_engine */  }
191    
192    
193    /* Try to load the keyserver config file. If @quiet is 1
194       do not show any errors. */
195  static int  static int
196  load_keyserver_conf (int quiet)  load_keyserver_conf (int quiet)
197  {  {
# Line 187  load_keyserver_conf (int quiet) Line 211  load_keyserver_conf (int quiet)
211  }  }
212    
213    
214    static void
215    enable_mobile_mode (void)
216    {
217        memset (&reg_prefs, 0, sizeof (reg_prefs));
218        reg_prefs.always_trust = 0;
219        reg_prefs.auto_backup = 0;
220        reg_prefs.cache_time = 0;
221        reg_prefs.expert = 0;
222        reg_prefs.keylist_mode = 1;
223        reg_prefs.kserv_conf = m_strdup ("keyserver.conf");
224        reg_prefs.no_zip_mmedia = 1;
225        reg_prefs.use_tmpfiles = 1;
226        reg_prefs.word_wrap = 80;
227        reg_prefs.use_viewer = 0; /* XXX */
228    }
229    
230    
231    /* Main entry point. */
232  int WINAPI  int WINAPI
233  WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)  WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
234  {  {
# Line 196  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 238  WinMain (HINSTANCE hinst, HINSTANCE hpre
238      int first_start = 0, start_gpgprefs = 0;      int first_start = 0, start_gpgprefs = 0;
239      const char * s;      const char * s;
240      MSG msg;      MSG msg;
241      HWND hwnd;      HWND hwnd = NULL;
242    
243      glob_hinst = hinst;      glob_hinst = hinst;
244        
     gpgme_lib_init ();  
245      #ifdef _DEBUG      #ifdef _DEBUG
246      gpgme_set_debug_mode (1);      gpg_set_debug_mode (1);
247        debug = 1;
248      #endif      #endif
     gpgme_set_pgm_string ("WinPT "PGM_VERSION);  
249    
250      s = PTD_get_version ();      s = PTD_get_version ();
251      if (strcmp (s, "0.8.0"))      if (strcmp (s, "0.8.0")) {
     {  
252          log_box (_("Privacy Tray Dynamic (PTD)"), MB_ERR,          log_box (_("Privacy Tray Dynamic (PTD)"), MB_ERR,
253                   _("Please update your PTD.dll to the newest version, "                   _("Please update your PTD.dll to the newest version, "
254                     "the version (%s) you use is too old."), s);                     "the version (%s) you use is too old."), s);
255          return 0;          return 0;
256      }      }
257    
258      if (gpg_md_selftest ())      if (gpg_md_selftest ()) {
     {  
259          msg_box (NULL, _("Cryptographic selftest failed."),          msg_box (NULL, _("Cryptographic selftest failed."),
260                   _("WinPT Error"), MB_ERR);                   _("WinPT Error"), MB_ERR);
261          return 0;          return 0;
262      }      }
263    
264        s = gpgme_check_version (MIN_GPGME_VER);
265        if (!s || !*s) {
266            msg_box (NULL, _("A newer GPGME version is needed; at least "MIN_GPGME_VER),
267                     _("WinPT Error"), MB_ERR);
268            return 0;
269        }
270    
271        if (cmdline && stristr (cmdline, "--mobile")) {
272            msg_box (NULL, "WARNING: mobile modus is not fully implemented yet!",
273                     "WinPT", MB_INFO);
274            mobile = 1;
275        }
276    
277      set_default_kserver ();      set_default_kserver ();
278      regist_inst_gnupg (1);  
279      regist_inst_winpt (1, &created);      if (!mobile) {
280      if (!created)          regist_inst_gnupg (1);
281      {          regist_inst_winpt (1, &created);
282        }
283        else {
284            enable_mobile_mode ();
285            /* XXX: ask for GPG path */
286            created = 1; /* Disable registry writing */
287        }
288    
289        if (!created) {
290          memset (&reg_prefs, 0, sizeof (reg_prefs));          memset (&reg_prefs, 0, sizeof (reg_prefs));
291          reg_prefs.use_tmpfiles = 1; /* default */          reg_prefs.use_tmpfiles = 1; /* default */
292            reg_prefs.fm.progress = 0; /* XXX: fix the bug and enable it again */
293          get_reg_winpt_prefs (&reg_prefs);          get_reg_winpt_prefs (&reg_prefs);
294          if (!reg_prefs.no_hotkeys)          if (!reg_prefs.no_hotkeys)
295              hotkeys_modify ();              hotkeys_modify ();
296      }      }
297    
298      rc = gnupg_check_homedir ();      rc = gnupg_check_homedir ();
299      if (rc)      if (rc) {
     {  
300          log_box (_("WinPT Error"), MB_ERR,          log_box (_("WinPT Error"), MB_ERR,
301                   _("GPG home directory is not set correctly.\n"                   _("GPG home directory is not set correctly.\n"
302                     "Please check the GPG registry settings:\n%s."),                     "Please check the GPG registry settings:\n%s."),
303                   winpt_strerror (rc));                   winpt_strerror (rc));
304          const char * s = get_filename_dlg (GetActiveWindow (), FILE_OPEN,          const char * s = get_fileopen_dlg (GetActiveWindow (),
305                                             _("Select GPG Public Keyring"),                                             _("Select GPG Public Keyring"),
306                                             _("GPG Keyrings (*.gpg)\0*.gpg\0\0"),                                             _("GPG Keyrings (*.gpg)\0*.gpg\0\0"),
307                                             NULL);                                             NULL);
308          if (s && !file_exist_check (s))          if (s != NULL) {
         {  
309              size_t n;              size_t n;
310              char * p = strrchr (s, '\\');              char * p = strrchr (s, '\\');
311              if (!p)              if (!p)
# Line 265  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 324  WinMain (HINSTANCE hinst, HINSTANCE hpre
324                  gnupg_check_homedir (); /* change gpgProgram if needed */                  gnupg_check_homedir (); /* change gpgProgram if needed */
325              }              }
326          }          }
327          else          else {
         {  
328              msg_box (NULL, _("GPG home directory could not be determited."),              msg_box (NULL, _("GPG home directory could not be determited."),
329                       _("WinPT Error"), MB_ERR);                       _("WinPT Error"), MB_ERR);
330              goto start;              goto start;
# Line 274  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 332  WinMain (HINSTANCE hinst, HINSTANCE hpre
332      }      }
333    
334      rc = check_gnupg_prog ();      rc = check_gnupg_prog ();
335      if (rc)      if (rc) {
     {  
336          if (msg_box (NULL, _("Could not find the GPG binary (gpg.exe).\n"          if (msg_box (NULL, _("Could not find the GPG binary (gpg.exe).\n"
337                               "Do you want to start the GPG preferences to "                               "Do you want to start the GPG preferences to "
338                               "correct  this problem?"), _("WinPT Error"),                               "correct  this problem?"), _("WinPT Error"),
# Line 333  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 390  WinMain (HINSTANCE hinst, HINSTANCE hpre
390      }      }
391    
392      load_keyserver_conf (cmdline? 1 : 0);      load_keyserver_conf (cmdline? 1 : 0);
393    
394      if (cmdline && (stristr (cmdline, "--keymanager")      if (cmdline && (stristr (cmdline, "--keymanager")
395                  || stristr (cmdline, "--cardmanager"))) {                  || stristr (cmdline, "--cardmanager"))) {
396          update_keycache (GetDesktopWindow ());          update_keycache (GetDesktopWindow ());
397          if (stristr (cmdline, "keymanager"))          if (stristr (cmdline, "keymanager"))
398              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYMISC,              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYMISC,
399                              GetDesktopWindow(), keymanager_dlg_proc, NULL,                              GetDesktopWindow(), keymanager_dlg_proc, NULL,
400                              _("Key Manager"), IDS_WINPT_KEYMISC);                              _("Key Manager"), IDS_WINPT_KEYMISC);  
401          else {          else {
402              gpgme_card_t crd = smartcard_init ();              gpg_card_t crd = gpg_card_load ();
403              if (crd)              if (crd)
404                  dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_CARD_EDIT,                  dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_CARD_EDIT,
405                                    GetDesktopWindow(), card_edit_dlg_proc,                                    GetDesktopWindow(), card_edit_dlg_proc,
406                                    (LPARAM)crd, _("Card Manager"),                                    (LPARAM)crd, _("Card Manager"),
407                                    IDS_WINPT_CARD_EDIT);                                    IDS_WINPT_CARD_EDIT);
408              gpgme_card_release (crd);              gpg_card_release (crd);
409          }          }
410          keycache_release ();          keycache_release (0);
411          free_gnupg_table ();          free_gnupg_table ();
412          return 0;          return 0;
413      }      }
# Line 360  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 418  WinMain (HINSTANCE hinst, HINSTANCE hpre
418          return 0;          return 0;
419      }      }
420    
421      /*if (file_exist_check ("loadimage.exe"))      if (cmdline) {
422          PTD_create_loadimage (NULL);*/          if (stristr (cmdline, "--enable-debug") || stristr (cmdline, "--debug")) {
423                        gpg_set_debug_mode (1);
424      if (cmdline && stristr (cmdline, "--enable-debug")) {              winpt_debug_msg ();
425          gpgme_set_debug_mode (1);              debug = 1;
426          winpt_debug_msg ();          }
         debug = 1;  
427      }      }
428    
429      wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));      wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
430      rc = RegisterClass (&wc);      rc = RegisterClass (&wc);
431      if (rc == FALSE) {      if (rc == FALSE) {
432          msg_box (NULL, _("Could not register window class"), _("WinPT Error"), MB_ERR);          msg_box (NULL, _("Could not register window class"),
433                     _("WinPT Error"), MB_ERR);
434          free_gnupg_table ();          free_gnupg_table ();
435          return 0;          return 0;
436      }      }
# Line 393  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 451  WinMain (HINSTANCE hinst, HINSTANCE hpre
451      UpdateWindow (hwnd);      UpdateWindow (hwnd);
452    
453      if (!first_start && !start_gpgprefs) {      if (!first_start && !start_gpgprefs) {
454          gnupg_backup_options (1);          gnupg_backup_options ();        
         gnupg_backup_options (0);  
           
455          rc = check_crypto_engine ();          rc = check_crypto_engine ();
456          if (rc) {          if (rc) {
457              DestroyWindow (hwnd);              DestroyWindow (hwnd);
# Line 403  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 459  WinMain (HINSTANCE hinst, HINSTANCE hpre
459              return 0;              return 0;
460          }          }
461      }      }
462        
463      if (start_gpgprefs)      if (start_gpgprefs) {
     {  
464          char *ring;          char *ring;
465          size_t size = 0;          size_t size = 0;
466          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
# Line 417  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 472  WinMain (HINSTANCE hinst, HINSTANCE hpre
472      }      }
473    
474      if (first_start) {      if (first_start) {
475          struct key_wizard_s c, dummy;          struct first_start_s fs;
476            struct genkey_s c;
477            HWND h;
478  start:  start:
479          DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, hwnd,          h = GetDesktopWindow ();
480                          first_run_dlg_proc, (LPARAM)&dummy);          DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, h,
481          switch (dummy.interactive)                              gpgprefs_dlg_proc, NULL);
482          {          DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_FIRST, h,
483                            first_run_dlg_proc, (LPARAM)&fs);
484            switch (fs.choice) {
485          case SETUP_KEYGEN:          case SETUP_KEYGEN:
486              c.interactive = 1;              c.interactive = 1;
487                c.first_start = 1;
488              rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD,              rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYWIZARD,
489                                   hwnd, keygen_wizard_dlg_proc, (LPARAM)&c);                                   h, keygen_wizard_dlg_proc, (LPARAM)&c);
490              if (!rc)              if (!rc)
491                  goto start;                  goto start;
             update_keycache (hwnd);  
             check_crypto_engine ();  
492              break;              break;
493    
494          case SETUP_IMPORT:          case SETUP_IMPORT:
# Line 439  start: Line 497  start:
497                  msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);                  msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
498                  goto start;                  goto start;
499              }              }
             update_keycache (hwnd);  
             check_crypto_engine ();  
500              break;              break;
501    
         case SETUP_EXISTING:  
             break; /* todo */  
   
502          case -1:          case -1:
503              DestroyWindow (hwnd);              DestroyWindow (hwnd);
504              free_gnupg_table ();              free_gnupg_table ();
505              return 0;              return 0;
506          }          }
507            update_keycache (hwnd);
508            check_crypto_engine ();
509      }      }
510      else {      else {
511          gpgme_keycache_t c;          gpg_keycache_t c;
512          update_keycache (hwnd);          update_keycache (hwnd);
513          c = keycache_get_ctx (1);          c = keycache_get_ctx (1);
514          if (!c || !gpgme_keycache_count (c)) {          if (!c || !gpg_keycache_get_size (c)) {
515              gnupg_display_error ();              gnupg_display_error ();
516              msg_box (hwnd, _("The keycache was not initialized or is empty.\n"              msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
517                               "Please check your GPG config (keyrings, pathes...)"),                               "Please check your GPG config (keyrings, pathes...)"),
# Line 501  start: Line 556  start:
556      }      }
557                    
558      return 0;      return 0;
559  } /* WinMain */  }

Legend:
Removed from v.2  
changed lines
  Added in v.30

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26