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

Diff of /trunk/Src/wptKeyManager.cpp

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

revision 77 by twoaday, Mon Nov 14 15:01:01 2005 UTC revision 123 by twoaday, Wed Dec 14 09:01:45 2005 UTC
# Line 18  Line 18 
18   * along with WinPT; if not, write to the Free Software Foundation,   * along with WinPT; if not, write to the Free Software Foundation,
19   * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA   * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20   */   */
21    
22  #ifdef HAVE_CONFIG_H  #ifdef HAVE_CONFIG_H
23  #include <config.h>  #include <config.h>
24  #endif  #endif
# Line 129  km_check_if_protected (listview_ctrl_t l Line 130  km_check_if_protected (listview_ctrl_t l
130  }  }
131    
132    
133    /* Check if the key has a good status.
134       Return value: 0 on success. */
135  int  int
136  km_check_key_status (listview_ctrl_t lv, int pos)  km_check_key_status (listview_ctrl_t lv, int pos)
137  {  {
# Line 146  km_check_key_status (listview_ctrl_t lv, Line 149  km_check_key_status (listview_ctrl_t lv,
149      }      }
150    
151      return 0;      return 0;
152  } /* km_check_key_status */  }
153    
154    
155    /* Return all key flags ORed. */
156  int  int
157  km_get_key_status (listview_ctrl_t lv, int pos)  km_get_key_status (listview_ctrl_t lv, int pos)
158  {  {
# Line 168  km_get_key_status (listview_ctrl_t lv, i Line 172  km_get_key_status (listview_ctrl_t lv, i
172      if (key->disabled)      if (key->disabled)
173          flags |= KM_FLAG_DISABLED;          flags |= KM_FLAG_DISABLED;
174      return flags;      return flags;
175  } /* km_get_key_status */  }
176    
177    
178  /* Interface to enable or disable a key (@enable = 1 then enable).  /* Interface to enable or disable a key (@enable = 1 then enable).
# Line 187  km_enable_disable_key (listview_ctrl_t l Line 191  km_enable_disable_key (listview_ctrl_t l
191          BUG (NULL);          BUG (NULL);
192    
193      err = enable? ke->enable () : ke->disable ();      err = enable? ke->enable () : ke->disable ();
194      if (!err) {      if (!err)
195          show_msg (dlg, 1500, _("Key status changed."));          show_msg (dlg, 1500, _("Key status changed."));
         keycache_set_reload (1); /* XXX: set update flag */  
     }  
