diff --git a/g10/ChangeLog b/g10/ChangeLog index f42954c4c..909d43a44 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,11 @@ +2004-03-01 Werner Koch + + * 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. + 2004-02-27 David Shaw * keyedit.c (menu_addrevoker): Do not allow appointing a subkey as diff --git a/g10/mainproc.c b/g10/mainproc.c index ebb00ee70..674a376f1 100644 --- a/g10/mainproc.c +++ b/g10/mainproc.c @@ -1346,9 +1346,15 @@ check_sig_and_print( CTX c, KBNODE node ) (int)strlen(tstr), tstr, astr? astr: "?", (ulong)sig->keyid[1] ); rc = do_check_sig(c, node, NULL, &is_expkey, &is_revkey ); - if( rc == G10ERR_NO_PUBKEY && opt.keyserver_scheme && opt.keyserver_options.auto_key_retrieve) { - if( keyserver_import_keyid ( sig->keyid )==0 ) - rc = do_check_sig(c, node, NULL, &is_expkey, &is_revkey ); + if( rc == G10ERR_NO_PUBKEY + && opt.keyserver_scheme && opt.keyserver_options.auto_key_retrieve) { + 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 ); } /* If the key still isn't found, try to inform the user where it diff --git a/g10/options.h b/g10/options.h index 050477508..91ff9b309 100644 --- a/g10/options.h +++ b/g10/options.h @@ -186,6 +186,16 @@ 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 EMUBUG_MDENCODE 4 #define DBG_PACKET_VALUE 1 /* debug packet reading/writing */ diff --git a/g10/status.c b/g10/status.c index cde0c8d77..f260ab038 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. * @@ -155,6 +156,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 ) { @@ -200,8 +234,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 ); @@ -236,8 +270,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--;