--- gpgme-1.1.6/gpgme/ChangeLog +++ gpgme-r1301/gpgme/ChangeLog @@ -1,3 +1,12 @@ +2008-01-28 Werner Koch + + * keylist.c (gpgme_get_key): Skip duplicated keys. Fixes bug 876. + +2008-01-14 Marcus Brinkmann + + * engine-gpgconf.c (gpgconf_config_load_cb): Fix program_name + field. + 2008-01-04 Marcus Brinkmann * Makefile.am (gpgconf_components): New variable. --- gpgme-1.1.6/gpgme/engine-gpgconf.c +++ gpgme-r1301/gpgme/engine-gpgconf.c @@ -313,8 +310,8 @@ gpgconf_config_load_cb (void *hook, char if (fields >= 3) { - comp->description = strdup (field[2]); - if (!comp->description) + comp->program_name = strdup (field[2]); + if (!comp->program_name) return gpg_error_from_syserror (); } @@ -457,9 +454,18 @@ gpgconf_config_load_cb2 (void *hook, cha return gpg_error_from_syserror (); } - err = gpgconf_parse_option (opt, &opt->no_arg_value, field[8]); - if (err) - return err; + if (opt->flags & GPGME_CONF_NO_ARG_DESC) + { + opt->no_arg_description = strdup (field[8]); + if (!opt->no_arg_description) + return gpg_error_from_syserror (); + } + else + { + err = gpgconf_parse_option (opt, &opt->no_arg_value, field[8]); + if (err) + return err; + } err = gpgconf_parse_option (opt, &opt->value, field[9]); if (err) --- gpgme-1.1.6/gpgme/keylist.c +++ gpgme-r1301/gpgme/keylist.c @@ -964,11 +964,26 @@ gpgme_get_key (gpgme_ctx_t ctx, const ch err = gpgme_op_keylist_next (listctx, r_key); if (!err) { + try_next_key: err = gpgme_op_keylist_next (listctx, &key); if (gpgme_err_code (err) == GPG_ERR_EOF) - err = gpg_error (GPG_ERR_NO_ERROR); + err = 0; else { + if (!err + && *r_key && (*r_key)->subkeys && (*r_key)->subkeys->fpr + && key && key->subkeys && key->subkeys->fpr + && !strcmp ((*r_key)->subkeys->fpr, key->subkeys->fpr)) + { + /* The fingerprint is identical. We assume that this is + the same key and don't mark it as an ambiguous. This + problem may occur with corrupted keyrings and has + been noticed often with gpgsm. In fact gpgsm uses a + similar hack to sort out such duplicates but it can't + do that while listing keys. */ + gpgme_key_unref (key); + goto try_next_key; + } if (!err) { gpgme_key_unref (key); --- gpgme-1.1.6/tests/ChangeLog +++ gpgme-r1301/tests/ChangeLog @@ -1,3 +1,20 @@ +2008-01-28 Marcus Brinkmann + + * gpg/Makefile.am (DISTCLEANFILES): Add pubring.kbx~. + +2008-01-10 Marcus Brinkmann + + * gpg/t-gpgconf.c (main): Allow for dirmngr not to be available. + + * gpg/Makefile.am (./gpg-agent.conf): Correct pinentry path. + + * gpg/pinentry: New file. + * gpg/Makefile.am (DISTCLEANFILES, all-local): Add gpg-agent.conf + (./gpg-agent.conf): New target. + (EXTRA_DIST): Add pinentry. + + * gpg/t-gpgconf.c (main): Exit early if compiled without gpgconf. + 2008-01-04 Marcus Brinkmann * gpg/Makefile.am (CLEANFILES): Add pubring.kbx and dirmngr.conf. --- gpgme-1.1.6/tests/gpg/Makefile.am +++ gpgme-r1301/tests/gpg/Makefile.am @@ -38,10 +38,10 @@ TESTS = t-encrypt t-encrypt-sym t-encryp t-encrypt-large t-file-name t-gpgconf $(tests_unix) CLEANFILES = secring.gpg pubring.gpg pubring.kbx trustdb.gpg dirmngr.conf -DISTCLEANFILES = pubring.gpg~ random_seed gpg.conf +DISTCLEANFILES = pubring.gpg~ pubring.kbx~ random_seed gpg.conf gpg-agent.conf EXTRA_DIST = mkdemodirs pubdemo.asc secdemo.asc cipher-1.asc cipher-2.asc \ - geheim.txt pubkey-1.asc seckey-1.asc + geheim.txt pubkey-1.asc seckey-1.asc pinentry INCLUDES = -I$(top_srcdir)/gpgme @@ -55,7 +55,7 @@ noinst_PROGRAMS = $(TESTS) t-genkey clean-local: $(srcdir)/mkdemodirs --clean -all-local: ./pubring.gpg ./gpg.conf +all-local: ./pubring.gpg ./gpg.conf ./gpg-agent.conf ./pubring.gpg: $(srcdir)/pubdemo.asc ./Alpha/Secret.gpg $(GPG) --homedir . --import $(srcdir)/pubdemo.asc @@ -68,3 +68,7 @@ all-local: ./pubring.gpg ./gpg.conf ./gpg.conf: # This is required for t-sig-notations. echo no-force-v3-sigs > ./gpg.conf + +./gpg-agent.conf: +# This is required for gpg2, which does not support command fd. + echo pinentry-program $(abs_srcdir)/pinentry > ./gpg-agent.conf --- gpgme-1.1.6/tests/gpg/pinentry +++ gpgme-r1301/tests/gpg/pinentry @@ -0,0 +1,22 @@ +#! /bin/bash +# Dummy pinentry +# +# Copyright 2008 g10 Code GmbH +# +# This file is free software; as a special exception the author gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# This file is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. + +echo OK Your orders please + +while read cmd; do + case $cmd in + GETPIN) echo D abc; echo OK;; + *) echo OK;; + esac +done --- gpgme-1.1.6/tests/gpg/t-gpgconf.c +++ gpgme-r1301/tests/gpg/t-gpgconf.c @@ -254,6 +254,11 @@ main (int argc, char **argv) gpgme_conf_comp_t conf; gpgme_conf_comp_t comp; int first; + +#ifndef ENABLE_GPGCONF + return 0; +#endif + init_gpgme (GPGME_PROTOCOL_GPGCONF); err = gpgme_new (&ctx); @@ -287,15 +292,23 @@ main (int argc, char **argv) comp = conf; while (comp && strcmp (comp->name, "dirmngr")) comp = comp->next; - opt = comp->options; - while (opt && strcmp (opt->name, "verbose")) - opt = opt->next; - err = gpgme_conf_opt_change (opt, 0, arg); - fail_if_err (err); - - err = gpgme_op_conf_save (ctx, comp); - fail_if_err (err); + if (comp) + { + opt = comp->options; + while (opt && strcmp (opt->name, "verbose")) + opt = opt->next; + + /* Allow for the verbose option not to be there. */ + if (opt) + { + err = gpgme_conf_opt_change (opt, 0, arg); + fail_if_err (err); + + err = gpgme_op_conf_save (ctx, comp); + fail_if_err (err); + } + } } #endif