aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shaw <[email protected]>2003-09-23 23:14:03 +0000
committerDavid Shaw <[email protected]>2003-09-23 23:14:03 +0000
commit4ccd51cb50bea330ce44b47d2bc96dd263ab6d23 (patch)
treeb336700e29edad7fb42ab4d33bc0e4128893a6ec
parent* g10.c (main): Deprecate --default-comment in favor of --no-comments. (diff)
downloadgnupg-4ccd51cb50bea330ce44b47d2bc96dd263ab6d23.tar.gz
gnupg-4ccd51cb50bea330ce44b47d2bc96dd263ab6d23.zip
* keydb.h, keyring.c (keyring_search), trustdb.c (search_skipfnc): Expand
the skipfnc to include a pointer to the user ID that matched. * getkey.c (skip_disabled): Rename to skip_unusable, and add checks for expired or revoked user IDs.
-rw-r--r--g10/ChangeLog9
-rw-r--r--g10/getkey.c52
-rw-r--r--g10/keydb.h4
-rw-r--r--g10/keyring.c2
-rw-r--r--g10/trustdb.c2
5 files changed, 49 insertions, 20 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index 6bf4c7d61..fbbf81fdb 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,12 @@
+2003-09-23 David Shaw <[email protected]>
+
+ * keydb.h, keyring.c (keyring_search), trustdb.c (search_skipfnc):
+ Expand the skipfnc to include a pointer to the user ID that
+ matched.
+
+ * getkey.c (skip_disabled): Rename to skip_unusable, and add
+ checks for expired or revoked user IDs.
+
2003-09-22 David Shaw <[email protected]>
* g10.c (main): Deprecate --default-comment in favor of
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;
}
diff --git a/g10/keydb.h b/g10/keydb.h
index 7be5e7fff..216add2e9 100644
--- a/g10/keydb.h
+++ b/g10/keydb.h
@@ -131,7 +131,7 @@ typedef enum {
struct keydb_search_desc {
KeydbSearchMode mode;
- int (*skipfnc)(void *,u32*);
+ int (*skipfnc)(void *,u32*,PKT_user_id*);
void *skipfncvalue;
union {
const char *name;
@@ -201,7 +201,7 @@ int get_pubkey_fast ( PKT_public_key *pk, u32 *keyid );
KBNODE get_pubkeyblock( u32 *keyid );
int get_pubkey_byname( PKT_public_key *pk, const char *name,
KBNODE *ret_keyblock, KEYDB_HANDLE *ret_kdbhd,
- int include_disabled );
+ int include_unusable );
int get_pubkey_bynames( GETKEY_CTX *rx, PKT_public_key *pk,
STRLIST names, KBNODE *ret_keyblock );
int get_pubkey_next( GETKEY_CTX ctx, PKT_public_key *pk, KBNODE *ret_keyblock );
diff --git a/g10/keyring.c b/g10/keyring.c
index a18cbbad2..8004e3752 100644
--- a/g10/keyring.c
+++ b/g10/keyring.c
@@ -1083,7 +1083,7 @@ keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
for (n=any_skip?0:ndesc; n < ndesc; n++)
{
if (desc[n].skipfnc
- && desc[n].skipfnc (desc[n].skipfncvalue, aki))
+ && desc[n].skipfnc (desc[n].skipfncvalue, aki, uid))
break;
}
if (n == ndesc)
diff --git a/g10/trustdb.c b/g10/trustdb.c
index 289af8d29..9e152a9c1 100644
--- a/g10/trustdb.c
+++ b/g10/trustdb.c
@@ -1714,7 +1714,7 @@ validate_one_keyblock (KBNODE kb, struct key_item *klist,
static int
-search_skipfnc (void *opaque, u32 *kid)
+search_skipfnc (void *opaque, u32 *kid, PKT_user_id *dummy)
{
return test_key_hash_table ((KeyHashTable)opaque, kid);
}