gpg: Store the Tofu meta handle for databases in CTRL.
authorWerner Koch <wk@gnupg.org>
Sat, 21 May 2016 10:26:44 +0000 (12:26 +0200)
committerWerner Koch <wk@gnupg.org>
Sat, 21 May 2016 10:26:44 +0000 (12:26 +0200)
* g10/gpg.h (struct tofu_dbs_s, tofu_dbs_t): New declarations.
(struct server_control_s): Add field tofu.dbs.
* g10/tofu.c (struct dbs): Rename to tofu_dbs_s.  Replace all users by
by tofu_dbs_t.
(opendbs):  Add arg CTRL.  Cache the DBS in CTRL.
(closedbs): Rename to tofu_closedbs and make global.  Add arg CTRL.
(tofu_register): Add arg CTRL.  Change all callers.  Do not call
closedbs.
(tofu_get_validity): Ditto.
(tofu_set_policy): Ditto.
(tofu_get_policy): Ditto.
(tofu_set_policy_by_keyid): Add arg CTRL.
* g10/gpg.c (gpg_deinit_default_ctrl): Call tofu_closedbs.

Signed-off-by: Werner Koch <wk@gnupg.org>
g10/gpg.c
g10/gpg.h
g10/gpgv.c
g10/keyedit.c
g10/keylist.c
g10/test-stubs.c
g10/tofu.c
g10/tofu.h
g10/trustdb.c

index 3e0ae3f..f901bbd 100644 (file)
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -2046,6 +2046,7 @@ gpg_init_default_ctrl (ctrl_t ctrl)
 static void
 gpg_deinit_default_ctrl (ctrl_t ctrl)
 {
+  tofu_closedbs (ctrl);
   gpg_dirmngr_deinit_session_data (ctrl);
 }
 
@@ -4586,7 +4587,7 @@ main (int argc, char **argv)
                }
 
              merge_keys_and_selfsig (kb);
-             if (tofu_set_policy (kb, policy))
+             if (tofu_set_policy (ctrl, kb, policy))
                g10_exit (1);
            }
 
index 5cd8366..c0f0a2d 100644 (file)
--- a/g10/gpg.h
+++ b/g10/gpg.h
@@ -63,6 +63,10 @@ typedef struct dirmngr_local_s *dirmngr_local_t;
 typedef struct kbnode_struct *KBNODE;
 typedef struct kbnode_struct *kbnode_t;
 
+/* TOFU database meta object.  */
+struct tofu_dbs_s;
+typedef struct tofu_dbs_s *tofu_dbs_t;
+
 
 /* Session control object.  This object is passed to most functions to
    convey the status of a session.  Note that the defaults are set by
@@ -74,6 +78,12 @@ struct server_control_s
 
   /* Local data for call-dirmngr.c  */
   dirmngr_local_t dirmngr_local;
+
+  /* Local data for tofu.c  */
+  struct {
+    tofu_dbs_t dbs;
+  } tofu;
+
 };
 
 
index ea26659..f1e994b 100644 (file)
@@ -645,9 +645,10 @@ export_pubkey_buffer (ctrl_t ctrl, const char *keyspec, unsigned int options,
 }
 
 gpg_error_t
