diff options
Diffstat (limited to '')
-rw-r--r-- | g10/getkey.c | 52 |
1 files changed, 36 insertions, 16 deletions
diff --git a/g10/getkey.c b/g10/getkey.c index e2d2f3446..5e4ca44e2 100644 --- a/g10/getkey.c +++ b/g10/getkey.c @@ -726,24 +726,44 @@ classify_user_id( const char *name, KEYDB_SEARCH_DESC *desc ) static int -skip_disabled(void *dummy,u32 *keyid) +skip_unusable(void *dummy,u32 *keyid,PKT_user_id *uid) { - int rc,disabled=0; - PKT_public_key *pk=m_alloc_clear(sizeof(PKT_public_key)); + int unusable=0; + KBNODE keyblock; - rc = get_pubkey(pk, keyid); - if(rc) + keyblock=get_pubkeyblock(keyid); + if(!keyblock) { - log_error("error checking disabled status of %08lX: %s\n", - (ulong)keyid[1],g10_errstr(rc)); + log_error("error checking usability status of %08lX\n",(ulong)keyid[1]); goto leave; } - - disabled=pk_is_disabled(pk); + + /* Is the user ID in question revoked/expired? */ + if(uid) + { + KBNODE node; + + for(node=keyblock;node;node=node->next) + { + if(node->pkt->pkttype==PKT_USER_ID) + { + if(cmp_user_ids(uid,node->pkt->pkt.user_id)==0 + && (node->pkt->pkt.user_id->is_revoked + || node->pkt->pkt.user_id->is_expired)) + { + unusable=1; + break; + } + } + } + } + + if(!unusable) + unusable=pk_is_disabled(keyblock->pkt->pkt.public_key); leave: - free_public_key(pk); - return disabled; + release_kbnode(keyblock); + return unusable; } /**************** @@ -758,7 +778,7 @@ skip_disabled(void *dummy,u32 *keyid) static int key_byname( GETKEY_CTX *retctx, STRLIST namelist, PKT_public_key *pk, PKT_secret_key *sk, - int secmode, int include_disabled, + int secmode, int include_unusable, KBNODE *ret_kb, KEYDB_HANDLE *ret_kdbhd ) { int rc = 0; @@ -790,13 +810,13 @@ key_byname( GETKEY_CTX *retctx, STRLIST namelist, m_free (ctx); return G10ERR_INV_USER_ID; } - if(!include_disabled + if(!include_unusable && ctx->items[n].mode!=KEYDB_SEARCH_MODE_SHORT_KID && ctx->items[n].mode!=KEYDB_SEARCH_MODE_LONG_KID && ctx->items[n].mode!=KEYDB_SEARCH_MODE_FPR16 && ctx->items[n].mode!=KEYDB_SEARCH_MODE_FPR20 && ctx->items[n].mode!=KEYDB_SEARCH_MODE_FPR) - ctx->items[n].skipfnc=skip_disabled; + ctx->items[n].skipfnc=skip_unusable; } ctx->kr_handle = keydb_new (secmode); @@ -847,14 +867,14 @@ key_byname( GETKEY_CTX *retctx, STRLIST namelist, int get_pubkey_byname (PKT_public_key *pk, const char *name, KBNODE *ret_keyblock, - KEYDB_HANDLE *ret_kdbhd, int include_disabled ) + KEYDB_HANDLE *ret_kdbhd, int include_unusable ) { int rc; STRLIST namelist = NULL; add_to_strlist( &namelist, name ); rc = key_byname( NULL, namelist, pk, NULL, 0, - include_disabled, ret_keyblock, ret_kdbhd); + include_unusable, ret_keyblock, ret_kdbhd); free_strlist( namelist ); return rc; } |