[git] GPGME - branch, master, updated. gpgme-1.3.2-13-g3d69b51

by W. Trevor King cvs at cvs.gnupg.org
Fri Sep 28 09:56:53 CEST 2012


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GnuPG Made Easy".

The branch, master has been updated
       via  3d69b51f7f083193db28f364da4590c33b5e44e6 (commit)
       via  dda3702a9024a08da7bb949e15b63a47d23d59f5 (commit)
       via  193eb62538b9413e0dfbd04c075f871d5aa9130b (commit)
      from  d230b7c2f9ad5964c92ee22dc9532d9ac119600a (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 3d69b51f7f083193db28f364da4590c33b5e44e6
Author: W. Trevor King <wking at tremily.us>
Date:   Fri Sep 28 08:31:13 2012 +0200

    gpgme-tool: Return more detailed XML from KEYLIST
    
    src/gpgme-tool.c (cmd_keylist): Convert output from a list of
    to more detailed XML.
    (xml_preamble1, xml_preamble2, xml_end): Make global.
    (result_add_protocol, result_add_validity): New functions for
    generating XML from GPGME types.
    (result_add_string): Treat NULL strings as "".
    (result_xml_tag_data): Make 'data' a 'const char' so we can use the
    value returned by gpgme_get_protocol_name directly.
    --
    
    This is a first pass at returning most of the gpgme_key_t data from the
    KEYLIST call.
    
    Signed-off-by: W. Trevor King <wking at tremily.us>

diff --git a/src/gpgme-tool.c b/src/gpgme-tool.c
index 19dedb6..23122e8 100644
--- a/src/gpgme-tool.c
+++ b/src/gpgme-tool.c
@@ -565,6 +565,12 @@ skip_options (char *line)
 typedef gpg_error_t (*result_xml_write_cb_t) (void *hook, const void *buf,
 					      size_t len);
 
+static char xml_preamble1[] = "<?xml version=\"1.0\" "
+  "encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+static const char xml_preamble2[] = "<gpgme>\n";
+static const char xml_end[] = "</gpgme>\n";
+
+
 struct result_xml_state
 {
   int indent;
@@ -653,7 +659,7 @@ result_xml_tag_start (struct result_xml_state *state, char *name, ...)
 
 
 gpg_error_t
-result_xml_tag_data (struct result_xml_state *state, char *data)
+result_xml_tag_data (struct result_xml_state *state, const char *data)
 {
   result_xml_write_cb_t cb = state->cb;
   void *hook = state->hook;
@@ -813,6 +819,60 @@ result_add_sig_mode (struct result_xml_state *state, char *name,
 
 
 gpg_error_t
+result_add_protocol (struct result_xml_state *state, char *name,
+		     gpgme_protocol_t protocol)
+{
+  const char *str;
+  char code[20];
+
+  snprintf (code, sizeof (code) - 1, "%i", protocol);
+  str = gpgme_get_protocol_name(protocol);
+  if (!str)
+    str = "invalid";
+  result_xml_tag_start (state, name, "value", code, NULL);
+  result_xml_tag_data (state, str);
+  result_xml_tag_end (state);
+  return 0;
+}
+
+
+gpg_error_t
+result_add_validity (struct result_xml_state *state, char *name,
+		     gpgme_validity_t validity)
+{
+  const char *str;
+  char code[20];
+
+  snprintf (code, sizeof (code) - 1, "%i", validity);
+  switch (validity)
+    {
+    case GPGME_VALIDITY_UNDEFINED:
+      str ="undefined";
+      break;
+    case GPGME_VALIDITY_NEVER:
+      str ="never";
+      break;
+    case GPGME_VALIDITY_MARGINAL:
+      str ="marginal";
+      break;
+    case GPGME_VALIDITY_FULL:
+      str ="full";
+      break;
+    case GPGME_VALIDITY_ULTIMATE:
+      str ="ultimate";
+      break;
+    default:
+      str ="unknown";
+    }
+
+  result_xml_tag_start (state, name, "value", code, NULL);
+  result_xml_tag_data (state, str);
+  result_xml_tag_end (state);
+  return 0;
+}
+
+
+gpg_error_t
 result_add_value (struct result_xml_state *state,
 		  char *name, unsigned int val)
 {
@@ -829,6 +889,8 @@ gpg_error_t
 result_add_string (struct result_xml_state *state,
 		   char *name, char *str)
 {
+  if (!str)
+    str = "";
   result_xml_tag_start (state, name, NULL);
   result_xml_tag_data (state, str);
   result_xml_tag_end (state);
@@ -1820,10 +1882,6 @@ gt_passwd (gpgme_tool_t gt, char *fpr)
 gpg_error_t
 gt_result (gpgme_tool_t gt, unsigned int flags)
 {
-  static const char xml_preamble1[] = "<?xml version=\"1.0\" "
-    "encoding=\"UTF-8\" standalone=\"yes\"?>\n";
-  static const char xml_preamble2[] = "<gpgme>\n";
-  static const char xml_end[] = "</gpgme>\n";
   int indent = 2;
 
   gt_write_data (gt, xml_preamble1, sizeof (xml_preamble1));
@@ -2840,9 +2898,11 @@ cmd_keylist (assuan_context_t ctx, char *line)
 {
 #define MAX_CMD_KEYLIST_PATTERN 20
   struct server *server = assuan_get_pointer (ctx);
+  gpgme_tool_t gt = server->gt;
+  struct result_xml_state state;
   gpg_error_t err;
   int secret_only = 0;
-  int idx;
+  int idx, indent=2;
   const char *pattern[MAX_CMD_KEYLIST_PATTERN+1];
   const char optstr[] = "--secret-only";
   char *p;
@@ -2872,10 +2932,19 @@ cmd_keylist (assuan_context_t ctx, char *line)
     }
   pattern[idx] = NULL;
 
+  gt_write_data (gt, xml_preamble1, sizeof (xml_preamble1));
+  gt_write_data (gt, NULL, 0);
+  gt_write_data (gt, xml_preamble2, sizeof (xml_preamble2));
+  gt_write_data (gt, NULL, 0);
+  result_init (&state, indent, (result_xml_write_cb_t) gt_write_data, gt);
+  result_xml_tag_start (&state, "keylist", NULL);
+
   err = gt_keylist_start (server->gt, pattern, secret_only);
   while (! err)
     {
       gpgme_key_t key;
+      gpgme_subkey_t subkey;
+      gpgme_user_id_t uid;
 
       err = gt_keylist_next (server->gt, &key);
       if (gpg_err_code (err) == GPG_ERR_EOF)
@@ -2885,18 +2954,55 @@ cmd_keylist (assuan_context_t ctx, char *line)
 	}
       else if (! err)
 	{
-	  char buf[100];
-	  /* FIXME: More data.  */
-	  snprintf (buf, sizeof (buf), "key:%s\n", key->subkeys->fpr);
-          /* Write data and flush so that we see one D line for each
-             key.  This does not change the semantics but is easier to
-             read by organic eyes.  */
-	  if (!assuan_send_data (ctx, buf, strlen (buf)))
-            assuan_send_data (ctx, NULL, 0);
+	  result_xml_tag_start (&state, "key", NULL);
+	  result_add_value (&state, "revoked", key->revoked);
+	  result_add_value (&state, "expired", key->expired);
+	  result_add_value (&state, "disabled", key->disabled);
+	  result_add_value (&state, "invalid", key->invalid);
+	  result_add_value (&state, "can-encrypt", key->can_encrypt);
+	  result_add_value (&state, "can-sign", key->can_sign);
+	  result_add_value (&state, "can-certify", key->can_certify);
+	  result_add_value (&state, "can-authenticate", key->can_authenticate);
+	  result_add_value (&state, "is-qualified", key->is_qualified);
+	  result_add_value (&state, "secret", key->secret);
+	  result_add_protocol (&state, "protocol", key->protocol);
+	  result_xml_tag_start (&state, "issuer", NULL);
+	  result_add_string (&state, "serial", key->issuer_serial);
+	  result_add_string (&state, "name", key->issuer_name);
+	  result_xml_tag_end (&state);  /* issuer */
+	  result_add_string (&state, "chain_id", key->chain_id);
+	  result_add_validity (&state, "owner-trust", key->owner_trust);
+	  result_xml_tag_start (&state, "subkeys", NULL);
+	  subkey = key->subkeys;
+	  while (subkey) {
+	    result_xml_tag_start (&state, "subkey", NULL);
+	    /* FIXME: more data */
+	    result_add_fpr (&state, "fpr", subkey->fpr);
+	    result_xml_tag_end (&state);  /* subkey */
+	    subkey = subkey->next;
+	  }
+	  result_xml_tag_end (&state);  /* subkeys */
+	  result_xml_tag_start (&state, "uids", NULL);
+	  uid = key->uids;
+	  while (uid) {
+	    result_xml_tag_start (&state, "uid", NULL);
+	    /* FIXME: more data */
+	    result_add_string (&state, "uid", uid->uid);
+	    result_add_string (&state, "name", uid->name);
+	    result_add_string (&state, "email", uid->email);
+	    result_add_string (&state, "comment", uid->comment);
+	    result_xml_tag_end (&state);  /* uid */
+	    uid = uid->next;
+	  }
+	  result_xml_tag_end (&state);  /* uids */
+	  result_xml_tag_end (&state);  /* key */
 	  gpgme_key_unref (key);
 	}
     }
 
+  result_xml_tag_end (&state);  /* keylist */
+  gt_write_data (gt, xml_end, sizeof (xml_end));
+
   server_reset_fds (server);
 
   return err;

commit dda3702a9024a08da7bb949e15b63a47d23d59f5
Author: W. Trevor King <wking at tremily.us>
Date:   Wed Sep 26 19:26:00 2012 -0400

    gpgme-tool: Initialize input_fd and output_fd
    
    * src/gpgme-tool.c (gpgme_server): Initialize input_fd and output_fd.
    
    Signed-off-by: W. Trevor King <wking at tremily.us>

diff --git a/src/gpgme-tool.c b/src/gpgme-tool.c
index 3a02065..19dedb6 100644
--- a/src/gpgme-tool.c
+++ b/src/gpgme-tool.c
@@ -3121,6 +3121,8 @@ gpgme_server (gpgme_tool_t gt)
   static const char hello[] = ("GPGME-Tool " VERSION " ready");
 
   memset (&server, 0, sizeof (server));
+  server.input_fd = ASSUAN_INVALID_FD;
+  server.output_fd = ASSUAN_INVALID_FD;
   server.message_fd = ASSUAN_INVALID_FD;
   server.input_enc = GPGME_DATA_ENCODING_NONE;
   server.output_enc = GPGME_DATA_ENCODING_NONE;

commit 193eb62538b9413e0dfbd04c075f871d5aa9130b
Author: Werner Koch <wk at gnupg.org>
Date:   Wed Sep 26 09:37:22 2012 +0200

    gpgme-tool: Fix handling of file descriptors
    
    * src/gpgme-tool.c (server_reset_fds): Use close/CloseHandle instead
    of the assuan close functions.
    (_cmd_decrypt_verify, _cmd_sign_encrypt, cmd_verify, cmd_import)
    (cmd_export, cmd_genkey, cmd_getauditlog): Use SERVER object instead
    of assuan_get_*_fd functions.
    --
    
    Although we used our own handlers for INPUT and OUTPUT, we still used
    assuan_get_input_fd, assuan_get_output_fd and their close functions.
    That clearly can't work because libassuan does not have any values for
    them.

diff --git a/src/gpgme-tool.c b/src/gpgme-tool.c
index 75b7c9e..3a02065 100644
--- a/src/gpgme-tool.c
+++ b/src/gpgme-tool.c
@@ -1900,7 +1900,10 @@ server_write_data (void *hook, const void *buf, size_t len)
 }
 
 
-
+/* Wrapper around assuan_command_parse_fd to also handle a
+   "file=FILENAME" argument.  On success either a filename is returned
+   at FILENAME or a file descriptor at RFD; the other one is set to
+   NULL respective ASSUAN_INVALID_FD.  */
 static gpg_error_t
 server_parse_fd (assuan_context_t ctx, char *line, assuan_fd_t *rfd,
 		 char **filename)
@@ -1974,8 +1977,24 @@ server_reset_fds (struct server *server)
   /* assuan closes the input and output FDs for us when doing a RESET,
      but we use this same function after commands, so repeat it
      here.  */
-  assuan_close_input_fd (server->assuan_ctx);
-  assuan_close_output_fd (server->assuan_ctx);
+  if (server->input_fd != ASSUAN_INVALID_FD)
+    {
+#if HAVE_W32_SYSTEM
+      CloseHandle (server->input_fd);
+#else
+      close (server->input_fd);
+#endif
+      server->input_fd = ASSUAN_INVALID_FD;
+    }
+  if (server->output_fd != ASSUAN_INVALID_FD)
+    {
+#if HAVE_W32_SYSTEM
+      CloseHandle (server->output_fd);
+#else
+      close (server->output_fd);
+#endif
+      server->output_fd = ASSUAN_INVALID_FD;
+    }
   if (server->message_fd != ASSUAN_INVALID_FD)
     {
       /* FIXME: Assuan should provide a close function.  */
@@ -2331,11 +2350,11 @@ _cmd_decrypt_verify (assuan_context_t ctx, char *line, int verify)
   gpgme_data_t inp_data;
   gpgme_data_t out_data;
 
-  inp_fd = assuan_get_input_fd (ctx);
+  inp_fd = server->input_fd;
   inp_fn = server->input_filename;
   if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
     return GPG_ERR_ASS_NO_INPUT;
-  out_fd = assuan_get_output_fd (ctx);
+  out_fd = server->output_fd;
   out_fn = server->output_filename;
   if (out_fd == ASSUAN_INVALID_FD && !out_fn)
     return GPG_ERR_ASS_NO_OUTPUT;
@@ -2411,9 +2430,9 @@ _cmd_sign_encrypt (assuan_context_t ctx, char *line, int sign)
   if (strstr (line, "--expect-sign"))
     flags |= GPGME_ENCRYPT_EXPECT_SIGN;
 
-  inp_fd = assuan_get_input_fd (ctx);
+  inp_fd = server->input_fd;
   inp_fn = server->input_filename;
-  out_fd = assuan_get_output_fd (ctx);
+  out_fd = server->output_fd;
   out_fn = server->output_filename;
   if (inp_fd != ASSUAN_INVALID_FD || inp_fn)
     {
@@ -2502,11 +2521,11 @@ cmd_sign (assuan_context_t ctx, char *line)
   if (strstr (line, "--detach"))
     mode = GPGME_SIG_MODE_DETACH;
 
-  inp_fd = assuan_get_input_fd (ctx);
+  inp_fd = server->input_fd;
   inp_fn = server->input_filename;
   if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
     return GPG_ERR_ASS_NO_INPUT;
-  out_fd = assuan_get_output_fd (ctx);
+  out_fd = server->output_fd;
   out_fn = server->output_filename;
   if (out_fd == ASSUAN_INVALID_FD && !out_fn)
     return GPG_ERR_ASS_NO_OUTPUT;
@@ -2555,13 +2574,13 @@ cmd_verify (assuan_context_t ctx, char *line)
   gpgme_data_t msg_data = NULL;
   gpgme_data_t out_data = NULL;
 
-  inp_fd = assuan_get_input_fd (ctx);
+  inp_fd = server->input_fd;
   inp_fn = server->input_filename;
   if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
     return GPG_ERR_ASS_NO_INPUT;
   msg_fd = server->message_fd;
   msg_fn = server->message_filename;
-  out_fd = assuan_get_output_fd (ctx);
+  out_fd = server->output_fd;
   out_fn = server->output_filename;
 
   err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
@@ -2628,7 +2647,7 @@ cmd_import (assuan_context_t ctx, char *line)
       char *inp_fn;
       gpgme_data_t inp_data;
 
-      inp_fd = assuan_get_input_fd (ctx);
+      inp_fd = server->input_fd;
       inp_fn = server->input_filename;
       if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
 	return GPG_ERR_ASS_NO_INPUT;
@@ -2664,7 +2683,7 @@ cmd_export (assuan_context_t ctx, char *line)
   gpgme_export_mode_t mode = 0;
   const char *pattern[2];
 
-  out_fd = assuan_get_output_fd (ctx);
+  out_fd = server->output_fd;
   out_fn = server->output_filename;
   if (out_fd == ASSUAN_INVALID_FD && !out_fn)
     return GPG_ERR_ASS_NO_OUTPUT;
@@ -2724,11 +2743,11 @@ cmd_genkey (assuan_context_t ctx, char *line)
   gpgme_data_t parms_data = NULL;
   const char *parms;
 
-  inp_fd = assuan_get_input_fd (ctx);
+  inp_fd = server->input_fd;
   inp_fn = server->input_filename;
   if (inp_fd == ASSUAN_INVALID_FD && !inp_fn)
     return GPG_ERR_ASS_NO_INPUT;
-  out_fd = assuan_get_output_fd (ctx);
+  out_fd = server->output_fd;
   out_fn = server->output_filename;
 
   err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
@@ -2899,7 +2918,7 @@ cmd_getauditlog (assuan_context_t ctx, char *line)
   gpgme_data_t out_data;
   unsigned int flags = 0;
 
-  out_fd = assuan_get_output_fd (ctx);
+  out_fd = server->output_fd;
   out_fn = server->output_filename;
   if (out_fd == ASSUAN_INVALID_FD && !out_fn)
     return GPG_ERR_ASS_NO_OUTPUT;

-----------------------------------------------------------------------

Summary of changes:
 src/gpgme-tool.c |  187 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 157 insertions(+), 30 deletions(-)


hooks/post-receive
-- 
GnuPG Made Easy
http://git.gnupg.org




More information about the Gnupg-commits mailing list