From 3b346c52aabe5e0c19336a1c774e383e82a3d0ac Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Sat, 28 May 2005 20:10:38 +0000 Subject: [PATCH] Merging bug-fixes from CVS HEAD. --- NEWS | 19 ++++++++++++++++++- THANKS | 1 + TODO | 13 +++++-------- doc/ChangeLog | 11 +++++++++++ doc/gpgme.texi | 5 ++++- gpgme/ChangeLog | 41 ++++++++++++++++++++++++++++++++++++++++- gpgme/data-user.c | 13 ++++++++++++- gpgme/engine-gpgsm.c | 24 ++++++++++++++++-------- gpgme/gpgme.c | 10 ++++++---- gpgme/gpgme.h | 3 +++ gpgme/w32-io.c | 2 +- gpgme/wait-global.c | 18 +++++++++++++----- 12 files changed, 130 insertions(+), 30 deletions(-) diff --git a/NEWS b/NEWS index c454175..b8945ba 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,23 @@ -Noteworthy changes in version 1.0.3 +Noteworthy changes in version 1.0.3 (unreleased) ------------------------------------------------ + * Previousy, GPGME would use a default "include certs" of 1. This + has been changed. Now GPGME will use the crypto backend engines + default unless you set the value with gpgme_set_include_certs() + explicitely. A new macro GPGME_INCLUDE_CERTS_DEFAULT can be used + as a value to explicitely request the new default behaviour. + + Because the default changes, this is a slight change of the API + semantics. We consider it to be a bug fix. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +gpgme_set_engine_info NEW +gpgme_ctx_get_engine_info NEW +gpgme_ctx_set_engine_info NEW +gpgme_set_include_certs CHANGED DEFAULT +GPGME_INCLUDE_CERTS_DEFAULT NEW +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Noteworthy changes in version 1.0.2 (2004-12-28) ------------------------------------------------ diff --git a/THANKS b/THANKS index 506c0e9..4fda3d5 100644 --- a/THANKS +++ b/THANKS @@ -9,6 +9,7 @@ Albrecht Dre Alfons Hoogervorst alfons@proteus.demon.nl Enno Cramer uebergeek@web.de Frank Heckenbach frank@g-n-u.de +Igor Belyi gpgme@katehok.ac93.org Jan-Oliver Wagner jan@intevation.de Johannes Poehlmann jhp@caldera.de Jose C. GarcĂ­a Sogo jose@jaimedelamo.eu.org diff --git a/TODO b/TODO index 673d18e..04bec54 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,6 @@ Hey Emacs, this is -*- outline -*- mode! * Before release: -** Switch to LGPL? ** Some gpg tests fail with gpg 1.3.4-cvs (gpg/t-keylist-sig) The test is currently disabled there and in gpg/t-import. ** Add notation data to key signatures. @@ -9,7 +8,8 @@ Hey Emacs, this is -*- outline -*- mode! * ABI's to break: ** I/O and User Data could be made extensible. But this can be done without breaking the ABI hopefully. -* All enums that should be enums need to have a maximum value to ensure a certain minimum width for extensibility. +* All enums that should be enums need to have a maximum value to ensure + a certain minimum width for extensibility. ** Compatibility interfaces that can be removed in future versions: *** ath compatibility modules. *** gpgme_data_new_from_filepart @@ -28,6 +28,7 @@ Hey Emacs, this is -*- outline -*- mode! *** gpgme_attr_t *** All Gpgme* typedefs. + * Thread support: ** When GNU Pth supports sendmsg/recvmsg, wrap them properly. ** Without timegm (3) support our ISO time parser is not thread safe. @@ -60,9 +61,6 @@ Hey Emacs, this is -*- outline -*- mode! This allows us to handle years later than 2037 properly. With the time_t interface they are all mapped to 2037-12-31 -* Support -** gpgme.m4 should check --api-version of gpgme-config. - * Documentation ** Document validity and trust issues. @@ -143,14 +141,13 @@ Hey Emacs, this is -*- outline -*- mode! * Build suite ** Make sure everything is cleaned correctly (esp. test area). -** Configure test for gpg and gpgsm version (as a warning). ** Enable AC_CONFIG_MACRO_DIR and bump up autoconf version requirement. (To fix "./autogen.sh; ./configure --enable-maintainer-mode; touch - configure.ac; make"). + configure.ac; make"). Currently worked around with ACLOCAL_AMFLAGS??? * Error checking ** engine-gpgsm, with-validation - Add error checking some time after releasing a new gpgsm. + Add error checking some time after releasing a new gpgsm. Copyright 2004 g10 Code GmbH diff --git a/doc/ChangeLog b/doc/ChangeLog index b4217dc..37d6f8f 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,14 @@ +2005-05-28 Marcus Brinkmann + + * gpgme.texi (Key Listing Mode): Fix return type of + gpgme_set_keylist_mode. + Reported by "Sergio" . + +2005-04-28 Marcus Brinkmann + + * gpgme.texi (Included Certificates): Document + GPGME_INCLUDE_CERTS_DEFAULT. + 2004-12-07 Marcus Brinkmann * lesser.texi (Library Copying): Change from @appendixsec to diff --git a/doc/gpgme.texi b/doc/gpgme.texi index 957df64..24a4c20 100644 --- a/doc/gpgme.texi +++ b/doc/gpgme.texi @@ -1944,6 +1944,9 @@ default, only the sender's certificate is included. The possible values of @var{nr_of_certs} are: @table @code +@item GPGME_INCLUDE_CERTS_DEFAULT +Fall back to the default of the crypto backend. This is the default +for GPGME. @item -2 Include all certificates except the root certificate. @item -1 @@ -1974,7 +1977,7 @@ certificates to include into an S/MIME signed message. @cindex key listing mode @cindex key listing, mode of -@deftypefun void gpgme_set_keylist_mode (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_keylist_mode_t @var{mode}}) +@deftypefun gpgme_error_t gpgme_set_keylist_mode (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_keylist_mode_t @var{mode}}) The function @code{gpgme_set_keylist_mode} changes the default behaviour of the key listing functions. The value in @var{mode} is a bitwise-or combination of one or multiple of the following bit values: diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index ac759a0..19d23a9 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,7 +1,46 @@ +2005-05-28 Marcus Brinkmann + + * data-user.c: Include . + +2005-05-17 Marcus Brinkmann + + * gpgme.c (gpgme_new): Set the CTX->include_certs default to the + default. + +2005-05-11 Marcus Brinkmann + + * w32-io.c (_gpgme_io_select): Fix loop increment. + +2005-05-05 Marcus Brinkmann + + * data-user.c (user_release): Only call user hook if provided. + (user_seek): Return EBADF if no user hook is provided. + (user_read): Likewise. + (user_write): Likewise. + +2005-04-28 Marcus Brinkmann + + * gpgme.h (GPGME_INCLUDE_CERTS_DEFAULT): New macro. + * engine-gpgsm.c (gpgsm_sign): Send the include-certs option after + the reset, just for cleanliness, and do not sent it at all if the + default is requested. + * gpgme.c (gpgme_set_include_certs): Allow to use + GPGME_INCLUDE_CERTS_DEFAULT. + 2005-04-21 Werner Koch * verify.c (calc_sig_summary): Set the key revoked bit. +2005-04-14 Marcus Brinkmann + + * wait-global.c (gpgme_wait): Use LI->ctx when checking a context + in the list, not the user-provided CTX. + Reported by Igor Belyi . + + * wait-global.c (gpgme_wait): If no context is found, and we + should not hang, set *status to 0 and return NULL. + Reported by Igor Belyi . + 2004-12-11 Marcus Brinkmann * util.h [HAVE_CONFIG_H && HAVE_TTYNAME_R] (ttyname_r): Define @@ -4570,7 +4609,7 @@ * data.c (gpgme_data_rewind): Allow to rewind data_type_none. - Copyright 2001, 2002, 2003, 2004 g10 Code GmbH + Copyright 2001, 2002, 2003, 2004, 2005 g10 Code GmbH This file is free software; as a special exception the author gives unlimited permission to copy and/or distribute it, with or without diff --git a/gpgme/data-user.c b/gpgme/data-user.c index 8a71b88..f3deb32 100644 --- a/gpgme/data-user.c +++ b/gpgme/data-user.c @@ -23,6 +23,7 @@ #endif #include +#include #include "data.h" @@ -30,6 +31,9 @@ static ssize_t user_read (gpgme_data_t dh, void *buffer, size_t size) { + if (!dh->data.user.cbs->read) + return EBADF; + return (*dh->data.user.cbs->read) (dh->data.user.handle, buffer, size); } @@ -37,6 +41,9 @@ user_read (gpgme_data_t dh, void *buffer, size_t size) static ssize_t user_write (gpgme_data_t dh, const void *buffer, size_t size) { + if (!dh->data.user.cbs->write) + return EBADF; + return (*dh->data.user.cbs->write) (dh->data.user.handle, buffer, size); } @@ -44,6 +51,9 @@ user_write (gpgme_data_t dh, const void *buffer, size_t size) static off_t user_seek (gpgme_data_t dh, off_t offset, int whence) { + if (!dh->data.user.cbs->seek) + return EBADF; + return (*dh->data.user.cbs->seek) (dh->data.user.handle, offset, whence); } @@ -51,7 +61,8 @@ user_seek (gpgme_data_t dh, off_t offset, int whence) static void user_release (gpgme_data_t dh) { - (*dh->data.user.cbs->release) (dh->data.user.handle); + if (dh->data.user.cbs->release) + (*dh->data.user.cbs->release) (dh->data.user.handle); } diff --git a/gpgme/engine-gpgsm.c b/gpgme/engine-gpgsm.c index 7a71b5a..804d8fc 100644 --- a/gpgme/engine-gpgsm.c +++ b/gpgme/engine-gpgsm.c @@ -1,6 +1,6 @@ /* engine-gpgsm.c - GpgSM engine. Copyright (C) 2000 Werner Koch (dd9jn) - Copyright (C) 2001, 2002, 2003, 2004 g10 Code GmbH + Copyright (C) 2001, 2002, 2003, 2004, 2005 g10 Code GmbH This file is part of GPGME. @@ -1433,19 +1433,27 @@ gpgsm_sign (void *engine, gpgme_data_t in, gpgme_data_t out, if (!gpgsm) return gpg_error (GPG_ERR_INV_VALUE); - if (asprintf (&assuan_cmd, "OPTION include-certs %i", include_certs) < 0) - return gpg_error_from_errno (errno); - err = gpgsm_assuan_simple_command (gpgsm->assuan_ctx, assuan_cmd, NULL,NULL); - free (assuan_cmd); - if (err) - return err; - /* We must send a reset because we need to reset the list of signers. Note that RESET does not reset OPTION commands. */ err = gpgsm_assuan_simple_command (gpgsm->assuan_ctx, "RESET", NULL, NULL); if (err) return err; + if (include_certs != GPGME_INCLUDE_CERTS_DEFAULT) + { + /* FIXME: Make sure that if we run multiple operations, that we + can reset any previously set value in case the default is + requested. */ + + if (asprintf (&assuan_cmd, "OPTION include-certs %i", include_certs) < 0) + return gpg_error_from_errno (errno); + err = gpgsm_assuan_simple_command (gpgsm->assuan_ctx, assuan_cmd, + NULL, NULL); + free (assuan_cmd); + if (err) + return err; + } + for (i = 0; (key = gpgme_signers_enum (ctx, i)); i++) { const char *s = key->subkeys ? key->subkeys->fpr : NULL; diff --git a/gpgme/gpgme.c b/gpgme/gpgme.c index 568194d..d3eac1f 100644 --- a/gpgme/gpgme.c +++ b/gpgme/gpgme.c @@ -52,7 +52,7 @@ gpgme_new (gpgme_ctx_t *r_ctx) if (!ctx) return gpg_error_from_errno (errno); ctx->keylist_mode = GPGME_KEYLIST_MODE_LOCAL; - ctx->include_certs = 1; + ctx->include_certs = GPGME_INCLUDE_CERTS_DEFAULT; ctx->protocol = GPGME_PROTOCOL_OpenPGP; _gpgme_fd_table_init (&ctx->fdt); @@ -211,12 +211,14 @@ gpgme_get_textmode (gpgme_ctx_t ctx) /* Set the number of certifications to include in an S/MIME message. - The default is 1 (only the cert of the sender). -1 means all - certs, and -2 means all certs except the root cert. */ + The default is GPGME_INCLUDE_CERTS_DEFAULT. -1 means all certs, + and -2 means all certs except the root cert. */ void gpgme_set_include_certs (gpgme_ctx_t ctx, int nr_of_certs) { - if (nr_of_certs < -2) + if (nr_of_certs == GPGME_INCLUDE_CERTS_DEFAULT) + ctx->include_certs = GPGME_INCLUDE_CERTS_DEFAULT; + else if (nr_of_certs < -2) ctx->include_certs = -2; else ctx->include_certs = nr_of_certs; diff --git a/gpgme/gpgme.h b/gpgme/gpgme.h index 88d7603..b7ccedc 100644 --- a/gpgme/gpgme.h +++ b/gpgme/gpgme.h @@ -705,6 +705,9 @@ void gpgme_set_textmode (gpgme_ctx_t ctx, int yes); /* Return non-zero if text mode is set in CTX. */ int gpgme_get_textmode (gpgme_ctx_t ctx); +/* Use whatever the default of the backend crypto engine is. */ +#define GPGME_INCLUDE_CERTS_DEFAULT -256 + /* Include up to NR_OF_CERTS certificates in an S/MIME message. */ void gpgme_set_include_certs (gpgme_ctx_t ctx, int nr_of_certs); diff --git a/gpgme/w32-io.c b/gpgme/w32-io.c index 5b64120..5919343 100644 --- a/gpgme/w32-io.c +++ b/gpgme/w32-io.c @@ -1085,7 +1085,7 @@ _gpgme_io_select ( struct io_select_fd_s *fds, size_t nfds, int nonblock ) int k, j = handle_to_fd (waitbuf[i]); DEBUG1 ("WFMO invalid handle %d removed\n", j); - for (k=0 ; k < nfds; i++ ) { + for (k=0 ; k < nfds; k++ ) { if ( fds[k].fd == j ) { fds[k].for_read = fds[k].for_write = 0; goto restart; diff --git a/gpgme/wait-global.c b/gpgme/wait-global.c index 6d75d3d..f3a5b43 100644 --- a/gpgme/wait-global.c +++ b/gpgme/wait-global.c @@ -1,6 +1,6 @@ /* wait-global.c Copyright (C) 2000 Werner Koch (dd9jn) - Copyright (C) 2001, 2002, 2003, 2004 g10 Code GmbH + Copyright (C) 2001, 2002, 2003, 2004, 2005 g10 Code GmbH This file is part of GPGME. @@ -331,13 +331,15 @@ gpgme_wait (gpgme_ctx_t ctx, gpgme_error_t *status, int hang) LOCK (ctx_list_lock); for (li = ctx_active_list; li; li = li->next) { - for (i = 0; i < ctx->fdt.size; i++) - if (ctx->fdt.fds[i].fd != -1) + gpgme_ctx_t actx = li->ctx; + + for (i = 0; i < actx->fdt.size; i++) + if (actx->fdt.fds[i].fd != -1) break; - if (i == ctx->fdt.size) + if (i == actx->fdt.size) { gpgme_error_t err = 0; - _gpgme_engine_io_event (ctx->engine, GPGME_EVENT_DONE, &err); + _gpgme_engine_io_event (actx->engine, GPGME_EVENT_DONE, &err); } } UNLOCK (ctx_list_lock); @@ -350,6 +352,12 @@ gpgme_wait (gpgme_ctx_t ctx, gpgme_error_t *status, int hang) ctx = dctx; hang = 0; } + else if (!hang) + { + ctx = NULL; + if (status) + *status = 0; + } } } while (hang); -- 2.26.2