mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
gpg: New option --list-filter
* g10/gpg.c (oListFilter): New. (opts): Add --list-filter. (main): Parse oListFilter. * g10/keylist.c: Include init.h and recsel.h. (struct list_filter_s, list_filter): New. (release_list_filter): New. (cleanup_keylist_globals): New. (parse_and_set_list_filter): New. (list_keyblock): Implement --list-filter type "select". * g10/import.c (impex_filter_getval): Add scope support and new property names "key-size", "algostr", "origin", "lastupd", and "url". -- This option is pretty useful to select keys based on their properties. The scope thing can be sued to limit a selection to just the primary key or to subkeys. For example: gpg -k --list-filter 'select=revoked-f && sub/algostr=ed25519' Lists all non-revoked keys with an ed25519 (signing)-subkey.
This commit is contained in:
parent
d70779bdc6
commit
1324dc3490
7 changed files with 204 additions and 14 deletions
71
g10/import.c
71
g10/import.c
|
@ -1430,7 +1430,8 @@ check_prefs (ctrl_t ctrl, kbnode_t keyblock)
|
|||
}
|
||||
|
||||
|
||||
/* Helper for apply_*_filter in import.c and export.c. */
|
||||
/* Helper for apply_*_filter in import.c and export.c and also used by
|
||||
* keylist.c. */
|
||||
const char *
|
||||
impex_filter_getval (void *cookie, const char *propname)
|
||||
{
|
||||
|
@ -1440,11 +1441,32 @@ impex_filter_getval (void *cookie, const char *propname)
|
|||
kbnode_t node = parm->node;
|
||||
static char numbuf[20];
|
||||
const char *result;
|
||||
const char *s;
|
||||
enum { scpNone = 0, scpPub, scpSub, scpUid, scpSig} scope = 0;
|
||||
|
||||
log_assert (ctrl && ctrl->magic == SERVER_CONTROL_MAGIC);
|
||||
|
||||
if (node->pkt->pkttype == PKT_USER_ID
|
||||
|| node->pkt->pkttype == PKT_ATTRIBUTE)
|
||||
/* We allow a prefix delimited by a slash to limit the scope of the
|
||||
* keyword. Note that "pub" also includes "sec" and "sub" includes
|
||||
* "ssb". */
|
||||
if ((s=strchr (propname, '/')) && s != propname)
|
||||
{
|
||||
size_t n = s - propname;
|
||||
if (!strncmp (propname, "pub", n))
|
||||
scope = scpPub;
|
||||
else if (!strncmp (propname, "sub", n))
|
||||
scope = scpSub;
|
||||
else if (!strncmp (propname, "uid", n))
|
||||
scope = scpUid;
|
||||
else if (!strncmp (propname, "sig", n))
|
||||
scope = scpSig;
|
||||
|
||||
propname = s + 1;
|
||||
}
|
||||
|
||||
if ((node->pkt->pkttype == PKT_USER_ID
|
||||
|| node->pkt->pkttype == PKT_ATTRIBUTE)
|
||||
&& (!scope || scope == scpUid))
|
||||
{
|
||||
PKT_user_id *uid = node->pkt->pkt.user_id;
|
||||
|
||||
|
@ -1473,7 +1495,8 @@ impex_filter_getval (void *cookie, const char *propname)
|
|||
else
|
||||
result = NULL;
|
||||
}
|
||||
else if (node->pkt->pkttype == PKT_SIGNATURE)
|
||||
else if (node->pkt->pkttype == PKT_SIGNATURE
|
||||
&& (!scope || scope == scpSig))
|
||||
{
|
||||
PKT_signature *sig = node->pkt->pkt.signature;
|
||||
|
||||
|
@ -1503,10 +1526,12 @@ impex_filter_getval (void *cookie, const char *propname)
|
|||
else
|
||||
result = NULL;
|
||||
}
|
||||
else if (node->pkt->pkttype == PKT_PUBLIC_KEY
|
||||
|| node->pkt->pkttype == PKT_SECRET_KEY
|
||||
|| node->pkt->pkttype == PKT_PUBLIC_SUBKEY
|
||||
|| node->pkt->pkttype == PKT_SECRET_SUBKEY)
|
||||
else if (((node->pkt->pkttype == PKT_PUBLIC_KEY
|
||||
|| node->pkt->pkttype == PKT_SECRET_KEY)
|
||||
&& (!scope || scope == scpPub))
|
||||
|| ((node->pkt->pkttype == PKT_PUBLIC_SUBKEY
|
||||
|| node->pkt->pkttype == PKT_SECRET_SUBKEY)
|
||||
&& (!scope || scope == scpSub)))
|
||||
{
|
||||
PKT_public_key *pk = node->pkt->pkt.public_key;
|
||||
|
||||
|
@ -1520,6 +1545,16 @@ impex_filter_getval (void *cookie, const char *propname)
|
|||
snprintf (numbuf, sizeof numbuf, "%d", pk->pubkey_algo);
|
||||
result = numbuf;
|
||||
}
|
||||
else if (!strcmp (propname, "key_size"))
|
||||
{
|
||||
snprintf (numbuf, sizeof numbuf, "%u", nbits_from_pk (pk));
|
||||
result = numbuf;
|
||||
}
|
||||
else if (!strcmp (propname, "algostr"))
|
||||
{
|
||||
pubkey_string (pk, parm->hexfpr, sizeof parm->hexfpr);
|
||||
result = parm->hexfpr;
|
||||
}
|
||||
else if (!strcmp (propname, "key_created"))
|
||||
{
|
||||
snprintf (numbuf, sizeof numbuf, "%lu", (ulong)pk->timestamp);
|
||||
|
@ -1556,6 +1591,26 @@ impex_filter_getval (void *cookie, const char *propname)
|
|||
hexfingerprint (pk, parm->hexfpr, sizeof parm->hexfpr);
|
||||
result = parm->hexfpr;
|
||||
}
|
||||
else if (!strcmp (propname, "origin"))
|
||||
{
|
||||
result = key_origin_string (pk->keyorg);
|
||||
}
|
||||
else if (!strcmp (propname, "lastupd"))
|
||||
{
|
||||
snprintf (numbuf, sizeof numbuf, "%lu", (ulong)pk->keyupdate);
|
||||
result = numbuf;
|
||||
}
|
||||
else if (!strcmp (propname, "url"))
|
||||
{
|
||||
if (pk->updateurl && *pk->updateurl)
|
||||
{
|
||||
/* Fixme: This might get truncated. */
|
||||
mem2str (parm->hexfpr, pk->updateurl, sizeof parm->hexfpr);
|
||||
result = parm->hexfpr;
|
||||
}
|
||||
else
|
||||
result = "";
|
||||
}
|
||||
else
|
||||
result = NULL;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue