[Pkg-gnupg-commit] [gpgme] 124/132: core: Prepare for new key listing data send by gpg.

Daniel Kahn Gillmor dkg at fifthhorseman.net
Wed Apr 26 01:01:38 UTC 2017


This is an automated email from the git hooks/post-receive script.

dkg pushed a commit to branch experimental
in repository gpgme.

commit 813ae5fa2d712aa9679b791c67c9c1c43d36ffe4
Author: Werner Koch <wk at gnupg.org>
Date:   Tue Mar 28 11:40:44 2017 +0200

    core: Prepare for new key listing data send by gpg.
    
    * src/gpgme.h.in (gpgme_user_id_t): New fields 'origin' and
    'last_update'.
    (gpgme_key_t): New fields 'origin' and 'last_update'.
    * src/conversion.c (_gpgme_parse_timestamp_ul): New.
    * src/keylist.c (keylist_colon_handler): Parse fields 19 and 20.
    
    * tests/run-keylist.c (main): Print new fields.
    
    Signed-off-by: Werner Koch <wk at gnupg.org>
---
 NEWS                |  4 ++++
 doc/gpgme.texi      | 13 +++++++++++++
 src/conversion.c    | 19 +++++++++++++++++++
 src/gpgme.h.in      | 16 ++++++++++++++--
 src/keylist.c       | 23 ++++++++++++++++-------
 src/util.h          |  3 +++
 tests/run-keylist.c |  2 ++
 7 files changed, 71 insertions(+), 9 deletions(-)

diff --git a/NEWS b/NEWS
index e119b9a..0005abe 100644
--- a/NEWS
+++ b/NEWS
@@ -10,7 +10,11 @@ Noteworthy changes in version 1.8.1 (unreleased)
  gpgme_op_createkey          CHANGED: Meaning of 'expire' parameter.
  gpgme_op_createsubkey       CHANGED: Meaning of 'expire' parameter.
  GPGME_CREATE_NOEXPIRE       NEW.
+ gpgme_key_t                 EXTENDED: New field 'origin'.
+ gpgme_key_t                 EXTENDED: New field 'last_update'.
  gpgme_subkey_t              EXTENDED: New field 'is_de_vs'.
+ gpgme_user_id_t             EXTENDED: New field 'origin'.
+ gpgme_user_id_t             EXTENDED: New field 'last_update'.
  gpgme_op_keylist_from_data_start NEW.
  gpgme_op_set_uid_flag_start      NEW.
  gpgme_op_set_uid_flag            NEW.
diff --git a/doc/gpgme.texi b/doc/gpgme.texi
index d5969b7..62004ae 100644
--- a/doc/gpgme.texi
+++ b/doc/gpgme.texi
@@ -3078,6 +3078,9 @@ be true even if the corresponding subkey flag may be false
 (offline/stub keys).  This is only set if a listing of secret keys has
 been requested or if @code{GPGME_KEYLIST_MODE_WITH_SECRET} is active.
 
+ at item unsigned int origin : 5
+Reserved for the origin of this key.
+
 @item gpgme_protocol_t protocol
 This is the protocol supported by this key.
 
@@ -3111,6 +3114,9 @@ this is a copy of the fingerprint of the first subkey.  For an
 incomplete key (for example from a verification result) a subkey may
 be missing but this field may be set nevertheless.
 
+ at item unsigned long last_update
+Reserved for the time of the last update of this key.
+
 @end table
 @end deftp
 
@@ -3255,6 +3261,13 @@ this user id.
 
 @item gpgme_key_sig_t signatures
 This is a linked list with the signatures on this user ID.
+
+ at item unsigned int origin : 5
+Reserved for the origin of this user ID.
+
+ at item unsigned long last_update
+Reserved for the time of the last update of this user ID.
+
 @end table
 @end deftp
 
diff --git a/src/conversion.c b/src/conversion.c
index 6dfabe7..92dd214 100644
--- a/src/conversion.c
+++ b/src/conversion.c
@@ -536,6 +536,25 @@ _gpgme_parse_timestamp (const char *timestamp, char **endp)
 }
 
 
+/* This function is similar to _gpgme_parse_timestamp but returns an
+ * unsigned long and 0 on error.  */
+unsigned long
+_gpgme_parse_timestamp_ul (const char *timestamp)
+{
+  time_t tim;
+  char *tail;
+
+  if (!*timestamp)
+    return 0; /* Shortcut empty strings.  */
+
+  tim = _gpgme_parse_timestamp (timestamp, &tail);
+  if (tim == -1 || timestamp == tail || (*tail && *tail != ' '))
+    tim = 0; /* No time given or invalid engine.  */
+
+  return (unsigned long)tim;
+}
+
+
 /* The GPG backend uses OpenPGP algorithm numbers which we need to map
    to our algorithm numbers.  This function MUST not change ERRNO. */
 int
diff --git a/src/gpgme.h.in b/src/gpgme.h.in
index b6c1406..24b21e7 100644
--- a/src/gpgme.h.in
+++ b/src/gpgme.h.in
@@ -662,7 +662,10 @@ struct _gpgme_user_id
   unsigned int invalid : 1;
 
   /* Internal to GPGME, do not use.  */
