From 8002f98d48c3539e0211add8881620ea16cea21e Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Fri, 25 Apr 2003 14:24:17 +0000 Subject: [PATCH] 2003-04-25 Marcus Brinkmann * ops.h (_gpgme_passphrase_start): Remove prototype. * passphrase.c: Do not include , "util.h" or "debug.h", but "gpgme.h". (struct passphrase_result): Change to typedef for op_data_t. (release_passphrase_result): Rename to release_op_data. (_gpgme_passphrase_status_handler): Change first argument to void *. Use new op_data_t type. (_gpgme_passphrase_command_handler): Use new op_data_t type. (_gpgme_passphrase_start): Remove function. * decrypt.c (_gpgme_decrypt_start): Rewrite error handling. Do not call _gpgme_passphrase_start, but install command handler. * encrypt.c (_gpgme_op_encrypt_start): Likewise. * encrypt-sign.c (_gpgme_op_encrypt_sign_start): Likewise. * sign.c (_gpgme_op_sign_start): Likewise. --- gpgme/ChangeLog | 15 ++++++ gpgme/decrypt.c | 41 +++++++--------- gpgme/encrypt-sign.c | 52 ++++++++------------ gpgme/encrypt.c | 58 ++++++++-------------- gpgme/ops.h | 3 +- gpgme/passphrase.c | 112 ++++++++++++++++++++----------------------- gpgme/sign.c | 55 +++++++++------------ 7 files changed, 148 insertions(+), 188 deletions(-) diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index f0a40101..39347e46 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,5 +1,20 @@ 2003-04-25 Marcus Brinkmann + * ops.h (_gpgme_passphrase_start): Remove prototype. + * passphrase.c: Do not include , "util.h" or + "debug.h", but "gpgme.h". + (struct passphrase_result): Change to typedef for op_data_t. + (release_passphrase_result): Rename to release_op_data. + (_gpgme_passphrase_status_handler): Change first argument to void *. + Use new op_data_t type. + (_gpgme_passphrase_command_handler): Use new op_data_t type. + (_gpgme_passphrase_start): Remove function. + * decrypt.c (_gpgme_decrypt_start): Rewrite error handling. Do + not call _gpgme_passphrase_start, but install command handler. + * encrypt.c (_gpgme_op_encrypt_start): Likewise. + * encrypt-sign.c (_gpgme_op_encrypt_sign_start): Likewise. + * sign.c (_gpgme_op_sign_start): Likewise. + * context.h (struct gpgme_context_s): Remove member initialized, use_cms and help_data_1. Add member protocol. Make use_armor and use_textmode bit flags. Make keylist_mode, include_certs, diff --git a/gpgme/decrypt.c b/gpgme/decrypt.c index a27e1561..e10a16dc 100644 --- a/gpgme/decrypt.c +++ b/gpgme/decrypt.c @@ -163,41 +163,34 @@ _gpgme_decrypt_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args) GpgmeError _gpgme_decrypt_start (GpgmeCtx ctx, int synchronous, - GpgmeData ciph, GpgmeData plain, void *status_handler) + GpgmeData cipher, GpgmeData plain, void *status_handler) { - GpgmeError err = 0; + GpgmeError err; err = _gpgme_op_reset (ctx, synchronous); if (err) - goto leave; + return err; - /* Check the supplied data. */ - if (!ciph) - { - err = GPGME_No_Data; - goto leave; - } + if (!cipher) + return GPGME_No_Data; if (!plain) - { - err = GPGME_Invalid_Value; - goto leave; - } + return GPGME_Invalid_Value; - err = _gpgme_passphrase_start (ctx); if (err) - goto leave; + return err; + + if (ctx->passphrase_cb) + { + err = _gpgme_engine_set_command_handler (ctx->engine, + _gpgme_passphrase_command_handler, + ctx, NULL); + if (err) + return err; + } _gpgme_engine_set_status_handler (ctx->engine, status_handler, ctx); - err = _gpgme_engine_op_decrypt (ctx->engine, ciph, plain); - - leave: - if (err) - { - _gpgme_engine_release (ctx->engine); - ctx->engine = NULL; - } - return err; + return _gpgme_engine_op_decrypt (ctx->engine, cipher, plain); } diff --git a/gpgme/encrypt-sign.c b/gpgme/encrypt-sign.c index 2ed1b1c6..68ab115c 100644 --- a/gpgme/encrypt-sign.c +++ b/gpgme/encrypt-sign.c @@ -33,12 +33,10 @@ static GpgmeError -encrypt_sign_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args) +encrypt_sign_status_handler (void *priv, GpgmeStatusCode code, char *args) { - GpgmeError err = _gpgme_encrypt_status_handler (ctx, code, args); - if (err) - return err; - return _gpgme_sign_status_handler (ctx, code, args); + return _gpgme_encrypt_status_handler (priv, code, args) + || _gpgme_sign_status_handler (priv, code, args); } @@ -47,41 +45,31 @@ _gpgme_op_encrypt_sign_start (GpgmeCtx ctx, int synchronous, GpgmeRecipients recp, GpgmeData plain, GpgmeData cipher) { - GpgmeError err = 0; + GpgmeError err; err = _gpgme_op_reset (ctx, synchronous); if (err) - goto leave; + return err; - err = _gpgme_passphrase_start (ctx); - if (err) - goto leave; + if (!plain) + return GPGME_No_Data; + if (!cipher) + return GPGME_Invalid_Value; + + if (ctx->passphrase_cb) + { + err = _gpgme_engine_set_command_handler (ctx->engine, + _gpgme_passphrase_command_handler, + ctx, NULL); + if (err) + return err; + } _gpgme_engine_set_status_handler (ctx->engine, encrypt_sign_status_handler, ctx); - /* Check the supplied data */ - if (!plain) - { - err = GPGME_No_Data; - goto leave; - } - if (!cipher) - { - err = GPGME_Invalid_Value; - goto leave; - } - - err = _gpgme_engine_op_encrypt_sign (ctx->engine, recp, plain, cipher, - ctx->use_armor, ctx /* FIXME */); - - leave: - if (err) - { - _gpgme_engine_release (ctx->engine); - ctx->engine = NULL; - } - return err; + return _gpgme_engine_op_encrypt_sign (ctx->engine, recp, plain, cipher, + ctx->use_armor, ctx /* FIXME */); } GpgmeError diff --git a/gpgme/encrypt.c b/gpgme/encrypt.c index 86de371e..e0fcc570 100644 --- a/gpgme/encrypt.c +++ b/gpgme/encrypt.c @@ -158,29 +158,33 @@ _gpgme_encrypt_sym_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, static GpgmeError _gpgme_op_encrypt_start (GpgmeCtx ctx, int synchronous, - GpgmeRecipients recp, GpgmeData plain, GpgmeData ciph) + GpgmeRecipients recp, GpgmeData plain, GpgmeData cipher) { - GpgmeError err = 0; + GpgmeError err; int symmetric = 0; - /* Do some checks. */ - if (!recp) - symmetric = 1; - else if (!gpgme_recipients_count (recp)) - { - err = GPGME_No_UserID; - goto leave; - } - err = _gpgme_op_reset (ctx, synchronous); if (err) - goto leave; + return err; - if (symmetric) + if (!recp) + symmetric = 1; + else if (gpgme_recipients_count (recp) == 0) + return GPGME_No_UserID; + + if (!plain) + return GPGME_No_Data; + if (!cipher) + return GPGME_Invalid_Value; + + if (symmetric && ctx->passphrase_cb) { - err = _gpgme_passphrase_start (ctx); + /* Symmetric encryption requires a passphrase. */ + err = _gpgme_engine_set_command_handler (ctx->engine, + _gpgme_passphrase_command_handler, + ctx, NULL); if (err) - goto leave; + return err; } _gpgme_engine_set_status_handler (ctx->engine, @@ -189,28 +193,8 @@ _gpgme_op_encrypt_start (GpgmeCtx ctx, int synchronous, : _gpgme_encrypt_status_handler, ctx); - /* Check the supplied data */ - if (!plain) - { - err = GPGME_No_Data; - goto leave; - } - if (!ciph) - { - err = GPGME_Invalid_Value; - goto leave; - } - - err = _gpgme_engine_op_encrypt (ctx->engine, recp, plain, ciph, - ctx->use_armor); - - leave: - if (err) - { - _gpgme_engine_release (ctx->engine); - ctx->engine = NULL; - } - return err; + return _gpgme_engine_op_encrypt (ctx->engine, recp, plain, cipher, + ctx->use_armor); } diff --git a/gpgme/ops.h b/gpgme/ops.h index c21de0bf..61ec8d74 100644 --- a/gpgme/ops.h +++ b/gpgme/ops.h @@ -83,12 +83,11 @@ GpgmeError _gpgme_encrypt_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args); /*-- passphrase.c --*/ -GpgmeError _gpgme_passphrase_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, +GpgmeError _gpgme_passphrase_status_handler (void *priv, GpgmeStatusCode code, char *args); GpgmeError _gpgme_passphrase_command_handler (void *opaque, GpgmeStatusCode code, const char *key, const char **result); -GpgmeError _gpgme_passphrase_start (GpgmeCtx ctx); /*-- progress.c --*/ GpgmeError _gpgme_progress_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, diff --git a/gpgme/passphrase.c b/gpgme/passphrase.c index d56562f8..4493d5b6 100644 --- a/gpgme/passphrase.c +++ b/gpgme/passphrase.c @@ -1,4 +1,4 @@ -/* passphrase.c - passphrase functions +/* passphrase.c - Passphrase callback. Copyright (C) 2000 Werner Koch (dd9jn) Copyright (C) 2001, 2002, 2003 g10 Code GmbH @@ -24,79 +24,81 @@ #include #include #include -#include -#include "util.h" +#include "gpgme.h" #include "context.h" #include "ops.h" -#include "debug.h" -struct passphrase_result +typedef struct { int no_passphrase; void *last_pw_handle; char *userid_hint; char *passphrase_info; int bad_passphrase; -}; -typedef struct passphrase_result *PassphraseResult; +} *op_data_t; + static void -release_passphrase_result (void *hook) +release_op_data (void *hook) { - PassphraseResult result = (PassphraseResult) hook; + op_data_t opd = (op_data_t) hook; - free (result->passphrase_info); - free (result->userid_hint); + free (opd->passphrase_info); + free (opd->userid_hint); } GpgmeError -_gpgme_passphrase_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args) +_gpgme_passphrase_status_handler (void *priv, GpgmeStatusCode code, char *args) { + GpgmeCtx ctx = (GpgmeCtx) priv; GpgmeError err; - PassphraseResult result; + op_data_t opd; - err = _gpgme_op_data_lookup (ctx, OPDATA_PASSPHRASE, (void **) &result, - sizeof (*result), release_passphrase_result); + if (!ctx->passphrase_cb) + return 0; + + err = _gpgme_op_data_lookup (ctx, OPDATA_PASSPHRASE, (void **) &opd, + sizeof (*opd), release_op_data); if (err) return err; switch (code) { case GPGME_STATUS_USERID_HINT: - free (result->userid_hint); - if (!(result->userid_hint = strdup (args))) + if (opd->userid_hint) + free (opd->userid_hint); + if (!(opd->userid_hint = strdup (args))) return GPGME_Out_Of_Core; break; case GPGME_STATUS_BAD_PASSPHRASE: - result->bad_passphrase++; - result->no_passphrase = 0; + opd->bad_passphrase++; + opd->no_passphrase = 0; break; case GPGME_STATUS_GOOD_PASSPHRASE: - result->bad_passphrase = 0; - result->no_passphrase = 0; + opd->bad_passphrase = 0; + opd->no_passphrase = 0; break; case GPGME_STATUS_NEED_PASSPHRASE: case GPGME_STATUS_NEED_PASSPHRASE_SYM: - free (result->passphrase_info); - result->passphrase_info = strdup (args); - if (!result->passphrase_info) + if (opd->passphrase_info) + free (opd->passphrase_info); + opd->passphrase_info = strdup (args); + if (!opd->passphrase_info) return GPGME_Out_Of_Core; break; case GPGME_STATUS_MISSING_PASSPHRASE: - DEBUG0 ("missing passphrase - stop\n");; - result->no_passphrase = 1; + opd->no_passphrase = 1; break; case GPGME_STATUS_EOF: - if (result->no_passphrase - || result->bad_passphrase) + if (opd->no_passphrase || opd->bad_passphrase) return GPGME_Bad_Passphrase; break; @@ -109,15 +111,18 @@ _gpgme_passphrase_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args GpgmeError -_gpgme_passphrase_command_handler (void *opaque, GpgmeStatusCode code, - const char *key, const char **result_r) +_gpgme_passphrase_command_handler (void *priv, GpgmeStatusCode code, + const char *key, const char **result) { - GpgmeCtx ctx = opaque; + GpgmeCtx ctx = (GpgmeCtx) priv; GpgmeError err; - PassphraseResult result; + op_data_t opd; - err = _gpgme_op_data_lookup (ctx, OPDATA_PASSPHRASE, (void **) &result, - sizeof (*result), release_passphrase_result); + if (!ctx->passphrase_cb) + return 0; + + err = _gpgme_op_data_lookup (ctx, OPDATA_PASSPHRASE, (void **) &opd, + sizeof (*opd), release_op_data); if (err) return err; @@ -125,58 +130,45 @@ _gpgme_passphrase_command_handler (void *opaque, GpgmeStatusCode code, { /* We have been called for cleanup. */ if (ctx->passphrase_cb) - /* Fixme: Take the key in account. */ - err = ctx->passphrase_cb (ctx->passphrase_cb_value, NULL, - &result->last_pw_handle, NULL); - *result_r = NULL; + /* FIXME: Take the key in account. */ + err = ctx->passphrase_cb (ctx->passphrase_cb_value, NULL, + &opd->last_pw_handle, NULL); + *result = NULL; return err; } if (!key || !ctx->passphrase_cb) { - *result_r = NULL; + *result = NULL; return 0; } if (code == GPGME_STATUS_GET_HIDDEN && !strcmp (key, "passphrase.enter")) { - const char *userid_hint = result->userid_hint; - const char *passphrase_info = result->passphrase_info; - int bad_passphrase = result->bad_passphrase; + const char *userid_hint = opd->userid_hint; + const char *passphrase_info = opd->passphrase_info; + int bad_passphrase = opd->bad_passphrase; char *buf; - result->bad_passphrase = 0; + opd->bad_passphrase = 0; if (!userid_hint) userid_hint = "[User ID hint missing]"; if (!passphrase_info) passphrase_info = "[passphrase info missing]"; buf = malloc (20 + strlen (userid_hint) - + strlen (passphrase_info) + 3); + + strlen (passphrase_info) + 3); if (!buf) return GPGME_Out_Of_Core; sprintf (buf, "%s\n%s\n%s", bad_passphrase ? "TRY_AGAIN":"ENTER", userid_hint, passphrase_info); - err = ctx->passphrase_cb (ctx->passphrase_cb_value, buf, - &result->last_pw_handle, result_r); + err = ctx->passphrase_cb (ctx->passphrase_cb_value, buf, + &opd->last_pw_handle, result); free (buf); return err; } - *result_r = NULL; + *result = NULL; return 0; } - - -GpgmeError -_gpgme_passphrase_start (GpgmeCtx ctx) -{ - GpgmeError err = 0; - - if (ctx->passphrase_cb) - err = _gpgme_engine_set_command_handler (ctx->engine, - _gpgme_passphrase_command_handler, - ctx, NULL); - return err; -} diff --git a/gpgme/sign.c b/gpgme/sign.c index 68f68559..f416d104 100644 --- a/gpgme/sign.c +++ b/gpgme/sign.c @@ -182,50 +182,39 @@ _gpgme_sign_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args) static GpgmeError _gpgme_op_sign_start (GpgmeCtx ctx, int synchronous, - GpgmeData in, GpgmeData out, + GpgmeData plain, GpgmeData sig, GpgmeSigMode mode) { - GpgmeError err = 0; - - if (mode != GPGME_SIG_MODE_NORMAL - && mode != GPGME_SIG_MODE_DETACH - && mode != GPGME_SIG_MODE_CLEAR) - return GPGME_Invalid_Value; + GpgmeError err; err = _gpgme_op_reset (ctx, synchronous); if (err) - goto leave; + return err; - /* Check the supplied data. */ - if (!in) - { - err = GPGME_No_Data; - goto leave; - } - if (!out) - { - err = GPGME_Invalid_Value; - goto leave; - } + if (mode != GPGME_SIG_MODE_NORMAL && mode != GPGME_SIG_MODE_DETACH + && mode != GPGME_SIG_MODE_CLEAR) + return GPGME_Invalid_Value; - err = _gpgme_passphrase_start (ctx); - if (err) - goto leave; + if (!plain) + return GPGME_No_Data; + if (!sig) + return GPGME_Invalid_Value; + + if (ctx->passphrase_cb) + { + err = _gpgme_engine_set_command_handler (ctx->engine, + _gpgme_passphrase_command_handler, + ctx, NULL); + if (err) + return err; + } _gpgme_engine_set_status_handler (ctx->engine, _gpgme_sign_status_handler, ctx); - err = _gpgme_engine_op_sign (ctx->engine, in, out, mode, ctx->use_armor, - ctx->use_textmode, ctx->include_certs, - ctx /* FIXME */); - - leave: - if (err) - { - _gpgme_engine_release (ctx->engine); - ctx->engine = NULL; - } - return err; + return _gpgme_engine_op_sign (ctx->engine, plain, sig, mode, ctx->use_armor, + ctx->use_textmode, ctx->include_certs, + ctx /* FIXME */); } GpgmeError