Add a few key flags - needs the lates CVS gpg

This commit is contained in:
Werner Koch 2001-03-13 20:17:22 +00:00
parent be28316c35
commit ca12983e7c
9 changed files with 163 additions and 35 deletions

View File

@ -1,3 +1,7 @@
2001-02-28 Werner Koch <wk@gnupg.org>
Released 0.2.0.
2001-01-18 Werner Koch <wk@gnupg.org> 2001-01-18 Werner Koch <wk@gnupg.org>
* autogen.sh: Added option --build-w32. * autogen.sh: Added option --build-w32.

View File

@ -13,11 +13,11 @@ AM_MAINTAINER_MODE
# AGE, set REVISION to 0. # AGE, set REVISION to 0.
# 3. Interfaces removed (BAD, breaks upward compatibility): Increment # 3. Interfaces removed (BAD, breaks upward compatibility): Increment
# CURRENT, set AGE and REVISION to 0. # CURRENT, set AGE and REVISION to 0.
AM_INIT_AUTOMAKE(gpgme,0.1.4b) AM_INIT_AUTOMAKE(gpgme,0.2.0a)
LIBGPGME_LT_CURRENT=2 LIBGPGME_LT_CURRENT=3
LIBGPGME_LT_AGE=2 LIBGPGME_LT_AGE=3
LIBGPGME_LT_REVISION=0 LIBGPGME_LT_REVISION=0
NEED_GPG_VERSION=1.0.4d NEED_GPG_VERSION=1.0.4e
############################################## ##############################################
AC_SUBST(LIBGPGME_LT_CURRENT) AC_SUBST(LIBGPGME_LT_CURRENT)

View File

@ -1,3 +1,19 @@
2001-03-13 Werner Koch <wk@gnupg.org>
* context.h: Add invalid and revoke flags to user_id structure.
* keylist.c (gpgme_op_keylist_start): Use --fixed-list-mode.
(keylist_colon_handler): Adjust for that.
(set_userid_flags): New.
(set_mainkey_trust_info): Handle new key invalid flag
(set_subkey_trust_info): Ditto.
* gpgme.h: Add new attributes for key and user ID flags.
* key.c (_gpgme_key_append_name): Init these flags
(gpgme_key_get_as_xml): Print them.
(one_uid_as_xml): New helper for above.
(gpgme_key_get_string_attr, gpgme_key_get_ulong_attr):
Return the new attributes. Enhanced, so that subkey information
can be returned now.
2001-02-28 Werner Koch <wk@gnupg.org> 2001-02-28 Werner Koch <wk@gnupg.org>
* w32-io.c (destroy_reader): Set sop_me flag. * w32-io.c (destroy_reader): Set sop_me flag.

View File

