2003-04-25 Marcus Brinkmann <marcus@g10code.de>

* ops.h (_gpgme_passphrase_start): Remove prototype.
	* passphrase.c: Do not include <assert.h>, "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.
This commit is contained in:
Marcus Brinkmann 2003-04-25 14:24:17 +00:00
parent 9dbd9c6dff
commit 8002f98d48
7 changed files with 148 additions and 188 deletions

View File

@ -1,5 +1,20 @@
2003-04-25 Marcus Brinkmann <marcus@g10code.de>
* ops.h (_gpgme_passphrase_start): Remove prototype.
* passphrase.c: Do not include <assert.h>, "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,

View File

@ -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);
}

View File

@ -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

View File

@ -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);
}

View File

@ -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,

View File

@ -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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#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;
}

View File

@ -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