Fix gpg_addkey() to work with GPGME_CREATE_NOPASSWD as well.
[gpgme.git] / src / keylist.c
index 9f1e68d..2ce0846 100644 (file)
@@ -16,7 +16,7 @@
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with this program; if not, see <http://www.gnu.org/licenses/>.
+   License along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 #if HAVE_CONFIG_H
  */
 
 #if HAVE_CONFIG_H
@@ -54,6 +54,9 @@ typedef struct
 {
   struct _gpgme_op_keylist_result result;
 
 {
   struct _gpgme_op_keylist_result result;
 
+  /* The error code from ERROR keydb_search. */
+  gpgme_error_t keydb_search_err;
+
   gpgme_key_t tmp_key;
 
   /* This points to the last uid in tmp_key.  */
   gpgme_key_t tmp_key;
 
   /* This points to the last uid in tmp_key.  */
@@ -122,6 +125,8 @@ keylist_status_handler (void *priv, gpgme_status_code_t code, char *args)
   void *hook;
   op_data_t opd;
 
   void *hook;
   op_data_t opd;
 
+  (void)args;
+
   err = _gpgme_op_data_lookup (ctx, OPDATA_KEYLIST, &hook, -1, NULL);
   opd = hook;
   if (err)
   err = _gpgme_op_data_lookup (ctx, OPDATA_KEYLIST, &hook, -1, NULL);
   opd = hook;
   if (err)
@@ -133,10 +138,17 @@ keylist_status_handler (void *priv, gpgme_status_code_t code, char *args)
       opd->result.truncated = 1;
       break;
 
       opd->result.truncated = 1;
       break;
 
+    case GPGME_STATUS_ERROR:
+      err = _gpgme_parse_failure (args);
+      if (!opd->keydb_search_err && !strcmp (args, "keydb_search"))
+        opd->keydb_search_err = err;
+      err = 0;
+      break;
+
     default:
       break;
     }
     default:
       break;
     }
-  return 0;
+  return err;
 }
 
 \f
 }
 
 \f
@@ -466,11 +478,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;
   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;
   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;
 
   /* Ready.  */
   uid->tofu = ti;
@@ -1122,7 +1148,8 @@ gpgme_op_keylist_next (gpgme_ctx_t ctx, gpgme_key_t *r_key)
        return TRACE_ERR (err);
 
       if (!opd->key_cond)
        return TRACE_ERR (err);
 
       if (!opd->key_cond)
-       return TRACE_ERR (gpg_error (GPG_ERR_EOF));
+       return TRACE_ERR (opd->keydb_search_err? opd->keydb_search_err
+                          /**/                 : gpg_error (GPG_ERR_EOF));
 
       opd->key_cond = 0;
       assert (opd->key_queue);
 
       opd->key_cond = 0;
       assert (opd->key_queue);