@ -108,6 +108,8 @@ struct gpgme_data_s {
struct user_id_s { struct user_id_s {
struct user_id_s *next; struct user_id_s *next;
unsigned int revoked:1;
unsigned int invalid:1;
GpgmeValidity validity; GpgmeValidity validity;
const char *name_part; /* all 3 point into strings behind name */ const char *name_part; /* all 3 point into strings behind name */
const char *email_part; /* or to read-only strings */ const char *email_part; /* or to read-only strings */

View File

@ -43,7 +43,7 @@ extern "C" {
* let autoconf (using the AM_PATH_GPGME macro) check that this * let autoconf (using the AM_PATH_GPGME macro) check that this
* header matches the installed library. * header matches the installed library.
* Warning: Do not edit the next line. configure will do that for you! */ * Warning: Do not edit the next line. configure will do that for you! */
#define GPGME_VERSION "0.1.4b" #define GPGME_VERSION "0.2.0a"
@ -129,7 +129,11 @@ typedef enum {
GPGME_ATTR_VALIDITY= 12, GPGME_ATTR_VALIDITY= 12,
GPGME_ATTR_LEVEL = 13, GPGME_ATTR_LEVEL = 13,
GPGME_ATTR_TYPE = 14, GPGME_ATTR_TYPE = 14,
GPGME_ATTR_IS_SECRET= 15 GPGME_ATTR_IS_SECRET= 15,
GPGME_ATTR_KEY_REVOKED = 16,
GPGME_ATTR_KEY_INVALID = 17,
GPGME_ATTR_UID_REVOKED = 18,
GPGME_ATTR_UID_INVALID = 19
} GpgmeAttr; } GpgmeAttr;
typedef enum { typedef enum {

View File

@ -259,6 +259,8 @@ _gpgme_key_append_name ( GpgmeKey key, const char *s )
uid = xtrymalloc ( sizeof *uid + 2*strlen (s)+3 ); uid = xtrymalloc ( sizeof *uid + 2*strlen (s)+3 );
if ( !uid ) if ( !uid )
return mk_error (Out_Of_Core); return mk_error (Out_Of_Core);
uid->revoked = 0;
uid->invalid = 0;
uid->validity = 0; uid->validity = 0;
uid->name_part = NULL; uid->name_part = NULL;
uid->email_part = NULL; uid->email_part = NULL;
@ -362,6 +364,25 @@ add_tag_and_time ( GpgmeData d, const char *tag, time_t val )
add_tag_and_string ( d, tag, buf ); add_tag_and_string ( d, tag, buf );
} }
static void
one_uid_as_xml (GpgmeData d, struct user_id_s *u)
{
_gpgme_data_append_string (d, " <userid>\n");
if ( u->invalid )
_gpgme_data_append_string ( d, " <invalid/>\n");
if ( u->revoked )
_gpgme_data_append_string ( d, " <revoked/>\n");
add_tag_and_string ( d, "raw", u->name );
if ( *u->name_part )
add_tag_and_string ( d, "name", u->name_part );
if ( *u->email_part )
add_tag_and_string ( d, "email", u->email_part );
if ( *u->comment_part )
add_tag_and_string ( d, "comment", u->comment_part );
_gpgme_data_append_string (d, " </userid>\n");
}
char * char *
gpgme_key_get_as_xml ( GpgmeKey key ) gpgme_key_get_as_xml ( GpgmeKey key )
{ {
@ -377,8 +398,16 @@ gpgme_key_get_as_xml ( GpgmeKey key )
_gpgme_data_append_string ( d, "<GnupgKeyblock>\n" _gpgme_data_append_string ( d, "<GnupgKeyblock>\n"
" <mainkey>\n" ); " <mainkey>\n" );
if ( key->secret ) if ( key->keys.secret )
_gpgme_data_append_string ( d, " <secret/>\n"); _gpgme_data_append_string ( d, " <secret/>\n");
if ( key->keys.flags.invalid )
_gpgme_data_append_string ( d, " <invalid/>\n");
if ( key->keys.flags.revoked )
_gpgme_data_append_string ( d, " <revoked/>\n");
if ( key->keys.flags.expired )
_gpgme_data_append_string ( d, " <expired/>\n");
if ( key->keys.flags.disabled )
_gpgme_data_append_string ( d, " <disabled/>\n");
add_tag_and_string (d, "keyid", key->keys.keyid ); add_tag_and_string (d, "keyid", key->keys.keyid );
if (key->keys.fingerprint) if (key->keys.fingerprint)
add_tag_and_string (d, "fpr", key->keys.fingerprint ); add_tag_and_string (d, "fpr", key->keys.fingerprint );
@ -388,23 +417,30 @@ gpgme_key_get_as_xml ( GpgmeKey key )
/*add_tag_and_time (d, "expires", key->expires );*/ /*add_tag_and_time (d, "expires", key->expires );*/
_gpgme_data_append_string (d, " </mainkey>\n"); _gpgme_data_append_string (d, " </mainkey>\n");
/* Now the user IDs */ /* Now the user IDs. We are listing the last one firs becuase this is
for ( u = key->uids; u; u = u->next ) { * the primary one. */
_gpgme_data_append_string (d, " <userid>\n"); for (u = key->uids; u && u->next; u = u->next )
add_tag_and_string ( d, "raw", u->name ); ;
if ( *u->name_part ) if (u) {
add_tag_and_string ( d, "name", u->name_part ); one_uid_as_xml (d,u);
if ( *u->email_part ) for ( u = key->uids; u && u->next; u = u->next ) {
add_tag_and_string ( d, "email", u->email_part ); one_uid_as_xml (d,u);
if ( *u->comment_part ) }
add_tag_and_string ( d, "comment", u->comment_part );
_gpgme_data_append_string (d, " </userid>\n");
} }
/* and now the subkeys */
for (k=key->keys.next; k; k = k->next ) { for (k=key->keys.next; k; k = k->next ) {
_gpgme_data_append_string (d, " <subkey>\n"); _gpgme_data_append_string (d, " <subkey>\n");
if ( k->secret ) if ( k->secret )
_gpgme_data_append_string ( d, " <secret/>\n"); _gpgme_data_append_string ( d, " <secret/>\n");
if ( k->flags.invalid )
_gpgme_data_append_string ( d, " <invalid/>\n");
if ( k->flags.revoked )
_gpgme_data_append_string ( d, " <revoked/>\n");
if ( k->flags.expired )
_gpgme_data_append_string ( d, " <expired/>\n");
if ( k->flags.disabled )
_gpgme_data_append_string ( d, " <disabled/>\n");
add_tag_and_string (d, "keyid", k->keyid ); add_tag_and_string (d, "keyid", k->keyid );
if (k->fingerprint) if (k->fingerprint)
add_tag_and_string (d, "fpr", k->fingerprint ); add_tag_and_string (d, "fpr", k->fingerprint );
@ -424,6 +460,7 @@ gpgme_key_get_string_attr ( GpgmeKey key, GpgmeAttr what,
const void *reserved, int idx ) const void *reserved, int idx )
{ {
const char *val = NULL; const char *val = NULL;
struct subkey_s *k;
struct user_id_s *u; struct user_id_s *u;
if (!key) if (!key)
@ -435,13 +472,22 @@ gpgme_key_get_string_attr ( GpgmeKey key, GpgmeAttr what,
switch (what) { switch (what) {
case GPGME_ATTR_KEYID: case GPGME_ATTR_KEYID:
val = key->keys.keyid; for (k=&key->keys; k && idx; k=k->next, idx-- )
;
if (k)
val = k->keyid;
break; break;
case GPGME_ATTR_FPR: case GPGME_ATTR_FPR:
val = key->keys.fingerprint; for (k=&key->keys; k && idx; k=k->next, idx-- )
;
if (k)
val = k->fingerprint;
break; break;
case GPGME_ATTR_ALGO: case GPGME_ATTR_ALGO:
val = pkalgo_to_string (key->keys.key_algo); for (k=&key->keys; k && idx; k=k->next, idx-- )
;
if (k)
val = pkalgo_to_string (k->key_algo);
break; break;
case GPGME_ATTR_LEN: case GPGME_ATTR_LEN:
case GPGME_ATTR_CREATED: case GPGME_ATTR_CREATED:
@ -486,6 +532,10 @@ gpgme_key_get_string_attr ( GpgmeKey key, GpgmeAttr what,
break; break;
case GPGME_ATTR_LEVEL: /* not used here */ case GPGME_ATTR_LEVEL: /* not used here */
case GPGME_ATTR_TYPE: case GPGME_ATTR_TYPE:
case GPGME_ATTR_KEY_REVOKED:
case GPGME_ATTR_KEY_INVALID:
case GPGME_ATTR_UID_REVOKED:
case GPGME_ATTR_UID_INVALID:
break; break;
case GPGME_ATTR_IS_SECRET: case GPGME_ATTR_IS_SECRET:
if (key->secret) if (key->secret)
@ -501,6 +551,7 @@ gpgme_key_get_ulong_attr ( GpgmeKey key, GpgmeAttr what,
const void *reserved, int idx ) const void *reserved, int idx )
{ {
unsigned long val = 0; unsigned long val = 0;
struct subkey_s *k;
struct user_id_s *u; struct user_id_s *u;
if (!key) if (!key)
@ -512,13 +563,22 @@ gpgme_key_get_ulong_attr ( GpgmeKey key, GpgmeAttr what,
switch (what) { switch (what) {
case GPGME_ATTR_ALGO: case GPGME_ATTR_ALGO:
val = (unsigned long)key->keys.key_algo; for (k=&key->keys; k && idx; k=k->next, idx-- )
;
if (k)
val = (unsigned long)k->key_algo;
break; break;
case GPGME_ATTR_LEN: case GPGME_ATTR_LEN:
val = (unsigned long)key->keys.key_len; for (k=&key->keys; k && idx; k=k->next, idx-- )
;
if (k)
val = (unsigned long)k->key_len;
break; break;
case GPGME_ATTR_CREATED: case GPGME_ATTR_CREATED:
val = key->keys.timestamp < 0? 0L:(unsigned long)key->keys.timestamp; for (k=&key->keys; k && idx; k=k->next, idx-- )
;
if (k)
val = k->timestamp < 0? 0L:(unsigned long)k->timestamp;
break; break;
case GPGME_ATTR_VALIDITY: case GPGME_ATTR_VALIDITY:
for (u=key->uids; u && idx; u=u->next, idx-- ) for (u=key->uids; u && idx; u=u->next, idx-- )
@ -529,6 +589,30 @@ gpgme_key_get_ulong_attr ( GpgmeKey key, GpgmeAttr what,
case GPGME_ATTR_IS_SECRET: case GPGME_ATTR_IS_SECRET:
val = !!key->secret; val = !!key->secret;
break; break;
case GPGME_ATTR_KEY_REVOKED:
for (k=&key->keys; k && idx; k=k->next, idx-- )
;
if (k)
val = k->flags.revoked;
break;
case GPGME_ATTR_KEY_INVALID:
for (k=&key->keys; k && idx; k=k->next, idx-- )
;
if (k)
val = k->flags.invalid;
break;
case GPGME_ATTR_UID_REVOKED:
for (u=key->uids; u && idx; u=u->next, idx-- )
;
if (u)
val = u->revoked;
break;
case GPGME_ATTR_UID_INVALID:
for (u=key->uids; u && idx; u=u->next, idx-- )
;
if (u)
val = u->invalid;
break;
default: default:
break; break;
} }

View File

@ -32,6 +32,7 @@ struct subkey_s {
unsigned int revoked:1 ; unsigned int revoked:1 ;
unsigned int expired:1 ; unsigned int expired:1 ;
unsigned int disabled:1 ; unsigned int disabled:1 ;
unsigned int invalid:1 ;
} flags; } flags;
unsigned int key_algo; unsigned int key_algo;
unsigned int key_len; unsigned int key_len;
@ -45,6 +46,7 @@ struct gpgme_key_s {
unsigned int revoked:1 ; unsigned int revoked:1 ;
unsigned int expired:1 ; unsigned int expired:1 ;
unsigned int disabled:1 ; unsigned int disabled:1 ;
unsigned int invalid:1 ;
} gloflags; } gloflags;
unsigned int ref_count; unsigned int ref_count;
unsigned int secret:1; unsigned int secret:1;

View File

@ -98,6 +98,21 @@ set_mainkey_trust_info ( GpgmeKey key, const char *s )
case 'e': key->keys.flags.expired = 1; break; case 'e': key->keys.flags.expired = 1; break;
case 'r': key->keys.flags.revoked = 1; break; case 'r': key->keys.flags.revoked = 1; break;
case 'd': key->keys.flags.disabled = 1; break; case 'd': key->keys.flags.disabled = 1; break;
case 'i': key->keys.flags.invalid = 1; break;
}
}
}
static void
set_userid_flags ( GpgmeKey key, const char *s )
{
/* look at letters and stop at the first digit */
for (; *s && !my_isdigit (*s); s++ ) {
switch (*s) {
case 'r': key->uids->revoked = 1; break;
case 'i': key->uids->invalid = 1; break;
case 'n': key->uids->validity = 1; break; case 'n': key->uids->validity = 1; break;
case 'm': key->uids->validity = 2; break; case 'm': key->uids->validity = 2; break;
case 'f': key->uids->validity = 3; break; case 'f': key->uids->validity = 3; break;
@ -115,6 +130,7 @@ set_subkey_trust_info ( struct subkey_s *k, const char *s )
case 'e': k->flags.expired = 1; break; case 'e': k->flags.expired = 1; break;
case 'r': k->flags.revoked = 1; break; case 'r': k->flags.revoked = 1; break;
case 'd': k->flags.disabled = 1; break; case 'd': k->flags.disabled = 1; break;
case 'i': k->flags.invalid = 1; break;
} }
} }
} }
@ -201,7 +217,8 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
else if ( rectype == RT_PUB || rectype == RT_SEC ) { else if ( rectype == RT_PUB || rectype == RT_SEC ) {
switch (field) { switch (field) {
case 2: /* trust info */ case 2: /* trust info */
trust_info = p; /*save for later */ trust_info = p;
set_mainkey_trust_info (key, trust_info);
break; break;
case 3: /* key length */ case 3: /* key length */
i = atoi (p); i = atoi (p);
@ -226,13 +243,7 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
break; break;
case 9: /* ownertrust */ case 9: /* ownertrust */
break; break;
case 10: /* This is the first name listed */ case 10: /* not used due to --fixed-list-mode option */
if ( _gpgme_key_append_name ( key, p) )
ctx->out_of_core = 1;
else {
if (trust_info)
set_mainkey_trust_info (key, trust_info);
}
break; break;
case 11: /* signature class */ case 11: /* signature class */
break; break;
@ -283,12 +294,12 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
case 2: /* trust info */ case 2: /* trust info */
trust_info = p; /*save for later */ trust_info = p; /*save for later */
break; break;
case 10: /* the 2nd, 3rd,... user ID */ case 10: /* user ID */
if ( _gpgme_key_append_name ( key, p) ) if ( _gpgme_key_append_name ( key, p) )
ctx->out_of_core = 1; ctx->out_of_core = 1;
else { else {
if (trust_info) if (trust_info)
set_mainkey_trust_info (key, trust_info); set_userid_flags (key, trust_info);
} }
pend = NULL; /* we can stop here */ pend = NULL; /* we can stop here */
break; break;
@ -393,6 +404,7 @@ gpgme_op_keylist_start ( GpgmeCtx c, const char *pattern, int secret_only )
for ( i=0; i < c->verbosity; i++ ) for ( i=0; i < c->verbosity; i++ )
_gpgme_gpg_add_arg ( c->gpg, "--verbose" ); _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
_gpgme_gpg_add_arg ( c->gpg, "--with-colons" ); _gpgme_gpg_add_arg ( c->gpg, "--with-colons" );
_gpgme_gpg_add_arg ( c->gpg, "--fixed-list-mode" );
_gpgme_gpg_add_arg ( c->gpg, "--with-fingerprint" ); _gpgme_gpg_add_arg ( c->gpg, "--with-fingerprint" );
if (c->keylist_mode == 1) if (c->keylist_mode == 1)
_gpgme_gpg_add_arg ( c->gpg, "--no-expensive-trust-checks" ); _gpgme_gpg_add_arg ( c->gpg, "--no-expensive-trust-checks" );

View File

@ -269,9 +269,11 @@ create_reader (HANDLE fd)
static void static void
destroy_reader (struct reader_context_s *c) destroy_reader (struct reader_context_s *c)
{ {
LOCK (c->mutex)
c->stop_me = 1; c->stop_me = 1;
if (c->have_space_ev) if (c->have_space_ev)
SetEvent (c->have_space_ev); SetEvent (c->have_space_ev);
UNLOCK (c->mutex)
DEBUG1 ("waiting for thread %p termination ...", c->thread_hd ); DEBUG1 ("waiting for thread %p termination ...", c->thread_hd );
WaitForSingleObject (c->stopped, INFINITE); WaitForSingleObject (c->stopped, INFINITE);
@ -520,9 +522,11 @@ create_writer (HANDLE fd)
static void static void
destroy_writer (struct writer_context_s *c) destroy_writer (struct writer_context_s *c)
{ {
LOCK (c->mutex)
c->stop_me = 1; c->stop_me = 1;
if (c->have_data) if (c->have_data)
SetEvent (c->have_data); SetEvent (c->have_data);
UNLOCK (c->mutex)
DEBUG1 ("waiting for thread %p termination ...", c->thread_hd ); DEBUG1 ("waiting for thread %p termination ...", c->thread_hd );
WaitForSingleObject (c->stopped, INFINITE); WaitForSingleObject (c->stopped, INFINITE);