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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26