aboutsummaryrefslogtreecommitdiffstats
path: root/src/gpgme-tool.c
diff options
context:
space:
mode:
authorMarcus Brinkmann <[email protected]>2009-11-10 09:07:19 +0000
committerMarcus Brinkmann <[email protected]>2009-11-10 09:07:19 +0000
commit96cf17b15995c9b925f80a64dbd42c1305ca9895 (patch)
tree364f15711af329ff9b3b207245516e1320fb3ba0 /src/gpgme-tool.c
parentFix last change. (diff)
downloadgpgme-96cf17b15995c9b925f80a64dbd42c1305ca9895.tar.gz
gpgme-96cf17b15995c9b925f80a64dbd42c1305ca9895.zip
2009-11-10 Marcus Brinkmann <[email protected]>
* configure.ac: Activate UIServer if FD passing is enabled and Assuan is available. m4/ 2009-11-10 Marcus Brinkmann <[email protected]> * libassuan.m4: Fix LIBASSUAN_VERSION. src/ 2009-11-10 Marcus Brinkmann <[email protected]> * Makefile.am (uiserver_components): New variable. (main_sources): Add it. * ops.h, key.c (_gpgme_key_append_name): Take CONVERT argument, implement it. Adjust callers. (gpgme_key_from_uid): New function. * gpgme.h.in (gpgme_protocol_t): Add GPGME_PROTOCOL_DEFAULT. (gpgme_encrypt_flags_t): Add GPGME_ENCRYPT_PREPARE, GPGME_ENCRYPT_EXPECT_SIGN. (gpgme_set_sub_protocol, gpgme_key_from_uid): New functions. * libgpgme.vers, gpgme.def: Add new functions. * gpgme.c (gpgme_set_protocol): Add UIServer protocol. (gpgme_set_sub_protocol): New function. (gpgme_get_protocol_name): Add UIServer and default protocol. * assuan-support.c: Return correct error values, implement socketpair for POSIX. * priv-io.h, posix-io.c, w32-io.c, w32-glib-io.c, w32-qt-io.cpp (_gpgme_io_spawn): Add ATFORK and ATFORKVALUE arguments. Implement it for POSIX. Adjust all callers. * engine.h, engine-backend.h (_gpgme_engine_set_protocol) (_gpgme_engine_op_decrypt_verify): New prototypes. Adjust all users. * engine.c (engine_ops, gpgme_get_engine_info): Add UIServer engine. (_gpgme_engine_set_protocol, _gpgme_engine_op_decrypt_verify): New function. * decrypt-verify.c (decrypt_verify_start): Call _gpgme_engine_op_decrypt_verify. * util.h, posix-util.c, w32-util.c (_gpgme_get_uiserver_socket_path): New function. * engine-gpgsm.c (gpgsm_set_fd): Fix _gpgme_io_pipe invocation. * gpgme-tool.c: Some support for UIServer protocol. * engine-uiserver.c: New file.
Diffstat (limited to 'src/gpgme-tool.c')
-rw-r--r--src/gpgme-tool.c61
1 files changed, 46 insertions, 15 deletions
diff --git a/src/gpgme-tool.c b/src/gpgme-tool.c
index d2745301..0283ffd2 100644
--- a/src/gpgme-tool.c
+++ b/src/gpgme-tool.c
@@ -669,7 +669,10 @@ gt_recipients_add (gpgme_tool_t gt, const char *pattern)
if (gt->recipients_nr >= MAX_RECIPIENTS)
return gpg_error_from_errno (ENOMEM);
- err = gt_get_key (gt, pattern, &key);
+ if (gpgme_get_protocol (gt->ctx) == GPGME_PROTOCOL_UISERVER)
+ err = gpgme_key_from_uid (&key, pattern);
+ else
+ err = gt_get_key (gt, pattern, &key);
if (err)
return err;
@@ -780,6 +783,10 @@ gt_protocol_from_name (const char *name)
return GPGME_PROTOCOL_ASSUAN;
if (! strcasecmp (name, gpgme_get_protocol_name (GPGME_PROTOCOL_G13)))
return GPGME_PROTOCOL_G13;
+ if (! strcasecmp (name, gpgme_get_protocol_name (GPGME_PROTOCOL_UISERVER)))
+ return GPGME_PROTOCOL_UISERVER;
+ if (! strcasecmp (name, gpgme_get_protocol_name (GPGME_PROTOCOL_DEFAULT)))
+ return GPGME_PROTOCOL_DEFAULT;
return GPGME_PROTOCOL_UNKNOWN;
}
@@ -792,6 +799,13 @@ gt_set_protocol (gpgme_tool_t gt, gpgme_protocol_t proto)
gpg_error_t
+gt_set_sub_protocol (gpgme_tool_t gt, gpgme_protocol_t proto)
+{
+ return gpgme_set_sub_protocol (gt->ctx, proto);
+}
+
+
+gpg_error_t
gt_get_protocol (gpgme_tool_t gt)
{
gpgme_protocol_t proto = gpgme_get_protocol (gt->ctx);
@@ -1249,6 +1263,17 @@ cmd_protocol (assuan_context_t ctx, char *line)
static gpg_error_t
+cmd_sub_protocol (assuan_context_t ctx, char *line)
+{
+ struct server *server = assuan_get_pointer (ctx);
+ if (line && *line)
+ return gt_set_sub_protocol (server->gt, gt_protocol_from_name (line));
+ /* FIXME. */
+ return 0;
+}
+
+
+static gpg_error_t
cmd_armor (assuan_context_t ctx, char *line)
{
struct server *server = assuan_get_pointer (ctx);
@@ -1456,30 +1481,35 @@ _cmd_sign_encrypt (assuan_context_t ctx, char *line, int sign)
gpg_error_t err;
assuan_fd_t inp_fd;
assuan_fd_t out_fd;
- gpgme_data_t inp_data;
- gpgme_data_t out_data;
+ gpgme_data_t inp_data = NULL;
+ gpgme_data_t out_data = NULL;
gpgme_encrypt_flags_t flags = 0;
if (strstr (line, "--always-trust"))
flags |= GPGME_ENCRYPT_ALWAYS_TRUST;
if (strstr (line, "--no-encrypt-to"))
flags |= GPGME_ENCRYPT_NO_ENCRYPT_TO;
+ if (strstr (line, "--prepare"))
+ flags |= GPGME_ENCRYPT_PREPARE;
+ if (strstr (line, "--expect-sign"))
+ flags |= GPGME_ENCRYPT_EXPECT_SIGN;
inp_fd = assuan_get_input_fd (ctx);
- if (inp_fd == ASSUAN_INVALID_FD)
- return GPG_ERR_ASS_NO_INPUT;
out_fd = assuan_get_output_fd (ctx);
- if (out_fd == ASSUAN_INVALID_FD)
- return GPG_ERR_ASS_NO_OUTPUT;
-
- err = server_data_obj (inp_fd, server->input_enc, &inp_data);
- if (err)
- return err;
- err = server_data_obj (out_fd, server->output_enc, &out_data);
- if (err)
+ if (inp_fd != ASSUAN_INVALID_FD)
{
- gpgme_data_release (inp_data);
- return err;
+ err = server_data_obj (inp_fd, server->input_enc, &inp_data);
+ if (err)
+ return err;
+ }
+ if (out_fd != ASSUAN_INVALID_FD)
+ {
+ err = server_data_obj (out_fd, server->output_enc, &out_data);
+ if (err)
+ {
+ gpgme_data_release (inp_data);
+ return err;
+ }
}
err = gt_sign_encrypt (server->gt, flags, inp_data, out_data, sign);
@@ -1957,6 +1987,7 @@ register_commands (assuan_context_t ctx)
// TODO: Set engine info.
{ "ENGINE", cmd_engine },
{ "PROTOCOL", cmd_protocol, hlp_protocol },
+ { "SUB_PROTOCOL", cmd_sub_protocol },
{ "ARMOR", cmd_armor },
{ "TEXTMODE", cmd_textmode },
{ "INCLUDE_CERTS", cmd_include_certs },