1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-04-17 15:44:34 +02:00

gpg: Skip legacy keys while searching keyrings.

* g10/getkey.c (search_modes_are_fingerprint): New.
(lookup): Skip over legacy keys.
--

GnuPG-bug-id: 1847
Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2015-02-23 16:37:57 +01:00
parent d9f6eea611
commit a8116aacd9
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B

View File

@ -2525,6 +2525,29 @@ found:
} }
/* Return true if all the search modes are fingerprints. */
static int
search_modes_are_fingerprint (getkey_ctx_t ctx)
{
size_t n, found;
for (n=found=0; n < ctx->nitems; n++)
{
switch (ctx->items[n].mode)
{
case KEYDB_SEARCH_MODE_FPR16:
case KEYDB_SEARCH_MODE_FPR20:
case KEYDB_SEARCH_MODE_FPR:
found++;
break;
default:
break;
}
}
return found && found == ctx->nitems;
}
/* The main function to lookup a key. On success the found keyblock /* The main function to lookup a key. On success the found keyblock
is stored at RET_KEYBLOCK and also in CTX. If WANT_SECRET is true is stored at RET_KEYBLOCK and also in CTX. If WANT_SECRET is true
a corresponding secret key is required. */ a corresponding secret key is required. */
@ -2534,9 +2557,21 @@ lookup (getkey_ctx_t ctx, kbnode_t *ret_keyblock, int want_secret)
int rc; int rc;
int no_suitable_key = 0; int no_suitable_key = 0;
rc = 0; for (;;)
while (!(rc = keydb_search (ctx->kr_handle, ctx->items, ctx->nitems, NULL)))
{ {
rc = keydb_search (ctx->kr_handle, ctx->items, ctx->nitems, NULL);
/* Skip over all legacy keys but only if they are not requested
by fingerprints.
Fixme: The lower level keydb code should actually do that but
then it would be harder to report the number of skipped
legacy keys during import. */
if (gpg_err_code (rc) == GPG_ERR_LEGACY_KEY
&& !(ctx->nitems && ctx->items->mode == KEYDB_SEARCH_MODE_FIRST)
&& !search_modes_are_fingerprint (ctx))
continue;
if (rc)
break;
/* If we are searching for the first key we have to make sure /* If we are searching for the first key we have to make sure
that the next iteration does not do an implicit reset. that the next iteration does not do an implicit reset.
This can be triggered by an empty key ring. */ This can be triggered by an empty key ring. */