/[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 24 by twoaday, Sat Oct 8 10:43:08 2005 UTC revision 73 by twoaday, Tue Nov 8 07:15:13 2005 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 Timo Schulz
3   *   *
4   * This file is part of WinPT.   * This file is part of WinPT.
5   *   *
6   * WinPT is free software; you can redistribute it and/or modify   * WinPT is free software; you can redistribute it and/or modify
7   * it under the terms of the GNU General Public License as published by   * it under the terms of the GNU General Public License as published by
8   * the Free Software Foundation; either version 2 of the License, or   * the Free Software Foundation; either version 2 of the License, or
9   * (at your option) any later version.   * (at your option) any later version.
10   *   *
11   * WinPT is distributed in the hope that it will be useful,   * WinPT is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   * GNU General Public License for more details.   * GNU General Public License for more details.
15   *   *
16   * You should have received a copy of the GNU General Public License   * You should have received a copy of the GNU General Public License
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    
21  #include <windows.h>  #ifdef HAVE_CONFIG_H
22    #include <config.h>
23  #include "../resource.h"  #endif
24  #include "wptErrors.h"  
25  #include "wptGPG.h"  #include <windows.h>
26  #include "wptCommonCtl.h"  
27  #include "wptContext.h" /* for passphrase_s */  #include "resource.h"
28  #include "wptNLS.h"  #include "wptErrors.h"
29  #include "wptDlgs.h"  #include "wptGPG.h"
30  #include "wptTypes.h"  #include "wptCommonCtl.h"
31  #include "wptKeylist.h"  #include "wptContext.h" /* for passphrase_s */
32  #include "wptW32API.h"  #include "wptNLS.h"
33  #include "wptVersion.h"  #include "wptDlgs.h"
34  #include "wptKeyEdit.h"  #include "wptTypes.h"
35    #include "wptKeylist.h"
36    #include "wptW32API.h"
37  static void  #include "wptVersion.h"
38  do_change_ownertrust (winpt_key_t k, const char *s)  #include "wptKeyEdit.h"
39  {  
40      char ot[64];  
41        /* Check that the key is not expired or revoked. */
42      if( strstr( s, "ultimate" ) ) {  static int
43          listview_get_item_text (k->callback.ctl, k->callback.idx, 5, ot, DIM (ot)-1);  do_check_key (gpgme_key_t key)
44          strcpy (ot, "Ultimate");  {
45          listview_add_sub_item (k->callback.ctl, k->callback.idx, 5, ot);      int okay = 0;
46          /* fixme: If we switch back from Ultimate to a lower level */      okay = key->expired;
47      }      if (!okay)
48  } /* do_change_ownertrust */          okay = key->revoked;
49        return okay;
50    }
51  static int  
52  do_check_key (gpgme_key_t key)  
53  {  /* Convert a trust integer into a string representation. */
54      int okay = 0;  static const char*
55      okay = key->expired;  ownertrust_to_string (int val)
56      if (!okay)  {
57          okay = key->revoked;      const char *inf;
58      return okay;      int id = val;
59  } /* do_check_key */  
60        switch (id) {
61        case 1: inf = _("Don't know");         break;
62  static const char*      case 2: inf = _("I do NOT trust");     break;
63  ownertrust_to_string (int val)      case 3: inf = _("I trust marginally"); break;
64  {      case 4: inf = _("I trust fully");      break;
65      const char * inf;      case 5:
66      int id = val;      case 6: inf = _("I trust ultimately"); break;
67      switch (id) {      default:inf = _("Unknown");            break;
68      case 1: inf = _("Don't know");         break;      }
69      case 2: inf = _("I do NOT trust");     break;      
70      case 3: inf = _("I trust marginally"); break;      return inf;
71      case 4: inf = _("I trust fully");      break;  }
72      case 5:  
73      case 6: inf = _("I trust ultimately"); break;  
74      default:inf = _("Unknown");            break;  /* Generate a unique temp name for the photo which
75      }     depends on the dialog handle and return it. */
76        static const char*
77      return inf;  get_photo_tmpname (HWND dlg)
78  } /* ownertrust_to_string */  {
79        static char buf[64];
80    
81  #define PHOTO_TMPNAME "winpt_temp_photo.jpg"      _snprintf (buf, sizeof (buf)-1, "winpt_photo_%08lX.tmp", (DWORD)dlg);
82        return buf;
83  static int  }
84  keyprops_show_photo (HWND dlg, gpgme_key_t key)  
85  {  
86      RECT r;      /* Load the photo from the key @key */
87      POINT p;  static int
88      HWND h;  keyprops_load_photo (HWND dlg, gpgme_key_t key, gpgme_validity_t *r_valid)
89      const BYTE *img;  {
90      DWORD imglen = 0;      winpt_key_s k;
91      int pos=0;      FILE *f;
92      winpt_key_s k;      const BYTE *img;
93        DWORD imglen = 0;
94      winpt_get_pubkey (key->subkeys->keyid, &k);      int pos=0;
95      img = k.ext->attrib.d;  
96      imglen = k.ext->attrib.len;      winpt_get_pubkey (key->subkeys->keyid, &k);
97        img = k.ext->attrib.d;
98      if (!img || !imglen)      imglen = k.ext->attrib.len;
99          return -1;      if (!k.ext->attrib.validity)
100      FILE *f = fopen (PHOTO_TMPNAME, "wb");          get_uat_validity (key->subkeys->keyid, &k.ext->attrib.validity);
101      if (f) {      *r_valid = k.ext->attrib.validity;
102          for (pos = 0; img[pos] != 0x10; pos++)  
103                  ;      if (!img || !imglen)
104          pos += 16;          return -1;
105          fwrite (img + pos, 1, imglen - pos, f);      f = fopen (get_photo_tmpname (dlg), "wb");
106          fwrite (img, 1, imglen, f);      if (f) {
107          fclose (f);          for (pos = 0; img[pos] != 0x10; pos++)
108      }                  ;
109            pos += 16;
110      h = GetDlgItem (dlg, IDC_KEYPROPS_IMG);          fwrite (img + pos, 1, imglen - pos, f);
111      GetWindowRect (h, &r);          fwrite (img, 1, imglen, f);
112      p.x = r.left + 5;          fclose (f);
113      p.y = r.top - 2;      }
114      memset (&p, 0, sizeof (p));      return 0;
115      PTD_jpg_show (h, &p, PHOTO_TMPNAME);  }
116      unlink (PHOTO_TMPNAME);  
117    
118      return 0;  /* Display the photo in the image control in the dialog @dlg. */
119  }  static int
120    keyprops_show_photo (HWND dlg)
121    {
122  /* Return string representation of the key validity. @key. */      RECT r;    
123  static const char*      POINT p;
124  get_validity (gpgme_key_t key)      HWND h;
125  {  
126      int val;      h = GetDlgItem (dlg, IDC_KEYPROPS_IMG);
127      val = key->expired;      GetWindowRect (h, &r);
128      if (val)      p.x = r.left + 5;
129          return "Expired";            p.y = r.top - 2;
130      val = key->revoked;      memset (&p, 0, sizeof (p));
131      if (val)      PTD_jpg_show (h, &p, get_photo_tmpname (dlg));
132          return "Revoked";      
133      return get_key_trust2 (NULL, key->uids->validity, 0, 0);      return 0;
134  }  }
135    
136    
137  /* Return the preferred sym. algorithm from @key as a string. */  /* Return string representation of the key validity. @key. */
138  static const char*  static const char*
139  get_pref_cipher (winpt_key_t k)  get_validity (gpgme_key_t key)
140  {  {
141      const char *sym_prefs=NULL;          int val;
142        val = key->expired;
143      if (k->is_v3)      if (val)
144          return "IDEA";          return _("Expired");    
145      if (!k->ext->sym_prefs)      val = key->revoked;
146          return "3DES";      if (val)
147      switch (*k->ext->sym_prefs) {          return _("Revoked");
148      case 1: return "IDEA";      val = key->disabled;
149      case 2: return "3DES";      if (val)
150      case 3: return "CAST5";          return _("Disabled");
151      case 4: return "Blowfish";      return get_key_trust2 (NULL, key->uids->validity, 0, 0);
152      case 7:  }
153      case 8:  
154      case 9: return "AES";  
155      case 10:return "Twofish";  /* Return the preferred sym. algorithm from @key as a string. */
156      }  static const char*
157      return "Unknown";  get_pref_cipher (winpt_key_t k)
158  }  {
159        if (k->is_v3)
160            return "IDEA";
161  /* Return true if the key has designated revokers. */      if (!k->ext->sym_prefs)
162  static bool          return "3DES";
163  check_for_desig_rev (gpgme_key_t key)      switch (*k->ext->sym_prefs) {
164  {      case 1: return "IDEA";
165      winpt_key_s k;      case 2: return "3DES";
166      memset (&k, 0, sizeof (k));      case 3: return "CAST5";
167      if (!winpt_get_pubkey (key->subkeys->keyid, &k))      case 4: return "Blowfish";
168          return k.ext->gloflags.has_desig_rev? true : false;      case 7:
169      return false;      case 8:
170  }      case 9: return "AES";
171        case 10:return "Twofish";
172        }
173  /* Dialog box procedure to show the key properties. */      return "Unknown";
174  BOOL CALLBACK  }
175  keyprops_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  
176  {  
177      static winpt_key_t k;  /* Return true if the key has designated revokers. */
178      static gpgme_key_t key, sk;  static bool
179      static int photo_done = 0;  check_for_desig_rev (gpgme_key_t key)
180      struct winpt_key_s k2;  {
181      refresh_cache_s rcs = {0};      winpt_key_s k;
182      const char *inf;      memset (&k, 0, sizeof (k));
183      char info[2048];      if (!winpt_get_pubkey (key->subkeys->keyid, &k))
184      u32 created, expires;          return k.ext->gloflags.has_desig_rev? true : false;
185      int ot, cancel = 0;      return false;
186      int rc;  }
187        
188      switch (msg) {  
189      case WM_INITDIALOG:  /* Print information (name) of the smart card. */
190          if (!lparam)  static const char*
191              dlg_fatal_error( dlg, "Could not get dialog param!" );  get_card_type (winpt_key_t k)
192          k = (winpt_key_t)lparam;  {    
193          #ifndef LANG_DE      static char buf[64];
194          SetWindowText( dlg, _("Key Properties") );  
195          SetDlgItemText (dlg, IDC_KEYPROPS_OT_CHANGE, _("&Change"));      if (!k->ext->card_type)
196          SetDlgItemText (dlg, IDC_KEYPROPS_REVOKERS, _("&Revokers"));          return "";
197          SetDlgItemText (dlg, IDC_KEYPROPS_CHANGE_PWD, _("Change &Passwd"));      _snprintf (buf, sizeof (buf)-1, _("Card-Type: %s\r\n"), k->ext->card_type);
198          #endif        return buf;
199    }
200          photo_done = 0;  
201          memset (&k2, 0, sizeof (k2));  
202          if (k->key_pair)  /* Display the key information for key @k.
203              winpt_get_seckey (k->keyid, &k2);     Return value: gpgme key on success. */
204          else  static void
205              winpt_get_pubkey (k->keyid, &k2);  display_key_info (HWND dlg, winpt_key_t k, gpgme_key_t *r_key)
206          sk = k2.ctx;  {
207          if (sk)      struct winpt_key_s k2;
208              k->is_protected = k2.is_protected;      gpgme_key_t sk, key;
209          if (get_pubkey (k->keyid, &key))      char info[512];
210              BUG (0);      const char *inf;
211          created = key->subkeys->timestamp;      u32 created, expires;    
212          expires = key->subkeys->expires;  
213          _snprintf (info, DIM (info)-1,      memset (&k2, 0, sizeof (k2));      
214                    "Type: %s\r\n"      if (k->key_pair)
215                    "Key ID: %s\r\n"          winpt_get_seckey (k->keyid, &k2);
216                    "Algorithm: %s\r\n"      else    
217                    "Size: %s\r\n"          winpt_get_pubkey (k->keyid, &k2);
218                    "Created: %s\r\n"      sk = k2.ctx;        
219                    "Expires: %s\r\n"      if (sk)
220                    "Validity: %s\r\n"          k->is_protected = k2.is_protected;
221                    "Cipher: %s\r\n",      if (get_pubkey (k->keyid, &key))
222                    get_key_type (key),          BUG (0);    
223                    k->keyid,      created = key->subkeys->timestamp;  
224                    get_key_algo (key, 0),      expires = key->subkeys->expires;    
225                    get_key_size (key, 0),      _snprintf (info, DIM (info)-1,
226                    get_key_created (created),                 _("Type: %s\r\n"
227                    get_key_expire_date (expires),                 "Key ID: %s\r\n"
228                    get_validity (key),                 "Algorithm: %s\r\n"
229                    get_pref_cipher (&k2));                 "Size: %s\r\n"
230          SetDlgItemText (dlg, IDC_KEYPROPS_INFO, info);                 "Created: %s\r\n"
231          SetDlgItemText (dlg, IDC_KEYPROPS_FPR, get_key_fpr (key));                 "Expires: %s\r\n"
232          ot = gpgme_key_get_ulong_attr( key, GPGME_ATTR_OTRUST, NULL, 0 );                               "Validity: %s\r\n"
233          inf = ownertrust_to_string (ot);                 "Cipher: %s\r\n"
234          SetDlgItemText( dlg, IDC_KEYPROPS_OT, inf );                 "%s\r\n"),
235          if (k->key_pair)                 get_key_type (key),
236              EnableWindow( GetDlgItem( dlg, IDC_KEYPROPS_CHANGE_PWD ), TRUE );                 k->keyid,
237          if (check_for_desig_rev (key))                 get_key_algo (key, 0),
238              EnableWindow( GetDlgItem( dlg, IDC_KEYPROPS_REVOKERS ), TRUE );                 get_key_size (key, 0),
239          center_window (dlg, NULL);                 get_key_created (created),
240          SetForegroundWindow (dlg);                       get_key_expire_date (expires),
241          return TRUE;                 get_validity (key),
242                         get_pref_cipher (&k2),
243      case WM_PAINT:                       get_card_type (&k2));
244          if (photo_done == 0) {  
245              photo_done = 1;      SetDlgItemText (dlg, IDC_KEYPROPS_INFO, info);
246              keyprops_show_photo (dlg, key);      SetDlgItemText (dlg, IDC_KEYPROPS_FPR, get_key_fpr (key));  
247          }      inf = ownertrust_to_string (key->owner_trust);
248          break;      SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);
249    
250      case WM_SYSCOMMAND:      *r_key = key;
251          if( LOWORD( wparam ) == SC_CLOSE )  }
252              EndDialog( dlg, TRUE );  
253          return FALSE;  
254            /* Dialog box procedure to show the key properties. */
255      case WM_COMMAND:  BOOL CALLBACK
256          switch( LOWORD( wparam ) ) {  keyprops_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
257          case IDOK:  {
258              EndDialog( dlg, TRUE );      static winpt_key_t k;
259              return TRUE;      static gpgme_key_t key;
260                    gpgme_validity_t valid;
261          case IDC_KEYPROPS_OT_CHANGE:      refresh_cache_s rcs = {0};
262              if( do_check_key( key ) ) {      const char *inf;
263                  msg_box( dlg, _("The status of this key is 'revoked' or 'expired'.\n"      int rc;
264                                  "You cannot change the ownertrust of such keys."),      
265                                  _("WinPT Warning"), MB_ERR );      /* XXX: static variable (k) prevent that the dialog can
266                  return FALSE;              be opened twice. */
267              }      switch (msg) {
268              if( !k->key_pair && key->uids->validity < 3 ) {      case WM_INITDIALOG:
269                  rc = msg_box( dlg, _("This is a non-valid key.\n"          if (!lparam)
270                                       "Modifying the ownertrust has no effect on such keys.\n\n"              dlg_fatal_error (dlg, "Could not get dialog param!");
271                                       "Do you really want to continue?"),          k = (winpt_key_t)lparam;
272                                       _("WinPT Warning"), MB_ICONWARNING|MB_YESNO );          #ifndef LANG_DE
273                  if (rc == IDNO)          SetWindowText (dlg, _("Key Properties"));
274                      return FALSE;          SetDlgItemText (dlg, IDC_KEYPROPS_OT_CHANGE, _("&Change"));
275              }          SetDlgItemText (dlg, IDC_KEYPROPS_REVOKERS, _("&Revokers"));
276              GetDlgItemText( dlg, IDC_KEYPROPS_OT, info, sizeof info -1 );          SetDlgItemText (dlg, IDC_KEYPROPS_CHANGE_PWD, _("Change &Passwd"));
277            SetDlgItemText (dlg, IDC_KEYPROPS_OTINF, _("Ownertrust"));
278                        #endif  
279              dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYEDIT_OWNERTRUST,  
280                                dlg, (DLGPROC)keyedit_ownertrust_dlg_proc,          display_key_info (dlg, k, &key);
281                                (LPARAM)k, _("Change Ownertrust"),          if (!keyprops_load_photo (dlg, key, &valid)) {
282                                IDS_WINPT_KEYEDIT_OWNERTRUST);              k->has_photo = 1;  
283              if (k->callback.new_val == -1) { /* Cancel */              if (valid < GPGME_VALIDITY_MARGINAL)
284                  EndDialog (dlg, FALSE);                  SetDlgItemText (dlg, IDC_KEYPROPS_IMGINF, _("Photo-ID not validated."));
285                  break;          }
286              }          if (k->key_pair)
287                EnableWindow (GetDlgItem (dlg, IDC_KEYPROPS_CHANGE_PWD), TRUE);
288              inf = ownertrust_to_string (k->callback.new_val);          if (check_for_desig_rev (key))
289              do_change_ownertrust (k, inf);              EnableWindow (GetDlgItem (dlg, IDC_KEYPROPS_REVOKERS), TRUE);
290              SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);          center_window (dlg, NULL);
291              msg_box (dlg, _("Ownertrust successfully changed."), _("GnuPG Status"), MB_OK);          SetForegroundWindow (dlg);      
292                        return TRUE;
293              /* reload only the keylist */  
294              rcs.kr_reload = 1; rcs.kr_update = 1;      case WM_DESTROY:
295              rcs.tr_update = 0;          remove (get_photo_tmpname (dlg));
296              DialogBoxParam( glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,          break;
297                              keycache_dlg_proc, (LPARAM)&rcs );        
298              /* XXX: old code!?      case WM_PAINT:
299              get_seckey (k->keyid, &sk);          if (k->has_photo)
300              if (get_pubkey (k->keyid, &key))              keyprops_show_photo (dlg);
301                  BUG (0);          break;
302              */  
303              return TRUE;      case WM_SYSCOMMAND:
304                        if (LOWORD (wparam) == SC_CLOSE)
305          case IDC_KEYPROPS_CHANGE_PWD:              EndDialog (dlg, TRUE);
306              keyedit_change_passwd (k, dlg);                  return FALSE;
307              return TRUE;          
308        case WM_COMMAND:
309          case IDC_KEYPROPS_REVOKERS:                  switch (LOWORD (wparam)) {
310              dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYREVOKERS, dlg,          case IDOK:
311                                key_revokers_dlg_proc, (LPARAM)key, _("Key Revokers"),              EndDialog (dlg, TRUE);
312                                IDS_WINPT_KEY_REVOKERS);              return TRUE;
313              break;              
314          }          case IDC_KEYPROPS_OT_CHANGE:
315      }              if (do_check_key (key)) {
316                        msg_box (dlg, _("The status of this key is 'revoked' or 'expired'.\n"
317      return FALSE;                                  "You cannot change the ownertrust of such keys."),
318  }                                  _("WinPT Warning"), MB_ERR);
319                    return TRUE;
320                }
321                if( !k->key_pair && key->uids->validity < 3 ) {
322                    rc = msg_box( dlg, _("This is a non-valid key.\n"
323                                         "Modifying the ownertrust has no effect on such keys.\n\n"
324                                         "Do you really want to continue?"),
325                                         _("WinPT Warning"), MB_ICONWARNING|MB_YESNO );
326                    if (rc == IDNO)
327                        return TRUE;
328                }
329                //GetDlgItemText (dlg, IDC_KEYPROPS_OT, info, sizeof info -1);
330                dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYEDIT_OWNERTRUST,
331                                  dlg, (DLGPROC)keyedit_ownertrust_dlg_proc,
332                                  (LPARAM)k, _("Change Ownertrust"),
333                                  IDS_WINPT_KEYEDIT_OWNERTRUST);
334                if (k->callback.new_val == -1) { /* Cancel */
335                    EndDialog (dlg, FALSE);
336                    break;
337                }
338    
339                inf = ownertrust_to_string (k->callback.new_val);
340                SetDlgItemText (dlg, IDC_KEYPROPS_OT, inf);
341                msg_box (dlg, _("Ownertrust successfully changed."),
342                         _("GnuPG Status"), MB_OK);
343                
344                /* XXX: modified ownertrust values can effect the entire
345                        WoT so we reload the cache. But this is very slow. */
346                memset (&rcs, 0, sizeof (rcs));
347                rcs.kr_reload = 1; rcs.kr_update = 1; /* reload only keylist */
348                DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_KEYCACHE, dlg,
349                                keycache_dlg_proc, (LPARAM)&rcs);
350                return TRUE;
351                
352            case IDC_KEYPROPS_CHANGE_PWD:
353                keyedit_change_passwd (k, dlg);        
354                return TRUE;
355    
356            case IDC_KEYPROPS_REVOKERS:
357                dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYREVOKERS, dlg,
358                                  key_revokers_dlg_proc, (LPARAM)key,
359                                  _("Key Revokers"), IDS_WINPT_KEY_REVOKERS);
360                break;
361            }
362        }
363        
364        return FALSE;
365    }

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26