/[winpt]/trunk/Src/wptKeyPropsDlg.cpp
ViewVC logotype

Diff of /trunk/Src/wptKeyPropsDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 73 by twoaday, Tue Nov 8 07:15:13 2005 UTC revision 256 by twoaday, Sat Aug 5 10:31:06 2006 UTC
# Line 1  Line 1 
1  /* wptKeyPropsDlg.cpp - WinPT key properties dialog  /* wptKeyPropsDlg.cpp - WinPT key property dialog
2   *      Copyright (C) 2000, 2001, 2002, 2003, 2005 Timo Schulz   *      Copyright (C) 2000, 2001, 2002, 2003, 2005, 2006 Timo Schulz
3   *   *
4   * This file is part of WinPT.   * This file is part of WinPT.
5   *   *
# 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  #ifdef HAVE_CONFIG_H  #ifdef HAVE_CONFIG_H
21  #include <config.h>  #include <config.h>
22  #endif  #endif
23    
24  #include <windows.h>  #include <windows.h>
25    #include <assert.h>
26    
27  #include "resource.h"  #include "resource.h"
28  #include "wptErrors.h"  #include "wptErrors.h"
# Line 42  Line 42 
42  static int  static int
43  do_check_key (gpgme_key_t key)  do_check_key (gpgme_key_t key)
44  {  {
45      int okay = 0;      int invalid = 0;
46      okay = key->expired;  
47      if (!okay)      invalid = key->expired;
48          okay = key->revoked;      if (!invalid)
49      return okay;          invalid = key->revoked;
50        return invalid;
51  }  }
52    
53    
54  /* Convert a trust integer into a string representation. */  /* Convert a trust integer into a string representation. */
55  static const char*  static const char*
56  ownertrust_to_string (int val)  ownertrust_to_string (int val, bool is_keypair)
57  {  {
58      const char *inf;      const char *inf;
59      int id = val;      int id = val;
# Line 63  ownertrust_to_string (int val) Line 64  ownertrust_to_string (int val)
64      case 3: inf = _("I trust marginally"); break;      case 3: inf = _("I trust marginally"); break;
65      case 4: inf = _("I trust fully");      break;      case 4: inf = _("I trust fully");      break;
66      case 5:      case 5:
67      case 6: inf = _("I trust ultimately"); break;      case 6:
68            if (is_keypair)
69                inf = _("I trust ultimately (implicit)");
70            else
71                inf = _("I trust ultimately"); break;
72      default:inf = _("Unknown");            break;      default:inf = _("Unknown");            break;
73      }      }
74            
# Line 73  ownertrust_to_string (int val) Line 78  ownertrust_to_string (int val)
78    
79  /* Generate a unique temp name for the photo which  /* Generate a unique temp name for the photo which
80     depends on the dialog handle and return it. */     depends on the dialog handle and return it. */
81  static const char*  const char*
82  get_photo_tmpname (HWND dlg)  get_photo_tmpname (HWND dlg)
83  {  {
84      static char buf[64];      static char buf[MAX_PATH+128+1];
85        char name[64];
86    
87      _snprintf (buf, sizeof (buf)-1, "winpt_photo_%08lX.tmp", (DWORD)dlg);      _snprintf (name, DIM (name)-1, "winpt_photo_%08lX.tmp", (DWORD)dlg);
88        get_temp_name (buf, DIM (buf)-1, name);
89      return buf;      return buf;
90  }  }
91    
92    
93    static void
94    draw_nophoto_img (HWND dlg)
95    {
96        /*..
97        n = DrawText (hdc, "No Photo-ID", -1, &r, DT_LEFT);
98        ..*/
99    }
100    
101    
102    
103    /* Delete temporary photo file. */
104    void
105    key_unload_photo (HWND dlg)
106    {
107        DeleteFile (get_photo_tmpname (dlg));
108    }
109    
110    
111  /* Load the photo from the key @key */  /* Load the photo from the key @key */
112  static int  int
113  keyprops_load_photo (HWND dlg, gpgme_key_t key, gpgme_validity_t *r_valid)  key_load_photo (HWND dlg, gpgme_key_t key, gpgme_validity_t *r_valid)
114  {  {
115      winpt_key_s k;      winpt_key_s k;
116      FILE *f;      FILE *fp;
117      const BYTE *img;      const BYTE *img;
118      DWORD imglen = 0;      DWORD imglen = 0;
119      int pos=0;      int pos=0;
120    
121      winpt_get_pubkey (key->subkeys->keyid, &k);      if (winpt_get_pubkey (key->subkeys->keyid, &k))
122            BUG (0);
123      img = k.ext->attrib.d;      img = k.ext->attrib.d;
124      imglen = k.ext->attrib.len;      imglen = k.ext->attrib.len;
125      if (!k.ext->attrib.validity)      if (img && !k.ext->attrib.validity)
126          get_uat_validity (key->subkeys->keyid, &k.ext->attrib.validity);          get_uat_validity (key->subkeys->keyid, &k.ext->attrib.validity);
127      *r_valid = k.ext->attrib.validity;      if (r_valid)
128            *r_valid = k.ext->attrib.validity;
129    
130      if (!img || !imglen)      if (!img || !imglen) {
131            draw_nophoto_img (dlg);
132          return -1;          return -1;
     f = fopen (get_photo_tmpname (dlg), "wb");  
     if (f) {  
         for (pos = 0; img[pos] != 0x10; pos++)  
                 ;  
         pos += 16;  
         fwrite (img + pos, 1, imglen - pos, f);  
         fwrite (img, 1, imglen, f);  
         fclose (f);  
133      }      }
     return 0;  
 }  
134    
135        fp = fopen (get_photo_tmpname (dlg), "wb");
136  /* Display the photo in the image control in the dialog @dlg. */      if (fp) {
137  static int          pos += 16;
138  keyprops_show_photo (HWND dlg)          fwrite (img + pos, 1, imglen - pos, fp);
139  {          fclose (fp);
140      RECT r;          }
     POINT p;  
     HWND h;  
   
     h = GetDlgItem (dlg, IDC_KEYPROPS_IMG);  
     GetWindowRect (h, &r);  
     p.x = r.left + 5;  
     p.y = r.top - 2;  
     memset (&p, 0, sizeof (p));  
     PTD_jpg_show (h, &p, get_photo_tmpname (dlg));  
       
141      return 0;      return 0;
142  }  }
143    
# Line 138  keyprops_show_photo (HWND dlg) Line 146  keyprops_show_photo (HWND dlg)
146  static const char*  static const char*
147  get_validity (gpgme_key_t key)  get_validity (gpgme_key_t key)
148  {  {
149      int val;      if (key->expired)
     val = key->expired;  
     if (val)  
150          return _("Expired");              return _("Expired");    
151      val = key->revoked;      if (key->revoked)
     if (val)  
152          return _("Revoked");          return _("Revoked");
153      val = key->disabled;      if (key->disabled)
     if (val)  
154          return _("Disabled");          return _("Disabled");
155        if (key->invalid)
156            return _("Invalid");
157      return get_key_trust2 (NULL, key->uids->validity, 0, 0);      return get_key_trust2 (NULL, key->uids->validity, 0, 0);
158  }  }
159    
# Line 158  get_pref_cipher (winpt_key_t k) Line 164  get_pref_cipher (winpt_key_t k)
164  {  {
165      if (k->is_v3)      if (k->is_v3)
166          return "IDEA";          return "IDEA";
167      if (!k->ext->sym_prefs)      if (!k->ext || !k->ext->sym_prefs)
168          return "3DES";          return "3DES";
169      switch (*k->ext->sym_prefs) {      switch (*k->ext->sym_prefs) {
170      case 1: return "IDEA";      case 1: return "IDEA";
171      case 2: return "3DES";      case 2: return "3DES";
172      case 3: return "CAST5";      case 3: return "CAST5";
173      case 4: return "Blowfish";      case 4: return "Blowfish";
174      case 7:      case 7: return "AES128";
175      case 8:      case 8: return "AES192";
176      case 9: return "AES";      case 9: return "AES256";
177      case 10:return "Twofish";      case 10:return "Twofish";
178        default:break;
179      }      }
180      return "Unknown";      return "Unknown";
181  }  }
# Line 179  static bool Line 186  static bool
186  check_for_desig_rev (gpgme_key_t key)  check_for_desig_rev (gpgme_key_t key)
187  {  {
188      winpt_key_s k;      winpt_key_s k;
189    
190      memset (&k, 0, sizeof (k));      memset (&k, 0, sizeof (k));
191      if (!winpt_get_pubkey (key->subkeys->keyid, &k))      if (!winpt_get_pubkey (key->subkeys->keyid, &k))
192          return k.ext->gloflags.has_desig_rev? true : false;          return k.ext->gloflags.has_desig_rev? true : false;
# Line 192  get_card_type (winpt_key_t k) Line 200  get_card_type (winpt_key_t k)
200  {      {    
201      static char buf[64];      static char buf[64];
202    
203      if (!k->ext->card_type)      if (!k->ext || !k->ext->card_type)
204          return "";          return "";
205      _snprintf (buf, sizeof (buf)-1, _("Card-Type: %s\r\n"), k->ext->card_type);      _snprintf (buf, DIM (buf)-1, _("Card-Type: %s\r\n"), k->ext->card_type);
206      return buf;      return buf;
207  }  }
208    
209    
210    /* Return 1 if at least one user-ID is valid. */
211    static int
212    key_is_valid (gpgme_key_t key)
213    {
214        gpgme_user_id_t u;
215    
216        for (u=key->uids; u; u=u->next) {
217            if (u->validity >= GPGME_VALIDITY_MARGINAL)
218                return 1;
219        }
220        return 0;
221    }
222    
223    
224    
225  /* Display the key information for key @k.  /* Display the key information for key @k.
226     Return value: gpgme key on success. */     Return value: gpgme key on success. */
227  static void  static void
228  display_key_info (HWND dlg, winpt_key_t k, gpgme_key_t *r_key)  display_key_info (HWND dlg, winpt_key_t k)
229  {  {
230      struct winpt_key_s k2;      gpgme_key_t key;
231      gpgme_key_t sk, key;      struct winpt_key_s sk;
232      char info[512];      char info[512];
233      const char *inf;      const char *inf;
234      u32 created, expires;          DWORD created, expires;
235    
236      memset (&k2, 0, sizeof (k2));            gpg_keycache_update_attr (k->ext, KC_ATTR_PREFSYM, 0);
237      if (k->key_pair)      memset (&sk, 0, sizeof (sk));
238          winpt_get_seckey (k->keyid, &k2);      if (k->key_pair && !winpt_get_seckey (k->keyid, &sk))
239      else              k->is_protected = sk.is_protected;
240          winpt_get_pubkey (k->keyid, &k2);      key = k->ext->key;
241      sk = k2.ctx;              created = key->subkeys->timestamp;
242      if (sk)      expires = key->subkeys->expires;
         k->is_protected = k2.is_protected;  
     if (get_pubkey (k->keyid, &key))  
         BUG (0);      
     created = key->subkeys->timestamp;    
     expires = key->subkeys->expires;      
243      _snprintf (info, DIM (info)-1,      _snprintf (info, DIM (info)-1,
244                 _("Type: %s\r\n"                 _("Type: %s\r\n"
245                 "Key ID: %s\r\n"                 "Key ID: 0x%s\r\n"
246                 "Algorithm: %s\r\n"                 "Algorithm: %s\r\n"
247                 "Size: %s\r\n"                 "Size: %s bits\r\n"
248                 "Created: %s\r\n"                 "Created: %s\r\n"
249                 "Expires: %s\r\n"                 "Expires: %s\r\n"
250                 "Validity: %s\r\n"                 "Validity: %s\r\n"
# Line 239  display_key_info (HWND dlg, winpt_key_t Line 257  display_key_info (HWND dlg, winpt_key_t
257                 get_key_created (created),                 get_key_created (created),
258                 get_key_expire_date (expires),                 get_key_expire_date (expires),
259                 get_validity (key),                 get_validity (key),
260                 get_pref_cipher (&k2),                 get_pref_cipher (k),
261                 get_card_type (&k2));                 get_card_type (&sk));
262    
263      SetDlgItemText (dlg, IDC_KEYPROPS_INFO, info);      SetDlgItemText (dlg, IDC_KEYPROPS_INFO, info);
264      SetDlgItemText (dlg, IDC_KEYPROPS_FPR, get_key_fpr (key));        SetDlgItemText (dlg, IDC_KEYPROPS_FPR, get_key_fpr (key));  
265      inf = ownertrust_to_string (key->owner_trust);      inf = ownertrust_to_string (key->owner_trust, k->key_pair);
266      SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);      SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);
267    }
268    
269    
270    /* Context to store associated data of the dialog. */
271    struct prop_info_s {
272        winpt_key_t key;
273    };
274    
275      *r_key = key;  
276    static void
277    on_init_dialog (HWND dlg, WPARAM wparam, LPARAM lparam)
278    {
279        gpgme_validity_t valid;
280    
281        winpt_key_t k = (winpt_key_t)lparam;
282        SetWindowText (dlg, _("Key Properties"));
283        SetDlgItemText (dlg, IDC_KEYPROPS_OT_CHANGE, _("&Change"));
284        SetDlgItemText (dlg, IDC_KEYPROPS_REVOKERS, _("&Revokers"));
285        SetDlgItemText (dlg, IDC_KEYPROPS_CHANGE_PWD, _("Change &Password"));
286        SetDlgItemText (dlg, IDC_KEYPROPS_OTINF, _("Ownertrust"));  
287        
288        display_key_info (dlg, k);
289        if (!key_load_photo (dlg, k->ctx, &valid)) {
290            k->has_photo = 1;
291            if (valid < GPGME_VALIDITY_MARGINAL)
292                SetDlgItemText (dlg, IDC_KEYPROPS_IMGINF, _("Photo-ID not validated."));
293        }    
294        if (k->key_pair)
295            EnableWindow (GetDlgItem (dlg, IDC_KEYPROPS_CHANGE_PWD), TRUE);
296        if (check_for_desig_rev (k->ctx))
297            EnableWindow (GetDlgItem (dlg, IDC_KEYPROPS_REVOKERS), TRUE);
298        if (do_check_key (k->ctx))
299            EnableWindow (GetDlgItem (dlg, IDC_KEYPROPS_OT_CHANGE), FALSE);
300        center_window (dlg, NULL);  
301        SetForegroundWindow (dlg);
302  }  }
303    
304    
# Line 255  display_key_info (HWND dlg, winpt_key_t Line 306  display_key_info (HWND dlg, winpt_key_t
306  BOOL CALLBACK  BOOL CALLBACK
307  keyprops_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keyprops_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
308  {  {
309      static winpt_key_t k;      struct prop_info_s *prop = NULL;
     static gpgme_key_t key;  
     gpgme_validity_t valid;  
     refresh_cache_s rcs = {0};  
310      const char *inf;      const char *inf;
311      int rc;      int rc;
312            
313      /* XXX: static variable (k) prevent that the dialog can      if (msg != WM_INITDIALOG &&
314              be opened twice. */          (prop = (prop_info_s*)GetWindowLong (dlg, GWL_USERDATA)) == NULL)
315            return FALSE;
316    
317      switch (msg) {      switch (msg) {
318      case WM_INITDIALOG:      case WM_INITDIALOG:
319          if (!lparam)          assert (lparam != 0);
320              dlg_fatal_error (dlg, "Could not get dialog param!");          prop = new struct prop_info_s;
321          k = (winpt_key_t)lparam;          prop->key = (winpt_key_t)lparam;
322          #ifndef LANG_DE          SetWindowLong (dlg, GWL_USERDATA, (LONG)prop);
323          SetWindowText (dlg, _("Key Properties"));          on_init_dialog (dlg, wparam, lparam);
         SetDlgItemText (dlg, IDC_KEYPROPS_OT_CHANGE, _("&Change"));  
         SetDlgItemText (dlg, IDC_KEYPROPS_REVOKERS, _("&Revokers"));  
         SetDlgItemText (dlg, IDC_KEYPROPS_CHANGE_PWD, _("Change &Passwd"));  
         SetDlgItemText (dlg, IDC_KEYPROPS_OTINF, _("Ownertrust"));  
         #endif    
   
         display_key_info (dlg, k, &key);  
         if (!keyprops_load_photo (dlg, key, &valid)) {  
             k->has_photo = 1;    
             if (valid < GPGME_VALIDITY_MARGINAL)  
                 SetDlgItemText (dlg, IDC_KEYPROPS_IMGINF, _("Photo-ID not validated."));  
         }  
         if (k->key_pair)  
             EnableWindow (GetDlgItem (dlg, IDC_KEYPROPS_CHANGE_PWD), TRUE);  
         if (check_for_desig_rev (key))  
             EnableWindow (GetDlgItem (dlg, IDC_KEYPROPS_REVOKERS), TRUE);  
         center_window (dlg, NULL);  
         SetForegroundWindow (dlg);        
324          return TRUE;          return TRUE;
325    
326      case WM_DESTROY:      case WM_DESTROY:
327          remove (get_photo_tmpname (dlg));          key_unload_photo (dlg);
328            delete prop;prop = NULL;
329            SetWindowLong (dlg, GWL_USERDATA, 0);
330          break;          break;
331                
332      case WM_PAINT:      case WM_PAINT:
333          if (k->has_photo)          /* Display the photo in the frame of the dialog @dlg.
334              keyprops_show_photo (dlg);             The coordinates are fixed to (0,0). */
335            if (prop->key->has_photo) {
336                POINT p;
337                p.x = p.y = 0;
338                PTD_jpg_show (GetDlgItem (dlg, IDC_KEYPROPS_IMG),
339                              &p, get_photo_tmpname (dlg));
340            }
341          break;          break;
342    
     case WM_SYSCOMMAND:  
         if (LOWORD (wparam) == SC_CLOSE)  
             EndDialog (dlg, TRUE);  
         return FALSE;  
           
343      case WM_COMMAND:      case WM_COMMAND:
344          switch (LOWORD (wparam)) {          switch (LOWORD (wparam)) {
345          case IDOK:          case IDOK:
346              EndDialog (dlg, TRUE);              EndDialog (dlg, TRUE);
347              return TRUE;              return TRUE;
348    
349            case IDCANCEL:
350                EndDialog (dlg, FALSE);
351                return TRUE;
352                            
353          case IDC_KEYPROPS_OT_CHANGE:          case IDC_KEYPROPS_OT_CHANGE:
354              if (do_check_key (key)) {              if (do_check_key (prop->key->ctx)) {
355                  msg_box (dlg, _("The status of this key is 'revoked' or 'expired'.\n"                  msg_box (dlg, _("The status of this key is 'revoked' or 'expired'.\n"
356                                  "You cannot change the ownertrust of such keys."),                                  "You cannot change the ownertrust of such keys."),
357                                  _("WinPT Warning"), MB_ERR);                                  _("WinPT Warning"), MB_ERR);
358                  return TRUE;                  return TRUE;
359              }              }
360              if( !k->key_pair && key->uids->validity < 3 ) {              if (!prop->key->key_pair && !key_is_valid (prop->key->ctx)) {
361                  rc = msg_box( dlg, _("This is a non-valid key.\n"                  rc = msg_box (dlg, _("This is a non-valid key.\n"
362                                       "Modifying the ownertrust has no effect on such keys.\n\n"                                       "Modifying the ownertrust has no effect on such keys.\n\n"
363                                       "Do you really want to continue?"),                                       "Do you really want to continue?"),
364                                       _("WinPT Warning"), MB_ICONWARNING|MB_YESNO );                                       _("WinPT Warning"), MB_ICONWARNING|MB_YESNO);
365                  if (rc == IDNO)                  if (rc == IDNO)
366                      return TRUE;                      return TRUE;
367              }              }
368              //GetDlgItemText (dlg, IDC_KEYPROPS_OT, info, sizeof info -1);              rc = dialog_box_param (glob_hinst,
369              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYEDIT_OWNERTRUST,                                     (LPCSTR)IDD_WINPT_KEYEDIT_OWNERTRUST,
370                                dlg, (DLGPROC)keyedit_ownertrust_dlg_proc,                                      dlg, keyedit_ownertrust_dlg_proc,
371                                (LPARAM)k, _("Change Ownertrust"),                                     (LPARAM)prop->key, _("Change Ownertrust"),
372                                IDS_WINPT_KEYEDIT_OWNERTRUST);                                      IDS_WINPT_KEYEDIT_OWNERTRUST);
373              if (k->callback.new_val == -1) { /* Cancel */              if (rc == FALSE) /* Cancel */
374                  EndDialog (dlg, FALSE);                  return TRUE;
                 break;  
             }  
375    
376              inf = ownertrust_to_string (k->callback.new_val);              inf = ownertrust_to_string (prop->key->callback.new_val,
377                                            prop->key->key_pair);
378              SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);              SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);
379              msg_box (dlg, _("Ownertrust successfully changed."),              msg_box (dlg, _("Ownertrust successfully changed."),
380                       _("GnuPG Status"), MB_OK);                       _("GnuPG Status"), MB_OK);
381                            prop->key->update = 1;
             /* XXX: modified ownertrust values can effect the entire  
                     WoT so we reload the cache. But this is very slow. */  
             memset (&rcs, 0, sizeof (rcs));  
             rcs.kr_reload = 1; rcs.kr_update = 1; /* reload only keylist */  
             DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,  
                             keycache_dlg_proc, (LPARAM)&rcs);  
382              return TRUE;              return TRUE;
383                            
384          case IDC_KEYPROPS_CHANGE_PWD:          case IDC_KEYPROPS_CHANGE_PWD:
385              keyedit_change_passwd (k, dlg);                      keyedit_change_passwd (prop->key, dlg);        
386              return TRUE;              return TRUE;
387    
388          case IDC_KEYPROPS_REVOKERS:          case IDC_KEYPROPS_REVOKERS:
389              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYREVOKERS, dlg,              prop->key->update = dialog_box_param (glob_hinst,
390                                key_revokers_dlg_proc, (LPARAM)key,                                            (LPCTSTR)IDD_WINPT_KEYREVOKERS, dlg,
391                                _("Key Revokers"), IDS_WINPT_KEY_REVOKERS);                                            key_revokers_dlg_proc, (LPARAM)prop->key,
392                                              _("Key Revokers"),
393                                              IDS_WINPT_KEY_REVOKERS);
394                UpdateWindow (dlg);
395              break;              break;
396          }          }
397      }      }

Legend:
Removed from v.73  
changed lines
  Added in v.256

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26