core,cpp: Extend the TOFU information.
authorWerner Koch <wk@gnupg.org>
Wed, 7 Sep 2016 07:26:11 +0000 (09:26 +0200)
committerWerner Koch <wk@gnupg.org>
Wed, 7 Sep 2016 07:26:11 +0000 (09:26 +0200)
* src/gpgme.h.in (struct _gpeme_tofu_info): Rename FIRSTSEEN to
SIGNFIRST and LASTSEEN to SIGNLAST.  Add ENCRFIST and ENCRLAST.
* src/keylist.c (parse_tfs_record): Parse to ENCRFIRST and ENCRLAST.
* src/verify.c (parse_tofu_stats): Ditto.
* tests/run-keylist.c (main): Adjust and print encrypt stats.
* tests/run-verify.c (print_result): Ditto.

* lang/cpp/src/tofuinfo.h (TofuInfo): Rename firstSeen to signFirst
and lastSeen to signLast.  Add encrCount, encrFirst and encrLast.
* lang/cpp/src/tofuinfo.cpp (encrCount, encrFirst, encrLast): New.
--

The latest GnuPG commits have the needed changes but we also allow the
use of currently released GnuPG version.

Signed-off-by: Werner Koch <wk@gnupg.org>
lang/cpp/src/tofuinfo.cpp
lang/cpp/src/tofuinfo.h
src/gpgme.h.in
src/keylist.c
src/verify.c
tests/run-keylist.c
tests/run-verify.c

index ade262b..bb67fc8 100644 (file)
@@ -123,14 +123,29 @@ unsigned short GpgME::TofuInfo::signCount() const
     return isNull() ? 0 : d->mInfo->signcount;
 }
 
-unsigned long GpgME::TofuInfo::firstSeen() const
+unsigned short GpgME::TofuInfo::encrCount() const
 {
-    return isNull() ? 0 : d->mInfo->firstseen;
+    return isNull() ? 0 : d->mInfo->encrcount;
 }
 
-unsigned long GpgME::TofuInfo::lastSeen() const
+unsigned long GpgME::TofuInfo::signFirst() const
 {
-    return isNull() ? 0 : d->mInfo->lastseen;
+    return isNull() ? 0 : d->mInfo->signfirst;
+}
+
+unsigned long GpgME::TofuInfo::signLast() const
+{
+    return isNull() ? 0 : d->mInfo->signlast;
+}
+
+unsigned long GpgME::TofuInfo::encrFirst() const
+{
+    return isNull() ? 0 : d->mInfo->encrfirst;
+}
+
+unsigned long GpgME::TofuInfo::encrLast() const
+{
+    return isNull() ? 0 : d->mInfo->encrlast;
 }
 
 std::ostream &GpgME::operator<<(std::ostream &os, const GpgME::TofuInfo &info)
@@ -141,8 +156,11 @@ std::ostream &GpgME::operator<<(std::ostream &os, const GpgME::TofuInfo &info)
            << "\n validity: " << info.validity()
            << "\n policy: "   << info.policy()
            << "\n signcount: "<< info.signCount()
-           << "\n firstseen: "<< info.firstSeen()
-           << "\n lastseen: " << info.lastSeen()
+           << "\n signfirst: "<< info.signFirst()
+           << "\n signlast: " << info.signLast()
+           << "\n encrcount: "<< info.encrCount()
+           << "\n encrfirst: "<< info.encrFirst()
+           << "\n encrlast: " << info.encrLast()
            << '\n';
     }
     return os << ")";
index eb5dbcc..ec253e9 100644 (file)
@@ -93,11 +93,20 @@ public:
     /* Number of signatures seen for this binding.  Capped at USHRT_MAX.  */
     unsigned short signCount() const;
 
+    /* Number of encryption done to this binding.  Capped at USHRT_MAX.  */
+    unsigned short encrCount() const;
+
     /** Number of seconds since epoch when the first message was verified */
-    unsigned long firstSeen() const;
+    unsigned long signFirst() const;
 
     /** Number of seconds since epoch when the last message was verified */
-    unsigned long lastSeen() const;
+    unsigned long signLast() const;
+
+    /** Number of seconds since epoch when the first message was encrypted */
+    unsigned long encrFirst() const;
+
+    /** Number of seconds since epoch when the last message was encrypted */
+    unsigned long encrLast() const;
 
     /* If non-NULL a human readable string summarizing the TOFU data. */
     const char *description() const;
index 57f3446..00a4bed 100644 (file)
@@ -650,9 +650,11 @@ struct _gpgme_tofu_info
   unsigned short encrcount;
 
   /* Number of seconds since Epoch when the first and the most
-   * recently seen message were verified.  0 means unknown. */
-  unsigned long firstseen;
-  unsigned long lastseen;
+   * recently seen message were verified/decrypted.  0 means unknown. */
+  unsigned long signfirst;
+  unsigned long signlast;
+  unsigned long encrfirst;
+  unsigned long encrlast;
 
   /* If non-NULL a human readable string summarizing the TOFU data. */
   char *description;
index 9f1e68d..f7912e6 100644 (file)
@@ -466,11 +466,25 @@ parse_tfs_record (gpgme_user_id_t uid, char **field, int nfield)
   err = _gpgme_strtoul_field (field[6], &uval);
   if (err)
     goto inv_engine;
