aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/delete.c54
-rw-r--r--src/engine-backend.h2
-rw-r--r--src/engine-gpg.c13
-rw-r--r--src/engine-gpgsm.c4
-rw-r--r--src/engine.c4
-rw-r--r--src/engine.h2
-rw-r--r--src/gpgme.def3
-rw-r--r--src/gpgme.h.in9
-rw-r--r--src/libgpgme.vers2
9 files changed, 78 insertions, 15 deletions
diff --git a/src/delete.c b/src/delete.c
index fc99aacf..1bf1cb48 100644
--- a/src/delete.c
+++ b/src/delete.c
@@ -108,7 +108,7 @@ delete_status_handler (void *priv, gpgme_status_code_t code, char *args)
static gpgme_error_t
delete_start (gpgme_ctx_t ctx, int synchronous, const gpgme_key_t key,
- int allow_secret)
+ unsigned int flags)
{
gpgme_error_t err;
@@ -118,7 +118,7 @@ delete_start (gpgme_ctx_t ctx, int synchronous, const gpgme_key_t key,
_gpgme_engine_set_status_handler (ctx->engine, delete_status_handler, ctx);
- return _gpgme_engine_op_delete (ctx->engine, key, allow_secret);
+ return _gpgme_engine_op_delete (ctx->engine, key, flags);
}
@@ -130,7 +130,7 @@ gpgme_op_delete_start (gpgme_ctx_t ctx, const gpgme_key_t key,
{
gpgme_error_t err;
- TRACE_BEG3 (DEBUG_CTX, "gpgme_op_delete", ctx,
+ TRACE_BEG3 (DEBUG_CTX, "gpgme_op_delete_start", ctx,
"key=%p (%s), allow_secret=%i", key,
(key->subkeys && key->subkeys->fpr) ?
key->subkeys->fpr : "invalid", allow_secret);
@@ -138,7 +138,8 @@ gpgme_op_delete_start (gpgme_ctx_t ctx, const gpgme_key_t key,
if (!ctx)
return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
- err = delete_start (ctx, 0, key, allow_secret);
+ err = delete_start (ctx, 0, key,
+ allow_secret ? GPGME_DELETE_ALLOW_SECRET : 0);
return TRACE_ERR (err);
}
@@ -158,7 +159,50 @@ gpgme_op_delete (gpgme_ctx_t ctx, const gpgme_key_t key, int allow_secret)
if (!ctx)
return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
- err = delete_start (ctx, 1, key, allow_secret);
+ err = delete_start (ctx, 1, key,
+ allow_secret ? GPGME_DELETE_ALLOW_SECRET : 0);
+ if (!err)
+ err = _gpgme_wait_one (ctx);
+ return err;
+}
+
+
+/* Delete KEY from the keyring. */
+gpgme_error_t
+gpgme_op_delete_ext_start (gpgme_ctx_t ctx, const gpgme_key_t key,
+ unsigned int flags)
+{
+ gpgme_error_t err;
+
+ TRACE_BEG3 (DEBUG_CTX, "gpgme_op_delete_ext_start", ctx,
+ "key=%p (%s), flags=0x%x", key,
+ (key->subkeys && key->subkeys->fpr) ?
+ key->subkeys->fpr : "invalid", flags);
+
+ if (!ctx)
+ return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
+
+ err = delete_start (ctx, 0, key, flags);
+ return TRACE_ERR (err);
+}
+
+
+/* Delete KEY from the keyring. */
+gpgme_error_t
+gpgme_op_delete_ext (gpgme_ctx_t ctx, const gpgme_key_t key,
+ unsigned int flags)
+{
+ gpgme_error_t err;
+
+ TRACE_BEG3 (DEBUG_CTX, "gpgme_op_delete_ext", ctx,
+ "key=%p (%s), flags=0x%x", key,
+ (key->subkeys && key->subkeys->fpr) ?
+ key->subkeys->fpr : "invalid", flags);
+
+ if (!ctx)
+ return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
+
+ err = delete_start (ctx, 1, key, flags);
if (!err)
err = _gpgme_wait_one (ctx);
return err;
diff --git a/src/engine-backend.h b/src/engine-backend.h
index 53af6622..90328ecb 100644
--- a/src/engine-backend.h
+++ b/src/engine-backend.h
@@ -66,7 +66,7 @@ struct engine_ops
gpgme_data_t ciph,
gpgme_data_t plain, int export_session_key,
const char *override_session_key);
- gpgme_error_t (*delete) (void *engine, gpgme_key_t key, int allow_secret);
+ gpgme_error_t (*delete) (void *engine, gpgme_key_t key, unsigned int flags);
gpgme_error_t (*edit) (void *engine, int type, gpgme_key_t key,
gpgme_data_t out, gpgme_ctx_t ctx /* FIXME */);
gpgme_error_t (*encrypt) (void *engine, gpgme_key_t recp[],
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index 0c3a63ee..c749c972 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -1628,13 +1628,18 @@ gpg_decrypt (void *engine,
}
static gpgme_error_t
-gpg_delete (void *engine, gpgme_key_t key, int allow_secret)
+gpg_delete (void *engine, gpgme_key_t key, unsigned int flags)
{
engine_gpg_t gpg = engine;
- gpgme_error_t err;
+ gpgme_error_t err = 0;
+ int allow_secret = flags & GPGME_DELETE_ALLOW_SECRET;
+ int force = flags & GPGME_DELETE_FORCE;
- err = add_arg (gpg, allow_secret ? "--delete-secret-and-public-key"
- : "--delete-key");
+ if (force)
+ err = add_arg (gpg, "--yes");
+ if (!err)
+ err = add_arg (gpg, allow_secret ? "--delete-secret-and-public-key"
+ : "--delete-key");
if (!err)
err = add_arg (gpg, "--");
if (!err)
diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c
index c3d5427f..a0fcb1f4 100644
--- a/src/engine-gpgsm.c
+++ b/src/engine-gpgsm.c
@@ -1162,7 +1162,7 @@ gpgsm_decrypt (void *engine,
static gpgme_error_t
-gpgsm_delete (void *engine, gpgme_key_t key, int allow_secret)
+gpgsm_delete (void *engine, gpgme_key_t key, unsigned int flags)
{
engine_gpgsm_t gpgsm = engine;
gpgme_error_t err;
@@ -1171,7 +1171,7 @@ gpgsm_delete (void *engine, gpgme_key_t key, int allow_secret)
char *line;
int length = 8; /* "DELKEYS " */
- (void)allow_secret;
+ (void)flags;
if (!fpr)
return gpg_error (GPG_ERR_INV_VALUE);
diff --git a/src/engine.c b/src/engine.c
index 278916d4..89a8552c 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -671,7 +671,7 @@ _gpgme_engine_op_decrypt (engine_t engine,
gpgme_error_t
_gpgme_engine_op_delete (engine_t engine, gpgme_key_t key,
- int allow_secret)
+ unsigned int flags)
{
if (!engine)
return gpg_error (GPG_ERR_INV_VALUE);
@@ -679,7 +679,7 @@ _gpgme_engine_op_delete (engine_t engine, gpgme_key_t key,
if (!engine->ops->delete)
return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
- return (*engine->ops->delete) (engine->engine, key, allow_secret);
+ return (*engine->ops->delete) (engine->engine, key, flags);
}
diff --git a/src/engine.h b/src/engine.h
index dd0ef9c2..d25c1fa6 100644
--- a/src/engine.h
+++ b/src/engine.h
@@ -90,7 +90,7 @@ gpgme_error_t _gpgme_engine_op_decrypt (engine_t engine,
int export_session_key,
const char *override_session_key);
gpgme_error_t _gpgme_engine_op_delete (engine_t engine, gpgme_key_t key,
- int allow_secret);
+ unsigned int flags);
gpgme_error_t _gpgme_engine_op_edit (engine_t engine, int type,
gpgme_key_t key, gpgme_data_t out,
gpgme_ctx_t ctx /* FIXME */);
diff --git a/src/gpgme.def b/src/gpgme.def
index 51053cd9..a8918122 100644
--- a/src/gpgme.def
+++ b/src/gpgme.def
@@ -262,5 +262,8 @@ EXPORTS
gpgme_op_decrypt_ext @195
gpgme_op_decrypt_ext_start @196
+ gpgme_op_delete_ext @197
+ gpgme_op_delete_ext_start @198
+
; END
diff --git a/src/gpgme.h.in b/src/gpgme.h.in
index 867219a4..29cda2c6 100644
--- a/src/gpgme.h.in
+++ b/src/gpgme.h.in
@@ -1788,6 +1788,15 @@ gpgme_error_t gpgme_op_delete_start (gpgme_ctx_t ctx, const gpgme_key_t key,
gpgme_error_t gpgme_op_delete (gpgme_ctx_t ctx, const gpgme_key_t key,
int allow_secret);
+/* Flags for the key delete functions. */
+#define GPGME_DELETE_ALLOW_SECRET (1 << 0) /* Also delete secret key. */
+#define GPGME_DELETE_FORCE (1 << 1) /* Do not ask user to confirm. */
+
+gpgme_error_t gpgme_op_delete_ext_start (gpgme_ctx_t ctx, const gpgme_key_t key,
+ unsigned int flags);
+gpgme_error_t gpgme_op_delete_ext (gpgme_ctx_t ctx, const gpgme_key_t key,
+ unsigned int flags);
+
/*
* Key signing interface
diff --git a/src/libgpgme.vers b/src/libgpgme.vers
index adc8d7d4..9a74b76f 100644
--- a/src/libgpgme.vers
+++ b/src/libgpgme.vers
@@ -209,6 +209,8 @@ GPGME_1.0 {
gpgme_op_decrypt_verify_start;
gpgme_op_delete;
gpgme_op_delete_start;
+ gpgme_op_delete_ext;
+ gpgme_op_delete_ext_start;
gpgme_op_edit;
gpgme_op_edit_start;
gpgme_op_encrypt;