aboutsummaryrefslogtreecommitdiffstats
path: root/gpgme/keylist.c
diff options
context:
space:
mode:
Diffstat (limited to 'gpgme/keylist.c')
-rw-r--r--gpgme/keylist.c116
1 files changed, 79 insertions, 37 deletions
diff --git a/gpgme/keylist.c b/gpgme/keylist.c
index cbd7cb48..5cb124e4 100644
--- a/gpgme/keylist.c
+++ b/gpgme/keylist.c
@@ -91,14 +91,14 @@ parse_timestamp ( char *p )
static void
-set_trust_info ( GpgmeKey key, const char *s )
+set_mainkey_trust_info ( GpgmeKey key, const char *s )
{
/* look at letters and stop at the first digit */
for (; *s && !my_isdigit (*s); s++ ) {
switch (*s) {
- case 'e': key->flags.expired = 1; break;
- case 'r': key->flags.revoked = 1; break;
- case 'd': key->flags.disabled = 1; break;
+ case 'e': key->keys.flags.expired = 1; break;
+ case 'r': key->keys.flags.revoked = 1; break;
+ case 'd': key->keys.flags.disabled = 1; break;
case 'n': key->uids->validity = 1; break;
case 'm': key->uids->validity = 2; break;
case 'f': key->uids->validity = 3; break;
@@ -107,6 +107,19 @@ set_trust_info ( GpgmeKey key, const char *s )
}
}
+static void
+set_subkey_trust_info ( struct subkey_s *k, const char *s )
+{
+ /* look at letters and stop at the first digit */
+ for (; *s && !my_isdigit (*s); s++ ) {
+ switch (*s) {
+ case 'e': k->flags.expired = 1; break;
+ case 'r': k->flags.revoked = 1; break;
+ case 'd': k->flags.disabled = 1; break;
+ }
+ }
+}
+
/* Note: we are allowed to modify line */
static void
@@ -120,15 +133,13 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
GpgmeKey key = ctx->tmp_key;
int i;
const char *trust_info = NULL;
-
+ struct subkey_s *sk = NULL;
if ( ctx->out_of_core )
return;
if (!line)
return; /* EOF */
- /*fprintf (stderr, "line=`%s'\n", line );*/
-
for (p = line; p; p = pend) {
field++;
pend = strchr (p, ':');
@@ -142,8 +153,14 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
rectype = RT_UID;
key = ctx->tmp_key;
}
- else if ( !strcmp ( p, "sub" ) )
+ else if ( !strcmp ( p, "sub" ) && key ) {
+ /* start a new subkey */
rectype = RT_SUB;
+ if ( !(sk = _gpgme_key_add_subkey (key)) ) {
+ ctx->out_of_core=1;
+ return;
+ }
+ }
else if ( !strcmp ( p, "pub" ) ) {
/* start a new keyblock */
if ( _gpgme_key_new ( &key ) ) {
@@ -166,28 +183,27 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
rectype = RT_NONE;
}
- else if ( rectype == RT_PUB /*|| rectype == RT_SUB*/ ) {
+ else if ( rectype == RT_PUB ) {
switch (field) {
case 2: /* trust info */
- if ( rectype == RT_PUB )
- trust_info = p; /*save for later */
+ trust_info = p; /*save for later */
break;
case 3: /* key length */
i = atoi (p);
if ( i > 1 ) /* ignore invalid values */
- key->key_len = i;
+ key->keys.key_len = i;
break;
case 4: /* pubkey algo */
i = atoi (p);
if ( i > 1 && i < 128 )
- key->key_algo = i;
+ key->keys.key_algo = i;
break;
case 5: /* long keyid */
- if ( strlen (p) == DIM(key->keyid)-1 )
- strcpy (key->keyid, p);
+ if ( strlen (p) == DIM(key->keys.keyid)-1 )
+ strcpy (key->keys.keyid, p);
break;
case 6: /* timestamp (1998-02-28) */
- key->timestamp = parse_timestamp (p);
+ key->keys.timestamp = parse_timestamp (p);
break;
case 7: /* valid for n days */
break;
@@ -196,13 +212,11 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
case 9: /* ownertrust */
break;
case 10: /* This is the first name listed */
- if ( rectype == RT_PUB ) {
- if ( _gpgme_key_append_name ( key, p) )
- ctx->out_of_core = 1;
- else {
- if (trust_info)
- set_trust_info (key, trust_info);
- }
+ if ( _gpgme_key_append_name ( key, p) )
+ ctx->out_of_core = 1;
+ else {
+ if (trust_info)
+ set_mainkey_trust_info (key, trust_info);
}
break;
case 11: /* signature class */
@@ -212,6 +226,43 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
break;
}
}
+ else if ( rectype == RT_SUB && sk ) {
+ switch (field) {
+ case 2: /* trust info */
+ set_subkey_trust_info ( sk, p);
+ break;
+ case 3: /* key length */
+ i = atoi (p);
+ if ( i > 1 ) /* ignore invalid values */
+ sk->key_len = i;
+ break;
+ case 4: /* pubkey algo */
+ i = atoi (p);
+ if ( i > 1 && i < 128 )
+ sk->key_algo = i;
+ break;
+ case 5: /* long keyid */
+ if ( strlen (p) == DIM(sk->keyid)-1 )
+ strcpy (sk->keyid, p);
+ break;
+ case 6: /* timestamp (1998-02-28) */
+ sk->timestamp = parse_timestamp (p);
+ break;
+ case 7: /* valid for n days */
+ break;
+ case 8: /* reserved (LID) */
+ break;
+ case 9: /* ownertrust */
+ break;
+ case 10:/* user ID n/a for a subkey */
+ break;
+ case 11: /* signature class */
+ break;
+ case 12:
+ pend = NULL; /* we can stop here */
+ break;
+ }
+ }
else if ( rectype == RT_UID ) {
switch (field) {
case 2: /* trust info */
@@ -222,7 +273,7 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
ctx->out_of_core = 1;
else {
if (trust_info)
- set_trust_info (key, trust_info);
+ set_mainkey_trust_info (key, trust_info);
}
pend = NULL; /* we can stop here */
break;
@@ -231,9 +282,9 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
else if ( rectype == RT_FPR ) {
switch (field) {
case 10: /* fingerprint (take only the first one)*/
- if ( !key->fingerprint && *p ) {
- key->fingerprint = xtrystrdup (p);
- if ( !key->fingerprint )
+ if ( !key->keys.fingerprint && *p ) {
+ key->keys.fingerprint = xtrystrdup (p);
+ if ( !key->keys.fingerprint )
ctx->out_of_core = 1;
}
pend = NULL; /* that is all we want */
@@ -266,7 +317,7 @@ finish_key ( GpgmeCtx ctx )
}
q->key = key;
q->next = NULL;
- /* fixme: lock queue */
+ /* fixme: lock queue. Use a tail pointer? */
if ( !(q2 = ctx->key_queue) )
ctx->key_queue = q;
else {
@@ -373,12 +424,3 @@ gpgme_op_keylist_next ( GpgmeCtx c, GpgmeKey *r_key )
-
-
-
-
-
-
-
-
-