/[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 36 by werner, Thu Oct 27 15:25:13 2005 UTC revision 234 by twoaday, Tue Jun 27 10:16:41 2006 UTC
# Line 1  Line 1 
1  /* wptKeyPropsDlg.cpp - WinPT key properties dialog  /* wptKeyPropsDlg.cpp - WinPT key properties 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 <windows.h>  #include <assert.h>
26    
27  #include "../resource.h"  #include "resource.h"
28  #include "wptErrors.h"  #include "wptErrors.h"
29  #include "wptGPG.h"  #include "wptGPG.h"
30  #include "wptCommonCtl.h"  #include "wptCommonCtl.h"
# Line 38  Line 37 
37  #include "wptVersion.h"  #include "wptVersion.h"
38  #include "wptKeyEdit.h"  #include "wptKeyEdit.h"
39    
 static void  
 do_change_ownertrust (winpt_key_t k, const char *s)  
 {  
     char ot[64];  
       
     if( strstr( s, "ultimate" ) ) {  
         listview_get_item_text (k->callback.ctl, k->callback.idx, 5, ot, DIM (ot)-1);  
         strcpy (ot, "Ultimate");  
         listview_add_sub_item (k->callback.ctl, k->callback.idx, 5, ot);  
         /* fixme: If we switch back from Ultimate to a lower level */  
     }  
 }  
   
40    
41  /* Check that the key is not expired or revoked. */  /* Check that the key is not expired or revoked. */
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;
60    
61      switch (id) {      switch (id) {
62      case 1: inf = _("Don't know");         break;      case 1: inf = _("Don't know");         break;
63      case 2: inf = _("I do NOT trust");     break;      case 2: inf = _("I do NOT trust");     break;
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 86  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 *f;
# Line 106  keyprops_load_photo (HWND dlg, gpgme_key Line 118  keyprops_load_photo (HWND dlg, gpgme_key
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;
133        }
134    
135      f = fopen (get_photo_tmpname (dlg), "wb");      f = fopen (get_photo_tmpname (dlg), "wb");
136      if (f) {      if (f) {
         for (pos = 0; img[pos] != 0x10; pos++)  
                 ;  
137          pos += 16;          pos += 16;
138          fwrite (img + pos, 1, imglen - pos, f);          fwrite (img + pos, 1, imglen - pos, f);
         fwrite (img, 1, imglen, f);  
139          fclose (f);          fclose (f);
140      }      }
141      return 0;      return 0;
142  }  }
143    
144    
 /* Display the photo in the image control in the dialog @dlg. */  
 static int  
 keyprops_show_photo (HWND dlg)  
 {  
     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));  
       
     return 0;  
 }  
   
   
