doc: Typo fix in a comment.
[gnupg.git] / g10 / delkey.c
index b0a2b0d..bf8c4e9 100644 (file)
@@ -16,7 +16,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
-#include <assert.h>
 #include <ctype.h>
 
 #include "gpg.h"
 #include "options.h"
 #include "packet.h"
-#include "status.h"
-#include "iobuf.h"
+#include "../common/status.h"
+#include "../common/iobuf.h"
 #include "keydb.h"
-#include "util.h"
+#include "../common/util.h"
 #include "main.h"
 #include "trustdb.h"
 #include "filter.h"
-#include "ttyio.h"
-#include "status.h"
-#include "i18n.h"
+#include "../common/ttyio.h"
+#include "../common/i18n.h"
 #include "call-agent.h"
 
 
@@ -49,7 +47,8 @@
  * key can't be deleted for that reason.
  */
 static gpg_error_t
-do_delete_key( const char *username, int secret, int force, int *r_sec_avail )
+do_delete_key (ctrl_t ctrl, const char *username, int secret, int force,
+               int *r_sec_avail)
 {
   gpg_error_t err;
   kbnode_t keyblock = NULL;
@@ -139,9 +138,9 @@ do_delete_key( const char *username, int secret, int force, int *r_sec_avail )
   else
     {
       if (secret)
-        print_seckey_info (pk);
+        print_seckey_info (ctrl, pk);
       else
-        print_pubkey_info (NULL, pk );
+        print_pubkey_info (ctrl, NULL, pk );
       tty_printf( "\n" );
 
       yes = cpr_get_answer_is_yes
@@ -182,11 +181,18 @@ do_delete_key( const char *username, int secret, int force, int *r_sec_avail )
               if (agent_probe_secret_key (NULL, node->pkt->pkt.public_key))
                 continue;  /* No secret key for that public (sub)key.  */
 
-              prompt = gpg_format_keydesc (node->pkt->pkt.public_key,
+              prompt = gpg_format_keydesc (ctrl,
+                                           node->pkt->pkt.public_key,
                                            FORMAT_KEYDESC_DELKEY, 1);
               err = hexkeygrip_from_pk (node->pkt->pkt.public_key, &hexgrip);
+              /* NB: We require --yes to advise the agent not to
+               * request a confirmation.  The rationale for this extra
+               * pre-caution is that since 2.1 the secret key may also
+               * be used for other protocols and thus deleting it from
+               * the gpg would also delete the key for other tools. */
               if (!err)
-                err = agent_delete_key (NULL, hexgrip, prompt);
+                err = agent_delete_key (NULL, hexgrip, prompt,
+                                        opt.answer_yes);
               xfree (prompt);
               xfree (hexgrip);
               if (err)
@@ -201,7 +207,10 @@ do_delete_key( const char *username, int secret, int force, int *r_sec_avail )
                     firsterr = err;
                   if (gpg_err_code (err) == GPG_ERR_CANCELED
                       || gpg_err_code (err) == GPG_ERR_FULLY_CANCELED)
-                    break;
+                   {
+                     write_status_error ("delete_key.secret", err);
+                     break;
+                   }
                 }
 
             }
@@ -225,7 +234,7 @@ do_delete_key( const char *username, int secret, int force, int *r_sec_avail )
         revalidation_mark().  This makes sense - only deleting keys
         that have ownertrust set should trigger this. */
 
-      if (!secret && pk && clear_ownertrusts (pk))
+      if (!secret && pk && clear_ownertrusts (ctrl, pk))
         {
           if (opt.verbose)
             log_info (_("ownertrust information cleared\n"));
@@ -242,7 +251,7 @@ do_delete_key( const char *username, int secret, int force, int *r_sec_avail )
  * Delete a public or secret key from a keyring.
  */
 gpg_error_t
-delete_keys (strlist_t names, int secret, int allow_both)
+delete_keys (ctrl_t ctrl, strlist_t names, int secret, int allow_both)
 {
   gpg_error_t err;
   int avail;
@@ -253,14 +262,14 @@ delete_keys (strlist_t names, int secret, int allow_both)
 
   for ( ;names ; names=names->next )
     {
-      err = do_delete_key (names->d, secret, force, &avail);
+      err = do_delete_key (ctrl, names->d, secret, force, &avail);
       if (err && avail)
         {
           if (allow_both)
             {
-              err = do_delete_key (names->d, 1, 0, &avail);
+              err = do_delete_key (ctrl, names->d, 1, 0, &avail);
               if (!err)
-                err = do_delete_key (names->d, 0, 0, &avail);
+                err = do_delete_key (ctrl, names->d, 0, 0, &avail);
             }
           else
             {