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

Legend:
Removed from v.34  
changed lines
  Added in v.174

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26