diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2019-06-04 02:17:21 +0200 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2019-06-04 02:17:21 +0200 |
commit | 20acc7c0226550530085a674ef1bb41ebfa39408 (patch) | |
tree | b459b077352be56c64262645039a04f213139ce7 /agent | |
parent | doc: Add a section for gpg-check-pattern. (diff) | |
download | gnupg2-20acc7c0226550530085a674ef1bb41ebfa39408.tar.xz gnupg2-20acc7c0226550530085a674ef1bb41ebfa39408.zip |
g10,agent: Support CONFIRM for --delete-key.
* agent/call-pinentry.c (agent_get_confirmation): Add call of
pinentry_loopback_confirm.
(agent_popup_message_start): Likewise.
(agent_popup_message_stop): Return if it's loopback mode.
* agent/command.c (pinentry_loopback_confirm): New.
* g10/call-agent.c (default_inq_cb): Support "CONFIRM" inquery
when PINENTRY_MODE_LOOPBACK mode.
(confirm_status_cb): New.
(agent_delete_key): Supply confirm_status_cb to set the description
string for confirmation.
--
In the Assuan communication, we introduce new interaction:
[gpg] [gpg-agent]
--- CMD: PKDECRYPT -->
<-- STATUS: SETDESC "..."
<-- STATUS: SETOK "..."
<-- STATUS: SETNOTOK "..."
<-- INQUERY: CONFIRM 0/1 (0 for display, 1 for user query)
--- INQUERY-result: -->
<-- RESULT: ...
GnuPG-bug-id: 3465
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
Diffstat (limited to 'agent')
-rw-r--r-- | agent/call-pinentry.c | 16 | ||||
-rw-r--r-- | agent/command.c | 23 |
2 files changed, 38 insertions, 1 deletions
diff --git a/agent/call-pinentry.c b/agent/call-pinentry.c index 487b21e81..c2105cd6e 100644 --- a/agent/call-pinentry.c +++ b/agent/call-pinentry.c @@ -1391,6 +1391,9 @@ agent_get_confirmation (ctrl_t ctrl, if (ctrl->pinentry_mode == PINENTRY_MODE_CANCEL) return gpg_error (GPG_ERR_CANCELED); + if (ctrl->pinentry_mode == PINENTRY_MODE_LOOPBACK) + return pinentry_loopback_confirm (ctrl, desc, 1, ok, notok); + return gpg_error (GPG_ERR_NO_PIN_ENTRY); } @@ -1486,7 +1489,15 @@ agent_popup_message_start (ctrl_t ctrl, const char *desc, const char *ok_btn) int err; if (ctrl->pinentry_mode != PINENTRY_MODE_ASK) - return gpg_error (GPG_ERR_CANCELED); + { + if (ctrl->pinentry_mode == PINENTRY_MODE_CANCEL) + return gpg_error (GPG_ERR_CANCELED); + + if (ctrl->pinentry_mode == PINENTRY_MODE_LOOPBACK) + return pinentry_loopback_confirm (ctrl, desc, 0, ok_btn, NULL); + + return gpg_error (GPG_ERR_NO_PIN_ENTRY); + } rc = start_pinentry (ctrl); if (rc) @@ -1537,6 +1548,9 @@ agent_popup_message_stop (ctrl_t ctrl) (void)ctrl; + if (ctrl->pinentry_mode == PINENTRY_MODE_LOOPBACK) + return; + if (!popup_tid || !entry_ctx) { log_debug ("agent_popup_message_stop called with no active popup\n"); diff --git a/agent/command.c b/agent/command.c index 3c2da183c..b59532ce5 100644 --- a/agent/command.c +++ b/agent/command.c @@ -3680,3 +3680,26 @@ pinentry_loopback(ctrl_t ctrl, const char *keyword, assuan_end_confidential (ctx); return rc; } + +/* Helper for the pinentry loopback mode to ask confirmation + or just to show message. */ +gpg_error_t +pinentry_loopback_confirm (ctrl_t ctrl, const char *desc, + int ask_confirmation, + const char *ok, const char *notok) +{ + gpg_error_t err = 0; + assuan_context_t ctx = ctrl->server_local->assuan_ctx; + + if (desc) + err = print_assuan_status (ctx, "SETDESC", "%s", desc); + if (!err && ok) + err = print_assuan_status (ctx, "SETOK", "%s", ok); + if (!err && notok) + err = print_assuan_status (ctx, "SETNOTOK", "%s", notok); + + if (!err) + err = assuan_inquire (ctx, ask_confirmation ? "CONFIRM 1" : "CONFIRM 0", + NULL, NULL, 0); + return err; +} |