Blame src/delete.c

Packit d7e8d0
/* delete.c - Delete a key.
Packit d7e8d0
   Copyright (C) 2001, 2002, 2003, 2004 g10 Code GmbH
Packit d7e8d0
Packit d7e8d0
   This file is part of GPGME.
Packit d7e8d0
Packit d7e8d0
   GPGME is free software; you can redistribute it and/or modify it
Packit d7e8d0
   under the terms of the GNU Lesser General Public License as
Packit d7e8d0
   published by the Free Software Foundation; either version 2.1 of
Packit d7e8d0
   the License, or (at your option) any later version.
Packit d7e8d0
Packit d7e8d0
   GPGME is distributed in the hope that it will be useful, but
Packit d7e8d0
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit d7e8d0
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit d7e8d0
   Lesser General Public License for more details.
Packit d7e8d0
Packit d7e8d0
   You should have received a copy of the GNU Lesser General Public
Packit d7e8d0
   License along with this program; if not, write to the Free Software
Packit d7e8d0
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
Packit d7e8d0
   02111-1307, USA.  */
Packit d7e8d0
Packit d7e8d0
#if HAVE_CONFIG_H
Packit d7e8d0
#include <config.h>
Packit d7e8d0
#endif
Packit d7e8d0
#include <stdlib.h>
Packit d7e8d0
#include <errno.h>
Packit d7e8d0
Packit d7e8d0
#include "debug.h"
Packit d7e8d0
#include "gpgme.h"
Packit d7e8d0
#include "context.h"
Packit d7e8d0
#include "ops.h"
Packit d7e8d0
Packit d7e8d0