196      else      else
197          msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);          msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);
198      delete ke;      delete ke;
# Line 270  km_clip_export (HWND dlg, listview_ctrl_ Line 272  km_clip_export (HWND dlg, listview_ctrl_
272            
273      rset = keylist_enum_recipients (lv, KEYLIST_LIST, &n);      rset = keylist_enum_recipients (lv, KEYLIST_LIST, &n);
274      if (!n) {      if (!n) {
275          msg_box (dlg, _("No key was selected for export."), _("Key Manager"), MB_ERR);          msg_box (dlg, _("No key was selected for export."),
276          rc = WPTERR_GENERAL;                   _("Key Manager"), MB_ERR);
277            rc = WPTERR_GENERAL;
278          goto leave;          goto leave;
279      }      }
280            
# Line 291  km_clip_export (HWND dlg, listview_ctrl_ Line 294  km_clip_export (HWND dlg, listview_ctrl_
294  leave:  leave:
295      free (rset);      free (rset);
296      return rc;      return rc;
297  } /* km_clip_export */  }
298    
299    
300  /* Export the selected secret key from @lv into @fname.  /* Export the selected secret key from @lv into @fname.
# Line 356  km_file_export (HWND dlg, listview_ctrl_ Line 359  km_file_export (HWND dlg, listview_ctrl_
359      /*gpgme_set_comment (ctx, "Generated by WinPT "PGM_VERSION);*/      /*gpgme_set_comment (ctx, "Generated by WinPT "PGM_VERSION);*/
360      patt = gpg_keylist_to_pattern (rset, n);      patt = gpg_keylist_to_pattern (rset, n);
361            
362      err = gpgme_op_export( ctx, patt, 0, keydata);      err = gpgme_op_export (ctx, patt, 0, keydata);
363      if( err ) {      if( err ) {
364          msg_box( dlg, gpgme_strerror( err ), _("Key Manager"), MB_ERR );          msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);
365          goto leave;          goto leave;
366      }      }
367            
368      log_box( _("Key Manager"), MB_OK,      log_box (_("Key Manager"), MB_OK,
369               _("Key(s) successfully saved in '%s'."), fname );               _("Key(s) successfully saved in '%s'."), fname);
370            
371  leave:  leave:
372      err = gpg_data_release_and_set_file( keydata, fname );      err = gpg_data_release_and_set_file (keydata, fname);
373      if (err)      if (err)
374          log_box (_("Key Manager"), MB_OK,          log_box (_("Key Manager"), MB_OK,
375                   _("Could not save data to '%s'."), fname);                   _("Could not save data to '%s'."), fname);
376      gpgme_release (ctx);      gpgme_release (ctx);
377      free (patt);      free (patt);
378      return (int)err;      return (int)err;
379  } /* km_file_export */  }
380    
381    
382    /* Read a dash escaped key from the clipboard
383       unescape it and write it back. */
384  static int  static int
385  extract_dash_escaped_key (void)  extract_dash_escaped_key (void)
386  {  {
# Line 384  extract_dash_escaped_key (void) Line 389  extract_dash_escaped_key (void)
389    
390      err = gpg_data_new_from_clipboard (&inp, 0);      err = gpg_data_new_from_clipboard (&inp, 0);
391      if (err) {      if (err) {
392          msg_box (NULL, gpgme_strerror( err ), _("Key Manager"), MB_ERR);          msg_box (NULL, gpgme_strerror (err), _("Key Manager"), MB_ERR);
393          return -1;          return -1;
394      }      }
395      gpg_data_extract_plaintext (inp, &plain);      gpg_data_extract_plaintext (inp, &plain);
# Line 392  extract_dash_escaped_key (void) Line 397  extract_dash_escaped_key (void)
397      gpgme_data_release (inp);      gpgme_data_release (inp);
398    
399      return 0;      return 0;
400  } /* extract_dash_escaped_key */  }
401    
402    
403  /* Import keys from the clipboard. */  /* Import keys from the clipboard. */
# Line 405  km_clip_import (HWND dlg) Line 410  km_clip_import (HWND dlg)
410      int has_data = 0;      int has_data = 0;
411            
412      if (!gpg_clip_istext_avail (&has_data) && !has_data) {      if (!gpg_clip_istext_avail (&has_data) && !has_data) {
413          msg_box( dlg, winpt_strerror (WPTERR_CLIP_ISEMPTY), _("Key Manager"), MB_ERR);          msg_box (dlg, winpt_strerror (WPTERR_CLIP_ISEMPTY),
414                     _("Key Manager"), MB_ERR);
415          return WPTERR_CLIP_ISEMPTY;          return WPTERR_CLIP_ISEMPTY;
416      }      }
417      err = gpg_clip_is_secured (&pgptype, &has_data);      err = gpg_clip_is_secured (&pgptype, &has_data);
418      if (err)      if (err)
419          msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);          msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);
420      if (!has_data) {      if (!has_data) {
421          msg_box (dlg, _("No valid OpenPGP data found."), _("Key Manager"), MB_ERR);          msg_box (dlg, _("No valid OpenPGP data found."),
422                     _("Key Manager"), MB_ERR);
423          return WPTERR_GENERAL;          return WPTERR_GENERAL;
424      }      }
425      if (!(pgptype & PGP_PUBKEY) && !(pgptype & PGP_SECKEY)) {      if (!(pgptype & PGP_PUBKEY) && !(pgptype & PGP_SECKEY)) {
426          msg_box (dlg, _("No valid OpenPGP keys found."), _("Key Manager"), MB_ERR);          msg_box (dlg, _("No valid OpenPGP keys found."),
427                     _("Key Manager"), MB_ERR);
428          return WPTERR_GENERAL;          return WPTERR_GENERAL;
429      }      }
430      if (pgptype & PGP_DASH_ESCAPED) {      if (pgptype & PGP_DASH_ESCAPED) {
# Line 461  km_http_import (HWND dlg, const char *ur Line 469  km_http_import (HWND dlg, const char *ur
469      fp = fopen (p, "wb");      fp = fopen (p, "wb");
470      if (!fp) {      if (!fp) {
471          free_if_alloc (p);          free_if_alloc (p);
472          log_box (_("Key Import HTTP"), MB_ERR, "%s: %s", p, winpt_strerror (WPTERR_FILE_CREAT));          log_box (_("Key Import HTTP"), MB_ERR, "%s: %s", p,
473                     winpt_strerror (WPTERR_FILE_CREAT));
474          return WPTERR_FILE_CREAT;          return WPTERR_FILE_CREAT;
475      }      }
476    
# Line 530  km_file_import (HWND dlg, const char *fn Line 539  km_file_import (HWND dlg, const char *fn
539      if (res->secret_imported == 0 && fm_stat.import.has_seckey == 1)      if (res->secret_imported == 0 && fm_stat.import.has_seckey == 1)
540          res->secret_imported = 1;          res->secret_imported = 1;
541    
542        /* XXX: if we import a key pair but the secret key comes first,
543                no_{valid}_user_id is 1 even so the public key, which comes
544                later is valid and self-signed. */
545      print_import_status (res);      print_import_status (res);
546      if (res->no_user_id > 0) {      if (res->no_user_id > 0) {
547          msg_box (dlg, _("Key without a self signature was dectected!\n"          msg_box (dlg, _("Key without a self signature was dectected!\n"
# Line 571  km_delete_keys (listview_ctrl_t lv, HWND Line 583  km_delete_keys (listview_ctrl_t lv, HWND
583            
584      if (listview_get_curr_pos (lv) == -1) {      if (listview_get_curr_pos (lv) == -1) {
585          msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);          msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
586          return WPTERR_GENERAL;          return -1;
587      }      }
588                    
589      if (listview_count_items (lv, 1) > 8) {      if (listview_count_items (lv, 1) > 8) {
# Line 589  km_delete_keys (listview_ctrl_t lv, HWND Line 601  km_delete_keys (listview_ctrl_t lv, HWND
601      rset = (gpgme_key_t *)calloc (n+1, sizeof (gpgme_key_t));      rset = (gpgme_key_t *)calloc (n+1, sizeof (gpgme_key_t));
602      if (!rset)      if (!rset)
603          BUG (NULL);          BUG (NULL);
604      for( i = 0; i < n; i++ ) {      for (i = 0; i < n; i++) {
605          if( listview_get_item_state( lv, i ) ) {          if( listview_get_item_state(lv, i)) {
606              listview_get_item_text( lv, i, 0, uid, sizeof uid - 1 );              listview_get_item_text (lv, i, 0, uid, sizeof uid - 1);
607              listview_get_item_text( lv, i, 1, keyid, sizeof keyid - 1 );              listview_get_item_text (lv, i, 1, keyid, sizeof keyid - 1);
608              listview_get_item_text( lv, i, 3, keylen, sizeof keylen - 1 );              listview_get_item_text (lv, i, 3, keylen, sizeof keylen - 1);
609              listview_get_item_text( lv, i, 7, date, sizeof date - 1 );              listview_get_item_text (lv, i, 7, date, sizeof date - 1);
610              seckey_type = km_check_for_seckey (lv, i, NULL);              seckey_type = km_check_for_seckey (lv, i, NULL);
611              if (confirm && !seckey_type) {              if (confirm && !seckey_type) {
612                  rc = log_box( _("Key Manager"), MB_YESNO|MB_ICONWARNING,                  rc = log_box( _("Key Manager"), MB_YESNO|MB_ICONWARNING,
# Line 608  km_delete_keys (listview_ctrl_t lv, HWND Line 620  km_delete_keys (listview_ctrl_t lv, HWND
620                  with_seckey = 0;                  with_seckey = 0;
621              }              }
622              else if (confirm) {              else if (confirm) {
623                  rc = log_box( _("Key Manager"), MB_YESNO|MB_ICONWARNING,                                  rc = log_box (_("Key Manager"), MB_YESNO|MB_ICONWARNING,                
624                                _("Do you really want to delete this KEY PAIR?\n\n"                                _("Do you really want to delete this KEY PAIR?\n\n"
625                                  "Please remember that you are not able to decrypt\n"                                  "Please remember that you are not able to decrypt\n"
626                                  "messages you stored with this key any longer.\n"                                  "messages you stored with this key any longer.\n"
627                                  "\n"                                  "\n"
628                                  "pub/sec %s %s %s\n"                                  "pub/sec %s %s %s\n"
629                                  "  \"%s\""), keylen, keyid, date, uid );                                  "  \"%s\""), keylen, keyid, date, uid);
630                  if( rc == IDYES ) {                  if( rc == IDYES ) {
631                      if (seckey_type == 2)                      if (seckey_type == 2)
632                          msg_box( dlg, _("The actual secret key is stored on a smartcard.\n"                          msg_box (dlg, _("The actual secret key is stored on a smartcard.\n"
633                                          "Only the public key and the secret key \n"                                          "Only the public key and the secret key \n"
634                                          "placeholder will be deleted.\n"), _("Key Manager"), MB_OK );                                          "placeholder will be deleted.\n"),
635                                            _("Key Manager"), MB_OK);
636                      get_pubkey (keyid, &k);                      get_pubkey (keyid, &k);
637                      rset[k_pos++] = k;                      rset[k_pos++] = k;
638                  }                  }
# Line 650  km_delete_keys (listview_ctrl_t lv, HWND Line 663  km_delete_keys (listview_ctrl_t lv, HWND
663              n--;              n--;
664      }      }
665      if (n == 0)      if (n == 0)
666          show_msg (dlg, 1500, _("GnuPG Status: Finished"));          show_msg (dlg, 1500, _("GnuPG Status: Finished"));      
667      gpgme_release (ctx);      gpgme_release (ctx);
668      listview_del_items (lv);      listview_del_items (lv);
669      delete_keys_from_cache (rset, k_pos);      delete_keys_from_cache (rset, k_pos);
# Line 660  km_delete_keys (listview_ctrl_t lv, HWND Line 673  km_delete_keys (listview_ctrl_t lv, HWND
673  }  }
674    
675    
676    /* Send the select key in @lv to the keyserver @host:@port. */
677  int  int
678  km_send_to_keyserver (listview_ctrl_t lv, HWND dlg, const char * host, u16 port)  km_send_to_keyserver (listview_ctrl_t lv, HWND dlg, const char *host, u16 port)
679  {  {
680      char keyid[32];      char keyid[32];
681      const char *t;      const char *t;
682      int id;      int id;
683            
684      id = listview_get_curr_pos( lv );      id = listview_get_curr_pos (lv);
685      if( id == -1 ) {      if (id == -1) {
686          msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );          msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
687          return WPTERR_GENERAL;          return WPTERR_GENERAL;
688      }      }
689    
690      listview_get_item_text( lv, id, 1, keyid, sizeof keyid - 1 );      listview_get_item_text (lv, id, 1, keyid, sizeof keyid - 1);
691      id = log_box (_("Key Manager"), MB_YESNO,      id = log_box (_("Key Manager"), MB_YESNO,
692                    _("Do you really want to send '%s' to keyserver %s?"),                    _("Do you really want to send '%s' to keyserver %s?"),
693                      keyid, host);                      keyid, host);
# Line 685  km_send_to_keyserver (listview_ctrl_t lv Line 699  km_send_to_keyserver (listview_ctrl_t lv
699      }      }
700    
701      return 0;      return 0;
702  } /* km_send_to_keyserver */  }
703    
704    
705  /* Send the selected key in @lv via MAPI to a mail recipient. */  /* Send the selected key in @lv via MAPI to a mail recipient. */
# Line 696  km_send_to_mail_recipient (listview_ctrl Line 710  km_send_to_mail_recipient (listview_ctrl
710      gpgme_ctx_t ctx=NULL;      gpgme_ctx_t ctx=NULL;
711      gpgme_data_t out;      gpgme_data_t out;
712      gpgme_error_t rc;      gpgme_error_t rc;
713      const char *s;      char keyid[32], tmp[128];
714      char keyid[32], tmp[192+256];      char *fname;
715      int pos;      int pos;
716    
717      if (listview_count_items (lv, 1 ) > 1) {      if (listview_count_items (lv, 1) > 1) {
718          msg_box (dlg, _("Please only select one key."),          msg_box (dlg, _("Please only select one key."),
719                   _("Key Manager"), MB_INFO|MB_OK);                   _("Key Manager"), MB_INFO|MB_OK);
720          return WPTERR_GENERAL;          return WPTERR_GENERAL;
# Line 710  km_send_to_mail_recipient (listview_ctrl Line 724  km_send_to_mail_recipient (listview_ctrl
724          msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);          msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
725          return WPTERR_GENERAL;          return WPTERR_GENERAL;
726      }      }
727      listview_get_item_text(lv, pos, 1, keyid, sizeof keyid-1);      listview_get_item_text(lv, pos, 1, keyid, sizeof (keyid)-1);
728      if (get_pubkey (keyid, &key))      if (get_pubkey (keyid, &key))
729          BUG (NULL);          BUG (NULL);
730      s = key->uids->name;  
731      GetTempPath (sizeof tmp-1, tmp);      GetTempPath (sizeof (tmp)-1, tmp);
732      strncat (tmp, s, sizeof tmp-200);      if (tmp[strlen (tmp)-1] == '\\')
733      strncat (tmp, ".asc", sizeof tmp-200);          tmp[strlen (tmp)-1] = 0;
734        fname = make_filename (tmp, key->uids->name, "asc");
735        for (pos=0; pos < (int)strlen (fname); pos++) {
736            if (fname[pos] == ' ')
737                fname[pos] = '_';
738        }
739    
740      rc = gpgme_new (&ctx);      rc = gpgme_new (&ctx);
741      if (rc)      if (rc)
# Line 730  km_send_to_mail_recipient (listview_ctrl Line 749  km_send_to_mail_recipient (listview_ctrl
749      if (rc)      if (rc)
750          msg_box (dlg, gpgme_strerror (rc), _("Key Manager"), MB_ERR);          msg_box (dlg, gpgme_strerror (rc), _("Key Manager"), MB_ERR);
751      else      else
752          mapi_send_pubkey (keyid, tmp);          mapi_send_pubkey (keyid, fname);
753    
754      gpg_data_release_and_set_file (out, tmp);      gpg_data_release_and_set_file (out, fname);
755      gpgme_release (ctx);      gpgme_release (ctx);
756        free_if_alloc (fname);
757      return rc;      return rc;
758  }  }
759    
# Line 749  km_refresh_one_key (listview_ctrl_t lv, Line 769  km_refresh_one_key (listview_ctrl_t lv,
769          idx = pos;          idx = pos;
770      else      else
771          idx = listview_get_curr_pos (lv);          idx = listview_get_curr_pos (lv);
772      if (idx != -1)      if (idx != -1) {
773      {          listview_get_item_text (lv, idx, 1, keyid, sizeof (keyid) - 1);
         listview_get_item_text (lv, idx, 1, keyid, sizeof keyid - 1);  
774          t = keyid;          t = keyid;
775          if (!strncmp (keyid, "0x", 2))          if (!strncmp (keyid, "0x", 2))
776              t += 2;              t += 2;
777          hkp_recv_key (dlg, default_keyserver, default_keyserver_port, t, 0, KM_KS_REFRESH);          hkp_recv_key (dlg, default_keyserver, default_keyserver_port,
778                          t, 0, KM_KS_REFRESH);
779      }      }
780  }  }
781    
782    
783    /* Refresh all keys from the default keyserver. */
784  void  void
785  km_refresh_from_keyserver (listview_ctrl_t lv, HWND dlg)  km_refresh_from_keyserver (listview_ctrl_t lv, HWND dlg)
786  {  {
# Line 773  km_refresh_from_keyserver (listview_ctrl Line 794  km_refresh_from_keyserver (listview_ctrl
794      }      }
795      idx = listview_count_items (lv, 0);      idx = listview_count_items (lv, 0);
796      if (listview_count_items (lv, 1) == idx) {      if (listview_count_items (lv, 1) == idx) {
797          id = msg_box (dlg, _("Do you really want to refresh all keys in the keyring?"), _("Key Manager"), MB_YESNO);          id = msg_box (dlg, _("Do you really want to refresh all keys in the keyring?"),
798                          _("Key Manager"), MB_YESNO);
799          if (id == IDNO)          if (id == IDNO)
800              return;              return;
801          for (i = 0; i < idx; i++)          for (i = 0; i < idx; i++)
# Line 787  km_refresh_from_keyserver (listview_ctrl Line 809  km_refresh_from_keyserver (listview_ctrl
809                  km_refresh_one_key (lv, dlg, i);                  km_refresh_one_key (lv, dlg, i);
810          }          }
811      }      }
812  } /* km_refresh_from_keyserver */  }
813    
814    
815  void  void
# Line 797  km_set_clip_info (const char *uid) Line 819  km_set_clip_info (const char *uid)
819            
820      key_get_clip_info (uid, buf, 255);          key_get_clip_info (uid, buf, 255);    
821      set_clip_text (NULL, buf, strlen (buf));      set_clip_text (NULL, buf, strlen (buf));
822  } /* km_set_clip_info */  }
823    
824    
825    
# Line 843  km_update_default_key_str (HWND dlg) Line 865  km_update_default_key_str (HWND dlg)
865    
866  /* Count all keys and show from @lv results in the status bar @sb. */  /* Count all keys and show from @lv results in the status bar @sb. */
867  void  void
868  km_complete_status_bar (HWND sb, listview_ctrl_t lv)  km_update_status_bar (HWND sb, listview_ctrl_t lv)
869  {  {
870      char txt_sec[128], txt_pub[128];      char txt_sec[128], txt_pub[128];
871      int nkeys = 0, nsec = 0, i;      int nkeys = 0, nsec = 0;
872        int i;
873    
874      nkeys = listview_count_items (lv, 0);      nkeys = listview_count_items (lv, 0);
875      for (i = 0; i < nkeys; i++) {      for (i = 0; i < nkeys; i++) {
# Line 911  km_find_key (HWND dlg, listview_ctrl_t l Line 934  km_find_key (HWND dlg, listview_ctrl_t l
934      }      }
935      free_if_alloc (name);      free_if_alloc (name);
936  }  }
   
   
   
 void  
 km_dump_key (gpgme_key_t key)  
 {  
 #if _DEBUG  
     log_box ("DEBUG", MB_OK,  
              "%d %d %s %d\n%s", key->subkeys->length,  
              key->subkeys->pubkey_algo,  
              key->subkeys->keyid,  
              key->subkeys->timestamp,  
              key->uids->uid);  
 #endif  
 }  
   
 #if 0  
 gpg_optfile_t  
 km_groupdb_open (void)  
 {        
     gpg_optfile_t opt;  
     char * optfile;  
     int err = 0;  
       
     optfile = get_gnupg_cfgfile();  
     if( !optfile )  
         BUG( NULL );  
     if( parse_gpg_options( optfile, &opt ) )  
         err = 1;  
     free_if_alloc( optfile );  
     return err? NULL : opt;  
 } /* km_groupdb_open */  
   
   
 int  
 km_groupdb_expand_recipients( const char *name, gpgme_recipients_t rset )  
 {    
     gpg_keycache_t kc;  
     gpgme_key_t pk;  
     gpg_optfile_t opt;  
     gpg_group_t grp;      
     gpg_member_t mbr;  
     int no_trust = 0, n;  
   
     kc = keycache_get_ctx( 1 );  
     if( !kc )  
         BUG( NULL );  
   
     opt = km_groupdb_open( );  
     if( !opt )  
         return WPTERR_FILE_OPEN;  
       
     grp = find_group( opt, name );  
     if( !grp )  
         return WPTERR_GENERAL;  
       
     /* we are paranoid and check that all group members exist in the  
        key cache. there is no need that it is really the real key, but  
        an entry should be available. the rest is up to GPG. */  
     for( mbr = grp->list; mbr; mbr = mbr->next ) {  
         if( gpgme_keycache_find_key( kc, mbr->name, 0, &pk ) )  
             BUG( NULL );  
         n = count_userids (pk);  
         while( n-- ) {  
             gpgme_user_id_t u = get_nth_userid (pk, n);  
             const char * s =  u->uid;  
             if( s && stristr( s, mbr->name )  
                 && u->validity < 3 )  
                 no_trust++;  
         }  
     }  
   
     gpgme_recipients_add_name( rset, name );  
     release_gpg_options( opt );  
       
     return no_trust;  
 } /* km_groupdb_expand_recipients */  
   
   
 static HTREEITEM  
 km_tv_insert_item( HWND tree, HTREEITEM parent, const char *text )  
 {  
     TVINSERTSTRUCT tvis;  
     HTREEITEM node;  
       
     memset( &tvis, 0, sizeof tvis );  
     tvis.hParent = parent;  
     tvis.hInsertAfter = TVI_LAST;  
     tvis.item.mask = TVIF_TEXT;  
     tvis.item.pszText = (char *)text;  
     node = TreeView_InsertItem( tree, &tvis );  
     return node;  
 } /* km_tv_insert_item */  
   
   
 int  
 km_groups_new( km_group_t *r_gc, HWND ctrl )  
 {  
     km_group_t gc;  
       
     gc = new km_group_s;  
     if (!gc)  
         BUG (NULL);  
     gc->tree = ctrl;  
     gc->gh = km_groupdb_open ();  
     *r_gc = gc;  
     return 0;  
 } /* km_groups_new */  
   
   
 void  
 km_groups_sync( km_group_t gc )  
 {  
     char * optfile;  
   
     optfile = get_gnupg_cfgfile ();  
     if( !optfile )  
         BUG( NULL );  
     commit_gpg_options( optfile, gc->gh );  
     free_if_alloc( optfile );  
     gc->need_sync = 0;  
 } /* km_groups_sync */  
   
   
 void  
 km_groups_release (km_group_t gc)  
 {  
     if( gc ) {  
         /* xxx: this reset the default key (sync=1) */  
         gc->need_sync=0;  
         if (gc->need_sync)  
             km_groups_sync (gc);  
         if (gc->gh)  
             release_gpg_options( gc->gh );  
         gc->gh = NULL;  
         gc->tree = NULL;  
         delete gc;  
     }      
 } /* km_groups_release */  
   
   
 int  
 km_groups_load( km_group_t gc )  
 {      
     HTREEITEM n;  
     gpg_group_t grp, g;  
     gpg_member_t mbr;  
     u32 gid = 0;  
       
     if( !gc->gh )  
         return 0;  
     grp = gc->gh->grp;  
     if( !grp )  
         return 0; /* no groups */  
           
     for( g = grp; g; g = g->next ) {  
         n = km_tv_insert_item( gc->tree, NULL, g->name );  
         for( mbr = g->list; mbr; mbr = mbr->next ) {  
             if( mbr->used && mbr->name )  
                 km_tv_insert_item( gc->tree, n, mbr->name );  
         }  
     }  
     DragAcceptFiles( gc->tree, TRUE );  
     gc->need_sync = 0;  
     return 0;  
 } /* km_groups_load */  
   
   
 int  
 km_groups_add( km_group_t gc, listview_ctrl_t lv, int km_index )  
 {  
     TVITEM tvi;  
     char uid[128], valid[64], text[128];  
     int i_valid;  
       
     memset( &tvi, 0, sizeof tvi );  
     tvi.hItem = TreeView_GetSelection( gc->tree );  
     tvi.pszText = text;  
     tvi.cchTextMax = sizeof text -1;  
     tvi.mask = TVIF_TEXT;  
     TreeView_GetItem( gc->tree, &tvi );  
       
       
     listview_get_item_text( lv, km_index, 0, uid, sizeof uid -1 );  
     listview_get_item_text( lv, km_index, 5, valid, sizeof valid -1 );  
       
     if( strstr( valid, "Ultimate" ) )  
         i_valid = 5;      
     else if( !strstr( valid, "Full" ) )  
         i_valid = 4;  
     else if( !strstr( valid, "Marginal" ) )  
         i_valid = 3;  
     else  
         i_valid = 0;  
       
     /* we can't add the full name. one way would be to use the first  
        text until a space appears.  
     group_add_entry(&gc->gh, gid, i_valid, uid);  
     treeview_add_item(gc->tree, tvi.hItem, uid);  
     */  
     gc->need_sync = 1;  
       
     return 0;  
 } /* km_groups_add */  
   
   
 static int  
 km_groups_del_main( km_group_t gc )  
 {  
     TVITEM tvi;  
     char text[128];  
     int id;  
       
     memset( &tvi, 0, sizeof tvi );  
     tvi.hItem = TreeView_GetSelection( gc->tree );  
     tvi.pszText = text;  
     tvi.cchTextMax = sizeof text -1;  
     tvi.mask = TVIF_TEXT;  
     TreeView_GetItem( gc->tree, &tvi );  
                               
     id = log_box( _("Key Manager"), MB_INFO_ASK,  
                    _("Do you really want to delete this group?\n\n%s"), text);  
     if( id == IDNO )  
         return 0;  
     delete_group( gc->gh, text );      
     TreeView_DeleteItem( gc->tree, &tvi );  
     gc->need_sync = 1;  
       
     return 0;  
 } /* km_groups_del */  
   
   
 static int  
 km_groups_del_entry( km_group_t gc )  
 {  
     TVITEM tvi;  
     HTREEITEM root;  
     int id;  
     char text[128], info[256];  
     gpg_group_t  grp = NULL;  
       
     memset( &tvi, 0, sizeof tvi );  
     tvi.hItem = TreeView_GetSelection( gc->tree );  
     tvi.pszText = text;  
     tvi.cchTextMax = sizeof text-1;  
     tvi.mask = TVIF_TEXT;  
     TreeView_GetItem( gc->tree, &tvi );  
       
     _snprintf( info, sizeof info -1,  
               _("Do you really want to delete this entry?\n\n%s"), text );  
       
     id = msg_box( gc->tree, info, _("Key Manager"), MB_INFO_ASK );  
     if( id == IDNO )  
         return 0;  
   
     root = TreeView_GetParent( gc->tree, tvi.hItem );  
     if( root ) {  
     }  
       
     delete_member( gc->gh, /*fixme*/NULL, text );  
     TreeView_DeleteItem( gc->tree, &tvi );  
     gc->need_sync = 1;  
     return 0;  
 } /* km_groups_del_entry */  
   
   
 int  
 km_groups_del( km_group_t gc )  
 {  
     if ( TreeView_GetParent( gc->tree, TreeView_GetSelection( gc->tree ) ) )  
         return km_groups_del_entry( gc );  
     else  
         return km_groups_del_main( gc );  
 } /* km_groups_del */  
 #endif  

Legend:
Removed from v.77  
changed lines
  Added in v.123

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26