-tofu_get_policy (PKT_public_key *pk, PKT_user_id *user_id,
+tofu_get_policy (ctrl_t ctrl, PKT_public_key *pk, PKT_user_id *user_id,
                 enum tofu_policy *policy)
 {
+  (void)ctrl;
   (void)pk;
   (void)user_id;
   (void)policy;
index c7288b2..c78f8a3 100644 (file)
@@ -3485,7 +3485,7 @@ show_key_with_all_names_colon (ctrl_t ctrl, estream_t fp, kbnode_t keyblock)
            {
 #ifdef USE_TOFU
              enum tofu_policy policy;
-             if (! tofu_get_policy (primary, uid, &policy)
+             if (! tofu_get_policy (ctrl, primary, uid, &policy)
                  && policy != TOFU_POLICY_NONE)
                es_fprintf (fp, "%s", tofu_policy_str (policy));
 #endif /*USE_TOFU*/
index 763edac..cbde0bb 100644 (file)
@@ -1545,7 +1545,7 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock,
            {
 #ifdef USE_TOFU
              enum tofu_policy policy;
-             if (! tofu_get_policy (pk, uid, &policy)
+             if (! tofu_get_policy (ctrl, pk, uid, &policy)
                  && policy != TOFU_POLICY_NONE)
                es_fprintf (es_stdout, "%s", tofu_policy_str (policy));
 #endif /*USE_TOFU*/
index 177f35a..cfaa72c 100644 (file)
@@ -456,9 +456,10 @@ export_pubkey_buffer (ctrl_t ctrl, const char *keyspec, unsigned int options,
 }
 
 gpg_error_t
-tofu_get_policy (PKT_public_key *pk, PKT_user_id *user_id,
+tofu_get_policy (ctrl_t ctrl, PKT_public_key *pk, PKT_user_id *user_id,
                 enum tofu_policy *policy)
 {
+  (void)ctrl;
   (void)pk;
   (void)user_id;
   (void)policy;
index b73ad93..314c76b 100644 (file)
@@ -782,7 +782,8 @@ opendb (char *filename, enum db_type type)
   return db;
 }
 
-struct dbs
+/* Definition of the Tofu dabase meta handle.  */
+struct tofu_dbs_s
 {
   struct db *db;
 };
@@ -814,7 +815,7 @@ link_db (struct db **head, struct db *db)
    TYPE must be either DB_MAIL or DB_KEY.  In the combined format, the
    combined DB is always returned.  */
 static struct db *
-getdb (struct dbs *dbs, const char *name, enum db_type type)
+getdb (tofu_dbs_t dbs, const char *name, enum db_type type)
 {
   struct db *t = NULL;
   char *name_sanitized = NULL;
@@ -980,9 +981,12 @@ closedb (struct db *db)
 /* Create a new DB meta-handle.  Returns NULL on error.  */
 /* FIXME: Change to return an error code for better reporting by the
    caller.  */
-static struct dbs *
-opendbs (void)
+static tofu_dbs_t
+opendbs (ctrl_t ctrl)
 {
+  if (ctrl->tofu.dbs)
+    return ctrl->tofu.dbs;
+
   if (opt.tofu_db_format == TOFU_DB_AUTO)
     {
       char *filename = make_filename (opt.homedir, "tofu.db", NULL);
@@ -1045,13 +1049,20 @@ opendbs (void)
        }
     }
 
-  return xmalloc_clear (sizeof (struct dbs));
+  ctrl->tofu.dbs = xmalloc_clear (sizeof (struct tofu_dbs_s));
+  return ctrl->tofu.dbs;
 }
 
+
 /* Release all of the resources associated with a DB meta-handle.  */
-static void
-closedbs (struct dbs *dbs)
+void
+tofu_closedbs (ctrl_t ctrl)
 {
+  tofu_dbs_t dbs = ctrl->tofu.dbs;
+
+  if (!dbs)
+    return;  /* Not initialized.  */
+
   if (dbs->db)
     {
       struct db *old_head = db_cache;
@@ -1103,7 +1114,8 @@ closedbs (struct dbs *dbs)
         }
     }
 
-  xfree (dbs);
+  xfree (ctrl->tofu.dbs);
+  ctrl->tofu.dbs = NULL;
 
 #if DEBUG_TOFU_CACHE
   log_debug ("Queries: %d (prepares saved: %d)\n",
@@ -1142,7 +1154,7 @@ get_single_long_cb2 (void *cookie, int argc, char **argv, char **azColName,
 
    If SHOW_OLD is set, the binding's old policy is displayed.  */
 static gpg_error_t
-record_binding (struct dbs *dbs, const char *fingerprint, const char *email,
+record_binding (tofu_dbs_t dbs, const char *fingerprint, const char *email,
                const char *user_id, enum tofu_policy policy, int show_old)
 {
   char *fingerprint_pp = format_hexfingerprint (fingerprint, NULL, 0);
@@ -1485,7 +1497,7 @@ time_ago_scale (signed long t)
    if CONFLICT is not NULL.  Returns _tofu_GET_POLICY_ERROR if an error
    occurs.  */
 static enum tofu_policy
-get_policy (struct dbs *dbs, const char *fingerprint, const char *email,
+get_policy (tofu_dbs_t dbs, const char *fingerprint, const char *email,
            char **conflict)
 {
   struct db *db;
@@ -1598,7 +1610,7 @@ get_policy (struct dbs *dbs, const char *fingerprint, const char *email,
    conflicting binding's policy to TOFU_POLICY_ASK.  In either case,
    we return TRUST_UNDEFINED.  */
 static enum tofu_policy
-get_trust (struct dbs *dbs, const char *fingerprint, const char *email,
+get_trust (tofu_dbs_t dbs, const char *fingerprint, const char *email,
           const char *user_id, int may_ask)
 {
   char *fingerprint_pp;
@@ -2405,7 +2417,7 @@ write_stats_status (long messages, enum tofu_policy policy,
 }
 
 static void
-show_statistics (struct dbs *dbs, const char *fingerprint,
+show_statistics (tofu_dbs_t dbs, const char *fingerprint,
                 const char *email, const char *user_id,
                 const char *sig_exclude)
 {
@@ -2646,11 +2658,11 @@ email_from_user_id (const char *user_id)
    This function returns the binding's trust level on return.  If an
    error occurs, this function returns TRUST_UNKNOWN.  */
 int
-tofu_register (PKT_public_key *pk, const char *user_id,
+tofu_register (ctrl_t ctrl, PKT_public_key *pk, const char *user_id,
               const byte *sig_digest_bin, int sig_digest_bin_len,
               time_t sig_time, const char *origin, int may_ask)
 {
-  struct dbs *dbs;
+  tofu_dbs_t dbs;
   struct db *db;
   char *fingerprint = NULL;
   char *fingerprint_pp = NULL;
@@ -2664,7 +2676,7 @@ tofu_register (PKT_public_key *pk, const char *user_id,
 
   sig_digest = make_radix64_string (sig_digest_bin, sig_digest_bin_len);
 
-  dbs = opendbs ();
+  dbs = opendbs (ctrl);
   if (! dbs)
     {
       log_error (_("error opening TOFU database: %s\n"),
@@ -2806,8 +2818,6 @@ tofu_register (PKT_public_key *pk, const char *user_id,
   xfree (email);
   xfree (fingerprint_pp);
   xfree (fingerprint);
-  if (dbs)
-    closedbs (dbs);
   xfree (sig_digest);
 
   return trust_level;
@@ -2887,15 +2897,15 @@ tofu_wot_trust_combine (int tofu_base, int wot_base)
 
    Returns TRUST_UNDEFINED if an error occurs.  */
 int
-tofu_get_validity (PKT_public_key *pk, const char *user_id,
+tofu_get_validity (ctrl_t ctrl, PKT_public_key *pk, const char *user_id,
                   int may_ask)
 {
-  struct dbs *dbs;
+  tofu_dbs_t dbs;
   char *fingerprint = NULL;
   char *email = NULL;
   int trust_level = TRUST_UNDEFINED;
 
-  dbs = opendbs ();
+  dbs = opendbs (ctrl);
   if (! dbs)
     {
       log_error (_("error opening TOFU database: %s\n"),
@@ -2925,9 +2935,6 @@ tofu_get_validity (PKT_public_key *pk, const char *user_id,
  die:
   xfree (email);
   xfree (fingerprint);
-  if (dbs)
-    closedbs (dbs);
-
   return trust_level;
 }
 
@@ -2939,16 +2946,16 @@ tofu_get_validity (PKT_public_key *pk, const char *user_id,
 
    Returns 0 on success and an error code otherwise.  */
 gpg_error_t
-tofu_set_policy (kbnode_t kb, enum tofu_policy policy)
+tofu_set_policy (ctrl_t ctrl, kbnode_t kb, enum tofu_policy policy)
 {
-  struct dbs *dbs;
+  tofu_dbs_t dbs;
   PKT_public_key *pk;
   char *fingerprint = NULL;
 
   log_assert (kb->pkt->pkttype == PKT_PUBLIC_KEY);
   pk = kb->pkt->pkt.public_key;
 
-  dbs = opendbs ();
+  dbs = opendbs (ctrl);
   if (! dbs)
     {
       log_error (_("error opening TOFU database: %s\n"),
@@ -2987,8 +2994,6 @@ tofu_set_policy (kbnode_t kb, enum tofu_policy policy)
     }
 
   xfree (fingerprint);
-  closedbs (dbs);
-
   return 0;
 }
 
@@ -3000,13 +3005,13 @@ tofu_set_policy (kbnode_t kb, enum tofu_policy policy)
 
    Returns 0 on success and an error code otherwise.  */
 gpg_error_t
-tofu_set_policy_by_keyid (u32 *keyid, enum tofu_policy policy)
+tofu_set_policy_by_keyid (ctrl_t ctrl, u32 *keyid, enum tofu_policy policy)
 {
   kbnode_t keyblock = get_pubkeyblock (keyid);
   if (! keyblock)
     return gpg_error (GPG_ERR_NO_PUBKEY);
 
-  return tofu_set_policy (keyblock, policy);
+  return tofu_set_policy (ctrl, keyblock, policy);
 }
 
 /* Return the TOFU policy for the specified binding in *POLICY.  If no
@@ -3017,10 +3022,10 @@ tofu_set_policy_by_keyid (u32 *keyid, enum tofu_policy policy)
 
    Returns 0 on success and an error code otherwise.  */
 gpg_error_t
-tofu_get_policy (PKT_public_key *pk, PKT_user_id *user_id,
+tofu_get_policy (ctrl_t ctrl, PKT_public_key *pk, PKT_user_id *user_id,
                 enum tofu_policy *policy)
 {
-  struct dbs *dbs;
+  tofu_dbs_t dbs;
   char *fingerprint;
   char *email;
 
@@ -3028,7 +3033,7 @@ tofu_get_policy (PKT_public_key *pk, PKT_user_id *user_id,
   log_assert (pk->main_keyid[0] == pk->keyid[0]
               && pk->main_keyid[1] == pk->keyid[1]);
 
-  dbs = opendbs ();
+  dbs = opendbs (ctrl);
   if (! dbs)
     {
       log_error (_("error opening TOFU database: %s\n"),
@@ -3044,8 +3049,6 @@ tofu_get_policy (PKT_public_key *pk, PKT_user_id *user_id,
 
   xfree (email);
   xfree (fingerprint);
-  closedbs (dbs);
-
   if (*policy == _tofu_GET_POLICY_ERROR)
     return gpg_error (GPG_ERR_GENERAL);
   return 0;
index 7ee1083..d3448b9 100644 (file)
@@ -63,6 +63,7 @@ enum tofu_policy
     _tofu_GET_POLICY_ERROR = 100
   };
 
+
 /* Return a string representation of a trust policy.  Returns "???" if
    POLICY is not valid.  */
 const char *tofu_policy_str (enum tofu_policy policy);
@@ -78,7 +79,7 @@ int tofu_policy_to_trust_level (enum tofu_policy policy);
    interact with the user in the case of a conflict or if the
    binding's policy is ask.  This function returns the binding's trust
    level.  If an error occurs, it returns TRUST_UNKNOWN.  */
-int tofu_register (PKT_public_key *pk, const char *user_id,
+int tofu_register (ctrl_t ctrl, PKT_public_key *pk, const char *user_id,
                   const byte *sigs_digest, int sigs_digest_len,
                   time_t sig_time, const char *origin, int may_ask);
 
@@ -91,18 +92,21 @@ int tofu_wot_trust_combine (int tofu, int wot);
    <PK, USER_ID>.  If MAY_ASK is 1, then this function may
    interact with the user.  If not, TRUST_UNKNOWN is returned.  If an
    error occurs, TRUST_UNDEFINED is returned.  */
-int tofu_get_validity (PKT_public_key *pk, const char *user_id, int may_ask);
+int tofu_get_validity (ctrl_t ctrl,
+                       PKT_public_key *pk, const char *user_id, int may_ask);
 
 /* Set the policy for all non-revoked user ids in the keyblock KB to
    POLICY.  */
-gpg_error_t tofu_set_policy (kbnode_t kb, enum tofu_policy policy);
+gpg_error_t tofu_set_policy (ctrl_t ctrl, kbnode_t kb, enum tofu_policy policy);
 
 /* Set the TOFU policy for all non-revoked users in the key with the
    key id KEYID to POLICY.  */
-gpg_error_t tofu_set_policy_by_keyid (u32 *keyid, enum tofu_policy policy);
+gpg_error_t tofu_set_policy_by_keyid (ctrl_t ctrl,
+                                      u32 *keyid, enum tofu_policy policy);
 
 /* Return the TOFU policy for the specified binding in *POLICY.  */
-gpg_error_t tofu_get_policy (PKT_public_key *pk, PKT_user_id *user_id,
+gpg_error_t tofu_get_policy (ctrl_t ctrl,
+                             PKT_public_key *pk, PKT_user_id *user_id,
                             enum tofu_policy *policy);
 
 /* When doing a lot of DB activities (in particular, when listing
@@ -111,4 +115,7 @@ gpg_error_t tofu_get_policy (PKT_public_key *pk, PKT_user_id *user_id,
 void tofu_begin_batch_update (void);
 void tofu_end_batch_update (void);
 
+/* Release all of the resources associated with a DB meta-handle.  */
+void tofu_closedbs (ctrl_t ctrl);
+
 #endif /*G10_TOFU_H*/
index e5f7121..527a23d 100644 (file)
@@ -1065,12 +1065,12 @@ tdb_get_validity_core (ctrl_t ctrl,
          user_ids ++;
 
          if (sig)
-           tl = tofu_register (main_pk, user_id->name,
+           tl = tofu_register (ctrl, main_pk, user_id->name,
                                sig->digest, sig->digest_len,
                                sig->timestamp, "unknown",
                                may_ask);
          else
-           tl = tofu_get_validity (main_pk, user_id->name, may_ask);
+           tl = tofu_get_validity (ctrl, main_pk, user_id->name, may_ask);
 
          if (tl == TRUST_EXPIRED)
            user_ids_expired ++;