* context.h: Do not include rungpg.h, but engine.h.
(struct gpgme_context_s): Replace member gpg with engine.
* gpgme.c (gpgme_release): Release engine, not gpg.
* recipient.c (_gpgme_append_gpg_args_from_recifgpients): Function
moved ...
* rungpg.c (_gpgme_append_gpg_args_from_recipients): ... here.
Make static, change order of arguments, and return an error value.
* ops.h (_gpgme_append_gpg_args_from_recipients): Removed prototype.
* rungpg.h (_gpgme_gpg_op_verify): Add prototype.
(_gpgme_gpg_op_encrypt): Likewise.
(_gpgme_gpg_op_decrypt): Likewise.
(_gpgme_gpg_op_delete): Likewise.
(_gpgme_gpg_op_export): Likewise.
(_gpgme_gpg_op_genkey): Likewise.
(_gpgme_gpg_op_import): Likewise.
(_gpgme_gpg_op_keylist): Likewise.
(_gpgme_gpg_op_sign): Likewise.
(_gpgme_gpg_op_trustlist): Likewise.
* rungpg.c (_gpgme_gpg_op_verify): New function.
(_gpgme_gpg_op_encrypt): Likewise.
(_gpgme_gpg_op_decrypt): Likewise.
(_gpgme_gpg_op_delete): Likewise.
(_gpgme_gpg_op_export): Likewise.
(_gpgme_gpg_op_genkey): Likewise.
(_gpgme_gpg_op_import): Likewise.
(_gpgme_gpg_op_keylist): Likewise.
(_gpgme_gpg_op_sign): Likewise.
(_gpgme_gpg_op_trustlist): Likewise.
* engine.h (_gpgme_engine_set_status_handler): Add prototype.
(_gpgme_engine_set_command_handler): Likewise.
(_gpgme_engine_set_colon_line_handler): Likewise.
(_gpgme_engine_op_decrypt): Likewise.
(_gpgme_engine_op_delete): Likewise.
(_gpgme_engine_op_encrypt): Likewise.
(_gpgme_engine_op_export): Likewise.
(_gpgme_engine_op_genkey): Likewise.
(_gpgme_engine_op_import): Likewise.
(_gpgme_engine_op_keylist): Likewise.
(_gpgme_engine_op_sign): Likewise.
(_gpgme_engine_op_trustlist): Likewise.
(_gpgme_engine_op_verify): Likewise.
(_gpgme_engine_start): Likewise.
* engine.c (_gpgme_engine_set_status_handler): New function.
(_gpgme_engine_set_command_handler): Likewise.
(_gpgme_engine_set_colon_line_handler): Likewise.
(_gpgme_engine_op_decrypt): Likewise.
(_gpgme_engine_op_delete): Likewise.
(_gpgme_engine_op_encrypt): Likewise.
(_gpgme_engine_op_export): Likewise.
(_gpgme_engine_op_genkey): Likewise.
(_gpgme_engine_op_import): Likewise.
(_gpgme_engine_op_keylist): Likewise.
(_gpgme_engine_op_sign): Likewise.
(_gpgme_engine_op_trustlist): Likewise.
(_gpgme_engine_op_verify): Likewise.
(_gpgme_engine_start): Likewise.
* verify.c (gpgme_op_verify_start): Reimplement in terms of above
functions.
* encrypt.c (gpgme_op_encrypt_start): Likewise.
* decrypt.c (_gpgme_decrypt_start): Likewise.
* passphrase.c (_gpgme_passphrase_start): Likewise.
* keylist.c (gpgme_op_keylist_start): Likewise.
+2001-11-21 Marcus Brinkmann <marcus@g10code.de>
+
+ * context.h: Do not include rungpg.h, but engine.h.
+ (struct gpgme_context_s): Replace member gpg with engine.
+ * gpgme.c (gpgme_release): Release engine, not gpg.
+
+ * recipient.c (_gpgme_append_gpg_args_from_recifgpients): Function
+ moved ...
+ * rungpg.c (_gpgme_append_gpg_args_from_recipients): ... here.
+ Make static, change order of arguments, and return an error value.
+ * ops.h (_gpgme_append_gpg_args_from_recipients): Removed prototype.
+
+ * rungpg.h (_gpgme_gpg_op_verify): Add prototype.
+ (_gpgme_gpg_op_encrypt): Likewise.
+ (_gpgme_gpg_op_decrypt): Likewise.
+ (_gpgme_gpg_op_delete): Likewise.
+ (_gpgme_gpg_op_export): Likewise.
+ (_gpgme_gpg_op_genkey): Likewise.
+ (_gpgme_gpg_op_import): Likewise.
+ (_gpgme_gpg_op_keylist): Likewise.
+ (_gpgme_gpg_op_sign): Likewise.
+ (_gpgme_gpg_op_trustlist): Likewise.
+ * rungpg.c (_gpgme_gpg_op_verify): New function.
+ (_gpgme_gpg_op_encrypt): Likewise.
+ (_gpgme_gpg_op_decrypt): Likewise.
+ (_gpgme_gpg_op_delete): Likewise.
+ (_gpgme_gpg_op_export): Likewise.
+ (_gpgme_gpg_op_genkey): Likewise.
+ (_gpgme_gpg_op_import): Likewise.
+ (_gpgme_gpg_op_keylist): Likewise.
+ (_gpgme_gpg_op_sign): Likewise.
+ (_gpgme_gpg_op_trustlist): Likewise.
+
+ * engine.h (_gpgme_engine_set_status_handler): Add prototype.
+ (_gpgme_engine_set_command_handler): Likewise.
+ (_gpgme_engine_set_colon_line_handler): Likewise.
+ (_gpgme_engine_op_decrypt): Likewise.
+ (_gpgme_engine_op_delete): Likewise.
+ (_gpgme_engine_op_encrypt): Likewise.
+ (_gpgme_engine_op_export): Likewise.
+ (_gpgme_engine_op_genkey): Likewise.
+ (_gpgme_engine_op_import): Likewise.
+ (_gpgme_engine_op_keylist): Likewise.
+ (_gpgme_engine_op_sign): Likewise.
+ (_gpgme_engine_op_trustlist): Likewise.
+ (_gpgme_engine_op_verify): Likewise.
+ (_gpgme_engine_start): Likewise.
+ * engine.c (_gpgme_engine_set_status_handler): New function.
+ (_gpgme_engine_set_command_handler): Likewise.
+ (_gpgme_engine_set_colon_line_handler): Likewise.
+ (_gpgme_engine_op_decrypt): Likewise.
+ (_gpgme_engine_op_delete): Likewise.
+ (_gpgme_engine_op_encrypt): Likewise.
+ (_gpgme_engine_op_export): Likewise.
+ (_gpgme_engine_op_genkey): Likewise.
+ (_gpgme_engine_op_import): Likewise.
+ (_gpgme_engine_op_keylist): Likewise.
+ (_gpgme_engine_op_sign): Likewise.
+ (_gpgme_engine_op_trustlist): Likewise.
+ (_gpgme_engine_op_verify): Likewise.
+ (_gpgme_engine_start): Likewise.
+
+ * verify.c (gpgme_op_verify_start): Reimplement in terms of above
+ functions.
+ * encrypt.c (gpgme_op_encrypt_start): Likewise.
+ * decrypt.c (_gpgme_decrypt_start): Likewise.
+ * passphrase.c (_gpgme_passphrase_start): Likewise.
+ * keylist.c (gpgme_op_keylist_start): Likewise.
+
2001-11-20 Marcus Brinkmann <marcus@g10code.de>
* types.h: Add types EngineObject and GpgsmObject.
#include "gpgme.h"
#include "types.h"
-#include "rungpg.h" /* for GpgObject */
+#include "engine.h"
struct key_queue_item_s {
struct key_queue_item_s *next;
int cancel; /* cancel operation request */
- GpgObject gpg; /* the running gpg process */
+ EngineObject engine; /* The running engine process. */
int verbosity; /* level of verbosity to use */
int use_armor;
void *status_handler)
{
GpgmeError err = 0;
- int i;
fail_on_pending_request (ctx);
ctx->pending = 1;
_gpgme_release_result (ctx);
ctx->out_of_core = 0;
- /* Do some checks. */
-
/* Create a process object. */
- _gpgme_gpg_release (ctx->gpg);
- err = _gpgme_gpg_new (&ctx->gpg);
+ _gpgme_engine_release (ctx->engine);
+ err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+ : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
if (err)
goto leave;
- _gpgme_gpg_set_status_handler (ctx->gpg, status_handler, ctx);
-
- err = _gpgme_passphrase_start (ctx);
- if (err)
- goto leave;
-
- /* Build the commandline. */
- _gpgme_gpg_add_arg (ctx->gpg, "--decrypt");
- for (i = 0; i < ctx->verbosity; i++)
- _gpgme_gpg_add_arg (ctx->gpg, "--verbose");
-
/* Check the supplied data. */
if (!ciph || gpgme_data_get_type (ciph) == GPGME_DATA_TYPE_NONE)
{
}
_gpgme_data_set_mode (plain, GPGME_DATA_MODE_IN);
- /* Tell the gpg object about the data. */
- _gpgme_gpg_add_arg (ctx->gpg, "--output");
- _gpgme_gpg_add_arg (ctx->gpg, "-");
- _gpgme_gpg_add_data (ctx->gpg, plain, 1);
- _gpgme_gpg_add_data (ctx->gpg, ciph, 0);
+ err = _gpgme_passphrase_start (ctx);
+ if (err)
+ goto leave;
+
+ _gpgme_engine_set_status_handler (ctx->engine, status_handler, ctx);
+ _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
+
+ err = _gpgme_engine_op_decrypt (ctx->engine, ciph, plain);
- /* And kick off the process. */
- err = _gpgme_gpg_spawn (ctx->gpg, ctx);
+ if (!err) /* And kick off the process. */
+ err = _gpgme_engine_start (ctx->engine, ctx);
leave:
if (err)
{
ctx->pending = 0;
- _gpgme_gpg_release (ctx->gpg);
- ctx->gpg = NULL;
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
}
return err;
}
GpgmeError
-gpgme_op_delete_start ( GpgmeCtx c, const GpgmeKey key, int allow_secret )
+gpgme_op_delete_start (GpgmeCtx ctx, const GpgmeKey key, int allow_secret)
{
- GpgmeError rc = 0;
- int i;
- const char *s;
+ GpgmeError err = 0;
- fail_on_pending_request( c );
- c->pending = 1;
+ fail_on_pending_request (ctx);
+ ctx->pending = 1;
- if (!key) {
- rc = mk_error (Invalid_Value);
- goto leave;
+ if (!key)
+ {
+ err = mk_error (Invalid_Value);
+ goto leave;
}
- if ( c->gpg ) {
- _gpgme_gpg_release ( c->gpg );
- c->gpg = NULL;
+ if (ctx->engine)
+ {
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
}
- rc = _gpgme_gpg_new ( &c->gpg );
- if (rc)
- goto leave;
+ err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+ : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+ if (err)
+ goto leave;
- _gpgme_gpg_set_status_handler ( c->gpg, delete_status_handler, c );
+ _gpgme_engine_set_status_handler (ctx->engine, delete_status_handler, ctx);
+ _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
- /* build the commandline */
- for ( i=0; i < c->verbosity; i++ )
- _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
- _gpgme_gpg_add_arg ( c->gpg, allow_secret?
- "--delete-secret-and-public-key":"--delete-key" );
-
- _gpgme_gpg_add_arg ( c->gpg, "--" );
- s = gpgme_key_get_string_attr ( key, GPGME_ATTR_FPR, NULL, 0 );
- if (!s) {
- rc = mk_error (Invalid_Key);
- goto leave;
- }
- _gpgme_gpg_add_arg ( c->gpg, s );
-
- /* do it */
- rc = _gpgme_gpg_spawn ( c->gpg, c );
+ err = _gpgme_engine_op_delete (ctx->engine, key, allow_secret);
+ if (!err)
+ err = _gpgme_engine_start (ctx->engine, ctx);
leave:
- if (rc) {
- c->pending = 0;
- _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+ if (err)
+ {
+ ctx->pending = 0;
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
}
- return rc;
+ return err;
}
GpgmeError
-gpgme_op_encrypt_start ( GpgmeCtx c, GpgmeRecipients recp,
- GpgmeData plain, GpgmeData ciph )
+gpgme_op_encrypt_start (GpgmeCtx ctx, GpgmeRecipients recp, GpgmeData plain,
+ GpgmeData ciph)
{
- int rc = 0;
- int i;
+ int err = 0;
- fail_on_pending_request( c );
- c->pending = 1;
+ fail_on_pending_request (ctx);
+ ctx->pending = 1;
- _gpgme_release_result (c);
- c->out_of_core = 0;
+ _gpgme_release_result (ctx);
+ ctx->out_of_core = 0;
- /* do some checks */
- if ( !gpgme_recipients_count ( recp ) ) {
- /* Fixme: In this case we should do symmentric encryption */
- rc = mk_error (No_Recipients);
- goto leave;
+ /* Do some checks. */
+ if (!gpgme_recipients_count (recp))
+ {
+ /* Fixme: In this case we should do symmentric encryption. */
+ err = mk_error (No_Recipients);
+ goto leave;
}
-
- /* create a process object */
- _gpgme_gpg_release (c->gpg); c->gpg = NULL;
- rc = _gpgme_gpg_new ( &c->gpg );
- if (rc)
- goto leave;
-
- _gpgme_gpg_set_status_handler ( c->gpg, encrypt_status_handler, c );
-
- /* build the commandline */
- _gpgme_gpg_add_arg ( c->gpg, "--encrypt" );
- if ( c->use_armor )
- _gpgme_gpg_add_arg ( c->gpg, "--armor" );
- for ( i=0; i < c->verbosity; i++ )
- _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
- /* If we know that all recipients are valid (full or ultimate trust)
- * we can suppress further checks */
- if ( _gpgme_recipients_all_valid (recp) )
- _gpgme_gpg_add_arg ( c->gpg, "--always-trust" );
-
- _gpgme_append_gpg_args_from_recipients ( recp, c->gpg );
- /* Check the supplied data */
- if ( gpgme_data_get_type (plain) == GPGME_DATA_TYPE_NONE ) {
- rc = mk_error (No_Data);
- goto leave;
+ /* Create an engine object. */
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
+ err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+ : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+ if (err)
+ goto leave;
+
+ _gpgme_engine_set_status_handler (ctx->engine, encrypt_status_handler, ctx);
+ _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
+
+ /* Check the supplied data */
+ if (gpgme_data_get_type (plain) == GPGME_DATA_TYPE_NONE)
+ {
+ err = mk_error (No_Data);
+ goto leave;
}
- _gpgme_data_set_mode (plain, GPGME_DATA_MODE_OUT );
- if ( !ciph || gpgme_data_get_type (ciph) != GPGME_DATA_TYPE_NONE ) {
- rc = mk_error (Invalid_Value);
- goto leave;
+ _gpgme_data_set_mode (plain, GPGME_DATA_MODE_OUT);
+ if (!ciph || gpgme_data_get_type (ciph) != GPGME_DATA_TYPE_NONE)
+ {
+ err = mk_error (Invalid_Value);
+ goto leave;
}
- _gpgme_data_set_mode (ciph, GPGME_DATA_MODE_IN );
- /* Tell the gpg object about the data */
- _gpgme_gpg_add_arg ( c->gpg, "--output" );
- _gpgme_gpg_add_arg ( c->gpg, "-" );
- _gpgme_gpg_add_data ( c->gpg, ciph, 1 );
- _gpgme_gpg_add_arg ( c->gpg, "--" );
- _gpgme_gpg_add_data ( c->gpg, plain, 0 );
+ _gpgme_data_set_mode (ciph, GPGME_DATA_MODE_IN);
+
+ err = _gpgme_engine_op_encrypt (ctx->engine, recp, plain, ciph, ctx->use_armor);
+
- /* and kick off the process */
- rc = _gpgme_gpg_spawn ( c->gpg, c );
+ if (!err) /* And kick off the process. */
+ err = _gpgme_engine_start (ctx->engine, ctx);
leave:
- if (rc) {
- c->pending = 0;
- _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+ if (err)
+ {
+ ctx->pending = 0;
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
}
- return rc;
+ return err;
}
}
xfree (engine);
}
+
+void
+_gpgme_engine_set_verbosity (EngineObject engine, int verbosity)
+{
+ if (!engine)
+ return;
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ while (verbosity-- > 0)
+ _gpgme_gpg_add_arg (engine->engine.gpg, "--verbose");
+ break;
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+}
+
+void
+_gpgme_engine_set_status_handler (EngineObject engine,
+ GpgStatusHandler fnc, void *fnc_value)
+{
+ if (!engine)
+ return;
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ _gpgme_gpg_set_status_handler (engine->engine.gpg, fnc, fnc_value);
+ break;
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+}
+
+GpgmeError
+_gpgme_engine_set_command_handler (EngineObject engine,
+ GpgCommandHandler fnc, void *fnc_value)
+{
+ if (!engine)
+ return mk_error (Invalid_Value);
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ return _gpgme_gpg_set_command_handler (engine->engine.gpg, fnc, fnc_value);
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+GpgmeError _gpgme_engine_set_colon_line_handler (EngineObject engine,
+ GpgColonLineHandler fnc,
+ void *fnc_value)
+{
+ if (!engine)
+ return mk_error (Invalid_Value);
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ return _gpgme_gpg_set_colon_line_handler (engine->engine.gpg, fnc,
+ fnc_value);
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_decrypt (EngineObject engine, GpgmeData ciph, GpgmeData plain)
+{
+ if (!engine)
+ return mk_error (Invalid_Value);
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ return _gpgme_gpg_op_decrypt (engine->engine.gpg, ciph, plain);
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_delete (EngineObject engine, GpgmeKey key, int allow_secret)
+{
+ if (!engine)
+ return mk_error (Invalid_Value);
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ return _gpgme_gpg_op_delete (engine->engine.gpg, key, allow_secret);
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_encrypt (EngineObject engine, GpgmeRecipients recp,
+ GpgmeData plain, GpgmeData ciph, int use_armor)
+{
+ if (!engine)
+ return mk_error (Invalid_Value);
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ return _gpgme_gpg_op_encrypt (engine->engine.gpg, recp, plain, ciph,
+ use_armor);
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_export (EngineObject engine, GpgmeRecipients recp,
+ GpgmeData keydata, int use_armor)
+{
+ if (!engine)
+ return mk_error (Invalid_Value);
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ return _gpgme_gpg_op_export (engine->engine.gpg, recp, keydata,
+ use_armor);
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_genkey (EngineObject engine, GpgmeData help_data, int use_armor)
+{
+ if (!engine)
+ return mk_error (Invalid_Value);
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ return _gpgme_gpg_op_genkey (engine->engine.gpg, help_data, use_armor);
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_import (EngineObject engine, GpgmeData keydata)
+{
+ if (!engine)
+ return mk_error (Invalid_Value);
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ return _gpgme_gpg_op_import (engine->engine.gpg, keydata);
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_keylist (EngineObject engine, const char *pattern, int secret_only,
+ int keylist_mode)
+{
+ if (!engine)
+ return mk_error (Invalid_Value);
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ return _gpgme_gpg_op_keylist (engine->engine.gpg, pattern, secret_only,
+ keylist_mode);
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_sign (EngineObject engine, GpgmeData in, GpgmeData out,
+ GpgmeSigMode mode, int use_armor,
+ int use_textmode, GpgmeCtx ctx /* FIXME */)
+{
+ if (!engine)
+ return mk_error (Invalid_Value);
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ return _gpgme_gpg_op_sign (engine->engine.gpg, in, out, mode, use_armor,
+ use_textmode, ctx);
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_trustlist (EngineObject engine, const char *pattern)
+{
+ if (!engine)
+ return mk_error (Invalid_Value);
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ return _gpgme_gpg_op_trustlist (engine->engine.gpg, pattern);
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+GpgmeError
+_gpgme_engine_op_verify (EngineObject engine, GpgmeData sig, GpgmeData text)
+{
+ if (!engine)
+ return mk_error (Invalid_Value);
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ return _gpgme_gpg_op_verify (engine->engine.gpg, sig, text);
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+GpgmeError _gpgme_engine_start (EngineObject engine, void *opaque)
+{
+ if (!engine)
+ return mk_error (Invalid_Value);
+
+ switch (engine->protocol)
+ {
+ case GPGME_PROTOCOL_OpenPGP:
+ return _gpgme_gpg_spawn (engine->engine.gpg, opaque);
+ case GPGME_PROTOCOL_CMS:
+ /* FIXME */
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
#define ENGINE_H
#include "types.h"
+#include "rungpg.h"
const char *_gpgme_engine_get_path (GpgmeProtocol proto);
const char *_gpgme_engine_get_version (GpgmeProtocol proto);
GpgmeError _gpgme_engine_new (GpgmeProtocol proto, EngineObject *r_engine);
void _gpgme_engine_release (EngineObject engine);
+void _gpgme_engine_set_status_handler (EngineObject engine,
+ GpgStatusHandler fnc, void *fnc_value);
+GpgmeError _gpgme_engine_set_command_handler (EngineObject engine,
+ GpgCommandHandler fnc,
+ void *fnc_value);
+GpgmeError _gpgme_engine_set_colon_line_handler (EngineObject gpg,
+ GpgColonLineHandler fnc,
+ void *fnc_value);
+void _gpgme_engine_set_verbosity (EngineObject engine, int verbosity);
+GpgmeError _gpgme_engine_op_decrypt (EngineObject engine, GpgmeData ciph,
+ GpgmeData plain);
+GpgmeError _gpgme_engine_op_delete (EngineObject engine, GpgmeKey key,
+ int allow_secret);
+GpgmeError _gpgme_engine_op_encrypt (EngineObject engine, GpgmeRecipients recp,
+ GpgmeData plain, GpgmeData ciph,
+ int use_armor);
+GpgmeError _gpgme_engine_op_export (EngineObject engine, GpgmeRecipients recp,
+ GpgmeData keydata, int use_armor);
+GpgmeError _gpgme_engine_op_genkey (EngineObject engine, GpgmeData help_data,
+ int use_armor);
+GpgmeError _gpgme_engine_op_import (EngineObject engine, GpgmeData keydata);
+GpgmeError _gpgme_engine_op_keylist (EngineObject engine, const char *pattern,
+ int secret_only,
+ int keylist_mode);
+GpgmeError _gpgme_engine_op_sign (EngineObject engine, GpgmeData in,
+ GpgmeData out, GpgmeSigMode mode,
+ int use_armor, int use_textmode,
+ GpgmeCtx ctx /* FIXME */);
+GpgmeError _gpgme_engine_op_trustlist (EngineObject engine,
+ const char *pattern);
+GpgmeError _gpgme_engine_op_verify (EngineObject engine, GpgmeData sig,
+ GpgmeData text);
+GpgmeError _gpgme_engine_start (EngineObject engine, void *opaque);
#endif /* ENGINE_H */
/* FIXME: Need to do more */
}
-
GpgmeError
-gpgme_op_export_start ( GpgmeCtx c, GpgmeRecipients recp,
- GpgmeData keydata )
+gpgme_op_export_start (GpgmeCtx ctx, GpgmeRecipients recp, GpgmeData keydata)
{
- int rc = 0;
- int i;
-
- fail_on_pending_request( c );
- c->pending = 1;
+ GpgmeError err = 0;
- /* create a process object */
- _gpgme_gpg_release (c->gpg); c->gpg = NULL;
- rc = _gpgme_gpg_new ( &c->gpg );
- if (rc)
- goto leave;
+ fail_on_pending_request (ctx);
+ ctx->pending = 1;
- _gpgme_gpg_set_status_handler ( c->gpg, export_status_handler, c );
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
- /* build the commandline */
- _gpgme_gpg_add_arg ( c->gpg, "--export" );
- if ( c->use_armor )
- _gpgme_gpg_add_arg ( c->gpg, "--armor" );
- for ( i=0; i < c->verbosity; i++ )
- _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
+ err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+ : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+ if (err)
+ goto leave;
- if ( !keydata || gpgme_data_get_type (keydata) != GPGME_DATA_TYPE_NONE ) {
- rc = mk_error (Invalid_Value);
- goto leave;
+ if (!keydata || gpgme_data_get_type (keydata) != GPGME_DATA_TYPE_NONE)
+ {
+ err = mk_error (Invalid_Value);
+ goto leave;
}
- _gpgme_data_set_mode (keydata, GPGME_DATA_MODE_IN );
- _gpgme_gpg_add_data ( c->gpg, keydata, 1 );
- _gpgme_gpg_add_arg ( c->gpg, "--" );
+ _gpgme_data_set_mode (keydata, GPGME_DATA_MODE_IN);
- {
- void *ec;
- const char *s;
-
- rc = gpgme_recipients_enum_open ( recp, &ec );
- if ( rc )
- goto leave;
- while ( (s = gpgme_recipients_enum_read ( recp, &ec )) )
- _gpgme_gpg_add_arg (c->gpg, s);
- rc = gpgme_recipients_enum_close ( recp, &ec );
- if ( rc )
- goto leave;
- }
+ _gpgme_engine_set_status_handler (ctx->engine, export_status_handler, ctx);
+ _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
- rc = _gpgme_gpg_spawn ( c->gpg, c );
+ err = _gpgme_engine_op_export (ctx->engine, recp, keydata, ctx->use_armor);
+ if (!err)
+ err = _gpgme_engine_start (ctx->engine, ctx);
leave:
- if (rc) {
- c->pending = 0;
- _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+ if (err)
+ {
+ ctx->pending = 0;
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
}
- return rc;
+ return err;
}
-
-
/**
* gpgme_op_export:
* @c: the context
*
* Return value: 0 for success or an error code
**/
-
GpgmeError
-gpgme_op_genkey_start ( GpgmeCtx c, const char *parms,
- GpgmeData pubkey, GpgmeData seckey )
+gpgme_op_genkey_start (GpgmeCtx ctx, const char *parms,
+ GpgmeData pubkey, GpgmeData seckey)
{
- int rc = 0;
- int i;
- const char *s, *s2, *sx;
-
- fail_on_pending_request( c );
- c->pending = 1;
-
- gpgme_data_release (c->help_data_1); c->help_data_1 = NULL;
-
- /* create a process object */
- _gpgme_gpg_release (c->gpg); c->gpg = NULL;
- rc = _gpgme_gpg_new ( &c->gpg );
- if (rc)
- goto leave;
-
- /* We need a special mechanism to get the fd of a pipe here, so
- * that we can use this for the %pubring and %secring parameters.
- * We don't have this yet, so we implement only the adding to the
- * standard keyrings */
- if ( pubkey || seckey ) {
- rc = mk_error (Not_Implemented);
- goto leave;
+ int err = 0;
+ int i;
+ const char *s, *s2, *sx;
+
+ fail_on_pending_request (ctx);
+ ctx->pending = 1;
+
+ gpgme_data_release (ctx->help_data_1);
+ ctx->help_data_1 = NULL;
+
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
+ err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+ : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+ if (err)
+ goto leave;
+
+ /* We need a special mechanism to get the fd of a pipe here, so
+ * that we can use this for the %pubring and %secring parameters.
+ * We don't have this yet, so we implement only the adding to the
+ * standard keyrings */
+ if (pubkey || seckey)
+ {
+ err = mk_error (Not_Implemented);
+ goto leave;
}
- _gpgme_gpg_set_status_handler ( c->gpg, genkey_status_handler, c );
-
- /* build the commandline */
- _gpgme_gpg_add_arg ( c->gpg, "--gen-key" );
- if ( c->use_armor )
- _gpgme_gpg_add_arg ( c->gpg, "--armor" );
- for ( i=0; i < c->verbosity; i++ )
- _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
-
- if ( !pubkey && !seckey )
- ; /* okay: Add key to the keyrings */
- else if ( !pubkey
- || gpgme_data_get_type (pubkey) != GPGME_DATA_TYPE_NONE ) {
- rc = mk_error (Invalid_Value);
- goto leave;
+ if (!pubkey && !seckey)
+ ; /* okay: Add key to the keyrings */
+ else if (!pubkey || gpgme_data_get_type (pubkey) != GPGME_DATA_TYPE_NONE)
+ {
+ err = mk_error (Invalid_Value);
+ goto leave;
}
- else if ( !seckey
- || gpgme_data_get_type (seckey) != GPGME_DATA_TYPE_NONE ) {
- rc = mk_error (Invalid_Value);
- goto leave;
+ else if (!seckey || gpgme_data_get_type (seckey) != GPGME_DATA_TYPE_NONE)
+ {
+ err = mk_error (Invalid_Value);
+ goto leave;
}
- if ( pubkey ) {
- _gpgme_data_set_mode (pubkey, GPGME_DATA_MODE_IN );
- _gpgme_data_set_mode (seckey, GPGME_DATA_MODE_IN );
- /* need some more things here */
+ if (pubkey)
+ {
+ _gpgme_data_set_mode (pubkey, GPGME_DATA_MODE_IN);
+ _gpgme_data_set_mode (seckey, GPGME_DATA_MODE_IN);
+ /* FIXME: Need some more things here. */
}
-
- if ( (parms = strstr (parms, "<GnupgKeyParms "))
- && (s = strchr (parms, '>'))
- && (sx = strstr (parms, "format=\"internal\""))
- && sx < s
- && (s2 = strstr (s+1, "</GnupgKeyParms>")) ) {
- /* fixme: check that there are no control statements inside */
- rc = gpgme_data_new_from_mem ( &c->help_data_1, s+1, s2-s-1, 1 );
+ if ((parms = strstr (parms, "<GnupgKeyParms "))
+ && (s = strchr (parms, '>'))
+ && (sx = strstr (parms, "format=\"internal\""))
+ && sx < s
+ && (s2 = strstr (s+1, "</GnupgKeyParms>")))
+ {
+ /* FIXME: Check that there are no control statements inside. */
+ err = gpgme_data_new_from_mem (&ctx->help_data_1, s+1, s2-s-1, 1);
}
- else
- rc = mk_error (Invalid_Value);
+ else
+ err = mk_error (Invalid_Value);
- if (rc )
- goto leave;
+ if (err)
+ goto leave;
- _gpgme_data_set_mode (c->help_data_1, GPGME_DATA_MODE_OUT );
- _gpgme_gpg_add_data (c->gpg, c->help_data_1, 0);
+ _gpgme_data_set_mode (ctx->help_data_1, GPGME_DATA_MODE_OUT);
+
+ _gpgme_engine_set_status_handler (ctx->engine, genkey_status_handler, ctx);
+ _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
+
+ err = _gpgme_engine_op_genkey (ctx->engine, ctx->help_data_1, ctx->use_armor);
+
+ if (!err)
+ err = _gpgme_engine_start (ctx->engine, ctx);
- rc = _gpgme_gpg_spawn ( c->gpg, c );
-
leave:
- if (rc) {
- c->pending = 0;
- _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+ if (err)
+ {
+ ctx->pending = 0;
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
}
- return rc;
+ return err;
}
-
-
/**
* gpgme_op_genkey:
* @c: the context
* Release all resources associated with the given context.
**/
void
-gpgme_release ( GpgmeCtx c )
+gpgme_release (GpgmeCtx c)
{
- if (!c)
- return;
- _gpgme_gpg_release ( c->gpg );
- _gpgme_release_result ( c );
- gpgme_key_release ( c->tmp_key );
- gpgme_data_release ( c->help_data_1 );
- gpgme_data_release ( c->notation );
- gpgme_signers_clear (c);
- if (c->signers)
- xfree (c->signers);
- /* fixme: release the key_queue */
- xfree (c);
+ if (!c)
+ return;
+ _gpgme_engine_release (c->engine);
+ _gpgme_release_result (c);
+ gpgme_key_release (c->tmp_key);
+ gpgme_data_release (c->help_data_1);
+ gpgme_data_release (c->notation);
+ gpgme_signers_clear (c);
+ if (c->signers)
+ xfree (c->signers);
+ /* FIXME: Release the key_queue. */
+ xfree (c);
}
-
void
_gpgme_release_result (GpgmeCtx c)
{
* a progress callback */
}
-
-
GpgmeError
-gpgme_op_import_start ( GpgmeCtx c, GpgmeData keydata )
+gpgme_op_import_start (GpgmeCtx ctx, GpgmeData keydata)
{
- int rc = 0;
- int i;
-
- fail_on_pending_request( c );
- c->pending = 1;
-
- /* create a process object */
- _gpgme_gpg_release (c->gpg); c->gpg = NULL;
- rc = _gpgme_gpg_new ( &c->gpg );
- if (rc)
- goto leave;
-
- _gpgme_gpg_set_status_handler ( c->gpg, import_status_handler, c );
-
- /* build the commandline */
- _gpgme_gpg_add_arg ( c->gpg, "--import" );
- for ( i=0; i < c->verbosity; i++ )
- _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
-
- /* Check the supplied data */
- if ( gpgme_data_get_type (keydata) == GPGME_DATA_TYPE_NONE ) {
- rc = mk_error (No_Data);
- goto leave;
+ int err = 0;
+
+ fail_on_pending_request (ctx);
+ ctx->pending = 1;
+
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
+ err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+ : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+ if (err)
+ goto leave;
+
+ /* Check the supplied data */
+ if (gpgme_data_get_type (keydata) == GPGME_DATA_TYPE_NONE)
+ {
+ err = mk_error (No_Data);
+ goto leave;
}
- _gpgme_data_set_mode (keydata, GPGME_DATA_MODE_OUT );
+ _gpgme_data_set_mode (keydata, GPGME_DATA_MODE_OUT);
+
+ _gpgme_engine_set_status_handler (ctx->engine, import_status_handler, ctx);
+ _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
- _gpgme_gpg_add_data ( c->gpg, keydata, 0 );
+ _gpgme_engine_op_import (ctx->engine, keydata);
- rc = _gpgme_gpg_spawn ( c->gpg, c );
+ if (!err)
+ err = _gpgme_engine_start (ctx->engine, ctx);
leave:
- if (rc) {
- c->pending = 0;
- _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+ if (err)
+ {
+ ctx->pending = 0;
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
}
- return rc;
+ return err;
}
-
/**
* gpgme_op_import:
* @c: Context
* Return value: 0 on success or an errorcode.
**/
GpgmeError
-gpgme_op_keylist_start ( GpgmeCtx c, const char *pattern, int secret_only )
+gpgme_op_keylist_start (GpgmeCtx ctx, const char *pattern, int secret_only)
{
- GpgmeError rc = 0;
- int i;
+ GpgmeError err = 0;
- if ( !c )
- return mk_error (Invalid_Value);
- c->pending = 1;
+ if (!ctx)
+ return mk_error (Invalid_Value);
+ ctx->pending = 1;
- _gpgme_release_result (c);
- c->out_of_core = 0;
+ _gpgme_release_result (ctx);
+ ctx->out_of_core = 0;
- if ( c->gpg ) {
- _gpgme_gpg_release ( c->gpg );
- c->gpg = NULL;
+ if (ctx->engine)
+ {
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
}
- gpgme_key_release (c->tmp_key);
- c->tmp_key = NULL;
- /* Fixme: release key_queue */
-
- rc = _gpgme_gpg_new ( &c->gpg );
- if (rc)
- goto leave;
-
- _gpgme_gpg_set_status_handler ( c->gpg, keylist_status_handler, c );
-
- rc = _gpgme_gpg_set_colon_line_handler ( c->gpg,
- keylist_colon_handler, c );
- if (rc)
- goto leave;
-
- /* build the commandline */
- for ( i=0; i < c->verbosity; i++ )
- _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
- _gpgme_gpg_add_arg ( c->gpg, "--with-colons" );
- _gpgme_gpg_add_arg ( c->gpg, "--fixed-list-mode" );
- _gpgme_gpg_add_arg ( c->gpg, "--with-fingerprint" );
- if (c->keylist_mode == 1)
- _gpgme_gpg_add_arg ( c->gpg, "--no-expensive-trust-checks" );
- _gpgme_gpg_add_arg ( c->gpg, secret_only?
- "--list-secret-keys":"--list-keys" );
+ gpgme_key_release (ctx->tmp_key);
+ ctx->tmp_key = NULL;
+ /* Fixme: Release key_queue. */
- /* Tell the gpg object about the data */
- _gpgme_gpg_add_arg ( c->gpg, "--" );
- if (pattern && *pattern)
- _gpgme_gpg_add_arg ( c->gpg, pattern );
+ err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+ : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+ if (err)
+ goto leave;
+
+ _gpgme_engine_set_status_handler (ctx->engine, keylist_status_handler, ctx);
+ err = _gpgme_engine_set_colon_line_handler (ctx->engine,
+ keylist_colon_handler, ctx);
+ if (err)
+ goto leave;
+ _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
+
+ err = _gpgme_engine_op_keylist (ctx->engine, pattern, secret_only, ctx->keylist_mode);
- /* and kick off the process */
- rc = _gpgme_gpg_spawn ( c->gpg, c );
+ if (!err) /* And kick off the process. */
+ err = _gpgme_engine_start (ctx->engine, ctx);
leave:
- if (rc) {
- c->pending = 0;
- _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+ if (err)
+ {
+ ctx->pending = 0;
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
}
- return rc;
+ return err;
}
/*-- recipient.c --*/
-void _gpgme_append_gpg_args_from_recipients (
- const GpgmeRecipients rset,
- GpgObject gpg );
int _gpgme_recipients_all_valid ( const GpgmeRecipients rset );
GpgmeError err = 0;
if (ctx->passphrase_cb)
- err = _gpgme_gpg_set_command_handler (ctx->gpg, command_handler, ctx);
+ err = _gpgme_engine_set_command_handler (ctx->engine, command_handler, ctx);
return err;
}
return 0;
}
-
-void
-_gpgme_append_gpg_args_from_recipients (
- const GpgmeRecipients rset,
- GpgObject gpg )
-{
- struct user_id_s *r;
-
- assert (rset);
- for (r=rset->list ; r; r = r->next ) {
- _gpgme_gpg_add_arg ( gpg, "-r" );
- _gpgme_gpg_add_arg ( gpg, r->name );
- }
-}
-
int
_gpgme_recipients_all_valid ( const GpgmeRecipients rset )
{
return 0;
}
+GpgmeError
+_gpgme_gpg_op_decrypt (GpgObject gpg, GpgmeData ciph, GpgmeData plain)
+{
+ GpgmeError err;
+
+ err = _gpgme_gpg_add_arg (gpg, "--decrypt");
+
+ /* Tell the gpg object about the data. */
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "--output");
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "-");
+ if (!err)
+ err = _gpgme_gpg_add_data (gpg, plain, 1);
+ if (!err)
+ err = _gpgme_gpg_add_data (gpg, ciph, 0);
+
+ return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_delete (GpgObject gpg, GpgmeKey key, int allow_secret)
+{
+ GpgmeError err;
+
+ err = _gpgme_gpg_add_arg (gpg, allow_secret
+ ? "--delete-secret-and-public-key"
+ : "--delete-key");
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "--");
+ if (!err)
+ {
+ const char *s = gpgme_key_get_string_attr (key, GPGME_ATTR_FPR, NULL, 0);
+ if (!s)
+ err = mk_error (Invalid_Key);
+ else
+ err = _gpgme_gpg_add_arg (gpg, s);
+ }
+
+ return err;
+}
+
+static GpgmeError
+_gpgme_append_gpg_args_from_recipients (GpgObject gpg,
+ const GpgmeRecipients rset)
+{
+ GpgmeError err = 0;
+ struct user_id_s *r;
+
+ assert (rset);
+ for (r = rset->list; r; r = r->next)
+ {
+ err = _gpgme_gpg_add_arg (gpg, "-r");
+ if (!err)
+ _gpgme_gpg_add_arg (gpg, r->name);
+ if (err)
+ break;
+ }
+ return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_encrypt (GpgObject gpg, GpgmeRecipients recp,
+ GpgmeData plain, GpgmeData ciph, int use_armor)
+{
+ GpgmeError err;
+
+ err = _gpgme_gpg_add_arg (gpg, "--encrypt");
+ if (!err && use_armor)
+ err = _gpgme_gpg_add_arg (gpg, "--armor");
+
+ /* If we know that all recipients are valid (full or ultimate trust)
+ * we can suppress further checks */
+ if (!err && _gpgme_recipients_all_valid (recp))
+ err = _gpgme_gpg_add_arg (gpg, "--always-trust");
+
+ if (!err)
+ err = _gpgme_append_gpg_args_from_recipients (gpg, recp);
+
+ /* Tell the gpg object about the data. */
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "--output");
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "-");
+ if (!err)
+ err = _gpgme_gpg_add_data (gpg, ciph, 1);
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "--");
+ if (!err)
+ err = _gpgme_gpg_add_data (gpg, plain, 0);
+
+ return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_export (GpgObject gpg, GpgmeRecipients recp,
+ GpgmeData keydata, int use_armor)
+{
+ GpgmeError err;
+
+ err = _gpgme_gpg_add_arg (gpg, "--export");
+ if (!err && use_armor)
+ err = _gpgme_gpg_add_arg (gpg, "--armor");
+ if (!err)
+ err = _gpgme_gpg_add_data (gpg, keydata, 1);
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "--");
+
+ if (!err)
+ {
+ void *ec;
+ const char *s;
+
+ err = gpgme_recipients_enum_open (recp, &ec);
+ while (!err && (s = gpgme_recipients_enum_read (recp, &ec)))
+ err = _gpgme_gpg_add_arg (gpg, s);
+ if (!err)
+ err = gpgme_recipients_enum_close (recp, &ec);
+ }
+
+ return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_genkey (GpgObject gpg, GpgmeData help_data, int use_armor)
+{
+ GpgmeError err;
+ err = _gpgme_gpg_add_arg (gpg, "--gen-key");
+ if (!err && use_armor)
+ err = _gpgme_gpg_add_arg (gpg, "--armor");
+ if (!err)
+ err = _gpgme_gpg_add_data (gpg, help_data, 0);
+ return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_import (GpgObject gpg, GpgmeData keydata)
+{
+ GpgmeError err;
+
+ err = _gpgme_gpg_add_arg (gpg, "--import");
+ if (!err)
+ err = _gpgme_gpg_add_data (gpg, keydata, 0);
+
+ return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_keylist (GpgObject gpg, const char *pattern, int secret_only,
+ int keylist_mode)
+{
+ GpgmeError err;
+
+ err = _gpgme_gpg_add_arg (gpg, "--with-colons");
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "--fixed-list-mode");
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "--with-fingerprint");
+ if (!err && keylist_mode == 1)
+ err = _gpgme_gpg_add_arg (gpg, "--no-expensive-trust-checks");
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, secret_only ? "--list-secret-keys"
+ : "--list-keys");
+
+ /* Tell the gpg object about the data */
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "--");
+ if (!err && pattern && *pattern)
+ err = _gpgme_gpg_add_arg (gpg, pattern);
+
+ return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_sign (GpgObject gpg, GpgmeData in, GpgmeData out,
+ GpgmeSigMode mode, int use_armor,
+ int use_textmode, GpgmeCtx ctx /* FIXME */)
+{
+ GpgmeError err;
+ GpgmeKey key;
+ int i;
+
+ if (mode == GPGME_SIG_MODE_CLEAR)
+ err = _gpgme_gpg_add_arg (gpg, "--clearsign");
+ else
+ {
+ err = _gpgme_gpg_add_arg (gpg, "--sign");
+ if (!err && mode == GPGME_SIG_MODE_DETACH)
+ err = _gpgme_gpg_add_arg (gpg, "--detach");
+ if (!err && use_armor)
+ err = _gpgme_gpg_add_arg (gpg, "--armor");
+ if (!err && use_textmode)
+ _gpgme_gpg_add_arg (gpg, "--textmode");
+ }
+ for (i = 0; (key = gpgme_signers_enum (ctx, i)); i++)
+ {
+ const char *s = gpgme_key_get_string_attr (key, GPGME_ATTR_KEYID,
+ NULL, 0);
+ if (s)
+ {
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "-u");
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, s);
+ }
+ gpgme_key_unref (key);
+ if (err) break;
+ }
+
+ /* Tell the gpg object about the data. */
+ if (!err)
+ err = _gpgme_gpg_add_data (gpg, in, 0);
+ if (!err)
+ err = _gpgme_gpg_add_data (gpg, out, 1);
+
+ return err;
+}
+
+GpgmeError
+_gpgme_gpg_op_trustlist (GpgObject gpg, const char *pattern)
+{
+ GpgmeError err;
+
+ err = _gpgme_gpg_add_arg (gpg, "--with-colons");
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "--list-trust-path");
+
+ /* Tell the gpg object about the data */
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "--");
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, pattern);
+
+ return err;
+}
+GpgmeError
+_gpgme_gpg_op_verify (GpgObject gpg, GpgmeData sig, GpgmeData text)
+{
+ GpgmeError err = 0;
+
+ if (gpg->pm.used)
+ {
+ err = _gpgme_gpg_add_arg (gpg, gpg->pm.used ? "--pipemode" : "--verify");
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "--");
+ if (!err)
+ err = _gpgme_gpg_add_pm_data (gpg, sig, 0);
+ if (!err)
+ err = _gpgme_gpg_add_pm_data (gpg, text, 1);
+ }
+ else
+ {
+ err = _gpgme_gpg_add_arg (gpg, "--verify");
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "--");
+ if (!err)
+ err = _gpgme_gpg_add_data (gpg, sig, -1);
+ if (text)
+ {
+ if (!err)
+ err = _gpgme_gpg_add_arg (gpg, "-");
+ if (!err)
+ err = _gpgme_gpg_add_data (gpg, text, 0);
+ }
+ }
+ return err;
+}
GpgCommandHandler fnc,
void *fnc_value );
-GpgmeError _gpgme_gpg_spawn ( GpgObject gpg, void *opaque );
-
-
+GpgmeError _gpgme_gpg_op_decrypt (GpgObject gpg, GpgmeData ciph,
+ GpgmeData plain);
+GpgmeError _gpgme_gpg_op_delete (GpgObject gpg, GpgmeKey key, int allow_secret);
+GpgmeError _gpgme_gpg_op_encrypt (GpgObject gpg, GpgmeRecipients recp,
+ GpgmeData plain, GpgmeData ciph,
+ int use_armor);
+GpgmeError _gpgme_gpg_op_export (GpgObject gpg, GpgmeRecipients recp,
+ GpgmeData keydata, int use_armor);
+GpgmeError _gpgme_gpg_op_genkey (GpgObject gpg, GpgmeData help_data,
+ int use_armor);
+GpgmeError _gpgme_gpg_op_import (GpgObject gpg, GpgmeData keydata);
+GpgmeError _gpgme_gpg_op_keylist (GpgObject gpg, const char *pattern,
+ int secret_only, int keylist_mode);
+GpgmeError _gpgme_gpg_op_sign (GpgObject gpg, GpgmeData in, GpgmeData out,
+ GpgmeSigMode mode, int use_armor,
+ int use_textmode, GpgmeCtx ctx /* FIXME */);
+GpgmeError _gpgme_gpg_op_trustlist (GpgObject gpg, const char *pattern);
+GpgmeError _gpgme_gpg_op_verify (GpgObject gpg, GpgmeData sig, GpgmeData text);
+GpgmeError _gpgme_gpg_spawn (GpgObject gpg, void *opaque);
#endif /* RUNGPG_H */
-
-
-
-
-
-
GpgmeSigMode mode)
{
GpgmeError err = 0;
- int i;
- GpgmeKey key;
fail_on_pending_request (ctx);
ctx->pending = 1;
return mk_error (Invalid_Value);
/* Create a process object. */
- _gpgme_gpg_release (ctx->gpg);
- ctx->gpg = NULL;
- err = _gpgme_gpg_new (&ctx->gpg);
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
+ err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+ : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
if (err)
goto leave;
- _gpgme_gpg_set_status_handler (ctx->gpg, sign_status_handler, ctx);
-
- err = _gpgme_passphrase_start (ctx);
- if (err)
- goto leave;
-
- /* Build the commandline. */
- if (mode == GPGME_SIG_MODE_CLEAR)
- _gpgme_gpg_add_arg (ctx->gpg, "--clearsign");
- else
- {
- _gpgme_gpg_add_arg (ctx->gpg, "--sign");
- if (mode == GPGME_SIG_MODE_DETACH)
- _gpgme_gpg_add_arg (ctx->gpg, "--detach");
- if (ctx->use_armor)
- _gpgme_gpg_add_arg (ctx->gpg, "--armor");
- if (ctx->use_textmode)
- _gpgme_gpg_add_arg (ctx->gpg, "--textmode");
- }
- for (i = 0; i < ctx->verbosity; i++)
- _gpgme_gpg_add_arg (ctx->gpg, "--verbose");
- for (i = 0; (key = gpgme_signers_enum (ctx, i)); i++)
- {
- const char *s = gpgme_key_get_string_attr (key, GPGME_ATTR_KEYID,
- NULL, 0);
- if (s)
- {
- _gpgme_gpg_add_arg (ctx->gpg, "-u");
- _gpgme_gpg_add_arg (ctx->gpg, s);
- }
- gpgme_key_unref (key);
- }
-
/* Check the supplied data. */
if (gpgme_data_get_type (in) == GPGME_DATA_TYPE_NONE)
{
}
_gpgme_data_set_mode (out, GPGME_DATA_MODE_IN);
- /* Tell the gpg object about the data. */
- _gpgme_gpg_add_data (ctx->gpg, in, 0);
- _gpgme_gpg_add_data (ctx->gpg, out, 1);
+ err = _gpgme_passphrase_start (ctx);
+ if (err)
+ goto leave;
+
+ _gpgme_engine_set_status_handler (ctx->engine, sign_status_handler, ctx);
+ _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
+
+ _gpgme_engine_op_sign (ctx->engine, in, out, mode, ctx->use_armor,
+ ctx->use_textmode, ctx /* FIXME */);
/* And kick off the process. */
- err = _gpgme_gpg_spawn (ctx->gpg, ctx);
+ err = _gpgme_engine_start (ctx->engine, ctx);
leave:
if (err)
{
ctx->pending = 0;
- _gpgme_gpg_release (ctx->gpg);
- ctx->gpg = NULL;
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
}
return err;
}
ctx->key_cond = 1;
}
-
-
GpgmeError
-gpgme_op_trustlist_start ( GpgmeCtx c, const char *pattern, int max_level )
+gpgme_op_trustlist_start (GpgmeCtx ctx, const char *pattern, int max_level)
{
- GpgmeError rc = 0;
+ GpgmeError err = 0;
- fail_on_pending_request( c );
- if ( !pattern || !*pattern ) {
- return mk_error (Invalid_Value);
- }
+ fail_on_pending_request (ctx);
+ if (!pattern || !*pattern)
+ return mk_error (Invalid_Value);
- c->pending = 1;
+ ctx->pending = 1;
- _gpgme_release_result (c);
- c->out_of_core = 0;
+ _gpgme_release_result (ctx);
+ ctx->out_of_core = 0;
- if ( c->gpg ) {
- _gpgme_gpg_release ( c->gpg );
- c->gpg = NULL;
+ if (ctx->engine)
+ {
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
}
- rc = _gpgme_gpg_new ( &c->gpg );
- if (rc)
- goto leave;
-
- _gpgme_gpg_set_status_handler ( c->gpg, trustlist_status_handler, c );
- rc = _gpgme_gpg_set_colon_line_handler ( c->gpg,
- trustlist_colon_handler, c );
- if (rc)
- goto leave;
-
- /* build the commandline */
- _gpgme_gpg_add_arg ( c->gpg, "--with-colons" );
- _gpgme_gpg_add_arg ( c->gpg, "--list-trust-path" );
-
- /* Tell the gpg object about the data */
- _gpgme_gpg_add_arg ( c->gpg, "--" );
- _gpgme_gpg_add_arg ( c->gpg, pattern );
+ err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+ : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+ if (err)
+ goto leave;
+
+ _gpgme_engine_set_status_handler (ctx->engine, trustlist_status_handler, ctx);
+ err = _gpgme_engine_set_colon_line_handler (ctx->engine,
+ trustlist_colon_handler, ctx);
+ if (err)
+ goto leave;
- /* and kick off the process */
- rc = _gpgme_gpg_spawn ( c->gpg, c );
+ err =_gpgme_engine_op_trustlist (ctx->engine, pattern);
+
+ if (!err) /* And kick off the process. */
+ err = _gpgme_engine_start (ctx->engine, ctx);
leave:
- if (rc) {
- c->pending = 0;
- _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
- }
- return rc;
+ if (err) {
+ ctx->pending = 0;
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
+ }
+ return err;
}
}
}
-
-
GpgmeError
-gpgme_op_verify_start ( GpgmeCtx c, GpgmeData sig, GpgmeData text )
+gpgme_op_verify_start (GpgmeCtx ctx, GpgmeData sig, GpgmeData text)
{
- int rc = 0;
- int i;
- int pipemode = 0; /*!!text; use pipemode for detached sigs */
+ int err = 0;
+ int pipemode = 0; /* !!text; use pipemode for detached sigs. */
- fail_on_pending_request( c );
- c->pending = 1;
+ fail_on_pending_request(ctx);
+ ctx->pending = 1;
- _gpgme_release_result (c);
- c->out_of_core = 0;
+ _gpgme_release_result (ctx);
+ ctx->out_of_core = 0;
- if ( !pipemode ) {
- _gpgme_gpg_release ( c->gpg );
- c->gpg = NULL;
+ if (!pipemode)
+ {
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
}
- if ( !c->gpg )
- rc = _gpgme_gpg_new ( &c->gpg );
- if (rc)
- goto leave;
+ if (!ctx->engine)
+ err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
+ : GPGME_PROTOCOL_OpenPGP, &ctx->engine);
+ if (err)
+ goto leave;
- if (pipemode)
- _gpgme_gpg_enable_pipemode ( c->gpg );
- _gpgme_gpg_set_status_handler (c->gpg, _gpgme_verify_status_handler, c);
+#if 0 /* FIXME */
+ if (pipemode)
+ _gpgme_gpg_enable_pipemode (c->engine->engine.gpg);
+#endif
- /* build the commandline */
- _gpgme_gpg_add_arg ( c->gpg, pipemode?"--pipemode" : "--verify" );
- for ( i=0; i < c->verbosity; i++ )
- _gpgme_gpg_add_arg ( c->gpg, "--verbose" );
+ _gpgme_engine_set_status_handler (ctx->engine, _gpgme_verify_status_handler,
+ ctx);
+ _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
- /* Check the supplied data */
- if ( gpgme_data_get_type (sig) == GPGME_DATA_TYPE_NONE ) {
- rc = mk_error (No_Data);
- goto leave;
- }
- if ( text && gpgme_data_get_type (text) == GPGME_DATA_TYPE_NONE ) {
- rc = mk_error (No_Data);
- goto leave;
- }
- _gpgme_data_set_mode (sig, GPGME_DATA_MODE_OUT );
- if (text) /* detached signature */
- _gpgme_data_set_mode (text, GPGME_DATA_MODE_OUT );
- /* Tell the gpg object about the data */
- _gpgme_gpg_add_arg ( c->gpg, "--" );
- if (pipemode) {
- _gpgme_gpg_add_pm_data ( c->gpg, sig, 0 );
- _gpgme_gpg_add_pm_data ( c->gpg, text, 1 );
+ /* Check the supplied data. */
+ if (gpgme_data_get_type (sig) == GPGME_DATA_TYPE_NONE)
+ {
+ err = mk_error (No_Data);
+ goto leave;
}
- else {
- _gpgme_gpg_add_data ( c->gpg, sig, -1 );
- if (text) {
- _gpgme_gpg_add_arg ( c->gpg, "-" );
- _gpgme_gpg_add_data ( c->gpg, text, 0 );
- }
+ if (text && gpgme_data_get_type (text) == GPGME_DATA_TYPE_NONE)
+ {
+ err = mk_error (No_Data);
+ goto leave;
}
+ _gpgme_data_set_mode (sig, GPGME_DATA_MODE_OUT);
+ if (text) /* Detached signature. */
+ _gpgme_data_set_mode (text, GPGME_DATA_MODE_OUT);
- /* and kick off the process */
- rc = _gpgme_gpg_spawn ( c->gpg, c );
+ err = _gpgme_engine_op_verify (ctx->engine, sig, text);
+ if (!err) /* And kick off the process. */
+ err = _gpgme_engine_start (ctx->engine, ctx);
leave:
- if (rc) {
- c->pending = 0;
- _gpgme_gpg_release ( c->gpg ); c->gpg = NULL;
+ if (err)
+ {
+ ctx->pending = 0;
+ _gpgme_engine_release (ctx->engine);
+ ctx->engine = NULL;
}
- return rc;
+ return err;
}
-
/*
* Figure out a common status value for all signatures
*/