diff --git a/g10/ChangeLog b/g10/ChangeLog index 2eb39ed9b..4e10c08f9 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,5 +1,13 @@ 2004-05-20 David Shaw + * options.h (ctrl): New for member IN_AUTO_KEY_RETRIEVE. + + * mainproc.c (check_sig_and_print): track whether we are + retrieving a key. + + * status.c (status_currently_allowed): New. + (write_status_text, write_status_text_and_buffer): Use it here. + * g10.c: New command --gpgconf-list. (gpgconf_list): New. From Werner on stable branch. diff --git a/g10/mainproc.c b/g10/mainproc.c index db15b0b5a..7c760b1a3 100644 --- a/g10/mainproc.c +++ b/g10/mainproc.c @@ -1348,7 +1348,12 @@ check_sig_and_print( CTX c, KBNODE node ) if( rc == G10ERR_NO_PUBKEY && opt.keyserver && (opt.keyserver_options.options&KEYSERVER_AUTO_KEY_RETRIEVE)) { - if( keyserver_import_keyid ( sig->keyid )==0 ) + int res; + + ctrl.in_auto_key_retrieve++; + res=keyserver_import_keyid ( sig->keyid ); + ctrl.in_auto_key_retrieve--; + if(!res) rc = do_check_sig(c, node, NULL, &is_expkey, &is_revkey ); } diff --git a/g10/options.h b/g10/options.h index c2a68b7b5..d8ed34b3e 100644 --- a/g10/options.h +++ b/g10/options.h @@ -201,6 +201,15 @@ struct } opt; +/* CTRL is used to keep some global variables we currently can't + avoid. Future concurrent versions of gpg will put it into a per + request structure CTRL. */ +EXTERN_UNLESS_MAIN_MODULE +struct { + int in_auto_key_retrieve; /* True if we are doing an + auto_key_retrieve. */ +} ctrl; + #define DBG_PACKET_VALUE 1 /* debug packet reading/writing */ #define DBG_MPI_VALUE 2 /* debug mpi details */ #define DBG_CIPHER_VALUE 4 /* debug cipher handling */ diff --git a/g10/status.c b/g10/status.c index 5506e25a4..91443a10a 100644 --- a/g10/status.c +++ b/g10/status.c @@ -1,5 +1,6 @@ /* status.c - * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2002, + * 2004 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -157,6 +158,39 @@ get_status_string ( int no ) return s; } + +/* Return true if the status message NO may currently be issued. We + need this to avoid syncronisation problem while auto retrieving a + key. There it may happen that a status NODATA is issued for a non + available key and the user may falsely interpret this has a missing + signature. */ +static int +status_currently_allowed (int no) +{ + if (!ctrl.in_auto_key_retrieve) + return 1; /* Yes. */ + + /* We allow some statis anyway, so that import statistics are + correct and to avoid problems if the retriebval subsystem will + prompt the user. */ + switch (no) + { + case STATUS_GET_BOOL: + case STATUS_GET_LINE: + case STATUS_GET_HIDDEN: + case STATUS_GOT_IT: + case STATUS_IMPORTED: + case STATUS_IMPORT_OK: + case STATUS_IMPORT_CHECK: + case STATUS_IMPORT_RES: + return 1; /* Yes. */ + default: + break; + } + return 0; /* No. */ +} + + void set_status_fd ( int fd ) { @@ -202,8 +236,8 @@ write_status ( int no ) void write_status_text ( int no, const char *text) { - if( !statusfp ) - return; /* not enabled */ + if( !statusfp || !status_currently_allowed (no) ) + return; /* Not enabled or allowed. */ fputs ( "[GNUPG:] ", statusfp ); fputs ( get_status_string (no), statusfp ); @@ -238,8 +272,8 @@ write_status_text_and_buffer ( int no, const char *string, int lower_limit = ' '; size_t n, count, dowrap; - if( !statusfp ) - return; /* not enabled */ + if( !statusfp || !status_currently_allowed (no) ) + return; /* Not enabled or allowed. */ if (wrap == -1) { lower_limit--;