-  unsigned int _unused : 30;
+  unsigned int _unused : 25;
+
+  /* Origin of this user ID.  */
+  unsigned int origin : 5;
 
   /* The validity of the user ID.  */
   gpgme_validity_t validity;
@@ -693,6 +696,9 @@ struct _gpgme_user_id
 
   /* The malloced TOFU information or NULL.  */
   gpgme_tofu_info_t tofu;
+
+  /* Time of the last refresh of thsi user id.  0 if unknown.  */
+  unsigned long last_update;
 };
 typedef struct _gpgme_user_id *gpgme_user_id_t;
 
@@ -736,7 +742,10 @@ struct _gpgme_key
   unsigned int is_qualified : 1;
 
   /* Internal to GPGME, do not use.  */
-  unsigned int _unused : 22;
+  unsigned int _unused : 17;
+
+  /* Origin of this key.  */
+  unsigned int origin : 5;
 
   /* This is the protocol supported by this key.  */
   gpgme_protocol_t protocol;
@@ -776,6 +785,9 @@ struct _gpgme_key
    * this is a copy of the FPR of the first subkey.  We need it here
    * to allow for an incomplete key object.  */
   char *fpr;
+
+  /* Time of the last refresh of the entire key.  0 if unknown.  */
+  unsigned long last_update;
 };
 typedef struct _gpgme_key *gpgme_key_t;
 
diff --git a/src/keylist.c b/src/keylist.c
index c88a7ca..e16ba4d 100644
--- a/src/keylist.c
+++ b/src/keylist.c
@@ -552,7 +552,7 @@ keylist_colon_handler (void *priv, char *line)
       RT_SSB, RT_SEC, RT_CRT, RT_CRS, RT_REV, RT_SPK
     }
   rectype = RT_NONE;
-#define NR_FIELDS 18
+#define NR_FIELDS 20
   char *field[NR_FIELDS];
   int fields = 0;
   void *hook;
@@ -733,6 +733,12 @@ keylist_colon_handler (void *priv, char *line)
       if (fields >= 17 && *field[17])
         parse_pub_field18 (subkey, field[17]);
 
+      if (fields >= 20)
+        {
+          key->last_update = _gpgme_parse_timestamp_ul (field[18]);
+          key->origin = 0; /* Fixme: Not yet defined in gpg.  */
+        }
+
       break;
 
     case RT_SUB:
@@ -818,12 +824,15 @@ keylist_colon_handler (void *priv, char *line)
 	{
 	  if (_gpgme_key_append_name (key, field[9], 1))
 	    return gpg_error (GPG_ERR_ENOMEM);	/* FIXME */
-	  else
-	    {
-	      if (field[1])
-		set_userid_flags (key, field[1]);
-	      opd->tmp_uid = key->_last_uid;
-	    }
+
+          if (field[1])
+            set_userid_flags (key, field[1]);
+          opd->tmp_uid = key->_last_uid;
+          if (fields >= 20)
+            {
+              opd->tmp_uid->last_update = _gpgme_parse_timestamp_ul (field[18]);
+              opd->tmp_uid->origin = 0; /* Fixme: Not yet defined in gpg.  */
+            }
 	}
       break;
 
diff --git a/src/util.h b/src/util.h
index b27c583..7b7924c 100644
--- a/src/util.h
+++ b/src/util.h
@@ -165,6 +165,9 @@ gpgme_off_t _gpgme_string_to_off (const char *string);
    point to the next non-parsed character in TIMESTRING. */
 time_t _gpgme_parse_timestamp (const char *timestamp, char **endp);
 
+/* Variant of _gpgme_parse_timestamp to return an unsigned long or 0
+ * on error or missing timestamp.  */
+unsigned long _gpgme_parse_timestamp_ul (const char *timestamp);
 
 gpgme_error_t _gpgme_map_gnupg_error (char *err);
 
diff --git a/tests/run-keylist.c b/tests/run-keylist.c
index aab4bb6..dd310e5 100644
--- a/tests/run-keylist.c
+++ b/tests/run-keylist.c
@@ -251,6 +251,7 @@ main (int argc, char **argv)
               key->is_qualified? " qualified":"",
               key->subkeys && key->subkeys->is_de_vs? " de-vs":"",
               key->subkeys && key->subkeys->is_cardkey? " cardkey":"");
+      printf ("upd     : %lu (%u)\n", key->last_update, key->origin);
 
       subkey = key->subkeys;
       if (subkey)
@@ -289,6 +290,7 @@ main (int argc, char **argv)
             printf ("    name: %s\n", uid->name);
           if (uid->comment)
             printf ("   cmmnt: %s\n", uid->comment);
+          printf ("     upd: %lu (%u)\n", uid->last_update, uid->origin);
           printf ("   valid: %s\n",
                   uid->validity == GPGME_VALIDITY_UNKNOWN? "unknown":
                   uid->validity == GPGME_VALIDITY_UNDEFINED? "undefined":

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/gpgme.git



More information about the Pkg-gnupg-commit mailing list