Marcel Härry 65fca63
From: Vincent Breitmoser <look@my.amazin.horse>
Marcel Härry 65fca63
Date: Thu, 13 Jun 2019 21:27:42 +0200
Marcel Härry 65fca63
Subject: gpg: allow import of previously known keys, even without UIDs
Marcel Härry 65fca63
Marcel Härry 65fca63
* g10/import.c (import_one): Accept an incoming OpenPGP certificate that
Marcel Härry 65fca63
has no user id, as long as we already have a local variant of the cert
Marcel Härry 65fca63
that matches the primary key.
Marcel Härry 65fca63
Marcel Härry 65fca63
--
Marcel Härry 65fca63
Marcel Härry 65fca63
This fixes two of the three broken tests in import-incomplete.scm.
Marcel Härry 65fca63
Marcel Härry 65fca63
GnuPG-Bug-id: 4393
Marcel Härry 65fca63
Signed-off-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
Marcel Härry 65fca63
---
Marcel Härry 65fca63
 g10/import.c | 44 +++++++++++---------------------------------
Marcel Härry 65fca63
 1 file changed, 11 insertions(+), 33 deletions(-)
Marcel Härry 65fca63
Marcel Härry 65fca63
diff --git a/g10/import.c b/g10/import.c
Marcel Härry 65fca63
index 5d3162c..f9acf95 100644
Marcel Härry 65fca63
--- a/g10/import.c
Marcel Härry 65fca63
+++ b/g10/import.c
Marcel Härry 65fca63
@@ -1788,7 +1788,6 @@ import_one_real (ctrl_t ctrl,
Marcel Härry 65fca63
   size_t an;
Marcel Härry 65fca63
   char pkstrbuf[PUBKEY_STRING_SIZE];
Marcel Härry 65fca63
   int merge_keys_done = 0;
Marcel Härry 65fca63
-  int any_filter = 0;
Marcel Härry 65fca63
   KEYDB_HANDLE hd = NULL;
Marcel Härry 65fca63
 
Marcel Härry 65fca63
   if (r_valid)
Marcel Härry 65fca63
@@ -1825,14 +1824,6 @@ import_one_real (ctrl_t ctrl,
Marcel Härry 65fca63
       log_printf ("\n");
Marcel Härry 65fca63
     }
Marcel Härry 65fca63
 
Marcel Härry 65fca63
-
Marcel Härry 65fca63
-  if (!uidnode )
Marcel Härry 65fca63
-    {
Marcel Härry 65fca63
-      if (!silent)
Marcel Härry 65fca63
-        log_error( _("key %s: no user ID\n"), keystr_from_pk(pk));
Marcel Härry 65fca63
-      return 0;
Marcel Härry 65fca63
-    }
Marcel Härry 65fca63
-
Marcel Härry 65fca63
   if (screener && screener (keyblock, screener_arg))
Marcel Härry 65fca63
     {
Marcel Härry 65fca63
       log_error (_("key %s: %s\n"), keystr_from_pk (pk),
Marcel Härry 65fca63
@@ -1907,17 +1898,10 @@ import_one_real (ctrl_t ctrl,
Marcel Härry 65fca63
 	  }
Marcel Härry 65fca63
     }
Marcel Härry 65fca63
 
Marcel Härry 65fca63
-  if (!delete_inv_parts (ctrl, keyblock, keyid, options ) )
Marcel Härry 65fca63
-    {
Marcel Härry 65fca63
-      if (!silent)
Marcel Härry 65fca63
-        {
Marcel Härry 65fca63
-          log_error( _("key %s: no valid user IDs\n"), keystr_from_pk(pk));
Marcel Härry 65fca63
-          if (!opt.quiet )
Marcel Härry 65fca63
-            log_info(_("this may be caused by a missing self-signature\n"));
Marcel Härry 65fca63
-        }
Marcel Härry 65fca63
-      stats->no_user_id++;
Marcel Härry 65fca63
-      return 0;
Marcel Härry 65fca63
-    }
Marcel Härry 65fca63
+  /* Delete invalid parts, and note if we have any valid ones left.
Marcel Härry 65fca63
+   * We will later abort import if this key is new but contains
Marcel Härry 65fca63
+   * no valid uids.  */
Marcel Härry 65fca63
+  delete_inv_parts (ctrl, keyblock, keyid, options);
Marcel Härry 65fca63
 
Marcel Härry 65fca63
   /* Get rid of deleted nodes.  */
Marcel Härry 65fca63
   commit_kbnode (&keyblock);
Marcel Härry 65fca63
@@ -1927,24 +1911,11 @@ import_one_real (ctrl_t ctrl,
Marcel Härry 65fca63
     {
Marcel Härry 65fca63
       apply_keep_uid_filter (ctrl, keyblock, import_filter.keep_uid);
Marcel Härry 65fca63
       commit_kbnode (&keyblock);
Marcel Härry 65fca63
-      any_filter = 1;
Marcel Härry 65fca63
     }
Marcel Härry 65fca63
   if (import_filter.drop_sig)
Marcel Härry 65fca63
     {
Marcel Härry 65fca63
       apply_drop_sig_filter (ctrl, keyblock, import_filter.drop_sig);
Marcel Härry 65fca63
       commit_kbnode (&keyblock);
Marcel Härry 65fca63
-      any_filter = 1;
Marcel Härry 65fca63
-    }
Marcel Härry 65fca63
-
Marcel Härry 65fca63
-  /* If we ran any filter we need to check that at least one user id
Marcel Härry 65fca63
-   * is left in the keyring.  Note that we do not use log_error in
Marcel Härry 65fca63
-   * this case. */
Marcel Härry 65fca63
-  if (any_filter && !any_uid_left (keyblock))
Marcel Härry 65fca63
-    {
Marcel Härry 65fca63
-      if (!opt.quiet )
Marcel Härry 65fca63
-        log_info ( _("key %s: no valid user IDs\n"), keystr_from_pk (pk));
Marcel Härry 65fca63
-      stats->no_user_id++;
Marcel Härry 65fca63
-      return 0;
Marcel Härry 65fca63
     }
Marcel Härry 65fca63
 
Marcel Härry 65fca63
   /* The keyblock is valid and ready for real import.  */
Marcel Härry 65fca63
@@ -2002,6 +1973,13 @@ import_one_real (ctrl_t ctrl,
Marcel Härry 65fca63
       err = 0;
Marcel Härry 65fca63
       stats->skipped_new_keys++;
Marcel Härry 65fca63
     }
Marcel Härry 65fca63
+  else if (err && !any_uid_left (keyblock))
Marcel Härry 65fca63
+    {
Marcel Härry 65fca63
+      if (!silent)
Marcel Härry 65fca63
+        log_info( _("key %s: new key but contains no user ID - skipped\n"), keystr(keyid));
Marcel Härry 65fca63
+      err = 0;
Marcel Härry 65fca63
+      stats->no_user_id++;
Marcel Härry 65fca63
+    }
Marcel Härry 65fca63
   else if (err)  /* Insert this key. */
Marcel Härry 65fca63
     {
Marcel Härry 65fca63
       /* Note: ERR can only be NO_PUBKEY or UNUSABLE_PUBKEY.  */