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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26