Packit d7e8d0
static gpgme_error_t
Packit d7e8d0
delete_status_handler (void *priv, gpgme_status_code_t code, char *args)
Packit d7e8d0
{
Packit d7e8d0
  (void)priv;
Packit d7e8d0
Packit d7e8d0
  if (code == GPGME_STATUS_DELETE_PROBLEM)
Packit d7e8d0
    {
Packit d7e8d0
      enum delete_problem
Packit d7e8d0
	{
Packit d7e8d0
	  DELETE_No_Problem = 0,
Packit d7e8d0
	  DELETE_No_Such_Key = 1,
Packit d7e8d0
	  DELETE_Must_Delete_Secret_Key = 2,
Packit d7e8d0
	  DELETE_Ambiguous_Specification = 3
Packit d7e8d0
	};
Packit d7e8d0
      long problem;
Packit d7e8d0
      char *tail;
Packit d7e8d0
Packit d7e8d0
      gpg_err_set_errno (0);
Packit d7e8d0
      problem = strtol (args, &tail, 0);
Packit d7e8d0
      if (errno || (*tail && *tail != ' '))
Packit d7e8d0
	return trace_gpg_error (GPG_ERR_INV_ENGINE);
Packit d7e8d0
Packit d7e8d0
      switch (problem)
Packit d7e8d0
	{
Packit d7e8d0
	case DELETE_No_Problem:
Packit d7e8d0
	  break;
Packit d7e8d0
Packit d7e8d0
	case DELETE_No_Such_Key:
Packit d7e8d0
	  return gpg_error (GPG_ERR_NO_PUBKEY);
Packit d7e8d0
Packit d7e8d0
	case DELETE_Must_Delete_Secret_Key:
Packit d7e8d0
	  return gpg_error (GPG_ERR_CONFLICT);
Packit d7e8d0
Packit d7e8d0
	case DELETE_Ambiguous_Specification:
Packit d7e8d0
	  return gpg_error (GPG_ERR_AMBIGUOUS_NAME);
Packit d7e8d0
Packit d7e8d0
	}
Packit d7e8d0
Packit d7e8d0
      return gpg_error (GPG_ERR_GENERAL);
Packit d7e8d0
    }
Packit d7e8d0
  else if (code == GPGME_STATUS_ERROR)
Packit d7e8d0
    {
Packit d7e8d0
      /* Some error stati are informational, so we don't return an
Packit d7e8d0
         error code if we are not ready to process this status.  */
Packit d7e8d0
      gpgme_error_t err;
Packit d7e8d0
      char *where = strchr (args, ' ');
Packit d7e8d0
      char *which;
Packit d7e8d0
Packit d7e8d0
      if (where)
Packit d7e8d0
	{
Packit d7e8d0
	  *where = '\0';
Packit d7e8d0
	  which = where + 1;
Packit d7e8d0
Packit d7e8d0
	  where = strchr (which, ' ');
Packit d7e8d0
	  if (where)
Packit d7e8d0
	    *where = '\0';
Packit d7e8d0
Packit d7e8d0
	  where = args;
Packit d7e8d0
	}
Packit d7e8d0
      else
Packit d7e8d0
	return trace_gpg_error (GPG_ERR_INV_ENGINE);
Packit d7e8d0
Packit d7e8d0
      err = atoi (which);
Packit d7e8d0
Packit d7e8d0
      if (!strcmp (where, "delete_key.secret")
Packit d7e8d0
	  && (gpg_err_code (err) == GPG_ERR_CANCELED
Packit d7e8d0
	      || gpg_err_code (err) == GPG_ERR_FULLY_CANCELED))
Packit d7e8d0
	{
Packit d7e8d0
	  /* This indicates a user cancellation on the confirmation dialog.  */
Packit d7e8d0
	  return gpg_error (gpg_err_code (err));
Packit d7e8d0
	}
Packit d7e8d0
    }
Packit d7e8d0
  return 0;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
static gpgme_error_t
Packit d7e8d0
delete_start (gpgme_ctx_t ctx, int synchronous, const gpgme_key_t key,
Packit d7e8d0
	      unsigned int flags)
Packit d7e8d0
{
Packit d7e8d0
  gpgme_error_t err;
Packit d7e8d0
Packit d7e8d0
  err = _gpgme_op_reset (ctx, synchronous);
Packit d7e8d0
  if (err)
Packit d7e8d0
    return err;
Packit d7e8d0
Packit d7e8d0
  _gpgme_engine_set_status_handler (ctx->engine, delete_status_handler, ctx);
Packit d7e8d0
Packit d7e8d0
  return _gpgme_engine_op_delete (ctx->engine, key, flags);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
/* Delete KEY from the keyring.  If ALLOW_SECRET is non-zero, secret
Packit d7e8d0
   keys are also deleted.  */
Packit d7e8d0
gpgme_error_t
Packit d7e8d0
gpgme_op_delete_start (gpgme_ctx_t ctx, const gpgme_key_t key,
Packit d7e8d0
		       int allow_secret)
Packit d7e8d0
{
Packit d7e8d0
  gpgme_error_t err;
Packit d7e8d0
Packit Service 30b792
  TRACE_BEG  (DEBUG_CTX, "gpgme_op_delete_start", ctx,
Packit d7e8d0
	      "key=%p (%s), allow_secret=%i", key,
Packit d7e8d0
	      (key->subkeys && key->subkeys->fpr) ?
Packit d7e8d0
	      key->subkeys->fpr : "invalid", allow_secret);
Packit d7e8d0
Packit d7e8d0
  if (!ctx)
Packit d7e8d0
    return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
Packit d7e8d0
Packit d7e8d0
  err = delete_start (ctx, 0, key,
Packit d7e8d0
		      allow_secret ? GPGME_DELETE_ALLOW_SECRET : 0);
Packit d7e8d0
  return TRACE_ERR (err);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
/* Delete KEY from the keyring.  If ALLOW_SECRET is non-zero, secret
Packit d7e8d0
   keys are also deleted.  */
Packit d7e8d0
gpgme_error_t
Packit d7e8d0
gpgme_op_delete (gpgme_ctx_t ctx, const gpgme_key_t key, int allow_secret)
Packit d7e8d0
{
Packit d7e8d0
  gpgme_error_t err;
Packit d7e8d0
Packit Service 30b792
  TRACE_BEG  (DEBUG_CTX, "gpgme_op_delete", ctx,
Packit d7e8d0
	      "key=%p (%s), allow_secret=%i", key,
Packit d7e8d0
	      (key->subkeys && key->subkeys->fpr) ?
Packit d7e8d0
	      key->subkeys->fpr : "invalid", allow_secret);
Packit d7e8d0
Packit d7e8d0
  if (!ctx)
Packit d7e8d0
    return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
Packit d7e8d0
Packit d7e8d0
  err = delete_start (ctx, 1, key,
Packit d7e8d0
		      allow_secret ? GPGME_DELETE_ALLOW_SECRET : 0);
Packit d7e8d0
  if (!err)
Packit d7e8d0
    err = _gpgme_wait_one (ctx);
Packit d7e8d0
  return err;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
/* Delete KEY from the keyring.  */
Packit d7e8d0
gpgme_error_t
Packit d7e8d0
gpgme_op_delete_ext_start (gpgme_ctx_t ctx, const gpgme_key_t key,
Packit d7e8d0
			   unsigned int flags)
Packit d7e8d0
{
Packit d7e8d0
  gpgme_error_t err;
Packit d7e8d0
Packit Service 30b792
  TRACE_BEG  (DEBUG_CTX, "gpgme_op_delete_ext_start", ctx,
Packit d7e8d0
	      "key=%p (%s), flags=0x%x", key,
Packit d7e8d0
	      (key->subkeys && key->subkeys->fpr) ?
Packit d7e8d0
	      key->subkeys->fpr : "invalid", flags);
Packit d7e8d0
Packit d7e8d0
  if (!ctx)
Packit d7e8d0
    return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
Packit d7e8d0
Packit d7e8d0
  err = delete_start (ctx, 0, key, flags);
Packit d7e8d0
  return TRACE_ERR (err);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
/* Delete KEY from the keyring.  */
Packit d7e8d0
gpgme_error_t
Packit d7e8d0
gpgme_op_delete_ext (gpgme_ctx_t ctx, const gpgme_key_t key,
Packit d7e8d0
		     unsigned int flags)
Packit d7e8d0
{
Packit d7e8d0
  gpgme_error_t err;
Packit d7e8d0
Packit Service 30b792
  TRACE_BEG  (DEBUG_CTX, "gpgme_op_delete_ext", ctx,
Packit d7e8d0
	      "key=%p (%s), flags=0x%x", key,
Packit d7e8d0
	      (key->subkeys && key->subkeys->fpr) ?
Packit d7e8d0
	      key->subkeys->fpr : "invalid", flags);
Packit d7e8d0
Packit d7e8d0
  if (!ctx)
Packit d7e8d0
    return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
Packit d7e8d0
Packit d7e8d0
  err = delete_start (ctx, 1, key, flags);
Packit d7e8d0
  if (!err)
Packit d7e8d0
    err = _gpgme_wait_one (ctx);
Packit d7e8d0
  return err;
Packit d7e8d0
}