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:
parent
9dbd9c6dff
commit
8002f98d48
@ -1,5 +1,20 @@
|
|||||||
2003-04-25 Marcus Brinkmann <marcus@g10code.de>
|
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,
|
* context.h (struct gpgme_context_s): Remove member initialized,
|
||||||
use_cms and help_data_1. Add member protocol. Make use_armor and
|
use_cms and help_data_1. Add member protocol. Make use_armor and
|
||||||
use_textmode bit flags. Make keylist_mode, include_certs,
|
use_textmode bit flags. Make keylist_mode, include_certs,
|
||||||
|
@ -163,41 +163,34 @@ _gpgme_decrypt_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args)
|
|||||||
|
|
||||||
GpgmeError
|
GpgmeError
|
||||||
_gpgme_decrypt_start (GpgmeCtx ctx, int synchronous,
|
_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);
|
err = _gpgme_op_reset (ctx, synchronous);
|
||||||
if (err)
|
if (err)
|
||||||
goto leave;
|
return err;
|
||||||
|
|
||||||
/* Check the supplied data. */
|
if (!cipher)
|
||||||
if (!ciph)
|
return GPGME_No_Data;
|
||||||
{
|
|
||||||
err = GPGME_No_Data;
|
|
||||||
goto leave;
|
|
||||||
}
|
|
||||||
if (!plain)
|
if (!plain)
|
||||||
{
|
return GPGME_Invalid_Value;
|
||||||
err = GPGME_Invalid_Value;
|
|
||||||
goto leave;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = _gpgme_passphrase_start (ctx);
|
|
||||||
if (err)
|
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);
|
_gpgme_engine_set_status_handler (ctx->engine, status_handler, ctx);
|
||||||
|
|
||||||
err = _gpgme_engine_op_decrypt (ctx->engine, ciph, plain);
|
return _gpgme_engine_op_decrypt (ctx->engine, cipher, plain);
|
||||||
|
|
||||||
leave:
|
|
||||||
if (err)
|
|
||||||
{
|
|
||||||
_gpgme_engine_release (ctx->engine);
|
|
||||||
ctx->engine = NULL;
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,12 +33,10 @@
|
|||||||
|
|
||||||
|
|
||||||
static GpgmeError
|
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);
|
return _gpgme_encrypt_status_handler (priv, code, args)
|
||||||
if (err)
|
|| _gpgme_sign_status_handler (priv, code, args);
|
||||||
return err;
|
|
||||||
return _gpgme_sign_status_handler (ctx, code, args);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -47,41 +45,31 @@ _gpgme_op_encrypt_sign_start (GpgmeCtx ctx, int synchronous,
|
|||||||
GpgmeRecipients recp,
|
GpgmeRecipients recp,
|
||||||
GpgmeData plain, GpgmeData cipher)
|
GpgmeData plain, GpgmeData cipher)
|
||||||
{
|
{
|
||||||
GpgmeError err = 0;
|
GpgmeError err;
|
||||||
|
|
||||||
err = _gpgme_op_reset (ctx, synchronous);
|
err = _gpgme_op_reset (ctx, synchronous);
|
||||||
if (err)
|
if (err)
|
||||||
goto leave;
|
return err;
|
||||||
|
|
||||||
err = _gpgme_passphrase_start (ctx);
|
if (!plain)
|
||||||
if (err)
|
return GPGME_No_Data;
|
||||||
goto leave;
|
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,
|
_gpgme_engine_set_status_handler (ctx->engine,
|
||||||
encrypt_sign_status_handler, ctx);
|
encrypt_sign_status_handler, ctx);
|
||||||
|
|
||||||
/* Check the supplied data */
|
return _gpgme_engine_op_encrypt_sign (ctx->engine, recp, plain, cipher,
|
||||||
if (!plain)
|
ctx->use_armor, ctx /* FIXME */);
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GpgmeError
|
GpgmeError
|
||||||
|
@ -158,29 +158,33 @@ _gpgme_encrypt_sym_status_handler (GpgmeCtx ctx, GpgmeStatusCode code,
|
|||||||
|
|
||||||
static GpgmeError
|
static GpgmeError
|
||||||
_gpgme_op_encrypt_start (GpgmeCtx ctx, int synchronous,
|
_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;
|
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);
|
err = _gpgme_op_reset (ctx, synchronous);
|
||||||
if (err)
|
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)
|
if (err)
|
||||||
goto leave;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
_gpgme_engine_set_status_handler (ctx->engine,
|
_gpgme_engine_set_status_handler (ctx->engine,
|
||||||
@ -189,28 +193,8 @@ _gpgme_op_encrypt_start (GpgmeCtx ctx, int synchronous,
|
|||||||
: _gpgme_encrypt_status_handler,
|
: _gpgme_encrypt_status_handler,
|
||||||
ctx);
|
ctx);
|
||||||
|
|
||||||
/* Check the supplied data */
|
return _gpgme_engine_op_encrypt (ctx->engine, recp, plain, cipher,
|
||||||
if (!plain)
|
ctx->use_armor);
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -83,12 +83,11 @@ GpgmeError _gpgme_encrypt_status_handler (GpgmeCtx ctx, GpgmeStatusCode code,
|
|||||||
char *args);
|
char *args);
|
||||||
|
|
||||||
/*-- passphrase.c --*/
|
/*-- passphrase.c --*/
|
||||||
GpgmeError _gpgme_passphrase_status_handler (GpgmeCtx ctx, GpgmeStatusCode code,
|
GpgmeError _gpgme_passphrase_status_handler (void *priv, GpgmeStatusCode code,
|
||||||
char *args);
|
char *args);
|
||||||
GpgmeError _gpgme_passphrase_command_handler (void *opaque,
|
GpgmeError _gpgme_passphrase_command_handler (void *opaque,
|
||||||
GpgmeStatusCode code,
|
GpgmeStatusCode code,
|
||||||
const char *key, const char **result);
|
const char *key, const char **result);
|
||||||
GpgmeError _gpgme_passphrase_start (GpgmeCtx ctx);
|
|
||||||
|
|
||||||
/*-- progress.c --*/
|
/*-- progress.c --*/
|
||||||
GpgmeError _gpgme_progress_status_handler (GpgmeCtx ctx, GpgmeStatusCode code,
|
GpgmeError _gpgme_progress_status_handler (GpgmeCtx ctx, GpgmeStatusCode code,
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* passphrase.c - passphrase functions
|
/* passphrase.c - Passphrase callback.
|
||||||
Copyright (C) 2000 Werner Koch (dd9jn)
|
Copyright (C) 2000 Werner Koch (dd9jn)
|
||||||
Copyright (C) 2001, 2002, 2003 g10 Code GmbH
|
Copyright (C) 2001, 2002, 2003 g10 Code GmbH
|
||||||
|
|
||||||
@ -24,79 +24,81 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#include "util.h"
|
#include "gpgme.h"
|
||||||
#include "context.h"
|
#include "context.h"
|
||||||
#include "ops.h"
|
#include "ops.h"
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
|
|
||||||
struct passphrase_result
|
typedef struct
|
||||||
{
|
{
|
||||||
int no_passphrase;
|
int no_passphrase;
|
||||||
void *last_pw_handle;
|
void *last_pw_handle;
|
||||||
char *userid_hint;
|
char *userid_hint;
|
||||||
char *passphrase_info;
|
char *passphrase_info;
|
||||||
int bad_passphrase;
|
int bad_passphrase;
|
||||||
};
|
} *op_data_t;
|
||||||
typedef struct passphrase_result *PassphraseResult;
|
|
||||||
|
|
||||||
static void
|
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 (opd->passphrase_info);
|
||||||
free (result->userid_hint);
|
free (opd->userid_hint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GpgmeError
|
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;
|
GpgmeError err;
|
||||||
PassphraseResult result;
|
op_data_t opd;
|
||||||
|
|
||||||
err = _gpgme_op_data_lookup (ctx, OPDATA_PASSPHRASE, (void **) &result,
|
if (!ctx->passphrase_cb)
|
||||||
sizeof (*result), release_passphrase_result);
|
return 0;
|
||||||
|
|
||||||
|
err = _gpgme_op_data_lookup (ctx, OPDATA_PASSPHRASE, (void **) &opd,
|
||||||
|
sizeof (*opd), release_op_data);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
switch (code)
|
switch (code)
|
||||||
{
|
{
|
||||||
case GPGME_STATUS_USERID_HINT:
|
case GPGME_STATUS_USERID_HINT:
|
||||||
free (result->userid_hint);
|
if (opd->userid_hint)
|
||||||
if (!(result->userid_hint = strdup (args)))
|
free (opd->userid_hint);
|
||||||
|
if (!(opd->userid_hint = strdup (args)))
|
||||||
return GPGME_Out_Of_Core;
|
return GPGME_Out_Of_Core;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GPGME_STATUS_BAD_PASSPHRASE:
|
case GPGME_STATUS_BAD_PASSPHRASE:
|
||||||
result->bad_passphrase++;
|
opd->bad_passphrase++;
|
||||||
result->no_passphrase = 0;
|
opd->no_passphrase = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GPGME_STATUS_GOOD_PASSPHRASE:
|
case GPGME_STATUS_GOOD_PASSPHRASE:
|
||||||
result->bad_passphrase = 0;
|
opd->bad_passphrase = 0;
|
||||||
result->no_passphrase = 0;
|
opd->no_passphrase = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GPGME_STATUS_NEED_PASSPHRASE:
|
case GPGME_STATUS_NEED_PASSPHRASE:
|
||||||
case GPGME_STATUS_NEED_PASSPHRASE_SYM:
|
case GPGME_STATUS_NEED_PASSPHRASE_SYM:
|
||||||
free (result->passphrase_info);
|
if (opd->passphrase_info)
|
||||||
result->passphrase_info = strdup (args);
|
free (opd->passphrase_info);
|
||||||
if (!result->passphrase_info)
|
opd->passphrase_info = strdup (args);
|
||||||
|
if (!opd->passphrase_info)
|
||||||
return GPGME_Out_Of_Core;
|
return GPGME_Out_Of_Core;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GPGME_STATUS_MISSING_PASSPHRASE:
|
case GPGME_STATUS_MISSING_PASSPHRASE:
|
||||||
DEBUG0 ("missing passphrase - stop\n");;
|
opd->no_passphrase = 1;
|
||||||
result->no_passphrase = 1;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GPGME_STATUS_EOF:
|
case GPGME_STATUS_EOF:
|
||||||
if (result->no_passphrase
|
if (opd->no_passphrase || opd->bad_passphrase)
|
||||||
|| result->bad_passphrase)
|
|
||||||
return GPGME_Bad_Passphrase;
|
return GPGME_Bad_Passphrase;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -109,15 +111,18 @@ _gpgme_passphrase_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args
|
|||||||
|
|
||||||
|
|
||||||
GpgmeError
|
GpgmeError
|
||||||
_gpgme_passphrase_command_handler (void *opaque, GpgmeStatusCode code,
|
_gpgme_passphrase_command_handler (void *priv, GpgmeStatusCode code,
|
||||||
const char *key, const char **result_r)
|
const char *key, const char **result)
|
||||||
{
|
{
|
||||||
GpgmeCtx ctx = opaque;
|
GpgmeCtx ctx = (GpgmeCtx) priv;
|
||||||
GpgmeError err;
|
GpgmeError err;
|
||||||
PassphraseResult result;
|
op_data_t opd;
|
||||||
|
|
||||||
err = _gpgme_op_data_lookup (ctx, OPDATA_PASSPHRASE, (void **) &result,
|
if (!ctx->passphrase_cb)
|
||||||
sizeof (*result), release_passphrase_result);
|
return 0;
|
||||||
|
|
||||||
|
err = _gpgme_op_data_lookup (ctx, OPDATA_PASSPHRASE, (void **) &opd,
|
||||||
|
sizeof (*opd), release_op_data);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
@ -125,58 +130,45 @@ _gpgme_passphrase_command_handler (void *opaque, GpgmeStatusCode code,
|
|||||||
{
|
{
|
||||||
/* We have been called for cleanup. */
|
/* We have been called for cleanup. */
|
||||||
if (ctx->passphrase_cb)
|
if (ctx->passphrase_cb)
|
||||||
/* Fixme: Take the key in account. */
|
/* FIXME: Take the key in account. */
|
||||||
err = ctx->passphrase_cb (ctx->passphrase_cb_value, NULL,
|
err = ctx->passphrase_cb (ctx->passphrase_cb_value, NULL,
|
||||||
&result->last_pw_handle, NULL);
|
&opd->last_pw_handle, NULL);
|
||||||
*result_r = NULL;
|
*result = NULL;
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!key || !ctx->passphrase_cb)
|
if (!key || !ctx->passphrase_cb)
|
||||||
{
|
{
|
||||||
*result_r = NULL;
|
*result = NULL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code == GPGME_STATUS_GET_HIDDEN && !strcmp (key, "passphrase.enter"))
|
if (code == GPGME_STATUS_GET_HIDDEN && !strcmp (key, "passphrase.enter"))
|
||||||
{
|
{
|
||||||
const char *userid_hint = result->userid_hint;
|
const char *userid_hint = opd->userid_hint;
|
||||||
const char *passphrase_info = result->passphrase_info;
|
const char *passphrase_info = opd->passphrase_info;
|
||||||
int bad_passphrase = result->bad_passphrase;
|
int bad_passphrase = opd->bad_passphrase;
|
||||||
char *buf;
|
char *buf;
|
||||||
|
|
||||||
result->bad_passphrase = 0;
|
opd->bad_passphrase = 0;
|
||||||
if (!userid_hint)
|
if (!userid_hint)
|
||||||
userid_hint = "[User ID hint missing]";
|
userid_hint = "[User ID hint missing]";
|
||||||
if (!passphrase_info)
|
if (!passphrase_info)
|
||||||
passphrase_info = "[passphrase info missing]";
|
passphrase_info = "[passphrase info missing]";
|
||||||
buf = malloc (20 + strlen (userid_hint)
|
buf = malloc (20 + strlen (userid_hint)
|
||||||
+ strlen (passphrase_info) + 3);
|
+ strlen (passphrase_info) + 3);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
return GPGME_Out_Of_Core;
|
return GPGME_Out_Of_Core;
|
||||||
sprintf (buf, "%s\n%s\n%s",
|
sprintf (buf, "%s\n%s\n%s",
|
||||||
bad_passphrase ? "TRY_AGAIN":"ENTER",
|
bad_passphrase ? "TRY_AGAIN":"ENTER",
|
||||||
userid_hint, passphrase_info);
|
userid_hint, passphrase_info);
|
||||||
|
|
||||||
err = ctx->passphrase_cb (ctx->passphrase_cb_value, buf,
|
err = ctx->passphrase_cb (ctx->passphrase_cb_value, buf,
|
||||||
&result->last_pw_handle, result_r);
|
&opd->last_pw_handle, result);
|
||||||
free (buf);
|
free (buf);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
*result_r = NULL;
|
*result = NULL;
|
||||||
return 0;
|
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;
|
|
||||||
}
|
|
||||||
|
55
gpgme/sign.c
55
gpgme/sign.c
@ -182,50 +182,39 @@ _gpgme_sign_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args)
|
|||||||
|
|
||||||
static GpgmeError
|
static GpgmeError
|
||||||
_gpgme_op_sign_start (GpgmeCtx ctx, int synchronous,
|
_gpgme_op_sign_start (GpgmeCtx ctx, int synchronous,
|
||||||
GpgmeData in, GpgmeData out,
|
GpgmeData plain, GpgmeData sig,
|
||||||
GpgmeSigMode mode)
|
GpgmeSigMode mode)
|
||||||
{
|
{
|
||||||
GpgmeError err = 0;
|
GpgmeError err;
|
||||||
|
|
||||||
if (mode != GPGME_SIG_MODE_NORMAL
|
|
||||||
&& mode != GPGME_SIG_MODE_DETACH
|
|
||||||
&& mode != GPGME_SIG_MODE_CLEAR)
|
|
||||||
return GPGME_Invalid_Value;
|
|
||||||
|
|
||||||
err = _gpgme_op_reset (ctx, synchronous);
|
err = _gpgme_op_reset (ctx, synchronous);
|
||||||
if (err)
|
if (err)
|
||||||
goto leave;
|
return err;
|
||||||
|
|
||||||
/* Check the supplied data. */
|
if (mode != GPGME_SIG_MODE_NORMAL && mode != GPGME_SIG_MODE_DETACH
|
||||||
if (!in)
|
&& mode != GPGME_SIG_MODE_CLEAR)
|
||||||
{
|
return GPGME_Invalid_Value;
|
||||||
err = GPGME_No_Data;
|
|
||||||
goto leave;
|
|
||||||
}
|
|
||||||
if (!out)
|
|
||||||
{
|
|
||||||
err = GPGME_Invalid_Value;
|
|
||||||
goto leave;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = _gpgme_passphrase_start (ctx);
|
if (!plain)
|
||||||
if (err)
|
return GPGME_No_Data;
|
||||||
goto leave;
|
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,
|
_gpgme_engine_set_status_handler (ctx->engine, _gpgme_sign_status_handler,
|
||||||
ctx);
|
ctx);
|
||||||
|
|
||||||
err = _gpgme_engine_op_sign (ctx->engine, in, out, mode, ctx->use_armor,
|
return _gpgme_engine_op_sign (ctx->engine, plain, sig, mode, ctx->use_armor,
|
||||||
ctx->use_textmode, ctx->include_certs,
|
ctx->use_textmode, ctx->include_certs,
|
||||||
ctx /* FIXME */);
|
ctx /* FIXME */);
|
||||||
|
|
||||||
leave:
|
|
||||||
if (err)
|
|
||||||
{
|
|
||||||
_gpgme_engine_release (ctx->engine);
|
|
||||||
ctx->engine = NULL;
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GpgmeError
|
GpgmeError
|
||||||
|
Loading…
Reference in New Issue
Block a user