gpgme/gpgme/passphrase.c
Marcus Brinkmann 3a6381133a 2002-10-10 Marcus Brinkmann <marcus@g10code.de>
* rungpg.h, engine-gpgsm.h: File removed.
	* engine-backend.h: New file.
	* Makefile.am (gpgsm_components): New variable, set depending on
	automake conditional HAVE_GPGSM.
	(libgpgme_la_SOURCES): Add engine-backend.h, remove rungpg.h and
	engine-gpgsm.h.  Replace engine-gpgsm.c with ${gpgsm_components}.
	(status-table.h): Depend on gpgme.h, not rungpg.h.
	* conversion.c: Include <stdlib.h>.
	* engine-gpgsm.c: Do not set ENABLE_GPGSM here.  Include
	"engine-backend.h" instead "engine-gpgsm.h".  Reorder some
	functions and remove all function prototypes.
	(_gpgme_gpgsm_get_version): Make static and rename to ...
	(gpgsm_get_version): ... this.
	(_gpgme_gpgsm_check_version): Make static and rename to ...
	(gpgsm_check_version): ... this.
	(_gpgme_gpgsm_new): Make static.  Change argument type from
	GpgsmObject * to void **.  Call gpgsm_release instead
	_gpgme_gpgsm_release.
	(_gpgme_gpgsm_op_decrypt): Make static and rename to ...
	(gpgsm_check_decrypt): ... this.
	(_gpgme_gpgsm_op_delete): Make static and rename to ...
	(gpgsm_check_delete): ... this.
	(_gpgme_gpgsm_set_recipients): Make static and rename to ...
	(gpgsm_check_set_recipients): ... this.
	(_gpgme_gpgsm_op_encrypt): Make static and rename to ...
	(gpgsm_encrypt): ... this.
	(_gpgme_gpgsm_op_export): Make static and rename to ...
	(gpgsm_export): ... this.
	(_gpgme_gpgsm_op_genkey): Make static and rename to ...
	(gpgsm_genkey): ... this.
	(_gpgme_gpgsm_op_import): Make static and rename to ...
	(gpgsm_import): ... this.
	(_gpgme_gpgsm_op_keylist): Make static and rename to ...
	(gpgsm_keylist): ... this.
	(_gpgme_gpgsm_op_keylist_ext): Make static and rename to ...
	(gpgsm_keylist_ext): ... this.
	(_gpgme_gpgsm_op_sign): Make static and rename to ...
	(gpgsm_sign): ... this.
	(_gpgme_gpgsm_op_trustlist): Make static and rename to ...
	(gpgsm_trustlist): ... this.
	(_gpgme_gpgsm_op_verify): Make static and rename to ...
	(gpgsm_verify): ... this.
	(gpgsm_status_handler): Rename to ...
	(status_handler): ... this.
	(_gpgme_gpgsm_set_status_handler): Make static and rename to ...
	(gpgsm_set_status_handler): ... this.
	(_gpgme_gpgsm_set_colon_line_handler): Make static and rename to ...
	(gpgsm_set_colon_line_handler): ... this.
	(_gpgme_gpgsm_add_io_cb): Rename to ...
	(add_io_cb): ... this.
	(_gpgme_gpgsm_start): Make static and rename to ...
	(gpgsm_start): ... this.
	(_gpgme_gpgsm_set_io_cb): Make static and rename to ...
	(gpgsm_set_io_cb): ... this.
	(_gpgme_gpgsm_io_event): Make static and rename to ...
	(gpgsm_io_event): ... this.
	(struct _gpgme_engine_ops_gpgsm): New variable.
	[!ENABLE_GPGSM]: Removed.
	* engine.c: Do not include <time.h>, <sys/types.h>, <string.h>,
	<assert.h>, "io.h", "rungpg.h" and "engine-gpgsm.h".  Include
	<stdlib.h> and "engine-backend.h".
	(struct engine_object_s): Rewritten.
	(engine_ops): New variable.
	* engine.c (_gpgme_engine_get_path, _gpgme_engine_get_version,
	_gpgme_engine_check_version, _gpgme_engine_new,
	_gpgme_engine_release, _gpgme_engine_set_verbosity,
	_gpgme_engine_set_status_handler,
	_gpgme_engine_set_command_handler,
	_gpgme_engine_set_colon_line_handler, _gpgme_engine_op_decrypt,
	_gpgme_engine_op_delete, _gpgme_engine_op_edit,
	_gpgme_engine_op_encrypt, _gpgme_engine_op_encrypt_sign,
	_gpgme_engine_op_export, _gpgme_engine_op_genkey,
	_gpgme_engine_op_import, _gpgme_engine_op_keylist,
	_gpgme_engine_op_keylist_ext, _gpgme_engine_op_sign,
	_gpgme_engine_op_trustlist, _gpgme_engine_op_verify,
	_gpgme_engine_start, _gpgme_engine_set_io_cbs,
	_gpgme_engine_io_event): Reimplement.
	* engine.h: Fix a few comments and a variable name in a prototype.
	* ops.h: Do not include "rungpg.h".
	* passphrase.c: Include config.h only if [HAVE_CONFIG_H].  Do not
	include "rungpg.h".
	* recipient.c: Likewise.
	* signers.c: Likewise.
	* version.c: Likewise.
	* rungpg.c: Likewise.  Include "engine-backend.h".  Reorder
	functions and remove prototypes.
	(_gpgme_gpg_get_version): Make static and rename to ...
	(gpg_get_version): ... this.
	(_gpgme_gpg_check_version): Make static and rename to ...
	(gpg_check_version): ... this.
	(_gpgme_gpg_new): Make static.  Change argument type from
	GpgObject * to void **.  Call gpg_release instead
	_gpgme_gpg_release.
	(_gpgme_gpg_op_decrypt): Make static and rename to ...
	(gpg_check_decrypt): ... this.
	(_gpgme_gpg_op_delete): Make static and rename to ...
	(gpg_check_delete): ... this.
	(_gpgme_gpg_set_recipients): Make static and rename to ...
	(gpg_check_set_recipients): ... this.
	(_gpgme_gpg_op_encrypt): Make static and rename to ...
	(gpg_encrypt): ... this.
	(_gpgme_gpg_op_export): Make static and rename to ...
	(gpg_export): ... this.
	(_gpgme_gpg_op_genkey): Make static and rename to ...
	(gpg_genkey): ... this.
	(_gpgme_gpg_op_import): Make static and rename to ...
	(gpg_import): ... this.
	(_gpgme_gpg_op_keylist): Make static and rename to ...
	(gpg_keylist): ... this.
	(_gpgme_gpg_op_keylist_ext): Make static and rename to ...
	(gpg_keylist_ext): ... this.
	(_gpgme_gpg_op_sign): Make static and rename to ...
	(gpg_sign): ... this.
	(_gpgme_gpg_op_trustlist): Make static and rename to ...
	(gpg_trustlist): ... this.
	(_gpgme_gpg_op_verify): Make static and rename to ...
	(gpg_verify): ... this.
	(gpg_status_handler): Rename to ...
	(status_handler): ... this.
	(_gpgme_gpg_set_status_handler): Make static and rename to ...
	(gpg_set_status_handler): ... this.
	(_gpgme_gpg_set_colon_line_handler): Make static and rename to ...
	(gpg_set_colon_line_handler): ... this.
	(gpgme_gpg_add_io_cb): Rename to ...
	(add_io_cb): ... this.
	(_gpgme_gpg_start): Make static and rename to ...
	(gpg_start): ... this.
	(_gpgme_gpg_set_io_cb): Make static and rename to ...
	(gpg_set_io_cb): ... this.
	(_gpgme_gpg_io_event): Make static and rename to ...
	(gpg_io_event): ... this.
	(struct _gpgme_engine_ops_gpg): New variable.
