g10: fix regression of bkuptocard subcommand in --edit-key.
authorNIIBE Yutaka <gniibe@fsij.org>
Thu, 24 Dec 2015 00:54:23 +0000 (09:54 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Thu, 24 Dec 2015 00:54:23 +0000 (09:54 +0900)
* g10/keyedit.c (keyedit_menu): Call transfer_secret_keys.
* g10/import.c (transfer_secret_keys): Make it global function.
Allow stats==NULL.

--

GnuPG-bug-id: 2169

g10/import.c
g10/keyedit.c
g10/main.h

index 02d6b76..27bfece 100644 (file)
@@ -1318,7 +1318,7 @@ import_one (ctrl_t ctrl,
    function prints diagnostics and returns an error code.  If BATCH is
    true the secret keys are stored by gpg-agent in the transfer format
    (i.e. no re-protection and aksing for passphrases). */
-static gpg_error_t
+gpg_error_t
 transfer_secret_keys (ctrl_t ctrl, struct import_stats_s *stats, kbnode_t sec_keyblock,
                       int batch)
 {
@@ -1389,8 +1389,11 @@ transfer_secret_keys (ctrl_t ctrl, struct import_stats_s *stats, kbnode_t sec_ke
       if (!ski)
         BUG ();
 
-      stats->count++;
-      stats->secret_read++;
+      if (stats)
+        {
+          stats->count++;
+          stats->secret_read++;
+        }
 
       /* We ignore stub keys.  The way we handle them in other parts
          of the code is by asking the agent whether any secret key is
@@ -1561,7 +1564,8 @@ transfer_secret_keys (ctrl_t ctrl, struct import_stats_s *stats, kbnode_t sec_ke
           if (opt.verbose)
             log_info (_("key %s: secret key imported\n"),
                       keystr_from_pk_with_sub (main_pk, pk));
-          stats->secret_imported++;
+          if (stats)
+            stats->secret_imported++;
         }
       else if ( gpg_err_code (err) == GPG_ERR_EEXIST )
         {
@@ -1569,7 +1573,8 @@ transfer_secret_keys (ctrl_t ctrl, struct import_stats_s *stats, kbnode_t sec_ke
             log_info (_("key %s: secret key already exists\n"),
                       keystr_from_pk_with_sub (main_pk, pk));
           err = 0;
-          stats->secret_dups++;
+          if (stats)
+            stats->secret_dups++;
         }
       else
         {
index d958db8..15500ef 100644 (file)
@@ -1922,7 +1922,6 @@ keyedit_menu (ctrl_t ctrl, const char *username, strlist_t locusr,
 
        case cmdBKUPTOCARD:
        case cmdCHECKBKUPKEY:
-          log_debug ("FIXME: This needs to be changed\n");
          {
            /* Ask for a filename, check whether this is really a
               backup key as generated by the card generation, parse
@@ -1975,6 +1974,7 @@ keyedit_menu (ctrl_t ctrl, const char *username, strlist_t locusr,
 
            if (cmd == cmdCHECKBKUPKEY)
              {
+               log_debug ("FIXME: This needs to be changed\n");
                /* PKT_public_key *sk = node->pkt->pkt.secret_key; */
                /* switch (is_secret_key_protected (sk)) */
                /*   { */
@@ -1996,14 +1996,21 @@ keyedit_menu (ctrl_t ctrl, const char *username, strlist_t locusr,
                  /* } */
              }
            else                /* Store it.  */
-             {
-               if (card_store_subkey (node, 0))
-                 {
-                   redisplay = 1;
-                   sec_shadowing = 1;
-                 }
-             }
-           release_kbnode (node);
+              {
+                /* We need to transfer it to gpg-agent.  */
+                err = transfer_secret_keys (ctrl, NULL, node, 1);
+
+                /* Then, treat the pkt as a public key to call
+                   card_store_subkey.  */
+                pkt->pkttype = PKT_PUBLIC_KEY;
+
+                if (card_store_subkey (node, 0))
+                  {
+                    redisplay = 1;
+                    sec_shadowing = 1;
+                  }
+              }
+            release_kbnode (node);
          }
          break;
 
index c3a2114..06f2577 100644 (file)
@@ -337,6 +337,8 @@ gpg_error_t import_old_secring (ctrl_t ctrl, const char *fname);
 import_stats_t import_new_stats_handle (void);
 void import_release_stats_handle (import_stats_t hd);
 void import_print_stats (import_stats_t hd);
+gpg_error_t transfer_secret_keys (ctrl_t ctrl, struct import_stats_s *stats,
+                                  kbnode_t sec_keyblock, int batch);
 
 int collapse_uids( KBNODE *keyblock );