/[winpt]/trunk/Src/wptKeyEditDlgs.cpp
ViewVC logotype

Diff of /trunk/Src/wptKeyEditDlgs.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 176 by twoaday, Mon Feb 13 09:38:03 2006 UTC revision 211 by twoaday, Sun May 7 12:36:48 2006 UTC
# Line 24  Line 24 
24  #include <windows.h>  #include <windows.h>
25  #include <commctrl.h>  #include <commctrl.h>
26  #include <time.h>  #include <time.h>
27  #include "resource.h"  #include <assert.h>
28    
29    #include "resource.h"
30  #include "wptTypes.h"  #include "wptTypes.h"
31  #include "wptW32API.h"  #include "wptW32API.h"
32  #include "wptVersion.h"  #include "wptVersion.h"
# Line 61  enum keyedit_commands { Line 62  enum keyedit_commands {
62      CMD_ENABLE,          CMD_ENABLE,    
63      CMD_SIGN,      CMD_SIGN,
64      CMD_LSIGN,      CMD_LSIGN,
65      CMD_CHECK      CMD_CHECK,
66        CMD_CLEAN,
67        CMD_MINIMIZE
68  };  };
69    
70  struct cmdlist_s {  struct cmdlist_s {
# Line 88  struct cmdlist_s { Line 91  struct cmdlist_s {
91      {"SIGN", 0, CMD_SIGN},      {"SIGN", 0, CMD_SIGN},
92      {"LSIGN", 0, CMD_LSIGN},      {"LSIGN", 0, CMD_LSIGN},
93      {"CHECK", 0, CMD_CHECK},      {"CHECK", 0, CMD_CHECK},
94        {"CLEAN", 0, CMD_CLEAN},
95        {"MINIMIZE", 0, CMD_MINIMIZE},
96      {NULL, 0}        {NULL, 0}  
97  };  };
98    
# Line 118  struct keyedit_cb_s { Line 123  struct keyedit_cb_s {
123      const char     *keyid;      const char     *keyid;
124      const char     *pass;      const char     *pass;
125      listview_ctrl_t lv;      listview_ctrl_t lv;
126        int             lv_pos;
127      void           *opaque;      void           *opaque;
128      unsigned int    finished:1;      unsigned int    finished:1;
129      unsigned int    is_protected:1;      unsigned int    is_protected:1;
# Line 131  struct keygen_cb_s { Line 137  struct keygen_cb_s {
137      int   algo;      int   algo;
138      u32   expire;      u32   expire;
139      char *fpr;      char *fpr;
140        char *name;
141        char *comment;
142        char *email;
143  };  };
144  typedef struct keygen_cb_s *keygen_cb_t;  typedef struct keygen_cb_s *keygen_cb_t;
145    
146    /* Subclass context for the subkey list. */
147  static subclass_s keyedit_subkey_proc;  static subclass_s keyedit_subkey_proc;
148    
149    /* Subclass context for the user-id list. */
150  static subclass_s keyedit_uid_proc;  static subclass_s keyedit_uid_proc;
151    
152  int keygen_check_date (SYSTEMTIME *st);  int keygen_check_date (SYSTEMTIME *st);
153  void get_userid_preflist (char **r_prefs, int * r_flags);  void get_userid_preflist (char **r_prefs, int * r_flags);
154  char* get_subkey_keyid (const char *keyid);  char* get_subkey_keyid (const char *keyid);
155    
156    void ComboBox_AddString_utf8 (HWND cb, const char *txt);
157    
158    static GpgKeyEdit*
159    create_GpgKeyEdit (const char *keyid)
160    {
161        GpgKeyEdit *ke;
162    
163        ke = new GpgKeyEdit (keyid);
164        if (!ke)
165            BUG (NULL);
166        return ke;
167    }
168    
169    
170  /* Associate each key with a combo box entry.  /* Associate each key with a combo box entry.
171     Skip the key in @k. */     Skip the key in @k. */
172  static void  static void
173  do_init_keylist (HWND dlg, winpt_key_t k)  do_init_keylist (HWND dlg, const char *keyid)
174  {  {
175      gpg_keycache_t pub;      gpg_keycache_t pub;
176      gpgme_key_t key;      gpgme_key_t key;
177      const char *s, *kid;      const char *s, *kid;
     char *u;  
178      int i, n;      int i, n;
179    
180      pub = keycache_get_ctx (1);      pub = keycache_get_ctx (1);
# Line 165  do_init_keylist (HWND dlg, winpt_key_t k Line 188  do_init_keylist (HWND dlg, winpt_key_t k
188              continue;              continue;
189          s = key->uids->uid;          s = key->uids->uid;
190          kid = key->subkeys->keyid;          kid = key->subkeys->keyid;
191          if (!s || !strcmp (kid+8, k->keyid))          if (!s || !strcmp (kid+8, keyid))
192              continue;              continue;
193          u = utf8_to_wincp (s, strlen (s));          ComboBox_AddString_utf8 (GetDlgItem (dlg, IDC_ADDREV_KEYLIST), s);
         SendDlgItemMessage (dlg, IDC_ADDREV_KEYLIST, CB_ADDSTRING,  
                             0, (WPARAM)(char *)u);  
         free (u);  
194      }      }
195      gpg_keycache_rewind (pub);      gpg_keycache_rewind (pub);
196      n = SendDlgItemMessage( dlg, IDC_ADDREV_KEYLIST, CB_GETCOUNT, 0, 0 );      n = SendDlgItemMessage (dlg, IDC_ADDREV_KEYLIST, CB_GETCOUNT, 0, 0);
197      for (i = 0; i < n; i++) {      for (i = 0; i < n; i++) {
198          gpg_keycache_next_key (pub, 0, &key);          gpg_keycache_next_key (pub, 0, &key);
199          SendDlgItemMessage (dlg, IDC_ADDREV_KEYLIST, CB_SETITEMDATA,          SendDlgItemMessage (dlg, IDC_ADDREV_KEYLIST, CB_SETITEMDATA,
# Line 186  do_init_keylist (HWND dlg, winpt_key_t k Line 206  do_init_keylist (HWND dlg, winpt_key_t k
206  /* Add a new user-id to the list view @lv. */  /* Add a new user-id to the list view @lv. */
207  static void  static void
208  do_add_new_userid (listview_ctrl_t lv,  do_add_new_userid (listview_ctrl_t lv,
209                     const char * name, const char *email, const char * comment)                     const char *utf8_name, const char *email,
210                       const char *utf8_comment)
211  {  {
212      char * p;      char *p;
213      size_t n;      size_t n;
214            
215      n = strlen (name) + strlen (email) + 16;      n = strlen (utf8_name) + strlen (email) + 16;
216      if (comment)      if (utf8_comment)
217          n += strlen (comment);          n += strlen (utf8_comment);
218      p = new char[n+1];      p = new char[n+1];
219      if (!p)      if (!p)
220          BUG( NULL );          BUG (NULL);
221      if (comment)      if (utf8_comment) {
222          sprintf (p, "%s (%s)", name, comment);          sprintf (p, "%s (%s)", utf8_name, utf8_comment);
223        }
224      else      else
225          sprintf (p, "%s", name);          sprintf (p, "%s", utf8_name);
226    
227      listview_add_item (lv, "");      listview_add_item (lv, "");
228      listview_add_sub_item (lv, 0, 0, _("Ultimate" ));      listview_add_sub_item (lv, 0, 0, _("Ultimate" ));
# Line 215  static void Line 237  static void
237  do_add_new_subkey (listview_ctrl_t lv, keygen_cb_t keygen, unsigned int flags)  do_add_new_subkey (listview_ctrl_t lv, keygen_cb_t keygen, unsigned int flags)
238  {  {
239      char info[128], keyid[32];      char info[128], keyid[32];
240      const char * expdate, * s;      const char *expdate, *s;
241      int n;      int n;
242            
243      expdate = keygen->expire? get_key_expire_date (keygen->expire) : _("Never");      expdate = keygen->expire? get_key_expire_date (keygen->expire) : _("Never");
# Line 223  do_add_new_subkey (listview_ctrl_t lv, k Line 245  do_add_new_subkey (listview_ctrl_t lv, k
245                 keygen->bits,                 keygen->bits,
246                 get_key_pubalgo ((gpgme_pubkey_algo_t)keygen->algo));                 get_key_pubalgo ((gpgme_pubkey_algo_t)keygen->algo));
247      _snprintf (keyid, sizeof keyid-1, "0x%s", keygen->fpr+8);      _snprintf (keyid, sizeof keyid-1, "0x%s", keygen->fpr+8);
248        s = get_key_created (time (NULL));
249      n = listview_count_items (lv, 0);      n = listview_count_items (lv, 0);
250      listview_add_item_pos (lv, n);      listview_add_item_pos (lv, n);
251      listview_add_sub_item (lv, n, 0, info);      listview_add_sub_item (lv, n, SUBK_COL_DESC, info);
252      listview_add_sub_item (lv, n, 1, keyid);      listview_add_sub_item (lv, n, SUBK_COL_KEYID, keyid);
253      listview_add_sub_item (lv, n, 2, get_key_created (time (NULL)));      listview_add_sub_item (lv, n, SUBK_COL_CREATION, s);
254      listview_add_sub_item (lv, n, 3, expdate);      listview_add_sub_item (lv, n, SUBK_COL_EXPIRES, expdate);
255      if (flags & KM_FLAG_REVOKED)      if (flags & KM_FLAG_REVOKED)
256          s = _("Revoked");                s = _("Revoked");      
257      else if (flags & KM_FLAG_EXPIRED)      else if (flags & KM_FLAG_EXPIRED)
258          s = _("Expired");          s = _("Expired");
259      else      else
260          s = _("OK");          s = _("OK");
261      listview_add_sub_item (lv, n, 4, s);      listview_add_sub_item (lv, n, SUBK_COL_STATUS, s);
262  }  }
263    
264    
# Line 252  do_find_userid (const char *keyid, const Line 275  do_find_userid (const char *keyid, const
275      gpg_uid_info_t inf, ui;      gpg_uid_info_t inf, ui;
276      int pos = -1;      int pos = -1;
277    
278      ke = new GpgKeyEdit (keyid);      ke = create_GpgKeyEdit (keyid);
     if (!ke)  
         BUG (NULL);  
279      err = ke->getUseridInfo (&inf);      err = ke->getUseridInfo (&inf);
280      delete ke;      delete ke;
281      if (err) {      if (err) {
# Line 273  do_find_userid (const char *keyid, const Line 294  do_find_userid (const char *keyid, const
294              }              }
295              continue;              continue;
296          }          }
297          if (ui->email) {          if (email && ui->email) {
298              if (!strcmp (ui->email, email)) {              if (!strcmp (ui->email, email)) {
299                  pos = ui->index;                  pos = ui->index;
300                  break;                  break;
# Line 319  is_jpg_file (const char *fname) Line 340  is_jpg_file (const char *fname)
340  BOOL CALLBACK  BOOL CALLBACK
341  keyedit_addphoto_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keyedit_addphoto_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
342  {  {
343      static winpt_key_t k;              static keyedit_cb_t cb;
344      GpgKeyEdit *ke;      GpgKeyEdit *ke;
345      gpgme_error_t ec;          gpgme_error_t err;
346      const char * s;          const char *s;    
347      char pwd[128], file[128];      char file[128];
348      int id;      int id;
349    
350      switch( msg ) {      switch( msg ) {
351      case WM_INITDIALOG:      case WM_INITDIALOG:
352          k = (winpt_key_t)lparam;          cb = (keyedit_cb_t)lparam;
353          if (!k)          if (!cb)
354              BUG (NULL);              BUG (NULL);
355          SetDlgItemText (dlg, IDC_ADDPHOTO_INF, _("Remember that the image is stored within your public key.  If you use a very large picture, your key will become very large as well! Keeping the image close to 240x288 is a good size to use."));          SetDlgItemText (dlg, IDC_ADDPHOTO_INF, _("Remember that the image is stored within your public key.  If you use a very large picture, your key will become very large as well! Keeping the image close to 240x288 is a good size to use."));
356          SetDlgItemText (dlg, IDC_ADDPHOTO_FILEINF, _("Pick an image to use for your photo ID.\nThe image must be a JPEG file."));          SetDlgItemText (dlg, IDC_ADDPHOTO_FILEINF, _("Pick an image to use for your photo ID.\nThe image must be a JPEG file."));
# Line 348  keyedit_addphoto_dlg_proc (HWND dlg, UIN Line 369  keyedit_addphoto_dlg_proc (HWND dlg, UIN
369          break;          break;
370    
371      case WM_COMMAND:      case WM_COMMAND:
372          switch( LOWORD( wparam ) ) {          switch( LOWORD (wparam)) {
   
373          case IDC_ADDPHOTO_SELFILE:          case IDC_ADDPHOTO_SELFILE:
374              s = get_fileopen_dlg (dlg, _("Select Image File"),              s = get_fileopen_dlg (dlg, _("Select Image File"),
375                                    _("JPEG Files (*.jpg, *.jpeg)\0*.jpg;*.jpeg\0\0"),                                    "JPEG Files (*.jpg, *.jpeg)\0*.jpg;*.jpeg\0\0",
376                                    NULL);                                    NULL);
377              if (s && !is_jpg_file (s)) {              if (s && !is_jpg_file (s)) {
378                  log_box (_("Add Photo"), MB_ERR,                  log_box (_("Add Photo"), MB_ERR,
# Line 375  keyedit_addphoto_dlg_proc (HWND dlg, UIN Line 395  keyedit_addphoto_dlg_proc (HWND dlg, UIN
395                  if (id == IDNO)                  if (id == IDNO)
396                      return TRUE;                      return TRUE;
397              }              }
398              if (k->is_protected &&              ke = create_GpgKeyEdit (cb->keyid);
399                  !GetDlgItemText (dlg, IDC_ADDPHOTO_PASS, pwd, sizeof (pwd)-1)) {              if (cb->pass)
400                  msg_box (dlg, _("Please enter a passphrase."), _("Add Photo"), MB_ERR);                  ke->setPassphrase (cb->pass);
                 return FALSE;  
             }  
             ke = new GpgKeyEdit (k->keyid);  
             if (!ke)  
                 BUG (NULL);  
             if (k->is_protected)  
                 ke->setPassphrase (pwd);  
401              else              else
402                  ke->setNoPassphrase (true);                  ke->setNoPassphrase (true);
403              ec = ke->addPhotoid (file);              err = ke->addPhotoid (file);
404              delete ke;              delete ke;
405              wipememory (pwd, sizeof (pwd));              if (err) {
406              if (ec) {                  msg_box (dlg, gpgme_strerror (err), _("Add Photo"), MB_ERR);
                 msg_box (dlg, gpgme_strerror (ec), _("Add Photo"), MB_ERR );  
407                  return FALSE;                  return FALSE;
408              }              }
409              else {              else {
410                  k->update = 1;                  cb->finished = 1;
411                  msg_box (dlg, _("Photo successfully added."),                  msg_box (dlg, _("Photo successfully added."),
412                           _("GnuPG Status"), MB_OK);                           _("GnuPG Status"), MB_OK);
413              }              }
# Line 416  keyedit_addphoto_dlg_proc (HWND dlg, UIN Line 428  keyedit_addphoto_dlg_proc (HWND dlg, UIN
428  BOOL CALLBACK  BOOL CALLBACK
429  keyedit_addrevoker_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keyedit_addrevoker_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
430  {  {
431      static winpt_key_t k;      static keyedit_cb_t cb;
     static gpgme_key_t seckey;  
432      gpgme_error_t err;      gpgme_error_t err;
433      GpgKeyEdit *ke;      GpgKeyEdit *ke;
434      char uid[128], pwd[128];      char *uid=NULL;
435    
436      switch (msg) {      switch (msg) {
437      case WM_INITDIALOG:      case WM_INITDIALOG:
438          k = (winpt_key_t)lparam;          cb = (keyedit_cb_t)lparam;
439          if (!k)          if (!cb)
             BUG (NULL);  
         if (get_seckey (k->keyid, &seckey))  
440              BUG (NULL);              BUG (NULL);
441          if (!k->is_protected)          do_init_keylist (dlg, cb->keyid);
             EnableWindow (GetDlgItem (dlg, IDC_ADDREV_PASS), FALSE);  
         do_init_keylist (dlg, k);  
442          SetDlgItemText (dlg, IDC_ADDREV_INF,          SetDlgItemText (dlg, IDC_ADDREV_INF,
443                          _("Appointing a key as designated revoker cannot be undone."));                          _("Appointing a key as designated revoker cannot be undone."));
444          SetDlgItemText (dlg, IDC_ADDREV_KEYINF, _("Public key"));          SetDlgItemText (dlg, IDC_ADDREV_KEYINF, _("Public key"));
# Line 441  keyedit_addrevoker_dlg_proc (HWND dlg, U Line 448  keyedit_addrevoker_dlg_proc (HWND dlg, U
448          SetForegroundWindow (dlg);          SetForegroundWindow (dlg);
449          break;          break;
450    
     case WM_DESTROY:      
         break;  
   
451      case WM_SYSCOMMAND:      case WM_SYSCOMMAND:
452          if( LOWORD (wparam) == SC_CLOSE )          if (LOWORD (wparam) == SC_CLOSE)
453              EndDialog( dlg, TRUE );              EndDialog (dlg, FALSE);
454          break;          break;
455    
456      case WM_COMMAND:      case WM_COMMAND:
457          switch( LOWORD( wparam ) ) {          switch (LOWORD (wparam)) {
458          case IDOK:                    case IDOK:
459              if( !GetDlgItemText( dlg, IDC_ADDREV_KEYLIST, uid, sizeof uid-1 ) ) {              if (!GetDlgItemText_utf8 (dlg, IDC_ADDREV_KEYLIST, &uid)) {
460                  msg_box( dlg, _("Please select a user ID."), _("Add Revoker"), MB_ERR );                  msg_box (dlg, _("Please select a user ID."), _("Add Revoker"), MB_ERR);
461                  return FALSE;                  return FALSE;
462              }              }
463                    
464              if( k->is_protected ) {              ke = create_GpgKeyEdit (cb->keyid);
465                  if( !GetDlgItemText( dlg, IDC_ADDREV_PASS, pwd, sizeof pwd-1 ) ) {              if (cb->pass)
466                      msg_box( dlg, _("Please enter the passphrase."), _("Add Revoker"), MB_ERR );                  ke->setPassphrase (cb->pass);
                     return FALSE;  
                 }  
             }  
             ke = new GpgKeyEdit (k->keyid);  
             if (k->is_protected)  
                 ke->setPassphrase (pwd);  
467              else              else
468                  ke->setNoPassphrase (true);                  ke->setNoPassphrase (true);
469              err = ke->addDesignatedRevoker (uid);              err = ke->addDesignatedRevoker (uid);
470              delete ke;              delete ke;
471              wipememory (pwd, sizeof (pwd));              safe_free (uid);
472              if (err) {              if (err) {
473                  msg_box (dlg, gpgme_strerror (err), _("Add Revoker"), MB_ERR);                  msg_box (dlg, gpgme_strerror (err), _("Add Revoker"), MB_ERR);
474                  return TRUE;                  return TRUE;
475              }              }
476              else {              else {
477                  k->update = 1;                  cb->finished = 1;
478                  msg_box (dlg, _("Revoker successfully addded."),                  msg_box (dlg, _("Revoker successfully addded."),
479                           _("GnuPG Status"), MB_OK);                           _("GnuPG Status"), MB_OK);
480              }              }
# Line 498  BOOL CALLBACK Line 496  BOOL CALLBACK
496  keyedit_adduid_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keyedit_adduid_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
497  {  {
498      static keyedit_cb_t ctx;      static keyedit_cb_t ctx;
499        keygen_cb_t keygen;
500      gpgme_error_t err;      gpgme_error_t err;
501      GpgKeyEdit *ke;      GpgKeyEdit *ke;
502      char *utf8_name = NULL;      char *utf8_name = NULL;
503      char name[128], email[128], comment[128];      char *utf8_comment = NULL;
504        char email[128];
505      int rc;      int rc;
506            
507      switch (msg) {      switch (msg) {
508      case WM_INITDIALOG:      case WM_INITDIALOG:
509          ctx = (keyedit_cb_t)lparam;          ctx = (keyedit_cb_t)lparam;
510          if( !ctx )          if (!ctx)
511              dlg_fatal_error(dlg, "Could not get dialog param!");              dlg_fatal_error(dlg, "Could not get dialog param!");
512          SetWindowText (dlg, _("Add new User ID"));          SetWindowText (dlg, _("Add new User ID"));
513          SetDlgItemText (dlg, IDC_ADDUID_INFNAME, _("&Name"));          SetDlgItemText (dlg, IDC_ADDUID_INFNAME, _("&Name"));
# Line 525  keyedit_adduid_dlg_proc (HWND dlg, UINT Line 525  keyedit_adduid_dlg_proc (HWND dlg, UINT
525      case WM_COMMAND:      case WM_COMMAND:
526          switch ( LOWORD( wparam ) )  {          switch ( LOWORD( wparam ) )  {
527          case IDOK:          case IDOK:
528              rc = GetDlgItemText( dlg, IDC_ADDUID_NAME, name, sizeof name-1 );              keygen = (keygen_cb_t)ctx->opaque;
529                rc = GetDlgItemText_utf8 (dlg, IDC_ADDUID_NAME, &utf8_name);
530              if (!rc || rc < 5) {              if (!rc || rc < 5) {
531                  msg_box( dlg, _("Please enter a name (min. 5 chars.)"), _("UserID"), MB_ERR );                  msg_box (dlg, _("Please enter a name (min. 5 chars.)"),
532                             _("UserID"), MB_ERR);
533                    free_if_alloc (utf8_name);
534                  return FALSE;                  return FALSE;
535              }              }
536              if (strchr (name, '@')) {              if (strchr (utf8_name, '@')) {
537                  msg_box( dlg, _("Please enter the email address in the email field and not in the name field"), _("UserID"), MB_INFO );                  msg_box (dlg, _("Please enter the email address in the email field and not in the name field"),
538                             _("UserID"), MB_INFO);
539                  return FALSE;                  return FALSE;
540              }              }
541                                      
542              if( !GetDlgItemText( dlg, IDC_ADDUID_EMAIL, email, sizeof email -1 ) ) {              if( !GetDlgItemText (dlg, IDC_ADDUID_EMAIL, email, sizeof (email) -1)) {
543                  msg_box( dlg, _("Please enter an email address."), _("UserID"), MB_ERR );                  msg_box( dlg, _("Please enter an email address."), _("UserID"), MB_ERR );
544                  return FALSE;                  return FALSE;
545              }              }
546              if (!strchr (email, '@' ) || strchr (email, ' ')) {              if (check_email_address (email)) {
547                  msg_box (dlg, _("Invalid email address."), _("UserID"), MB_ERR);                  msg_box (dlg, _("Invalid email address."), _("UserID"), MB_ERR);
548                  return FALSE;                  return FALSE;
549              }              }
550                            
551              rc = GetDlgItemText (dlg, IDC_ADDUID_COMMENT,              rc = GetDlgItemText_utf8 (dlg, IDC_ADDUID_COMMENT, &utf8_comment);
                                  comment, sizeof comment -1);  
552    
553              /* XXX: something is wrong with the encoding :-( */              ke = create_GpgKeyEdit (ctx->keyid);
             utf8_name = wincp_to_utf8 (name, strlen (name));  
   
             ke = new GpgKeyEdit (ctx->keyid);  
             if (!ke)  
                 BUG (NULL);  
554              if (ctx->is_protected)              if (ctx->is_protected)
555                  ke->setPassphrase (ctx->pass);                  ke->setPassphrase (ctx->pass);
556              else              else
557                  ke->setNoPassphrase (true);                  ke->setNoPassphrase (true);
558              err = ke->addUserid (utf8_name? utf8_name : name,              err = ke->addUserid (utf8_name, utf8_comment, email);
                                  rc > 0? comment : NULL, email);  
559              if (err)              if (err)
560                  msg_box (dlg, gpgme_strerror (err), _("UserID"), MB_ERR);                  msg_box (dlg, gpgme_strerror (err), _("UserID"), MB_ERR);
561              else {              else {
562                  msg_box (dlg, _("user ID successfully added."), _("GnuPG Status"), MB_OK);                  msg_box (dlg, _("user ID successfully added."), _("GnuPG Status"), MB_OK);
563                  ctx->finished = 1;                  ctx->finished = 1;
564                    keygen->name = utf8_name;
565                    keygen->comment = utf8_comment;
566                    keygen->email = m_strdup (email);
567              }              }
568              delete ke;              delete ke;
             free (utf8_name);  
             if (!err && ctx->lv)  
                 do_add_new_userid (ctx->lv, name, email, rc?comment : NULL);  
569              EndDialog (dlg, TRUE);              EndDialog (dlg, TRUE);
570              return TRUE;              return TRUE;
571                            
# Line 587  static void Line 584  static void
584  init_keysize_box (HWND dlg, int ctlid)  init_keysize_box (HWND dlg, int ctlid)
585  {  {
586      const char *sizelist[] = {      const char *sizelist[] = {
587          "1024", "1536", "2048", "2560", "3072", "3854", "4096", NULL          "1024", "1536",
588            "2048", "3072",
589            "4096", NULL
590      };      };
591      int i;      int i;
592    
593      for (i=0; sizelist[i] != NULL; i++)      for (i=0; sizelist[i] != NULL; i++)
594          SendDlgItemMessage (dlg, ctlid, CB_ADDSTRING, 0, (LPARAM)(char*)sizelist[i]);          SendDlgItemMessage (dlg, ctlid, CB_ADDSTRING, 0,
595                                (LPARAM)(char*)sizelist[i]);
596      SendDlgItemMessage (dlg, ctlid, CB_SETCURSEL, (WPARAM)2, 0);      SendDlgItemMessage (dlg, ctlid, CB_SETCURSEL, (WPARAM)2, 0);
597  }  }
598    
599    
600  static int  static int
601  get_keysize_from_box (HWND dlg, int ctlid)  get_keysize_from_box (HWND dlg, int ctlid)
602  {  {
# Line 605  get_keysize_from_box (HWND dlg, int ctli Line 607  get_keysize_from_box (HWND dlg, int ctli
607      if (pos == CB_ERR)      if (pos == CB_ERR)
608          return -1;          return -1;
609      SendDlgItemMessage (dlg, ctlid, CB_GETLBTEXT, pos, (LPARAM)(char*)buf);      SendDlgItemMessage (dlg, ctlid, CB_GETLBTEXT, pos, (LPARAM)(char*)buf);
610      return atol (buf);      return atoi (buf);
611  }  }
612    
613    
# Line 628  BOOL CALLBACK Line 630  BOOL CALLBACK
630  keyedit_addsubkey_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keyedit_addsubkey_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
631  {  {
632      static keyedit_cb_t ctx;      static keyedit_cb_t ctx;
633      static keygen_cb_t keygen;      keygen_cb_t keygen;
634      GpgKeyEdit *ke;      GpgKeyEdit *ke;
635      gpgme_error_t err;      gpgme_error_t err;
636      SYSTEMTIME st;      SYSTEMTIME st;
637      HWND lb;      HWND hwnd;
638      int index, size, valid;      int index, size, valid;
639            
640      switch (msg) {      switch (msg) {
# Line 640  keyedit_addsubkey_dlg_proc (HWND dlg, UI Line 642  keyedit_addsubkey_dlg_proc (HWND dlg, UI
642          ctx = (keyedit_cb_t)lparam;          ctx = (keyedit_cb_t)lparam;
643          if (!ctx)          if (!ctx)
644              dlg_fatal_error (dlg, "Could not get dialog param!");              dlg_fatal_error (dlg, "Could not get dialog param!");
         keygen = (keygen_cb_t)ctx->opaque;  
645    
646          SetWindowText (dlg, _("Add new Subkey"));          SetWindowText (dlg, _("Add new Subkey"));
647          SetDlgItemText (dlg, IDC_ADDSUBKEY_INFALGO, _("Key type"));          SetDlgItemText (dlg, IDC_ADDSUBKEY_INFALGO, _("Key type"));
# Line 649  keyedit_addsubkey_dlg_proc (HWND dlg, UI Line 650  keyedit_addsubkey_dlg_proc (HWND dlg, UI
650          SetDlgItemText (dlg, IDC_ADDSUBKEY_EXPIRE, _("&Never"));          SetDlgItemText (dlg, IDC_ADDSUBKEY_EXPIRE, _("&Never"));
651          SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));          SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
652    
653          lb = GetDlgItem (dlg, IDC_ADDSUBKEY_ALGO);          hwnd = GetDlgItem (dlg, IDC_ADDSUBKEY_ALGO);
654          listbox_add_string (lb, "DSA (sign only)");          listbox_add_string (hwnd, "DSA (sign only)");
655          listbox_add_string (lb, "ElGamal (encrypt only)");          listbox_add_string (hwnd, "ElGamal (encrypt only)");
656          listbox_add_string (lb, "RSA (sign only)");          listbox_add_string (hwnd, "RSA (sign only)");
657          listbox_add_string (lb, "RSA (encrypt only)");          listbox_add_string (hwnd, "RSA (encrypt only)");
658          CheckDlgButton (dlg, IDC_ADDSUBKEY_EXPIRE, BST_CHECKED);          CheckDlgButton (dlg, IDC_ADDSUBKEY_EXPIRE, BST_CHECKED);
659          EnableWindow (GetDlgItem (dlg, IDC_ADDSUBKEY_EXPDATE), FALSE);          EnableWindow (GetDlgItem (dlg, IDC_ADDSUBKEY_EXPDATE), FALSE);
660          init_keysize_box (dlg, IDC_ADDSUBKEY_SIZE);          init_keysize_box (dlg, IDC_ADDSUBKEY_SIZE);
# Line 661  keyedit_addsubkey_dlg_proc (HWND dlg, UI Line 662  keyedit_addsubkey_dlg_proc (HWND dlg, UI
662          return FALSE;          return FALSE;
663                    
664      case WM_SYSCOMMAND:      case WM_SYSCOMMAND:
665          if (LOWORD (wparam) == SC_CLOSE) {          if (LOWORD (wparam) == SC_CLOSE)
666              EndDialog (dlg, TRUE);              EndDialog (dlg, TRUE);
         }  
667          return FALSE;          return FALSE;
668                    
669      case WM_COMMAND:      case WM_COMMAND:
# Line 683  keyedit_addsubkey_dlg_proc (HWND dlg, UI Line 683  keyedit_addsubkey_dlg_proc (HWND dlg, UI
683    
684          switch (LOWORD (wparam)) {          switch (LOWORD (wparam)) {
685          case IDOK:          case IDOK:
686              lb = GetDlgItem (dlg, IDC_ADDSUBKEY_ALGO);              keygen = (keygen_cb_t)ctx->opaque;
687              switch (listbox_get_cursel (lb)) {              assert (keygen);
688                hwnd = GetDlgItem (dlg, IDC_ADDSUBKEY_ALGO);
689                switch (listbox_get_cursel (hwnd)) {
690              case 0: index = 2; break;              case 0: index = 2; break;
691              case 1: index = 4; break;              case 1: index = 4; break;
692              case 2: index = 5; break;              case 2: index = 5; break;
693              case 3: index = 6; break;              case 3: index = 6; break;
694              default:              default:
695                  msg_box (dlg, _("Please select one entry."), _("Add Subkey"), MB_ERR);                  msg_box (dlg, _("Please select one entry."),
696                             _("Add Subkey"), MB_ERR);
697                  return FALSE;                  return FALSE;
698              }              }
699              size = get_keysize_from_box (dlg, IDC_ADDSUBKEY_SIZE);              size = get_keysize_from_box (dlg, IDC_ADDSUBKEY_SIZE);
700              if (index == 2 && size != 1024) {              if (index == 2 && size != 1024) {
701                  msg_box (dlg,_("DSS uses a fixed keysize of 1024. Size changed."),                  msg_box (dlg,_("DSS uses a fixed keysize of 1024. Size changed."),
702                           _("Add Subkey"), MB_INFO);                           _("Add Subkey"), MB_INFO);
703                  size = 1024;                  size = 1024;
704              }              }
705    
706              DateTime_GetSystemtime (GetDlgItem (dlg, IDC_ADDSUBKEY_EXPDATE), &st);              hwnd = GetDlgItem (dlg, IDC_ADDSUBKEY_EXPDATE);
707                DateTime_GetSystemtime (hwnd, &st);
708              valid = w32_mktime (&st) - time (NULL);              valid = w32_mktime (&st) - time (NULL);
709              valid /= 86400;              valid /= 86400;
710    
# Line 714  keyedit_addsubkey_dlg_proc (HWND dlg, UI Line 718  keyedit_addsubkey_dlg_proc (HWND dlg, UI
718              if (valid > 0)              if (valid > 0)
719                  keygen->expire = time (NULL) + valid*24*60*60;                  keygen->expire = time (NULL) + valid*24*60*60;
720    
721              ke = new GpgKeyEdit (ctx->keyid);              ke = create_GpgKeyEdit (ctx->keyid);
             if (!ke)  
                 BUG (NULL);  
722              ke->setCallback (keygen_cb, NULL);              ke->setCallback (keygen_cb, NULL);
723              if (ctx->is_protected)              if (ctx->is_protected)
724                  ke->setPassphrase (ctx->pass);                  ke->setPassphrase (ctx->pass);
# Line 726  keyedit_addsubkey_dlg_proc (HWND dlg, UI Line 728  keyedit_addsubkey_dlg_proc (HWND dlg, UI
728    
729              err = ke->addSubkey ((gpgme_pubkey_algo_t)index, size, valid);              err = ke->addSubkey ((gpgme_pubkey_algo_t)index, size, valid);
730              keygen->fpr = get_subkey_keyid (ctx->keyid);              keygen->fpr = get_subkey_keyid (ctx->keyid);
731              keygen_cb_dlg_destroy ();              keygen_cb_dlg_destroy (1);
             keygen_cb (NULL, NULL, 0, 0, 0); /* flush */  
732              if (err)              if (err)
733                  msg_box (dlg, gpgme_strerror (err), _("Add Subkey"), MB_ERR);                  msg_box (dlg, gpgme_strerror (err), _("Add Subkey"), MB_ERR);
734              else {              else {
735                  msg_box (dlg, _("Subkey successfully added."), _("GnuPG Status"), MB_OK);                  msg_box (dlg, _("Subkey successfully added."),
736                  if (ctx->lv)                           _("GnuPG Status"), MB_OK);
                     do_add_new_subkey (ctx->lv, keygen, 0);  
737                  ctx->finished = 1;                  ctx->finished = 1;
738              }              }
739              delete ke;              delete ke;
# Line 755  BOOL Line 755  BOOL
755  keyedit_add_userid (winpt_key_t k, HWND dlg, listview_ctrl_t lv)  keyedit_add_userid (winpt_key_t k, HWND dlg, listview_ctrl_t lv)
756  {  {
757      keyedit_cb_s cb;      keyedit_cb_s cb;
758        keygen_cb_s keygen;
759      char *pass = NULL;      char *pass = NULL;
760      int cancel = 0;      int cancel = 0;
761    
762      if (!k->key_pair) {      if (!k->key_pair) {
763          msg_box( dlg, _("There is no secret key available!"), _("Add user ID"), MB_ERR );          msg_box (dlg, _("There is no secret key available!"),
764                     _("Add user ID"), MB_ERR);
765          return FALSE;          return FALSE;
766      }      }
767    
768      if (k->is_protected) {      if (k->is_protected) {
769          pass = request_passphrase( _("Key Edit"), 1, &cancel );          pass = request_passphrase (_("Key Edit"), 1, &cancel);
770          if (cancel)          if (cancel)
771              return FALSE;              return FALSE;
772      }      }
773              
774        memset (&keygen, 0, sizeof (keygen));
775      memset (&cb, 0, sizeof cb);      memset (&cb, 0, sizeof cb);
776        cb.opaque = &keygen;
777      cb.is_protected = k->is_protected;      cb.is_protected = k->is_protected;
778      cb.pass = pass;      cb.pass = pass;
     cb.lv = lv;  
779      cb.keyid = k->keyid;      cb.keyid = k->keyid;
780      dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYEDIT_ADDUID,      dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_KEYEDIT_ADDUID,
781                        dlg, keyedit_adduid_dlg_proc,                                dlg, keyedit_adduid_dlg_proc,        
782                        (LPARAM)&cb, _("Add user ID"),                        (LPARAM)&cb, _("Add user ID"),
783                        IDS_WINPT_KEYEDIT_ADDUID);                        IDS_WINPT_KEYEDIT_ADDUID);
784        if (lv != NULL && cb.finished)
785            do_add_new_userid (lv, keygen.name, keygen.email, keygen.comment);
786      if (cb.finished)      if (cb.finished)
787          k->update = 1;          k->update = 1;
788    
789        free_if_alloc (keygen.name);
790        free_if_alloc (keygen.email);
791        free_if_alloc (keygen.comment);
792      sfree_if_alloc (pass);      sfree_if_alloc (pass);
793      return TRUE;      return TRUE;
794  }  }
795    
796    
797    /* Return the keyID of the last subkey. */
798  char*  char*
799  get_subkey_keyid (const char *keyid)  get_subkey_keyid (const char *keyid)
800  {  {
# Line 794  get_subkey_keyid (const char *keyid) Line 802  get_subkey_keyid (const char *keyid)
802      gpgme_key_t key;      gpgme_key_t key;
803      gpgme_ctx_t ctx;      gpgme_ctx_t ctx;
804      gpgme_subkey_t subk;      gpgme_subkey_t subk;
805      char *kid;      char *kid = NULL;
806    
807      err = gpgme_new (&ctx);      err = gpgme_new (&ctx);
808      if (err)      if (err)
# Line 804  get_subkey_keyid (const char *keyid) Line 812  get_subkey_keyid (const char *keyid)
812      if (err)      if (err)
813          return NULL;          return NULL;
814      subk = get_nth_key (key, count_subkeys (key));      subk = get_nth_key (key, count_subkeys (key));
815      kid = strdup (subk->keyid);      if (subk != NULL)
816            kid = strdup (subk->keyid);
817      gpgme_key_release (key);      gpgme_key_release (key);
818      return kid;      return kid;
819  }  }
# Line 819  keyedit_add_subkey (winpt_key_t k, HWND Line 828  keyedit_add_subkey (winpt_key_t k, HWND
828      int cancel = 0;      int cancel = 0;
829    
830      if (!k->key_pair) {      if (!k->key_pair) {
831          msg_box (dlg, _("There is no secret key available!"), _("Add Subkey"), MB_ERR);          msg_box (dlg, _("There is no secret key available!"),
832                     _("Add Subkey"), MB_ERR);
833          return FALSE;          return FALSE;
834      }      }
835      if (k->is_protected) {      if (k->is_protected) {
# Line 830  keyedit_add_subkey (winpt_key_t k, HWND Line 840  keyedit_add_subkey (winpt_key_t k, HWND
840    
841      memset (&keygen, 0, sizeof (keygen));      memset (&keygen, 0, sizeof (keygen));
842      memset (&cb, 0, sizeof (cb));      memset (&cb, 0, sizeof (cb));
     cb.lv = lv;  
843      cb.keyid = k->keyid;      cb.keyid = k->keyid;
844      cb.is_protected = k->is_protected;      cb.is_protected = k->is_protected;
845      cb.pass = pass;      cb.pass = pass;
# Line 839  keyedit_add_subkey (winpt_key_t k, HWND Line 848  keyedit_add_subkey (winpt_key_t k, HWND
848                        dlg, keyedit_addsubkey_dlg_proc,                        dlg, keyedit_addsubkey_dlg_proc,
849                        (LPARAM)&cb, _("Add new Subkey"),                        (LPARAM)&cb, _("Add new Subkey"),
850                        IDS_WINPT_KEYEDIT_ADDSUBKEY);                        IDS_WINPT_KEYEDIT_ADDSUBKEY);
851      safe_free (keygen.fpr);      if (lv != NULL && cb.finished)
852            do_add_new_subkey (lv, &keygen, 0);
853      if (cb.finished)      if (cb.finished)
854          k->update = 1;          k->update = 1;
855    
856      sfree_if_alloc (pass);          safe_free (keygen.fpr);
857        sfree_if_alloc (pass);
858      return cb.finished? TRUE: FALSE;      return cb.finished? TRUE: FALSE;
859  }  }
860    
# Line 854  keyedit_set_pref_keyserver (winpt_key_t Line 865  keyedit_set_pref_keyserver (winpt_key_t
865      GpgKeyEdit *ke;      GpgKeyEdit *ke;
866      gpgme_error_t err;      gpgme_error_t err;
867      struct URL_ctx_s *url;      struct URL_ctx_s *url;
868      char *pass;      char *pass = NULL;
869    
870      url = (struct URL_ctx_s *)get_keyserver_URL_dlg (dlg);      url = (struct URL_ctx_s *)get_keyserver_URL_dlg (dlg);
871      if (url->cancel == 1) {      if (url->cancel == 1) {
# Line 868  keyedit_set_pref_keyserver (winpt_key_t Line 879  keyedit_set_pref_keyserver (winpt_key_t
879          return FALSE;          return FALSE;
880      }      }
881    
882      ke = new GpgKeyEdit (k->keyid);      ke = create_GpgKeyEdit (k->keyid);
     if (!ke)  
         BUG (NULL);  
883      if (k->is_protected)      if (k->is_protected)
884          ke->setPassphrase (pass);          ke->setPassphrase (pass);
885      else      else
886          ke->setNoPassphrase (true);          ke->setNoPassphrase (true);
887      err = ke->setPreferredKeyserver (0 /* XXX */, url->url);      err = ke->setPreferredKeyserver (-1, url->url);
888      if (!err)      if (!err)
889          msg_box (dlg, _("Preferred keyserver successfully set."), _("Key Edit"), MB_OK);          msg_box (dlg, _("Preferred keyserver successfully set."), _("Key Edit"), MB_OK);
890        else
891            msg_box (dlg, gpgme_strerror (err), _("Key Edit"), MB_ERR);
892    
893      sfree_if_alloc (pass);      sfree_if_alloc (pass);
894      delete ke;      delete ke;
895      delete url;          delete url;
896      return err == 0? 0 : WPTERR_GENERAL;      return err == 0? 0 : WPTERR_GENERAL;
897  }  }
898    
# Line 891  keyedit_set_pref_keyserver (winpt_key_t Line 902  keyedit_set_pref_keyserver (winpt_key_t
902  BOOL  BOOL
903  keyedit_add_photo (winpt_key_t k, HWND dlg)  keyedit_add_photo (winpt_key_t k, HWND dlg)
904  {  {
905        keyedit_cb_s cb;
906        char *pass = NULL;
907        int cancel;
908        
909      if (!k->key_pair) {      if (!k->key_pair) {
910          msg_box (dlg, _("There is no secret key available!"), _("Add Photo"), MB_ERR);          msg_box (dlg, _("There is no secret key available!"),
911                     _("Add Photo"), MB_ERR);
912          return FALSE;          return FALSE;
913      }      }
914    
915        memset (&cb, 0, sizeof (cb));
916        if (k->is_protected) {
917            pass = request_passphrase (_("Key Edit"), 1, &cancel);
918            if (cancel)
919                return FALSE;
920        }
921        cb.pass = pass;
922        cb.keyid = k->keyid;
923    
924      DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT_ADDPHOTO, dlg,      DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT_ADDPHOTO, dlg,
925                      keyedit_addphoto_dlg_proc, (LPARAM)k);                      keyedit_addphoto_dlg_proc, (LPARAM)&cb);
926    
927        if (cb.finished)
928            k->update = 1;
929        sfree_if_alloc (pass);    
930      return TRUE;      return TRUE;
931  }  }
932    
# Line 904  keyedit_add_photo (winpt_key_t k, HWND d Line 934  keyedit_add_photo (winpt_key_t k, HWND d
934  BOOL  BOOL
935  keyedit_add_revoker (winpt_key_t k, HWND dlg)  keyedit_add_revoker (winpt_key_t k, HWND dlg)
936  {  {
937        keyedit_cb_s cb;
938        char *pass = NULL;
939        int cancel;
940    
941      if (!k->key_pair) {      if (!k->key_pair) {
942          msg_box (dlg, _("There is no secret key available!"), _("Add Revoker"), MB_ERR);          msg_box (dlg, _("There is no secret key available!"), _("Add Revoker"), MB_ERR);
943          return FALSE;          return FALSE;
944      }      }
945    
946        if (k->is_protected) {
947            pass = request_passphrase (_("Key Edit"), 1, &cancel);
948            if (cancel)
949                return FALSE;
950        }
951    
952        memset (&cb, 0, sizeof (cb));
953        cb.is_protected = k->is_protected;
954        cb.keyid = k->keyid;
955        cb.pass = pass;
956      DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT_ADDREV, dlg,      DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT_ADDREV, dlg,
957                      keyedit_addrevoker_dlg_proc, (LPARAM)k);                      keyedit_addrevoker_dlg_proc, (LPARAM)&cb);
958    
959        if (cb.finished)
960            k->update = 1;
961        sfree_if_alloc (pass);
962      return TRUE;      return TRUE;
963  }  }
964    
# Line 934  keyedit_change_ownertrust (winpt_key_t k Line 983  keyedit_change_ownertrust (winpt_key_t k
983  }  }
984    
985    
986    /* Check if the given key is supposed to have IDEA
987       for secret key protection. */
988  static int  static int
989  is_idea_protect_algo (const char * keyid)  is_idea_protect_algo (const char *keyid)
990  {  {
991      winpt_key_s k;      winpt_key_s k;
992      const unsigned char *sym_prefs;      const unsigned char *sym_prefs;
# Line 943  is_idea_protect_algo (const char * keyid Line 994  is_idea_protect_algo (const char * keyid
994    
995      memset (&k, 0, sizeof (k));      memset (&k, 0, sizeof (k));
996      if (winpt_get_pubkey (keyid, &k))      if (winpt_get_pubkey (keyid, &k))
997          BUG (NULL);          BUG (0);
998      sym_prefs = k.ext->sym_prefs;      sym_prefs = k.ext->sym_prefs;
999        if (!k.is_v3)
1000            return 0;
1001      if (!sym_prefs)      if (!sym_prefs)
1002          return 1; /* assume that only v3 keys have no symmetric cipher preferences          return 1; /* assume that only v3 keys have no symmetric cipher preferences
1003                       and thus IDEA is explicit. */                       and thus IDEA is explicit. */
# Line 953  is_idea_protect_algo (const char * keyid Line 1006  is_idea_protect_algo (const char * keyid
1006      if ((n == 0 || n == 1) && *sym_prefs == 0x01)      if ((n == 0 || n == 1) && *sym_prefs == 0x01)
1007          return 1;          return 1;
1008      return 0;      return 0;
1009  } /* is_idea_protect_algo */  }
1010    
1011    
1012  BOOL  BOOL
1013  keyedit_change_passwd (winpt_key_t k, HWND dlg)  keyedit_change_passwd (winpt_key_t k, HWND dlg)
1014  {  {
1015      gpgme_error_t ec;      gpgme_error_t err;
1016      GpgKeyEdit *ke;      GpgKeyEdit *ke;
1017      char *old_pass = NULL;      char *old_pass = NULL;
1018      char *new_pass = NULL;      char *new_pass = NULL;
# Line 971  keyedit_change_passwd (winpt_key_t k, HW Line 1024  keyedit_change_passwd (winpt_key_t k, HW
1024          return FALSE;          return FALSE;
1025      }      }
1026    
1027      if( !idea_available && is_idea_protect_algo( k->keyid ) ) {      if (!idea_available && is_idea_protect_algo (k->keyid)) {
1028          msg_box( dlg, _("Cannot change passphrase because the key\n"          msg_box (dlg, _("Cannot change passphrase because the key\n"
1029                          "is protected with the IDEA encryption algorithm."),                          "is protected with the IDEA encryption algorithm."),
1030                          _("Key Edit"), MB_ERR );                          _("Key Edit"), MB_ERR);
1031          return FALSE;          return FALSE;
1032      }      }
1033    
# Line 998  keyedit_change_passwd (winpt_key_t k, HW Line 1051  keyedit_change_passwd (winpt_key_t k, HW
1051          return FALSE;          return FALSE;
1052      }      }
1053    
1054      ke = new GpgKeyEdit (k->keyid);      ke = create_GpgKeyEdit (k->keyid);
     if (!ke)  
         BUG (NULL);  
   
1055      ke->setPassphrase (k->is_protected? old_pass : NULL);      ke->setPassphrase (k->is_protected? old_pass : NULL);
1056      ec = ke->changePassphrase (new_pass, 0);      err = ke->changePassphrase (new_pass, 0);
1057      if( ec )      if (err)
1058          msg_box (dlg, gpgme_strerror (ec), _("Change Passwd"), MB_ERR);          msg_box (dlg, gpgme_strerror (err), _("Change Passwd"), MB_ERR);
1059      else      else
1060          msg_box (dlg, _("Passphrase successfully changed."),  _("GnuPG status"), MB_OK);          msg_box (dlg, _("Passphrase successfully changed."),  _("GnuPG status"), MB_OK);
1061      sfree_if_alloc (old_pass);      sfree_if_alloc (old_pass);
# Line 1021  listview_ctrl_t Line 1071  listview_ctrl_t
1071  subkey_list_init (HWND dlg, winpt_key_t k)  subkey_list_init (HWND dlg, winpt_key_t k)
1072  {  {
1073      LV_ITEM lvi;      LV_ITEM lvi;
     gpgme_key_t key;  
1074      gpgme_subkey_t sub;      gpgme_subkey_t sub;
1075      struct listview_column_s cols[] = {      struct listview_column_s cols[] = {
1076          {0, 80, (char *)_("Description")},          {0, 80, (char *)_("Description")},
# Line 1038  subkey_list_init (HWND dlg, winpt_key_t Line 1087  subkey_list_init (HWND dlg, winpt_key_t
1087      listview_ctrl_t lv;      listview_ctrl_t lv;
1088      char buf[256], tmp[128];      char buf[256], tmp[128];
1089      const char *t;      const char *t;
1090      int nkeys = 0, rc = 0, i, bits;          int nkeys = 0, i, bits;
1091    
1092      if( get_pubkey( k->keyid, &key ) ) {      nkeys = count_subkeys (k->ctx);
         msg_box( dlg, _("Could not find key."), _("Key Edit"), MB_ERR );  
         return NULL;  
     }  
     if (!k->ctx)  
         k->ctx = key;  
     nkeys = count_subkeys (key);  
1093      if( !nkeys ) {      if( !nkeys ) {
1094          msg_box (dlg, _("No subkey(s) found."), _("Key Edit"), MB_ERR);          msg_box (dlg, _("No subkey(s) found."), _("Key Edit"), MB_ERR);
1095          return NULL;          return NULL;
1096      }      }
1097                    
1098      rc  = listview_new( &lv );      listview_new (&lv, GetDlgItem (dlg, IDC_KEYEDIT_KEYLIST));
1099      if( rc )      for (i = 0; cols[i].fieldname != NULL; i++)
1100          BUG( dlg );          listview_add_column (lv, &cols[i]);
           
     lv->ctrl = GetDlgItem( dlg, IDC_KEYEDIT_KEYLIST );  
     for( i = 0; cols[i].fieldname != NULL; i++ )      
         listview_add_column( lv, &cols[i] );  
1101                    
1102      for( i = 0; i < nkeys; i++ ) {      for( i = 0; i < nkeys; i++ ) {
1103          listview_add_item( lv, "" );          listview_add_item( lv, "" );
1104          listview_add_sub_item( lv, 0, 1, "" );          listview_add_sub_item( lv, 0, 1, "" );
1105          memset( &lvi, 0, sizeof lvi );          memset( &lvi, 0, sizeof lvi );
1106          lvi.mask = LVIF_PARAM;            lvi.mask = LVIF_PARAM;  
1107          lvi.lParam = (LPARAM)key;          lvi.lParam = (LPARAM)k->ctx;
1108          if( ListView_SetItem( lv->ctrl, &lvi ) == FALSE )          if( ListView_SetItem( lv->ctrl, &lvi ) == FALSE )
1109              return NULL;              return NULL;
1110      }      }
1111                    
1112      listview_set_ext_style( lv );      listview_set_ext_style( lv );
1113      for( i = 0, sub = key->subkeys; i < nkeys; i++, sub = sub->next ) {      for( i = 0, sub = k->ctx->subkeys; i < nkeys; i++, sub = sub->next ) {
1114          memset( buf, 0, sizeof buf );          memset( buf, 0, sizeof buf );
1115    
1116          bits = sub->length;          bits = sub->length;
# Line 1118  subkey_list_init (HWND dlg, winpt_key_t Line 1157  subkey_list_init (HWND dlg, winpt_key_t
1157          listview_add_sub_item (lv, i, 8, t);          listview_add_sub_item (lv, i, 8, t);
1158      }      }
1159      return lv;      return lv;
1160  } /* subkey_list_init */  }
1161    
1162    
1163  static listview_ctrl_t  static listview_ctrl_t
1164  userid_list_init (HWND dlg, winpt_key_t k)  userid_list_init (HWND dlg, winpt_key_t k)
1165  {  {
1166      listview_ctrl_t lv = NULL;      listview_ctrl_t lv = NULL;
     gpgme_key_t key;  
1167      gpgme_key_sig_t ks;      gpgme_key_sig_t ks;
1168      gpgme_user_id_t u;      struct native_uid_s *u;
1169      int nuids = 0, rc, j, u_attr;      int nuids = 0, j, u_attr;
1170      struct listview_column_s cols[] = {      struct listview_column_s cols[] = {
1171          {0,  72, (char *)_("Validity")},          {0,  72, (char *)_("Validity")},
1172          {1, 150, (char *)_("Name")},          {1, 150, (char *)_("Name")},
# Line 1137  userid_list_init (HWND dlg, winpt_key_t Line 1175  userid_list_init (HWND dlg, winpt_key_t
1175          {0, 0, 0}          {0, 0, 0}
1176      };          };    
1177      const char *attr;      const char *attr;
   
     if (get_pubkey (k->keyid, &key)) {  
         msg_box (dlg, _("Could not find key."), _("Key Edit"), MB_ERR);  
         return NULL;  
     }  
1178            
1179      nuids = count_userids (key);      nuids = count_userids (k->ctx);
1180      if (!nuids) {      if (!nuids) {
1181          msg_box (dlg, _("No user ID(s) found."), _("Key Edit"), MB_ERR);          msg_box (dlg, _("No user ID(s) found."), _("Key Edit"), MB_ERR);
1182          return NULL;          return NULL;
1183      }      }
1184                    
1185      rc = listview_new (&lv);      listview_new (&lv, GetDlgItem (dlg, IDC_KEYEDIT_UIDLIST));
     if (rc)  
         BUG (dlg);  
     lv->ctrl = GetDlgItem( dlg, IDC_KEYEDIT_UIDLIST );  
1186      for( j = 0; cols[j].fieldname != NULL; j++ )      for( j = 0; cols[j].fieldname != NULL; j++ )
1187          listview_add_column( lv, &cols[j] );          listview_add_column (lv, &cols[j]);
1188                    
1189      for( j = 0; j < nuids; j++ ) {                for (j = 0; j < nuids; j++) {
1190          listview_add_item( lv, " " );          listview_add_item (lv, " ");
1191          listview_add_sub_item( lv, 0, 1, " " );                  listview_add_sub_item (lv, 0, 1, " " );        
1192      }      }
1193    
1194      listview_set_ext_style (lv);      listview_set_ext_style (lv);
1195      for (j = 0, u=key->uids; j < nuids; u=u->next, j++) {      for (j = 0, u=k->ext->uids; j < nuids; u=u->next, j++) {
1196          if (u->revoked)          if (u->revoked)
1197              attr = _("Revoked");              attr = _("Revoked");
1198          else {          else {
1199              u_attr = (int)u->validity;              u_attr = (int)u->validity;
1200              attr = get_key_trust2 (NULL, u_attr, 0, 0);              attr = get_key_trust2 (NULL, u_attr, 0, 0);
1201          }          }
1202          listview_add_sub_item( lv, j, 0, (char *)attr );                  listview_add_sub_item (lv, j, UID_COL_VALID, (char *)attr);
   
1203          /* XXX: add comment if available */          /* XXX: add comment if available */
1204          attr = u->name;          listview_add_sub_item (lv, j, UID_COL_NAME,
1205          if (attr) {                                 u->name? u->name : _("Invalid user ID"));
1206              char *uid = utf8_to_wincp (attr, strlen (attr));          if (u->email)
1207              if (uid) {              listview_add_sub_item (lv, j, UID_COL_EMAIL, u->email);
                 listview_add_sub_item (lv, j, 1, uid);  
                 free (uid);  
             }  
         }  
         else  
             listview_add_sub_item (lv, j, 1, _("Invalid user ID"));  
         attr = u->email;  
         if (attr)  
             listview_add_sub_item (lv, j, 2, attr);  
1208    
1209          ks = get_selfsig (u, k->keyid, 1);          ks = get_selfsig (u->signatures, k->keyid, 1);
1210          if (ks)          if (ks)
1211              listview_add_sub_item (lv, j, 3, get_key_created (ks->timestamp));              listview_add_sub_item (lv, j, UID_COL_CREATION,
1212                                       get_key_created (ks->timestamp));
1213      }      }
1214      if( !k->key_pair ) {      if( !k->key_pair ) {
1215          CheckDlgButton( dlg, IDC_KEYUID_ADD, BST_INDETERMINATE );          CheckDlgButton (dlg, IDC_KEYUID_ADD, BST_INDETERMINATE);
1216          CheckDlgButton( dlg, IDC_KEYUID_REVOKE, BST_INDETERMINATE );              CheckDlgButton (dlg, IDC_KEYUID_REVOKE, BST_INDETERMINATE);
1217      }      }
1218      return lv;      return lv;
1219  } /* userid_list_init */  }
1220    
1221    
1222  static void  static void
# Line 1257  do_show_help (HWND dlg) Line 1278  do_show_help (HWND dlg)
1278           "DISABLE   \t\tdisable a key\r\n"           "DISABLE   \t\tdisable a key\r\n"
1279           "ENABLE    \t\tenable a key\r\n"           "ENABLE    \t\tenable a key\r\n"
1280           "SIGN      \t\tsign a user-id (exportable)\r\n"           "SIGN      \t\tsign a user-id (exportable)\r\n"
1281           "LSIGN     \t\tsign a user-id (non-exportable)\r\n"));           "LSIGN     \t\tsign a user-id (non-exportable)\r\n"
1282             "CLEAN     \t\tremove unusable signatures from key\r\n"
1283             "MINIMIZE  \t\tremove all signatures from key\r\n"
1284             ));
1285      msg_box (dlg, helptext, _("Key Edit Help"), MB_OK);      msg_box (dlg, helptext, _("Key Edit Help"), MB_OK);
1286  }  }
1287    
# Line 1286  do_editkey_delkey (winpt_key_t k, HWND d Line 1310  do_editkey_delkey (winpt_key_t k, HWND d
1310          return FALSE;          return FALSE;
1311      }      }
1312            
1313      listview_get_item_text( lv, j, 0, tmp, sizeof tmp -1 );      /* XXX: change the warning to make clear that verification won't work
1314      id = log_box( _("Key Edit"), MB_YESNO|MB_ICONWARNING,              any longer if this is a sign-only key. */
1315        listview_get_item_text (lv, j, 0, tmp, sizeof (tmp) -1);
1316        id = log_box (_("Key Edit"), MB_YESNO|MB_ICONWARNING,
1317                      _("\"Subkey %s.\"\n\n"                      _("\"Subkey %s.\"\n\n"
1318                        "Anything encrypted to the selected subkey will no longer\n"                        "Anything encrypted to the selected subkey will no longer\n"
1319                        "be able to be decrypted.\n\n"                        "be able to be decrypted.\n\n"
1320                        "Do you really want to delete this subkey?"), tmp );                        "Do you really want to delete this subkey?"), tmp);
1321      if( id == IDNO )      if (id == IDNO)
1322          return FALSE;          return FALSE;
1323    
1324      ke = new GpgKeyEdit (k->keyid);      ke = new GpgKeyEdit (k->keyid);
# Line 1308  do_editkey_delkey (winpt_key_t k, HWND d Line 1334  do_editkey_delkey (winpt_key_t k, HWND d
1334      }      }
1335      delete ke;      delete ke;
1336      return err? FALSE : TRUE;      return err? FALSE : TRUE;
1337  } /* do_editkey_delkey */  }
   
1338    
1339    
1340  /* Set the expiration date for the selected key in list view @lv.  /* Set the expiration date for the selected key in list view @lv.
# Line 1569  do_editkey_primary (winpt_key_t k, HWND Line 1594  do_editkey_primary (winpt_key_t k, HWND
1594      gpgme_error_t err;      gpgme_error_t err;
1595      GpgKeyEdit *ke;      GpgKeyEdit *ke;
1596      int j, id, cancel=0;      int j, id, cancel=0;
1597      char buf[256], * pass = NULL;      char buf[256], *pass = NULL;
1598    
1599      if (listview_count_items (lv, 0) == 1)      if (listview_count_items (lv, 0) == 1)
1600          return TRUE;          return TRUE;
# Line 1580  do_editkey_primary (winpt_key_t k, HWND Line 1605  do_editkey_primary (winpt_key_t k, HWND
1605      listview_get_item_text (lv, j, 2, buf, sizeof buf-1);      listview_get_item_text (lv, j, 2, buf, sizeof buf-1);
1606      id = do_find_userid (k->keyid, buf, NULL, NULL);      id = do_find_userid (k->keyid, buf, NULL, NULL);
1607      if (id == -1)      if (id == -1)
1608          BUG (dlg);          BUG (0);
1609      if (k->is_protected) {      if (k->is_protected) {
1610          pass = request_passphrase (_("Key Edit"), 1, &cancel);          pass = request_passphrase (_("Key Edit"), 1, &cancel);
1611          if (cancel)          if (cancel)
# Line 1659  BOOL CALLBACK Line 1684  BOOL CALLBACK
1684  showpref_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  showpref_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
1685  {  {
1686      static keyedit_cb_t cb = NULL;      static keyedit_cb_t cb = NULL;
1687      gpg_uid_info_t inf=NULL;      gpg_uid_info_t inf=NULL, u;
1688        gpgme_key_t key;
1689      char buf[128];      char buf[128];
1690      int pos;      int pos;
1691    
1692      switch (msg) {      switch (msg) {
1693      case WM_INITDIALOG:      case WM_INITDIALOG:
1694          cb = (keyedit_cb_t)lparam;          cb = (keyedit_cb_t)lparam;
1695          if (cb == NULL)          if (!cb)
1696              BUG (dlg);              BUG (NULL);
1697          pos = listview_get_curr_pos (cb->lv);          key = (gpgme_key_t)cb->opaque;
1698          listview_get_item_text (cb->lv, pos, 2, buf, DIM (buf)-1);          listview_get_item_text (cb->lv, cb->lv_pos,
1699          SetDlgItemText (dlg, IDC_SHOWPREF_INFO, buf);                                  UID_COL_EMAIL, buf, sizeof (buf)-1);
1700          pos = do_find_userid (((winpt_key_t)cb->opaque)->keyid,          pos = do_find_userid (cb->keyid, buf, NULL, &inf);
1701                                buf, NULL, &inf);          if (pos < 0 || !inf) {
         if (inf) {  
             const char *prefs = inf->prefs;  
             if (prefs && *prefs) {  
                 if (parse_preflist (dlg, prefs) <= 0)  
                     pos = -1;  
             }  
             else  
                 pos = -1;  
1702              gpg_uid_info_release (inf);              gpg_uid_info_release (inf);
1703              if (pos == -1) {              EndDialog (dlg, FALSE);
1704                  msg_box (dlg, _("No preferences available."), _("Key Edit"), MB_ERR);              break;
1705                  EndDialog (dlg, TRUE);          }
1706            for (u=inf; u; u = u->next) {
1707                if (u->index == pos && u->prefs && *u->prefs) {
1708                    _snprintf (buf, sizeof (buf)-1, "%s", u->name);
1709                    SetDlgItemText (dlg, IDC_SHOWPREF_INFO, buf);
1710                    if (parse_preflist (dlg, u->prefs) <= 0)
1711                        pos = -1;
1712                    if (u->flags.mdc)
1713                        CheckDlgButton (dlg, IDC_SHOWPREF_MDC, BST_CHECKED);
1714                    break;
1715              }              }
1716              if (inf->flags.mdc)          }
1717                  CheckDlgButton (dlg, IDC_SHOWPREF_MDC, BST_CHECKED);          gpg_uid_info_release (inf);
1718            if (pos == -1) {        
1719                msg_box (dlg, _("No preferences available."), _("Key Edit"), MB_ERR);
1720                EndDialog (dlg, FALSE);
1721                break;
1722          }          }
1723          SetDlgItemText (dlg, IDC_SHOWPREF_MDC, _("MDC feature"));          SetDlgItemText (dlg, IDC_SHOWPREF_MDC, _("MDC feature"));
1724          SetDlgItemText (dlg, IDC_SHOWPREF_PREFINF, _("Preferences"));          SetDlgItemText (dlg, IDC_SHOWPREF_PREFINF, _("Preferences"));
1725            SetDlgItemText (dlg, IDC_SHOWPREF_UIDHINT, _("user ID:"));
1726          SetWindowText (dlg, _("Key Preferences"));          SetWindowText (dlg, _("Key Preferences"));
1727          SetForegroundWindow (dlg);          SetForegroundWindow (dlg);
1728          break;          break;
# Line 1700  showpref_dlg_proc (HWND dlg, UINT msg, W Line 1732  showpref_dlg_proc (HWND dlg, UINT msg, W
1732          case IDOK:          case IDOK:
1733              EndDialog (dlg, TRUE);              EndDialog (dlg, TRUE);
1734              break;              break;
1735    
1736            case IDCANCEL:
1737                EndDialog (dlg, FALSE);
1738                break;
1739          }          }
1740          break;          break;
1741      }      }
# Line 1711  static int Line 1747  static int
1747  do_editkey_showpref (winpt_key_t k, HWND dlg, listview_ctrl_t lv)  do_editkey_showpref (winpt_key_t k, HWND dlg, listview_ctrl_t lv)
1748  {  {
1749      struct keyedit_cb_s cb;      struct keyedit_cb_s cb;
1750        char status[32];
1751    
1752      if (k->is_v3)      if (k->is_v3)
1753          return TRUE;          return TRUE;
# Line 1719  do_editkey_showpref (winpt_key_t k, HWND Line 1756  do_editkey_showpref (winpt_key_t k, HWND
1756          msg_box (dlg, _("Please select a user ID."), _("Key Edit"), MB_ERR);          msg_box (dlg, _("Please select a user ID."), _("Key Edit"), MB_ERR);
1757          return FALSE;          return FALSE;
1758      }      }
   
1759      memset (&cb, 0, sizeof (cb));      memset (&cb, 0, sizeof (cb));
1760        cb.opaque = k->ctx;
1761        cb.keyid = k->keyid;
1762      cb.lv = lv;      cb.lv = lv;
1763      cb.opaque = k;      cb.lv_pos = listview_get_curr_pos (lv);
1764    
1765        listview_get_item_text (lv, cb.lv_pos, UID_COL_VALID,
1766                                status, sizeof (status)-1);
1767        if (!strcmp (status, _("Revoked")))
1768            return TRUE;
1769        
1770      DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT_SHOWPREF, dlg,      DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYEDIT_SHOWPREF, dlg,
1771                      showpref_dlg_proc, (LPARAM)&cb);                      showpref_dlg_proc, (LPARAM)&cb);
1772      return TRUE;      return TRUE;
# Line 1754  do_editkey_deluid (winpt_key_t k, HWND d Line 1798  do_editkey_deluid (winpt_key_t k, HWND d
1798      /* XXX: add a hint that also all signatures will be deleted? */      /* XXX: add a hint that also all signatures will be deleted? */
1799      listview_get_item_text (lv, j, UID_COL_NAME, name, DIM(name) -1);      listview_get_item_text (lv, j, UID_COL_NAME, name, DIM(name) -1);
1800      _snprintf (inf, DIM (inf)-1, _("user ID \"%s\".\n\n"      _snprintf (inf, DIM (inf)-1, _("user ID \"%s\".\n\n"
1801                                       "All signatures on this user ID will be also deleted."
1802                                       "\n\n"
1803                                     "Do you really want to delete this user ID?"),                                     "Do you really want to delete this user ID?"),
1804                                 name);                                 name);
1805      if (msg_box (dlg, inf, _("Key Edit"), MB_YESNO|MB_ICONWARNING) == IDNO)      if (msg_box (dlg, inf, _("Key Edit"), MB_YESNO|MB_ICONWARNING) == IDNO)
# Line 1779  do_editkey_deluid (winpt_key_t k, HWND d Line 1825  do_editkey_deluid (winpt_key_t k, HWND d
1825      }      }
1826      delete ke;      delete ke;
1827      return err? FALSE : TRUE;      return err? FALSE : TRUE;
1828  } /* do_editkey_deluid */  }
   
1829    
1830    
1831    /* Subclass routine for the subkey listview control to allow shortcuts. */
1832  static BOOL CALLBACK  static BOOL CALLBACK
1833  subkey_subclass_proc( HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam )  subkey_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
1834  {  {
1835      switch( msg ) {      int virt_key = 0;
1836        winpt_key_t key;
1837    
1838        switch (msg) {
1839      case WM_KEYUP:      case WM_KEYUP:
1840          int virt_key = (int)wparam;          virt_key = (int)wparam;
1841          switch( virt_key ) {                  key = (winpt_key_t)keyedit_subkey_proc.opaque;
1842            if (!key || !key->key_pair)
1843                break;
1844    
1845            switch (virt_key) {
1846          case VK_DELETE:          case VK_DELETE:
1847              SendDlgItemMessage( keyedit_subkey_proc.dlg, IDC_KEYEDIT_CMD,              SendDlgItemMessage (keyedit_subkey_proc.dlg, IDC_KEYEDIT_CMD,
1848                                  CB_SETCURSEL, CMD_DELKEY, 0 );                                  CB_SETCURSEL, CMD_DELKEY, 0);
1849              send_cmd_id( keyedit_subkey_proc.dlg, IDOK );              send_cmd_id (keyedit_subkey_proc.dlg, IDOK);
1850              break;              break;
1851    
1852          case VK_INSERT:          case VK_INSERT:
1853              SendDlgItemMessage( keyedit_subkey_proc.dlg, IDC_KEYEDIT_CMD,              SendDlgItemMessage (keyedit_subkey_proc.dlg, IDC_KEYEDIT_CMD,
1854                                  CB_SETCURSEL, CMD_ADDKEY, 0 );                                  CB_SETCURSEL, CMD_ADDKEY, 0);
1855              send_cmd_id( keyedit_subkey_proc.dlg, IDOK );              send_cmd_id (keyedit_subkey_proc.dlg, IDOK);
1856              break;              break;
1857          }          }
1858      }      }
1859      return CallWindowProc( keyedit_subkey_proc.old, dlg, msg, wparam, lparam );      return CallWindowProc (keyedit_subkey_proc.old, dlg, msg, wparam, lparam);
1860  } /* subkey_subclass_proc */  }
1861    
1862    
1863  static BOOL CALLBACK  static BOOL CALLBACK
1864  uid_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  uid_subclass_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
1865  {  {
1866      switch( msg ) {      int virt_key = 0;
1867        winpt_key_t key;
1868    
1869        switch (msg) {
1870      case WM_KEYUP:      case WM_KEYUP:
1871          int virt_key = (int)wparam;          virt_key = (int)wparam;
1872            key = (winpt_key_t)keyedit_uid_proc.opaque;
1873            if (!key || !key->key_pair)
1874                break;
1875    
1876          switch (virt_key) {          switch (virt_key) {
1877          case VK_DELETE:          case VK_DELETE:
1878              SendDlgItemMessage (keyedit_uid_proc.dlg, IDC_KEYEDIT_CMD,              SendDlgItemMessage (keyedit_uid_proc.dlg, IDC_KEYEDIT_CMD,
# Line 1827  uid_subclass_proc (HWND dlg, UINT msg, W Line 1887  uid_subclass_proc (HWND dlg, UINT msg, W
1887              break;              break;
1888          }          }
1889      }      }
1890      return CallWindowProc( keyedit_uid_proc.old, dlg, msg, wparam, lparam );      return CallWindowProc (keyedit_uid_proc.old, dlg, msg, wparam, lparam);
1891  } /* uid_subclass_proc */  }
1892    
1893    
1894    /* Enable the key @k when @enable is 1, disable it otherwise. */
1895  static void  static void
1896  do_editkey_enable_disable (winpt_key_t k, HWND dlg, listview_ctrl_t lv, int enable)  do_editkey_enable_disable (winpt_key_t k, HWND dlg,
1897                               listview_ctrl_t lv, int enable)
1898  {  {
1899      km_enable_disable_key (lv, dlg, 0, enable);      km_enable_disable_key (lv, dlg, 0, enable);
1900      k->update = 1;      k->update = 1;
# Line 1852  get_default_key (void) Line 1914  get_default_key (void)
1914  }  }
1915    
1916    
1917    
1918    static void
1919    do_editkey_minimize (winpt_key_t k, HWND dlg)
1920    {
1921        gpgme_error_t err;
1922        GpgKeyEdit *ke;
1923    
1924        ke = create_GpgKeyEdit (k->keyid);
1925        err = ke->minimizeKey ();
1926        if (err)
1927            msg_box (dlg, gpgme_strerror (err), _("Key Edit"), MB_ERR);
1928        else {
1929            msg_box (dlg, _("Finished to compact key."), _("Key Edit"), MB_OK);
1930            k->update = 1;
1931        }
1932        delete ke;
1933    }
1934    
1935    
1936    static void
1937    do_editkey_clean (winpt_key_t k, HWND dlg)
1938    {
1939        gpgme_error_t err;
1940        GpgKeyEdit *ke;
1941        
1942        ke = create_GpgKeyEdit (k->keyid);
1943        err = ke->cleanKey ();
1944        if (err)
1945            msg_box (dlg, gpgme_strerror (err), _("Key Edit"), MB_ERR);  
1946        else {
1947            msg_box (dlg, _("Finished to compact key."), _("Key Edit"), MB_OK);
1948            k->update = 1;
1949        }
1950        delete ke;
1951    }
1952    
1953    
1954    /* Start the dialog to list and display the status of all
1955       signatures for this key. */
1956  static void  static void
1957  do_editkey_check (winpt_key_t k, HWND dlg)  do_editkey_check (winpt_key_t k, HWND dlg)
1958  {  {
# Line 1894  do_editkey_sign_userid (winpt_key_t k, H Line 1995  do_editkey_sign_userid (winpt_key_t k, H
1995          if (cancel)          if (cancel)
1996              return FALSE;              return FALSE;
1997      }      }
1998      ke = new GpgKeyEdit (k->keyid);      ke = create_GpgKeyEdit (k->keyid);
1999      if (k->is_protected)      if (k->is_protected)
2000          ke->setPassphrase (pass);          ke->setPassphrase (pass);
2001      else      else
# Line 1932  lookup_cmd (HWND dlg) Line 2033  lookup_cmd (HWND dlg)
2033      return LB_ERR;      return LB_ERR;
2034  }  }
2035    
2036    
2037    
2038    gpgme_error_t key_get_revokers (winpt_key_t key, int reload,
2039                                    gpg_desig_rev_t *r_rev);
2040    
2041    /* Check if the key supports designated revokers and if
2042        secret keys exist to generate such a revoke cert. */
2043    static bool
2044    check_desig_rev (winpt_key_t key)
2045    {
2046        gpg_desig_rev_t rev, u;
2047        struct winpt_key_s sk;
2048    
2049        if (!key->ext->gloflags.has_desig_rev)
2050            return false;
2051        key_get_revokers (key, 0, &rev);
2052        for (u = rev; u; u = u->next) {
2053            memset (&sk, 0, sizeof (sk));
2054            if (!winpt_get_seckey (u->fpr+32, &sk))
2055                return true;
2056        }
2057        return false;
2058    }
2059    
2060    
2061    /* Use the gpg --desig-revoker command to create a revocation
2062       cert for a key that lists our key as a designated revoker. */
2063    static void
2064    gen_desig_revoke_cert (winpt_key_t key, HWND dlg)
2065    {
2066        const char *warn;
2067        char *inf, *p;
2068        int id;
2069    
2070        inf = km_key_get_info (key, 0);
2071        warn = _("Your keys is listed as a designated revoker for the key\n\n"
2072                 "%s\n\n"
2073                 "Are you sure you want to create a revocation certificate\n"
2074                 "which allow to revoke the key listed above?");
2075        p = new char[strlen (inf)+1+strlen (warn)+1];
2076        sprintf (p, warn, inf);
2077        free_if_alloc (inf);
2078    
2079        id = msg_box (dlg, p, _("Key Edit"), MB_YESNO|MB_ICONWARNING);
2080        free_if_alloc (p);
2081        if (id == IDNO)
2082            return;
2083    
2084        key->internal = 1;
2085        DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_KEYREVOKE, dlg,
2086                        key_revoke_dlg_proc, (LPARAM)key);
2087    }
2088    
2089    
2090  /* Dialog box procedure for the edit key dialog. */  /* Dialog box procedure for the edit key dialog. */
2091  BOOL CALLBACK  BOOL CALLBACK
2092  keyedit_main_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keyedit_main_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
# Line 1941  keyedit_main_dlg_proc (HWND dlg, UINT ms Line 2096  keyedit_main_dlg_proc (HWND dlg, UINT ms
2096      int cmd;      int cmd;
2097      HWND item;      HWND item;
2098    
2099      switch( msg ) {      switch (msg) {
2100      case WM_INITDIALOG:      case WM_INITDIALOG:
2101          k = (winpt_key_t)lparam;          k = (winpt_key_t)lparam;
2102          if (!k)          if (!k)
2103              BUG (NULL);              BUG (NULL);
2104          do_init_cmdlist (dlg, k->key_pair);          do_init_cmdlist (dlg, k->key_pair);
2105          lvsub = subkey_list_init (dlg, k);          lvsub = subkey_list_init (dlg, k);
2106          if( !lvsub )          if (!lvsub)
2107              BUG( NULL );              BUG (0);
2108          lvuid = userid_list_init (dlg, k);          lvuid = userid_list_init (dlg, k);
2109          if( !lvuid )          if (!lvuid)
2110              BUG( NULL );              BUG (0);
2111          item = GetDlgItem( dlg, IDC_KEYEDIT_KEYLIST );          item = GetDlgItem (dlg, IDC_KEYEDIT_KEYLIST);
2112            keyedit_subkey_proc.opaque = (void*)k;
2113          keyedit_subkey_proc.dlg = dlg;          keyedit_subkey_proc.dlg = dlg;
2114          keyedit_subkey_proc.current = (WNDPROC)subkey_subclass_proc;          keyedit_subkey_proc.current = (WNDPROC)subkey_subclass_proc;
2115          keyedit_subkey_proc.old = (WNDPROC)GetWindowLong( item, GWL_WNDPROC );          keyedit_subkey_proc.old = (WNDPROC)GetWindowLong (item, GWL_WNDPROC);
2116          if( keyedit_subkey_proc.old ) {          if (keyedit_subkey_proc.old) {
2117              if( !SetWindowLong( item, GWL_WNDPROC, (LONG)keyedit_subkey_proc.current ) ) {              if( !SetWindowLong (item, GWL_WNDPROC,
2118                  msg_box( dlg, _("Could not set subkey window procedure."), _("Key Edit"), MB_ERR );                                  (LONG)keyedit_subkey_proc.current)) {
2119                  BUG( NULL );                  msg_box (dlg, _("Could not set subkey window procedure."),
2120                             _("Key Edit"), MB_ERR);
2121                    BUG (0);
2122              }              }
2123          }          }
2124          item = GetDlgItem( dlg, IDC_KEYEDIT_UIDLIST );          item = GetDlgItem (dlg, IDC_KEYEDIT_UIDLIST);
2125            keyedit_uid_proc.opaque = (void*)k;
2126          keyedit_uid_proc.dlg = dlg;          keyedit_uid_proc.dlg = dlg;
2127          keyedit_uid_proc.current = (WNDPROC)uid_subclass_proc;          keyedit_uid_proc.current = (WNDPROC)uid_subclass_proc;
2128          keyedit_uid_proc.old = (WNDPROC)GetWindowLong( item, GWL_WNDPROC );          keyedit_uid_proc.old = (WNDPROC)GetWindowLong (item, GWL_WNDPROC);
2129          if( keyedit_uid_proc.old ) {          if (keyedit_uid_proc.old) {
2130              if( !SetWindowLong( item, GWL_WNDPROC, (LONG)keyedit_uid_proc.current ) ) {              if (!SetWindowLong (item, GWL_WNDPROC,
2131                  msg_box( dlg, _("Could not set user ID window procedure."), _("Key Edit"), MB_ERR );                                  (LONG)keyedit_uid_proc.current)) {
2132                  BUG( NULL );                  msg_box (dlg, _("Could not set user ID window procedure."),
2133                             _("Key Edit"), MB_ERR);
2134                    BUG (0);
2135              }              }
2136          }          }
2137          if (k->ctx->revoked) {          if (k->ctx->revoked) {
# Line 1980  keyedit_main_dlg_proc (HWND dlg, UINT ms Line 2141  keyedit_main_dlg_proc (HWND dlg, UINT ms
2141          SetDlgItemText (dlg, IDC_KEYEDIT_CMDINF, _("Command>"));          SetDlgItemText (dlg, IDC_KEYEDIT_CMDINF, _("Command>"));
2142          SetDlgItemText (dlg, IDCANCEL, _("&Close"));          SetDlgItemText (dlg, IDCANCEL, _("&Close"));
2143          SetDlgItemText (dlg, IDC_KEYEDIT_HELP, _("&Help"));          SetDlgItemText (dlg, IDC_KEYEDIT_HELP, _("&Help"));
2144            SetDlgItemText (dlg, IDC_KEYEDIT_REVOKE, _("&Revoke..."));
2145            if (!check_desig_rev (k))
2146                ShowWindow (GetDlgItem (dlg, IDC_KEYEDIT_REVOKE), SW_HIDE);
2147          SetWindowText (dlg, _("Key Edit"));          SetWindowText (dlg, _("Key Edit"));
2148          SetForegroundWindow (dlg);          SetForegroundWindow (dlg);
2149          center_window (dlg, NULL);          center_window (dlg, NULL);
2150          return TRUE;          return TRUE;
2151    
2152      case WM_DESTROY:      case WM_DESTROY:
2153          if( lvsub ) {          if (lvsub) {
2154              listview_release( lvsub );              listview_release (lvsub);
2155              lvsub = NULL;              lvsub = NULL;
2156          }          }
2157          if( lvuid ) {          if (lvuid) {
2158              listview_release( lvuid );              listview_release (lvuid);
2159              lvuid = NULL;              lvuid = NULL;
2160          }          }
2161          break;          break;
# Line 2039  keyedit_main_dlg_proc (HWND dlg, UINT ms Line 2203  keyedit_main_dlg_proc (HWND dlg, UINT ms
2203              case CMD_LSIGN: do_editkey_sign_userid (k, dlg,              case CMD_LSIGN: do_editkey_sign_userid (k, dlg,
2204                                                      lvuid, cmd);                                                      lvuid, cmd);
2205                              break;                              break;
2206                case CMD_CLEAN: do_editkey_clean (k, dlg);
2207                case CMD_MINIMIZE: do_editkey_minimize (k, dlg);
2208              }              }
2209              break;              break;
2210                
2211          case IDCANCEL:          case IDCANCEL:
2212              EndDialog (dlg, FALSE);              EndDialog (dlg, FALSE);
2213              break;              break;
# Line 2049  keyedit_main_dlg_proc (HWND dlg, UINT ms Line 2215  keyedit_main_dlg_proc (HWND dlg, UINT ms
2215          case IDC_KEYEDIT_HELP:          case IDC_KEYEDIT_HELP:
2216              do_show_help (dlg);              do_show_help (dlg);
2217              break;              break;
2218    
2219            case IDC_KEYEDIT_REVOKE:
2220                gen_desig_revoke_cert (k, dlg);
2221                break;
2222          }          }
2223          break;          break;
2224      }      }
2225      return FALSE;      return FALSE;
2226  }  }
   

Legend:
Removed from v.176  
changed lines
  Added in v.211

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26