* options.h, getkey.c (merge_selfsigs_subkey), gpg.c (main), sig-check.c
[gnupg.git] / g10 / delkey.c
index 23df627..354851d 100644 (file)
@@ -1,6 +1,6 @@
 /* delkey.c - delete keys
- * Copyright (C) 1998, 1999, 2000, 2001, 2002,
- *               2004 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004,
+ *               2005 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -16,7 +16,8 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
  */
 
 #include <config.h>
@@ -48,7 +49,7 @@
  * key can't be deleted for that reason.
  */
 static int
-do_delete_key( const char *username, int secret, int *r_sec_avail )
+do_delete_key( const char *username, int secret, int force, int *r_sec_avail )
 {
     int rc = 0;
     KBNODE keyblock = NULL;
@@ -71,7 +72,7 @@ do_delete_key( const char *username, int secret, int *r_sec_avail )
                   || desc.mode == KEYDB_SEARCH_MODE_FPR20);
     rc = desc.mode? keydb_search (hd, &desc, 1):G10ERR_INV_USER_ID;
     if (rc) {
-       log_error (_("key `%s' not found: %s\n"), username, g10_errstr (rc));
+       log_error (_("key \"%s\" not found: %s\n"), username, g10_errstr (rc));
        write_status_text( STATUS_DELETE_PROBLEM, "1" );
        goto leave;
     }
@@ -91,25 +92,32 @@ do_delete_key( const char *username, int secret, int *r_sec_avail )
        goto leave;
     }
 
-    if( secret ) {
+    if( secret )
+      {
        sk = node->pkt->pkt.secret_key;
        keyid_from_sk( sk, keyid );
-    }
-    else {
+      }
+    else
+      {
+       /* public */
        pk = node->pkt->pkt.public_key;
        keyid_from_pk( pk, keyid );
-       rc = seckey_available( keyid );
-       if( !rc && !opt.expert ) {
-            *r_sec_avail = 1;
-            rc = -1;
-            goto leave;
-       }
-       else if( rc != G10ERR_NO_SECKEY ) {
-           log_error("%s: get secret key: %s\n", username, g10_errstr(rc) );
-       }
-       else
-           rc = 0;
-    }
+
+       if(!force)
+         {
+           rc = seckey_available( keyid );
+           if( !rc )
+             {
+               *r_sec_avail = 1;
+               rc = -1;
+               goto leave;
+             }
+           else if( rc != G10ERR_NO_SECKEY )
+             log_error("%s: get secret key: %s\n", username, g10_errstr(rc) );
+           else
+             rc = 0;
+         }
+      }
 
     if( rc )
        rc = 0;
@@ -117,14 +125,14 @@ do_delete_key( const char *username, int secret, int *r_sec_avail )
         okay++;
     else if( opt.batch && secret )
       {
-       log_error(_("can't do that in batchmode\n"));
+       log_error(_("can't do this in batch mode\n"));
         log_info (_("(unless you specify the key by fingerprint)\n"));
       }
     else if( opt.batch && opt.answer_yes )
        okay++;
     else if( opt.batch )
       {
-       log_error(_("can't do that in batchmode without \"--yes\"\n"));
+       log_error(_("can't do this in batch mode without \"--yes\"\n"));
         log_info (_("(unless you specify the key by fingerprint)\n"));
       }
     else {
@@ -180,15 +188,18 @@ do_delete_key( const char *username, int secret, int *r_sec_avail )
 int
 delete_keys( STRLIST names, int secret, int allow_both )
 {
-    int rc, avail;
+    int rc, avail, force=(!allow_both && !secret && opt.expert);
+
+    /* Force allows us to delete a public key even if a secret key
+       exists. */
 
     for(;names;names=names->next) {
-       rc = do_delete_key (names->d, secret, &avail );
+       rc = do_delete_key (names->d, secret, force, &avail );
        if ( rc && avail ) { 
         if ( allow_both ) {
-          rc = do_delete_key (names->d, 1, &avail );
+          rc = do_delete_key (names->d, 1, 0, &avail );
           if ( !rc )
-            rc = do_delete_key (names->d, 0, &avail );
+            rc = do_delete_key (names->d, 0, 0, &avail );
         }
         else {
           log_error(_(