145  /* Return string representation of the key validity. @key. */  /* Return string representation of the key validity. @key. */
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        if (key->disabled)
154            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 166  get_validity (gpgme_key_t key) Line 162  get_validity (gpgme_key_t key)
162  static const char*  static const char*
163  get_pref_cipher (winpt_key_t k)  get_pref_cipher (winpt_key_t k)
164  {  {
     const char *sym_prefs=NULL;      
   
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      }      }
179      return "Unknown";      return "Unknown";
# Line 191  static bool Line 185  static bool
185  check_for_desig_rev (gpgme_key_t key)  check_for_desig_rev (gpgme_key_t key)
186  {  {
187      winpt_key_s k;      winpt_key_s k;
188    
189      memset (&k, 0, sizeof (k));      memset (&k, 0, sizeof (k));
190      if (!winpt_get_pubkey (key->subkeys->keyid, &k))      if (!winpt_get_pubkey (key->subkeys->keyid, &k))
191          return k.ext->gloflags.has_desig_rev? true : false;          return k.ext->gloflags.has_desig_rev? true : false;
# Line 204  get_card_type (winpt_key_t k) Line 199  get_card_type (winpt_key_t k)
199  {      {    
200      static char buf[64];      static char buf[64];
201    
202      if (!k->ext->card_type)      if (!k->ext || !k->ext->card_type)
203          return "";          return "";
204      _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);
205      return buf;      return buf;
206  }  }
207    
208    
209    /* Return 1 if at least one user-ID is valid. */
210    static int
211    key_is_valid (gpgme_key_t key)
212    {
213        gpgme_user_id_t u;
214    
215        for (u=key->uids; u; u=u->next) {
216            if (u->validity >= GPGME_VALIDITY_MARGINAL)
217                return 1;
218        }
219        return 0;
220    }
221    
222    
223    
224  /* Display the key information for key @k.  /* Display the key information for key @k.
225     Return value: gpgme key on success. */     Return value: gpgme key on success. */
226  static void  static void
227  display_key_info (HWND dlg, winpt_key_t k, gpgme_key_t *r_key)  display_key_info (HWND dlg, winpt_key_t k)
228  {  {
229      struct winpt_key_s k2;      gpgme_key_t key;
230      gpgme_key_t sk, key;      struct winpt_key_s sk;
231      char info[512];      char info[512];
232      const char *inf;      const char *inf;
233      u32 created, expires;          DWORD created, expires;
234    
235      memset (&k2, 0, sizeof (k2));            gpg_keycache_update_attr (k->ext, KC_ATTR_PREFSYM, 0);
236      if (k->key_pair)      memset (&sk, 0, sizeof (sk));
237          winpt_get_seckey (k->keyid, &k2);      if (k->key_pair && !winpt_get_seckey (k->keyid, &sk))
238      else              k->is_protected = sk.is_protected;
239          winpt_get_pubkey (k->keyid, &k2);      key = k->ext->key;
240      sk = k2.ctx;              created = key->subkeys->timestamp;
241      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;      
242      _snprintf (info, DIM (info)-1,      _snprintf (info, DIM (info)-1,
243                 _("Type: %s\r\n"                 _("Type: %s\r\n"
244                 "Key ID: %s\r\n"                 "Key ID: 0x%s\r\n"
245                 "Algorithm: %s\r\n"                 "Algorithm: %s\r\n"
246                 "Size: %s\r\n"                 "Size: %s bits\r\n"
247                 "Created: %s\r\n"                 "Created: %s\r\n"
248                 "Expires: %s\r\n"                 "Expires: %s\r\n"
249                 "Validity: %s\r\n"                 "Validity: %s\r\n"
# Line 251  display_key_info (HWND dlg, winpt_key_t Line 256  display_key_info (HWND dlg, winpt_key_t
256                 get_key_created (created),                 get_key_created (created),
257                 get_key_expire_date (expires),                 get_key_expire_date (expires),
258                 get_validity (key),                 get_validity (key),
259                 get_pref_cipher (&k2),                 get_pref_cipher (k),
260                 get_card_type (&k2));                 get_card_type (&sk));
261    
262      SetDlgItemText (dlg, IDC_KEYPROPS_INFO, info);      SetDlgItemText (dlg, IDC_KEYPROPS_INFO, info);
263      SetDlgItemText (dlg, IDC_KEYPROPS_FPR, get_key_fpr (key));        SetDlgItemText (dlg, IDC_KEYPROPS_FPR, get_key_fpr (key));  
264      inf = ownertrust_to_string (key->owner_trust);      inf = ownertrust_to_string (key->owner_trust, k->key_pair);
265      SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);      SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);
266    }
267    
268    
269    /* Context to store associated data of the dialog. */
270    struct prop_info_s {
271        winpt_key_t key;
272    };
273    
274      *r_key = key;  
275    static void
276    on_init_dialog (HWND dlg, WPARAM wparam, LPARAM lparam)
277    {
278        gpgme_validity_t valid;
279    
280        winpt_key_t k = (winpt_key_t)lparam;
281        SetWindowText (dlg, _("Key Properties"));
282        SetDlgItemText (dlg, IDC_KEYPROPS_OT_CHANGE, _("&Change"));
283        SetDlgItemText (dlg, IDC_KEYPROPS_REVOKERS, _("&Revokers"));
284        SetDlgItemText (dlg, IDC_KEYPROPS_CHANGE_PWD, _("Change &Password"));
285        SetDlgItemText (dlg, IDC_KEYPROPS_OTINF, _("Ownertrust"));  
286        
287        display_key_info (dlg, k);
288        if (!key_load_photo (dlg, k->ctx, &valid)) {
289            k->has_photo = 1;
290            if (valid < GPGME_VALIDITY_MARGINAL)
291                SetDlgItemText (dlg, IDC_KEYPROPS_IMGINF, _("Photo-ID not validated."));
292        }    
293        if (k->key_pair)
294            EnableWindow (GetDlgItem (dlg, IDC_KEYPROPS_CHANGE_PWD), TRUE);
295        if (check_for_desig_rev (k->ctx))
296            EnableWindow (GetDlgItem (dlg, IDC_KEYPROPS_REVOKERS), TRUE);
297        if (do_check_key (k->ctx))
298            EnableWindow (GetDlgItem (dlg, IDC_KEYPROPS_OT_CHANGE), FALSE);
299        center_window (dlg, NULL);  
300        SetForegroundWindow (dlg);
301  }  }
302    
303    
# Line 267  display_key_info (HWND dlg, winpt_key_t Line 305  display_key_info (HWND dlg, winpt_key_t
305  BOOL CALLBACK  BOOL CALLBACK
306  keyprops_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keyprops_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
307  {  {
308      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};  
309      const char *inf;      const char *inf;
     int cancel = 0;  
310      int rc;      int rc;
311            
312      /* XXX: static variable (k) prevent that the dialog can      if (msg != WM_INITDIALOG &&
313              be opened twice. */          (prop = (prop_info_s*)GetWindowLong (dlg, GWL_USERDATA)) == NULL)
314            return FALSE;
315    
316      switch (msg) {      switch (msg) {
317      case WM_INITDIALOG:      case WM_INITDIALOG:
318          if (!lparam)          assert (lparam != 0);
319              dlg_fatal_error (dlg, "Could not get dialog param!");          prop = new struct prop_info_s;
320          k = (winpt_key_t)lparam;          prop->key = (winpt_key_t)lparam;
321          #ifndef LANG_DE          SetWindowLong (dlg, GWL_USERDATA, (LONG)prop);
322          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);        
323          return TRUE;          return TRUE;
324    
325      case WM_DESTROY:      case WM_DESTROY:
326          unlink (get_photo_tmpname (dlg));          key_unload_photo (dlg);
327            delete prop;prop = NULL;
328            SetWindowLong (dlg, GWL_USERDATA, 0);
329          break;          break;
330                
331      case WM_PAINT:      case WM_PAINT:
332          if (k->has_photo)          /* Display the photo in the frame of the dialog @dlg.
333              keyprops_show_photo (dlg);             The coordinates are fixed to (0,0). */
334            if (prop->key->has_photo) {
335                POINT p;
336                p.x = p.y = 0;
337                PTD_jpg_show (GetDlgItem (dlg, IDC_KEYPROPS_IMG),
338                                &p, get_photo_tmpname (dlg));
339            }
340          break;          break;
341    
     case WM_SYSCOMMAND:  
         if (LOWORD (wparam) == SC_CLOSE)  
             EndDialog (dlg, TRUE);  
         return FALSE;  
           
342      case WM_COMMAND:      case WM_COMMAND:
343          switch (LOWORD (wparam)) {          switch (LOWORD (wparam)) {
344          case IDOK:          case IDOK:
345              EndDialog (dlg, TRUE);              EndDialog (dlg, TRUE);
346              return TRUE;              return TRUE;
347    
348            case IDCANCEL:
349                EndDialog (dlg, FALSE);
350                return TRUE;
351                            
352          case IDC_KEYPROPS_OT_CHANGE:          case IDC_KEYPROPS_OT_CHANGE:
353              if (do_check_key (key)) {              if (do_check_key (prop->key->ctx)) {
354                  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"
355                                  "You cannot change the ownertrust of such keys."),                                  "You cannot change the ownertrust of such keys."),
356                                  _("WinPT Warning"), MB_ERR);                                  _("WinPT Warning"), MB_ERR);
357                  return TRUE;                  return TRUE;
358              }              }
359              if( !k->key_pair && key->uids->validity < 3 ) {              if (!prop->key->key_pair && !key_is_valid (prop->key->ctx)) {
360                  rc = msg_box( dlg, _("This is a non-valid key.\n"                  rc = msg_box (dlg, _("This is a non-valid key.\n"
361                                       "Modifying the ownertrust has no effect on such keys.\n\n"                                       "Modifying the ownertrust has no effect on such keys.\n\n"
362                                       "Do you really want to continue?"),                                       "Do you really want to continue?"),
363                                       _("WinPT Warning"), MB_ICONWARNING|MB_YESNO );                                       _("WinPT Warning"), MB_ICONWARNING|MB_YESNO);
364                  if (rc == IDNO)                  if (rc == IDNO)
365                      return TRUE;                      return TRUE;
366              }              }
367              //GetDlgItemText (dlg, IDC_KEYPROPS_OT, info, sizeof info -1);              rc = dialog_box_param (glob_hinst,
368              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYEDIT_OWNERTRUST,                                     (LPCSTR)IDD_WINPT_KEYEDIT_OWNERTRUST,
369                                dlg, (DLGPROC)keyedit_ownertrust_dlg_proc,                                      dlg, keyedit_ownertrust_dlg_proc,
370                                (LPARAM)k, _("Change Ownertrust"),                                     (LPARAM)prop->key, _("Change Ownertrust"),
371                                IDS_WINPT_KEYEDIT_OWNERTRUST);                                      IDS_WINPT_KEYEDIT_OWNERTRUST);
372              if (k->callback.new_val == -1) { /* Cancel */              if (rc == FALSE) /* Cancel */
373                  EndDialog (dlg, FALSE);                  return TRUE;
                 break;  
             }  