2002-10-12 00:33:05 +00:00

181 lines
4.6 KiB
C

/* passphrase.c - passphrase functions
Copyright (C) 2000 Werner Koch (dd9jn)
Copyright (C) 2001, 2002 g10 Code GmbH
This file is part of GPGME.
GPGME is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
GPGME is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GPGME; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#if HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "util.h"
#include "context.h"
#include "ops.h"
struct passphrase_result_s
{
int no_passphrase;
void *last_pw_handle;
char *userid_hint;
char *passphrase_info;
int bad_passphrase;
};
void
_gpgme_release_passphrase_result (PassphraseResult result)
{
if (!result)
return;
free (result->passphrase_info);
free (result->userid_hint);
free (result);
}
void
_gpgme_passphrase_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args)
{
if (ctx->error)
return;
test_and_allocate_result (ctx, passphrase);
switch (code)
{
case GPGME_STATUS_USERID_HINT:
free (ctx->result.passphrase->userid_hint);
if (!(ctx->result.passphrase->userid_hint = strdup (args)))
ctx->error = mk_error (Out_Of_Core);
break;
case GPGME_STATUS_BAD_PASSPHRASE:
ctx->result.passphrase->bad_passphrase++;
ctx->result.passphrase->no_passphrase = 0;
break;
case GPGME_STATUS_GOOD_PASSPHRASE:
ctx->result.passphrase->bad_passphrase = 0;
ctx->result.passphrase->no_passphrase = 0;
break;
case GPGME_STATUS_NEED_PASSPHRASE:
case GPGME_STATUS_NEED_PASSPHRASE_SYM:
free (ctx->result.passphrase->passphrase_info);
ctx->result.passphrase->passphrase_info = strdup (args);
if (!ctx->result.passphrase->passphrase_info)
ctx->error = mk_error (Out_Of_Core);
break;
case GPGME_STATUS_MISSING_PASSPHRASE:
DEBUG0 ("missing passphrase - stop\n");;
ctx->result.passphrase->no_passphrase = 1;
break;
case GPGME_STATUS_EOF:
if (ctx->result.passphrase->no_passphrase
|| ctx->result.passphrase->bad_passphrase)
ctx->error = mk_error (No_Passphrase);
break;
default:
/* Ignore all other codes. */
break;
}
}
const char *
_gpgme_passphrase_command_handler (void *opaque, GpgmeStatusCode code, const char *key)
{
GpgmeCtx ctx = opaque;
if (!ctx->result.passphrase)
{
ctx->result.passphrase = calloc (1, sizeof *ctx->result.passphrase);
if (!ctx->result.passphrase)
{
ctx->error = mk_error (Out_Of_Core);
return NULL;
}
}
if (!code)
{
/* We have been called for cleanup. */
if (ctx->passphrase_cb)
{
/* Fixme: Take the key in account. */
ctx->passphrase_cb (ctx->passphrase_cb_value, NULL,
&ctx->result.passphrase->last_pw_handle);
}
return NULL;
}
if (!key || !ctx->passphrase_cb)
return NULL;
if (code == GPGME_STATUS_GET_HIDDEN && !strcmp (key, "passphrase.enter"))
{
const char *userid_hint = ctx->result.passphrase->userid_hint;
const char *passphrase_info = ctx->result.passphrase->passphrase_info;
int bad_passphrase = ctx->result.passphrase->bad_passphrase;
char *buf;
const char *s;
ctx->result.passphrase->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);
if (!buf)
{
ctx->error = mk_error (Out_Of_Core);
return NULL;
}
sprintf (buf, "%s\n%s\n%s",
bad_passphrase ? "TRY_AGAIN":"ENTER",
userid_hint, passphrase_info);
s = ctx->passphrase_cb (ctx->passphrase_cb_value,
buf, &ctx->result.passphrase->last_pw_handle);
free (buf);
return s;
}
return NULL;
}
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;
}