/[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 278 by twoaday, Mon Jan 15 22:02:04 2007 UTC revision 407 by twoaday, Mon Feb 6 19:26:03 2012 UTC
# Line 1  Line 1 
1  /* WinPT.cpp - Windows Privacy Tray (WinPT)  /* WinPT.cpp - Windows Privacy Tray (WinPT)
2   *      Copyright (C) 2000-2006 Timo Schulz   *      Copyright (C) 2000-2009 Timo Schulz
3   *   *
4   * This file is part of WinPT.   * This file is part of WinPT.
5   *   *
# Line 39  Line 39 
39  #include "wptUTF8.h"  #include "wptUTF8.h"
40    
41  void remove_crit_file_attrs (const char *fname, int force);  void remove_crit_file_attrs (const char *fname, int force);
 BOOL user_is_admin (void);  
 int  pcsc_available (void);  
42    
43  /* Global variables. */  /* Global variables. */
44  HINSTANCE glob_hinst;   /* global instance for the dialogs */  HINSTANCE glob_hinst;   /* global instance for the dialogs */
# Line 48  HWND glob_hwnd;                /* global window handle Line 46  HWND glob_hwnd;                /* global window handle
46  int scard_support = 0;  int scard_support = 0;
47  int debug = 0;  int debug = 0;
48  int gpg_read_only = 0;  int gpg_read_only = 0;
 int admin_user = 0;  
49  char gpgver[3];  char gpgver[3];
50  /* End */  /* End */
51    
52    
53    /* Retrieve the product verion of the given file @fname.
54       Format: MAJOR.MINOR.PATCH1.PATCH2
55       Return value: 0 on success. */
56    int
57    get_file_version (const char *fname, WORD *major, WORD *minor, WORD *patch1, WORD *patch2)
58    {
59        VS_FIXEDFILEINFO *inf;
60        char file[MAX_PATH+1] = {0};
61        LPVOID buf, data;
62        DWORD size;
63        UINT qlen;
64        int err = 0;
65    
66        strncpy (file, fname, MAX_PATH);
67        size = GetFileVersionInfoSize (file, NULL);
68        if (!size)
69            return -1;
70        
71        buf = (LPVOID)new char[size];
72        if (!buf)
73            BUG (NULL);
74        if (!GetFileVersionInfo (file, 0, size, buf)) {
75            err = -1;
76            goto fail;
77        }
78    
79        qlen = 0;
80        VerQueryValue (buf, (char*)"\\", &data, &qlen);
81        if (!qlen) {
82            err = -1;
83            goto fail;
84        }
85        
86        inf = (VS_FIXEDFILEINFO*)data;
87        *major = HIWORD (inf->dwProductVersionMS);
88        *minor = LOWORD (inf->dwProductVersionMS);
89        *patch1 = HIWORD (inf->dwProductVersionLS);
90        *patch2 = LOWORD (inf->dwProductVersionLS);
91    
92    fail:
93        delete [](char*)buf;
94        return err;
95    }
96    
97    
98  /* Load the key cache and rebuild the signature cache. */  /* Load the key cache and rebuild the signature cache. */
99  int  int
100  update_keycache (HWND hwnd)  update_keycache (HWND hwnd)
101  {  {
     int err;  
102      refresh_cache_s rcs;      refresh_cache_s rcs;
103    
104      /* no need to rebuild the sig cache each time. */      /* no need to rebuild the sig cache each time. */
105      memset (&rcs, 0, sizeof (rcs));      memset (&rcs, 0, sizeof (rcs));
106      rcs.kring_update = 1;      rcs.kring_update = 1;
107      err = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,      int err = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, hwnd,
108                      keycache_dlg_proc, (LPARAM)&rcs);                      keycache_dlg_proc, (LPARAM)&rcs);
109      if (err) {      if (err) {
110          char *cfgf = get_gnupg_config ();          char *cfgf = get_gnupg_config ();
111          if (cfgf && check_gnupg_options (cfgf, 0) == WPTERR_FILE_EXIST)          if (cfgf && check_gnupg_options (cfgf, 0) == WPTERR_FILE_EXIST)
112              msg_box (NULL, _("The gpg.conf contains at least one argument which points to a non-existing file."), "WinPT", MB_ERR);              msg_box (GetDesktopWindow (),
113                         _("The gpg.conf contains at least one argument which points to a non-existing file."), "WinPT", MB_ERR);
114          free_if_alloc (cfgf);          free_if_alloc (cfgf);
115          return -1;          return -1;
116      }      }
# Line 80  update_keycache (HWND hwnd) Line 122  update_keycache (HWND hwnd)
122  void  void
123  gpg_set_debug_mode (int val)  gpg_set_debug_mode (int val)
124  {  {
125      static char buf[256];      static char buf[MAX_PATH+1];
     char tmp[128];  
126            
127      /* XXX: no gpgme.dbg is created. */      /* XXX: no gpgme.dbg is created. */
128      if (val > 0) {      if (val > 0) {
129            char tmp[128];
130          GetTempPath (DIM (tmp)-1, tmp);          GetTempPath (DIM (tmp)-1, tmp);
131          _snprintf (buf, DIM (buf)-1, "GPGME_DEBUG=5:%sgpgme.dbg", tmp);          _snprintf (buf, DIM (buf)-1, "GPGME_DEBUG=5:%sgpgme.dbg", tmp);
132          putenv (buf);          putenv (buf);
# Line 94  gpg_set_debug_mode (int val) Line 136  gpg_set_debug_mode (int val)
136  }  }
137    
138    
 /* Initialize the gettext sub system. */  
 static void  
 load_gettext (void)  
 {  
     char *nls;  
   
     /* Return the name of the gettext language file. */  
     nls = get_reg_entry_mo ();  
     if (nls != NULL) {  
         gettext_set_file ("winpt", nls);  
         free_if_alloc (nls);  
     }  
 }  
   
   
139  /* Return true if the GPG environment is useable. */  /* Return true if the GPG environment is useable. */
140  static bool  static bool
141  gpg_prefs_ok (void)  gpg_prefs_ok (void)
142  {  {
143      char *p;      char *p = get_reg_entry_gpg4win ("gpg.exe");
   
     p = get_reg_entry_gpg4win ("gpg.exe");  
144      if (!p || file_exist_check (p) != 0) {      if (!p || file_exist_check (p) != 0) {
145          free_if_alloc (p);          free_if_alloc (p);
146          p = get_reg_entry_gpg ("gpgProgram");          p = get_reg_entry_gpg ("gpgProgram");
# Line 147  static void Line 172  static void
172  check_readonly_attr (const char *homedir)  check_readonly_attr (const char *homedir)
173  {  {
174      const char *files[] = {"pubring.gpg", "secring.gpg", "trustdb.gpg", NULL};      const char *files[] = {"pubring.gpg", "secring.gpg", "trustdb.gpg", NULL};
175      char *file;      
176      int i;      log_debug("check if there are gpg files with a read-only attribute");
177        for (int i=0; files[i] != NULL; i++) {
178      for (i=0; files[i] != NULL; i++) {          char *file = make_filename (homedir, files[i], NULL);
         file = make_filename (homedir, files[i], NULL);  
179          remove_crit_file_attrs (file, 0);          remove_crit_file_attrs (file, 0);
180          free_if_alloc (file);          free_if_alloc (file);
181      }      }
# Line 189  load_gpg_env (void) Line 213  load_gpg_env (void)
213          memset (&sec_attr, 0, sizeof (sec_attr));          memset (&sec_attr, 0, sizeof (sec_attr));
214          sec_attr.nLength = sizeof (sec_attr);          sec_attr.nLength = sizeof (sec_attr);
215          if (!CreateDirectory (p, &sec_attr)) {          if (!CreateDirectory (p, &sec_attr)) {
216              msg_box (NULL, _("Could not create GPG home directory"),              msg_box (GetDesktopWindow (),
217                         _("Could not create GPG home directory"),
218                       _("WinPT Error"), MB_ERR);                       _("WinPT Error"), MB_ERR);
219              free_if_alloc (p);              free_if_alloc (p);
220              return (2);              return (2);
# Line 217  check_default_key (void) Line 242  check_default_key (void)
242    
243      kc = keycache_get_ctx (0);      kc = keycache_get_ctx (0);
244      defkey = get_gnupg_default_key ();      defkey = get_gnupg_default_key ();
245      if (defkey) {      if (defkey != NULL) {
246          err = gpg_keycache_find_key (kc, defkey, 0, &key);          err = gpg_keycache_find_key (kc, defkey, 0, &key);
247          if (err) {          if (err) {
248              free_if_alloc (defkey);              free_if_alloc (defkey);
# Line 226  check_default_key (void) Line 251  check_default_key (void)
251      }      }
252      else {      else {
253          /* Actually this is just a warning but we still continue. */          /* Actually this is just a warning but we still continue. */
254          msg_box (NULL, _("No useable secret key found."),          msg_box (GetDesktopWindow (), _("No useable secret key found."),
255                   _("WinPT Warning"), MB_WARN);                   _("WinPT Warning"), MB_WARN);
         free_if_alloc (defkey);  
256          return 0;          return 0;
257      }      }
258    
# Line 237  check_default_key (void) Line 261  check_default_key (void)
261      kc = keycache_get_ctx (1);      kc = keycache_get_ctx (1);
262      if (!gpg_keycache_find_key (kc, defkey, 0, &key) &&      if (!gpg_keycache_find_key (kc, defkey, 0, &key) &&
263          (key->revoked || key->expired)) {          (key->revoked || key->expired)) {
264          msg_box (NULL, _("Default secret key is unuseable"),          msg_box (GetDesktopWindow (), _("Default secret key is unuseable"),
265                   _("WinPT Warning"), MB_ERR);                   _("WinPT Warning"), MB_ERR);
266          free_if_alloc (defkey);          free_if_alloc (defkey);
267          return -1;          return -1;
# Line 247  check_default_key (void) Line 271  check_default_key (void)
271  }  }
272    
273    
 /* Return the WinPT program file name (with full pathname). */  
 static const char*  
 get_prog_part (const char *fname, int use_cwd)  
 {  
     static char program[2*MAX_PATH+1];  
     char currdir[MAX_PATH+1];  
     char *cmd = NULL;  
     int j;  
           
     memset (currdir, 0, DIM (currdir));  
     memset (program, 0, DIM (program));  
           
     if (use_cwd) {  
         GetCurrentDirectory (DIM (currdir)-1, currdir);  
         _snprintf (program, DIM (program)-1, "%s\\%s", currdir, fname);  
     }  
     else {  
         cmd = GetCommandLine ();  
         if (!cmd)  
             return NULL;  
         strncpy (currdir, cmd, DIM (currdir)-1);  
         j = strlen (currdir);  
         while (j--) {  
             if (currdir[j] == '\\')  
                 break;  
         }  
         currdir[j] = 0;  
         _snprintf (program, DIM (program)-1, "%s\\%s", currdir + 1, fname);  
     }  
     return program;  
 }  
   
   
274  /* Check that the underlying crypto engine fullfills the minimal  /* Check that the underlying crypto engine fullfills the minimal
275     requirements so all commands work properly. */     requirements so all commands work properly. */
276  static bool  static bool
# Line 290  check_crypto_engine (void) Line 281  check_crypto_engine (void)
281    
282      rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);      rc = check_gnupg_engine (NEED_GPG_VERSION, &ma, &mi, &pa);
283      if (rc == -1) {      if (rc == -1) {
284          msg_box (NULL, _("Could not read GnuPG version."),          msg_box (GetDesktopWindow (), _("Could not read GnuPG version."),
285                   _("WinPT Error"), MB_ERR);                   _("WinPT Error"), MB_ERR);
286          return false;          return false;
287      }      }
# Line 301  check_crypto_engine (void) Line 292  check_crypto_engine (void)
292                     ma, mi, pa);                     ma, mi, pa);
293          return false;          return false;
294      }      }
295      /* Enable smart card support for GPG 2 or >= 1.4 */      
296        // TODO: smart card support needs to be revamped
297        // and adjusted according to newer OpenPGP cards.
298        /*
299      if ((ma > 1 || pa >= 4) && pcsc_available ())      if ((ma > 1 || pa >= 4) && pcsc_available ())
300          scard_support = 1;          scard_support = 1;
301        */
302        scard_support = 0;
303        
304      gpgver[0] = ma;      gpgver[0] = ma;
305      gpgver[1] = mi;      gpgver[1] = mi;
306      gpgver[2] = pa;      gpgver[2] = pa;
# Line 312  check_crypto_engine (void) Line 308  check_crypto_engine (void)
308  }  }
309    
310    
 /* Try to load the keyserver config file. If @quiet is 1  
    do not show any errors. */  
 static int  
 load_keyserver_conf (int quiet)  
 {      
     const char *t, *conf;  
     char *buf;  
     int rc;  
   
     #ifdef WINPT_MOBILE  
     /* In mobile mode we automatically assume the config file  
        in the current directory. */  
     return kserver_load_conf ("keyserver.conf");  
     #endif  
   
     /* Create $APPDATA\winpt if needed. */  
     buf = make_special_filename (CSIDL_APPDATA, "winpt", NULL);  
     if (buf && dir_exist_check (buf) && !CreateDirectory (buf, NULL)) {  
         MessageBox (NULL, _("Failed to create WinPT directory"),  
                     _("Keyserver"), MB_ERR);  
         free_if_alloc (buf);  
         return -1;  
     }  
     free_if_alloc (buf);  
   
     /* Check for $APPDATA\winpt\keyserver.conf */  
     buf = make_special_filename (CSIDL_APPDATA, "winpt\\keyserver.conf", NULL);  
   
     conf = get_prog_part ("keyserver.conf", 0);  
     if (!file_exist_check (conf))  
         t = conf;  
     else  
         t = "keyserver.conf";  
     if (file_exist_check (t) == 0 && file_exist_check (buf) != 0) {  
         if (!CopyFile (t, buf, FALSE)) {  
             MessageBox (NULL, _("Failed to copy the keyserver.conf"),  
                         _("Keyserver"), MB_ERR);  
             free_if_alloc (buf);  
             return -1;  
         }  
         t = buf;  
     }  
     else  
         t = buf;  
       
     rc = kserver_load_conf (t);  
     if (rc && !quiet)  
         msg_box (NULL, winpt_strerror (rc), _("Keyserver"), MB_ERR);  
     else {  
         free_if_alloc (reg_prefs.kserv_conf);  
         reg_prefs.kserv_conf = m_strdup (t);  
     }  
     free_if_alloc (buf);  
     return rc;  
 }  
   
311    
312  /* Check if both keyrings are empty. This indicates that  /* Check if both keyrings are empty. This indicates that
313     WinPT should offer to generate a key pair. */     WinPT should offer to generate a key pair. */
# Line 375  static bool Line 315  static bool
315  check_for_empty_keyrings (bool pub_only)  check_for_empty_keyrings (bool pub_only)
316  {  {
317      char *p;      char *p;
318      int n = 0;      int n;
319    
320        n=0;
321      p = get_gnupg_keyring (1, 0);      p = get_gnupg_keyring (1, 0);
322      if (file_exist_check (p) == 0 && get_file_size (p) == 0)      if (file_exist_check (p) == 0 && get_file_size (p) == 0)
323          n++;          n++;
# Line 391  check_for_empty_keyrings (bool pub_only) Line 332  check_for_empty_keyrings (bool pub_only)
332  }  }
333    
334    
 #ifdef WINPT_MOBILE  
 /* Enable the mobile mode if possible.  
    There are some constraints which must be fullfilled.  
    Return value: 0 on success. */  
 static int  
 enable_mobile_mode (void)  
 {  
     static const char *test_fname = "winpt_mobile_test.txt";  
     FILE *fp;  
     char *pubring;  
     ULARGE_INTEGER caller, total;  
     DWORD temp_size;  
   
     fp = fopen (test_fname, "wb");  
     if (fp == NULL) {  
         MessageBox (NULL, "Mobile mode cannot be used without write permission\n"  
                           "for the current directory", "WinPT Error", MB_ERR);  
               
         return -1;  
     }  
     fclose (fp);  
     DeleteFile (test_fname);  
     if (file_exist_check ("gpg.exe")) {  
         MessageBox (NULL, "The GnuPG program needs to be in the same directory\n"  
                           "as the WinPT program", "WinPT Error", MB_ERR);  
         return -1;  
     }  
       
     /* Because write operations to the keyring result in a temporary  
        file, we need at least 2 MB plus the size of the keyring for  
        free space. */  
     pubring = get_gnupg_keyring (1);  
     temp_size = get_file_size (pubring) + 2097152;  
     free_if_alloc (pubring);  
   
     if (!GetDiskFreeSpaceEx (NULL, &caller, &total, NULL) ||  
         caller.LowPart < temp_size) {  
         log_box ("WinPT Error", MB_ERR,  
                  "The mobile mode needs at least %lu KB for temporary files",  
                  temp_size/1024);  
         return -1;  
     }  
   
     /* XXX: shall we check for 'temp-directory' in the gpg.conf? */  
   
     return 0;  
 }  
 #endif  
   
   
 /* Set the default keyserver for this instance. */  
 void  
 set_default_keyserver (void)  
 {  
     char *host = get_reg_entry_keyserver ("Default");  
     char *str_port = get_reg_entry_keyserver ("Default_Port");  
     WORD port = HKP_PORT;  
   
     if (!host)  
         keyserver_set_default (NULL, 0);  
     else {  
         if (str_port && *str_port)  
             port = atoi (str_port);  
         keyserver_set_default (host, port);  
     }  
     free_if_alloc (host);  
     free_if_alloc (str_port);  
 }  
   
335    
336  /* Display info message that WinPT is now in debug mode. */  /* Display info message that WinPT is now in debug mode. */
337  void  void
338  winpt_debug_msg (void)  winpt_debug_msg (void)
339  {        {      
340      char output[512];      char output[512];
341      char temp[128];      char temp[MAX_PATH+1];
342                    
343      GetTempPath (DIM (temp) -1, temp);      GetTempPath (DIM (temp) - 1, temp);
344      _snprintf (output, DIM (output)-1,      _snprintf (output, DIM (output)-1,
345          "The GPGME output file is %sgpgme.dbg\n"          "The GPGME output file is %sgpgme.dbg\n"
346          "The WinPT output file is %swinpt.log\n", temp, temp);          "The WinPT output file is %swinpt.log\n", temp, temp);
# Line 483  count_insecure_elgkeys (void) Line 355  count_insecure_elgkeys (void)
355  {  {
356      gpg_keycache_t pc;      gpg_keycache_t pc;
357      gpgme_key_t key;      gpgme_key_t key;
     int n = 0;  
358    
359        int n = 0;
360      pc = keycache_get_ctx (1);      pc = keycache_get_ctx (1);
361      while (!gpg_keycache_next_key (pc, 0, &key)) {      while (!gpg_keycache_next_key (pc, 0, &key)) {
362          if (key->subkeys->pubkey_algo == GPGME_PK_ELG)          if (key->subkeys->pubkey_algo == GPGME_PK_ELG)
# Line 495  count_insecure_elgkeys (void) Line 367  count_insecure_elgkeys (void)
367  }  }
368    
369    
370    /* Return 1 if the current OS version is at least Windows XP */
371    static int
372    check_os_version (void)
373    {
374        OSVERSIONINFOA osver;    
375        memset (&osver, 0, sizeof (osver));
376        osver.dwOSVersionInfoSize = sizeof (osver);
377        
378        log_debug("check OS version");
379        if (!GetVersionEx (&osver)) {
380            MessageBox (NULL, _("Could not read the OS version."), _("WinPT Error"), MB_ERR);
381            return 0;
382        }
383    
384        if (osver.dwMajorVersion < 5 ||
385            (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 0)) {
386            MessageBox (NULL, _("WinPT requires Windows XP or higher."), _("WinPT Error"), MB_ERR);
387            return 0;
388        }
389        
390        return 1;
391    }
392        
393  /* Main entry point. */  /* Main entry point. */
394  int WINAPI  int WINAPI
395  WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)  WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int showcmd)
# Line 504  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 399  WinMain (HINSTANCE hinst, HINSTANCE hpre
399      MSG msg;      MSG msg;
400      HWND hwnd = NULL;      HWND hwnd = NULL;
401      WORD ver[3], ptdver[4];      WORD ver[3], ptdver[4];
402        
403      const char *s;      const char *s;
404      int rc, ec, created = 0;      int rc, ec, created = 0;
405      int first_start = 0, start_gpgprefs = 0;      int first_start = 0, start_gpgprefs = 0;
406      int winpt_inst_found = 0;      int winpt_inst_found = 0;
407      int start_manager = 0;          int start_manager = 0;    
408    
409  #ifdef WINPT_MOBILE      if (!check_os_version ())
     /* Do not continue in case of problems. */  
     if (enable_mobile_mode ())  
410          return 0;          return 0;
411  #endif      
   
412      glob_hinst = hinst;      glob_hinst = hinst;
413        
414        /* Allow to shutdown the process, for instance by an installer */
415      if (cmdline && stristr (cmdline, "--stop")) {      if (cmdline && stristr (cmdline, "--stop")) {
416          hwnd = FindWindow ("WinPT", "WinPT");          hwnd = FindWindow ("WinPT", "WinPT");
417          if (hwnd != NULL)          if (hwnd != NULL)
418              PostMessage (hwnd, WM_DESTROY, 0, 0);              PostMessage (hwnd, WM_DESTROY, 0, 0);
419          return 0;          return 0;
420      }      }    
   
 #ifdef _DEBUG  
     gpg_set_debug_mode (1);  
     debug = 1;  
 #endif  
421    
422      get_file_version ("WinPT.exe", &ver[0], &ver[1], &ver[2], &ver[3]);      log_debug("check PTD and GPGME version");
423      ec = get_file_version ("PTD.dll", &ptdver[0], &ptdver[1],        get_file_version ("winpt.exe", &ver[0], &ver[1], &ver[2], &ver[3]);
424                                   &ptdver[2], &ptdver[3]);      ec = get_file_version ("PTD.dll", &ptdver[0], &ptdver[1], &ptdver[2], &ptdver[3]);
425            if (!ec && (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])) {  
426          log_box (_("WinPT Error"), MB_ERR,          log_box (_("WinPT Error"), MB_ERR,
427                   _("The PTD.dll file has a different version than WinPT.exe\n"                   _("The PTD.dll file has a different version than WinPT.exe\n"
428                     "Please update the PTD.dll to version %d.%d.%d"),                     "Please update the PTD.dll to version %d.%d.%d"),
# Line 543  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 430  WinMain (HINSTANCE hinst, HINSTANCE hpre
430          return 0;          return 0;
431      }      }
432    
     if (gpg_md_selftest ()) {  
         msg_box (NULL, _("Cryptographic selftest failed."),  
                  _("WinPT Error"), MB_ERR);  
         return 0;  
     }  
   
433      s = gpgme_check_version (NEED_GPGME_VERSION);      s = gpgme_check_version (NEED_GPGME_VERSION);
434      if (!s || !*s) {      if (!s || !*s) {
435          msg_box (NULL, _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),          msg_box (GetDesktopWindow (),
436                     _("A newer GPGME version is needed; at least "NEED_GPGME_VERSION),
437                   _("WinPT Error"), MB_ERR);                   _("WinPT Error"), MB_ERR);
438          return 0;          return 0;
439      }      }
# Line 560  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 442  WinMain (HINSTANCE hinst, HINSTANCE hpre
442      if (GetLastError () == ERROR_ALREADY_EXISTS)      if (GetLastError () == ERROR_ALREADY_EXISTS)
443          winpt_inst_found = 1;          winpt_inst_found = 1;
444            
445      set_default_keyserver ();      gettext_set_user_domain ();
     load_gettext ();  
     admin_user = user_is_admin ();  
446    
447      regist_inst_gnupg (1);      regist_inst_gnupg (1);
448      regist_inst_winpt (1, &created);      regist_inst_winpt (1, &created);
# Line 570  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 450  WinMain (HINSTANCE hinst, HINSTANCE hpre
450      if (!created) {      if (!created) {
451          memset (&reg_prefs, 0, sizeof (reg_prefs));          memset (&reg_prefs, 0, sizeof (reg_prefs));
452          get_reg_winpt_prefs (&reg_prefs);          get_reg_winpt_prefs (&reg_prefs);
453          reg_prefs.fm.progress = 0; /* XXX: fix the bug and enable it again */          reg_prefs.fm.progress = 0; /* TODO: fix the bug and enable it again */
454          if (gnupg_load_config () == -2)          if (gnupg_load_config () == -2)
455              msg_box (NULL, _("The gpg.conf file contains the 'textmode' option\n"              msg_box (GetDesktopWindow (),
456                               "which leads to broken binary output during decryption.\n"                       _("The gpg.conf file contains the 'textmode' option\n"
457                               "If this is on purpose, just continue otherwise the option should be disabled."),                         "which leads to broken binary output during decryption.\n"
458                              _("WinPT Error"), MB_ERR);                         "If this is on purpose, just continue otherwise the option should be disabled."),
459                         _("WinPT Error"), MB_ERR);
460      }      }
461    
462      if (is_gpg4win_installed ())      if (is_gpg4win_installed ()) {
463          load_gpg_env (); /* XXX: check return code. */          log_debug("gpg4win: load gpg environment");
464            load_gpg_env (); /* TODO: check return code. */
465        }
466    
467      rc = gnupg_check_homedir ();      rc = gnupg_check_homedir ();
468      if (rc) {      if (rc) {  
         char *p;  
   
469          log_box (_("WinPT Error"), MB_ERR,          log_box (_("WinPT Error"), MB_ERR,
470                   _("GPG home directory is not set correctly.\n"                   _("GPG home directory is not set correctly.\n"
471                     "Please check the GPG registry settings:\n%s."),                     "Please check the GPG registry settings:\n%s."),
# Line 593  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 474  WinMain (HINSTANCE hinst, HINSTANCE hpre
474                                _("Select GPG Public Keyring"),                                _("Select GPG Public Keyring"),
475                                "GPG Keyrings (*.gpg)\0*.gpg\0\0",                                "GPG Keyrings (*.gpg)\0*.gpg\0\0",
476                                NULL);                                NULL);
477          if (s != NULL && (p=strrchr (s, '\\'))) {          
478            char * p;
479            if (s != NULL && (p = strrchr (s, '\\'))) {
480              char *path = substr (s, 0, (p-s));              char *path = substr (s, 0, (p-s));
481    
482              set_reg_entry_gpg ("HomeDir", path);              set_reg_entry_gpg ("HomeDir", path);
483              free_if_alloc (path);              free_if_alloc (path);
484          }          }
485          else {          else {
486              msg_box (NULL, _("GPG home directory could not be determined."),              msg_box (GetDesktopWindow (),
487                         _("GPG home directory could not be determined."),
488                       _("WinPT Error"), MB_ERR);                       _("WinPT Error"), MB_ERR);
489              goto start;              goto start;
490          }          }
# Line 608  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 492  WinMain (HINSTANCE hinst, HINSTANCE hpre
492    
493      rc = check_gnupg_prog ();      rc = check_gnupg_prog ();
494      if (rc) {      if (rc) {
495          if (msg_box (NULL, _("Could not find the GPG binary (gpg.exe).\n"          if (msg_box (GetDesktopWindow (),
496                               "Do you want to start the GPG preferences to "                       _("Could not find the GPG binary (gpg.exe).\n"
497                               "correct  this problem?"), _("WinPT Error"),                         "Do you want to start the GPG preferences to "
498                               MB_INFO|MB_YESNO) == IDYES)                         "correct  this problem?"), _("WinPT Error"),
499                         MB_INFO|MB_YESNO) == IDYES)
500              start_gpgprefs = 1;              start_gpgprefs = 1;
501          else {          else {
502              msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);              msg_box (GetDesktopWindow (),
503                         winpt_strerror (rc), _("WinPT Error"), MB_ERR);
504              return 0;              return 0;
505          }          }
506      }      }
# Line 622  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 508  WinMain (HINSTANCE hinst, HINSTANCE hpre
508      rc = gnupg_access_files ();      rc = gnupg_access_files ();
509      if (!start_gpgprefs && rc) {      if (!start_gpgprefs && rc) {
510          if (rc == WPTERR_GPG_KEYRINGS || rc == WPTERR_GPG_OPT_KEYRINGS) {          if (rc == WPTERR_GPG_KEYRINGS || rc == WPTERR_GPG_OPT_KEYRINGS) {
511              ec = msg_box (NULL,              ec = msg_box (GetDesktopWindow (),
512                  _("Could not access and/or find the public and secret keyring.\n"                  _("Could not access and/or find the public and secret keyring.\n"
513                    "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"
514                    "Continue if you want WinPT to offer you more choices.\n"),                    "Continue if you want WinPT to offer you more choices.\n"),
# Line 631  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 517  WinMain (HINSTANCE hinst, HINSTANCE hpre
517                  first_start = 1;                  first_start = 1;
518          }          }
519          if (!first_start) {          if (!first_start) {
520              msg_box (NULL, winpt_strerror (rc), _("WinPT Error"), MB_ERR);              msg_box (GetDesktopWindow (), winpt_strerror (rc), _("WinPT Error"), MB_ERR);
521              return 0;              return 0;
522          }          }
523      }      }
# Line 653  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 539  WinMain (HINSTANCE hinst, HINSTANCE hpre
539          return 0;          return 0;
540      }      }
541    
542      if (cmdline && stristr (cmdline, "--wipe-freespace")) {      rc = kserver_load_conf ();
543          dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_SPACE_SECDEL,      if (rc)
544                              GetDesktopWindow(), space_wipefrees_dlg_proc, 0,          msg_box (GetDesktopWindow (), winpt_strerror (rc),
545                              _("Wipe Free Space"), IDS_WINPT_SPACE_SECDEL);                   _("Keyserver"), MB_ERR);
         free_gnupg_table ();  
         return 0;  
     }  
   
     load_keyserver_conf (cmdline? 1 : 0);  
546    
547      if (cmdline && (stristr (cmdline, "--keymanager")      if (cmdline && (stristr (cmdline, "--keymanager")
548                  || stristr (cmdline, "--cardmanager"))) {                  || stristr (cmdline, "--cardmanager"))) {
# Line 687  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 568  WinMain (HINSTANCE hinst, HINSTANCE hpre
568          return 0;          return 0;
569      }      }
570    
 #ifndef WINPT_MOBILE  
571      if (cmdline && (stristr (cmdline, "--enable-debug") ||      if (cmdline && (stristr (cmdline, "--enable-debug") ||
572                      stristr (cmdline, "--debug"))) {                      stristr (cmdline, "--debug"))) {
573          gpg_set_debug_mode (1);          gpg_set_debug_mode (1);
574          winpt_debug_msg ();          winpt_debug_msg ();
575          debug = 1;          debug = 1;
576      }      }
 #endif  
577    
578      wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));      wc.hIcon = LoadIcon (glob_hinst, MAKEINTRESOURCE (IDI_WINPT));
579      rc = RegisterClass (&wc);      rc = RegisterClass (&wc);
580      if (rc == FALSE) {      if (rc == FALSE) {
581          msg_box (NULL, _("Could not register window class"),          msg_box (GetDesktopWindow (), _("Could not register window class"),
582                   _("WinPT Error"), MB_ERR);                   _("WinPT Error"), MB_ERR);
583          free_gnupg_table ();          free_gnupg_table ();
584          return 0;          return 0;
# Line 713  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 592  WinMain (HINSTANCE hinst, HINSTANCE hpre
592                           hinst,                           hinst,
593                           NULL);                           NULL);
594      if (hwnd == NULL) {      if (hwnd == NULL) {
595          msg_box (NULL, _("Could not create window"), _("WinPT Error"), MB_ERR);          msg_box (GetDesktopWindow (),
596                     _("Could not create window"),
597                     _("WinPT Error"), MB_ERR);
598          free_gnupg_table ();          free_gnupg_table ();
599          return 0;          return 0;
600      }      }
# Line 721  WinMain (HINSTANCE hinst, HINSTANCE hpre Line 602  WinMain (HINSTANCE hinst, HINSTANCE hpre
602      UpdateWindow (hwnd);      UpdateWindow (hwnd);
603    
604      if (!first_start && !start_gpgprefs) {      if (!first_start && !start_gpgprefs) {
605            log_debug("backup gpg config file and check back-end");
606          gnupg_backup_options ();                  gnupg_backup_options ();        
607          if (!check_crypto_engine ()) {          if (!check_crypto_engine ()) {
608              DestroyWindow (hwnd);              DestroyWindow (hwnd);
# Line 765  start: Line 647  start:
647              }              }
648              break;              break;
649    
650            case SETUP_EXISTING:
651                rc = gnupg_import_keypair ();
652                if (rc) {
653                    msg_box (hwnd, winpt_strerror (rc), _("WinPT Error"), MB_ERR);
654                    goto start;
655                }
656                break;
657    
658          case SETUP_CARDGEN:          case SETUP_CARDGEN:
659              rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN,              rc = DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_CARD_KEYGEN,
660                                   h, card_keygen_dlg_proc, 0);                                   h, card_keygen_dlg_proc, 0);
# Line 785  start: Line 675  start:
675              keycache_release (1);              keycache_release (1);
676              return 0;              return 0;
677          }          }
         if (!is_gpg4win_installed ()) {  
             select_language ();  
             load_gettext ();  
         }  
678      }      }
679      else {      else {
680          gpg_keycache_t c;          gpg_keycache_t c;
# Line 804  start: Line 690  start:
690              msg_box (hwnd, _("The keycache was not initialized or is empty.\n"              msg_box (hwnd, _("The keycache was not initialized or is empty.\n"
691                               "Please check your GPG config (keyrings, pathes...)"),                               "Please check your GPG config (keyrings, pathes...)"),
692                               _("WinPT Error"), MB_ERR);                               _("WinPT Error"), MB_ERR);
693              ec = msg_box (NULL, _("It seems that GPG is not configured properly.\n"              ec = msg_box (GetDesktopWindow (),
694                                    "Do you want to start the GPG preferences dialog?"),                            _("It seems that GPG is not configured properly.\n"
695                              "WinPT", MB_INFO|MB_YESNO);                              "Do you want to start the GPG preferences dialog?"),
696                              "WinPT", MB_INFO|MB_YESNO);
697              if (ec == IDYES) {              if (ec == IDYES) {
698                  DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,                  DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
699                                  gpgprefs_dlg_proc, 0);                                  gpgprefs_dlg_proc, 0);
# Line 832  start: Line 719  start:
719              DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,              DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_ELGWARN, glob_hwnd,
720                              elgamal_warn_dlg_proc, 0);                              elgamal_warn_dlg_proc, 0);
721      }      }
722      
723      if (start_manager)      if (start_manager)
724          PostMessage (hwnd, WM_COMMAND, start_manager, 0);          PostMessage (hwnd, WM_COMMAND, start_manager, 0);
725    
# Line 844  start: Line 731  start:
731              DispatchMessage (&msg);              DispatchMessage (&msg);
732          }          }
733      }      }
734                
735      return 0;      return 0;
736  }  }

Legend:
Removed from v.278  
changed lines
  Added in v.407

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26