374    
375              inf = ownertrust_to_string (k->callback.new_val);              inf = ownertrust_to_string (prop->key->callback.new_val,
376              do_change_ownertrust (k, inf);                                          prop->key->key_pair);
377              SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);              SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);
378              msg_box (dlg, _("Ownertrust successfully changed."),              msg_box (dlg, _("Ownertrust successfully changed."),
379                       _("GnuPG Status"), MB_OK);                       _("GnuPG Status"), MB_OK);
380                            prop->key->update = 1;
             /* reload only the keylist */  
             rcs.kr_reload = 1; rcs.kr_update = 1;  
             rcs.tr_update = 0;  
             DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,  
                             keycache_dlg_proc, (LPARAM)&rcs);  
381              return TRUE;              return TRUE;
382                            
383          case IDC_KEYPROPS_CHANGE_PWD:          case IDC_KEYPROPS_CHANGE_PWD:
384              keyedit_change_passwd (k, dlg);                      keyedit_change_passwd (prop->key, dlg);        
385              return TRUE;              return TRUE;
386    
387          case IDC_KEYPROPS_REVOKERS:          case IDC_KEYPROPS_REVOKERS:
388              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYREVOKERS, dlg,              prop->key->update = dialog_box_param (glob_hinst,
389                                key_revokers_dlg_proc, (LPARAM)key, _("Key Revokers"),                                            (LPCTSTR)IDD_WINPT_KEYREVOKERS, dlg,
390                                IDS_WINPT_KEY_REVOKERS);                                            key_revokers_dlg_proc, (LPARAM)prop->key,
391                                              _("Key Revokers"),
392                                              IDS_WINPT_KEY_REVOKERS);
393                UpdateWindow (dlg);
394              break;              break;
395          }          }
396      }      }

Legend:
Removed from v.36  
changed lines
  Added in v.234

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26