-  ti->firstseen = uval;
+  ti->signfirst = uval;
   err = _gpgme_strtoul_field (field[7], &uval);
   if (err)
     goto inv_engine;
-  ti->lastseen = uval;
+  ti->signlast = uval;
+
+  if (nfield > 9)
+    {
+      /* This condition is only to allow for gpg 2.1.15 - can
+       * eventually be removed.  */
+      err = _gpgme_strtoul_field (field[8], &uval);
+      if (err)
+        goto inv_engine;
+      ti->encrfirst = uval;
+      err = _gpgme_strtoul_field (field[9], &uval);
+      if (err)
+        goto inv_engine;
+      ti->encrlast = uval;
+    }
 
   /* Ready.  */
   uid->tofu = ti;
index 92eb333..5ac937d 100644 (file)
@@ -755,20 +755,21 @@ parse_tofu_user (gpgme_signature_t sig, char *args, gpgme_protocol_t protocol)
 
 /* Parse a TOFU_STATS line and store it in the last tofu info of SIG.
  *
- *   TOFU_STATS <validity> <sign-count> <encr-count> [<policy> [<tm1> <tm2>]]
+ *   TOFU_STATS <validity> <sign-count> <encr-count> \
+ *                         [<policy> [<tm1> <tm2> <tm3> <tm4>]]
  */
 static gpgme_error_t
 parse_tofu_stats (gpgme_signature_t sig, char *args)
 {
   gpgme_error_t err;
   gpgme_tofu_info_t ti;
-  char *field[6];
+  char *field[8];
   int nfields;
   unsigned long uval;
 
   if (!sig->key || !sig->key->_last_uid || !(ti = sig->key->_last_uid->tofu))
     return trace_gpg_error (GPG_ERR_INV_ENGINE); /* No TOFU_USER seen.  */
-  if (ti->firstseen || ti->signcount || ti->validity || ti->policy)
+  if (ti->signfirst || ti->signcount || ti->validity || ti->policy)
     return trace_gpg_error (GPG_ERR_INV_ENGINE); /* Already set.  */
 
   nfields = _gpgme_split_fields (args, field, DIM (field));
@@ -824,11 +825,24 @@ parse_tofu_stats (gpgme_signature_t sig, char *args)
   err = _gpgme_strtoul_field (field[4], &uval);
   if (err)
     return trace_gpg_error (GPG_ERR_INV_ENGINE);
-  ti->firstseen = uval;
+  ti->signfirst = uval;
   err = _gpgme_strtoul_field (field[5], &uval);
   if (err)
     return trace_gpg_error (GPG_ERR_INV_ENGINE);
-  ti->lastseen = uval;
+  ti->signlast = uval;
+  if (nfields > 7)
+    {
+      /* This condition is only to allow for gpg 2.1.15 - can
+       * eventually be removed.  */
+      err = _gpgme_strtoul_field (field[6], &uval);
+      if (err)
+        return trace_gpg_error (GPG_ERR_INV_ENGINE);
+      ti->encrfirst = uval;
+      err = _gpgme_strtoul_field (field[7], &uval);
+      if (err)
+        return trace_gpg_error (GPG_ERR_INV_ENGINE);
+      ti->encrlast = uval;
+    }
 
   return 0;
 }
index 00f874d..647a9ed 100644 (file)
@@ -291,9 +291,11 @@ main (int argc, char **argv)
                       ti->policy == GPGME_TOFU_POLICY_BAD? "bad" :
                       ti->policy == GPGME_TOFU_POLICY_ASK? "ask" : "?");
               printf ("   nsigs: %hu\n", ti->signcount);
+              printf ("   first: %s\n", isotimestr (ti->signfirst));
+              printf ("    last: %s\n", isotimestr (ti->signlast));
               printf ("   nencr: %hu\n", ti->encrcount);
-              printf ("   first: %s\n", isotimestr (ti->firstseen));
-              printf ("    last: %s\n", isotimestr (ti->lastseen));
+              printf ("   first: %s\n", isotimestr (ti->encrfirst));
+              printf ("    last: %s\n", isotimestr (ti->encrlast));
             }
         }
 
index 3c18d3b..ebc20d9 100644 (file)
@@ -197,9 +197,12 @@ print_result (gpgme_verify_result_t result)
                       ti->policy == GPGME_TOFU_POLICY_UNKNOWN? "unknown" :
                       ti->policy == GPGME_TOFU_POLICY_BAD? "bad" :
                       ti->policy == GPGME_TOFU_POLICY_ASK? "ask" : "?");
-              printf ("    sigcount : %hu\n", ti->signcount);
-              printf ("    firstseen: %s\n", isotimestr (ti->firstseen));
-              printf ("    lastseen : %s\n", isotimestr (ti->lastseen));
+              printf ("    signcount: %hu\n", ti->signcount);
+              printf ("      first..: %s\n", isotimestr (ti->signfirst));
+              printf ("      last ..: %s\n", isotimestr (ti->signlast));
+              printf ("    encrcount: %hu\n", ti->encrcount);
+              printf ("      first..: %s\n", isotimestr (ti->encrfirst));
+              printf ("      last ..: %s\n", isotimestr (ti->encrlast));
               printf ("    desc ....: ");
               print_description (nonnull (ti->description), 15);
             }