From 9cd6f55d3d01fe0781ce81b2e394ed3e8febd6fa Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sun, 19 Feb 2017 10:34:50 -0500 Subject: [PATCH v2] Fix passphrase callback with gpg 2.1+ (Bug#23619) * lisp/epg.el (epg-context-set-passphrase-callback): Set CONTEXT's pinentry mode to `loopback'. (epg--start): Only pass `--pinentry-mode' for gpg 2.1+. --- lisp/epg.el | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lisp/epg.el b/lisp/epg.el index 587271b000..ba7125f232 100644 --- a/lisp/epg.el +++ b/lisp/epg.el @@ -246,16 +246,15 @@ epg-context-set-passphrase-callback The function gets three arguments: the context, the key-id in question, and the callback data (if any). -The callback may not be called if you use GnuPG 2.x, which relies -on the external program called `gpg-agent' for passphrase query. -If you really want to intercept passphrase query, consider -installing GnuPG 1.x _along with_ GnuPG 2.x, which does passphrase -query by itself and Emacs can intercept them." +Also set CONTEXT's pinentry mode to `loopback' (when using GnuPG +2.x, the callback would not be called otherwise)." ;; (declare (obsolete setf "25.1")) (setf (epg-context-passphrase-callback context) (if (functionp passphrase-callback) (list passphrase-callback) - passphrase-callback))) + passphrase-callback)) + (when passphrase-callback + (setf (epg-context-pinentry-mode context) 'loopback))) (defun epg-context-set-progress-callback (context progress-callback) @@ -578,7 +577,13 @@ epg--start (if (epg-context-textmode context) '("--textmode")) (if (epg-context-output-file context) (list "--output" (epg-context-output-file context))) - (if (epg-context-pinentry-mode context) + (if (and (epg-context-pinentry-mode context) + ;; GPG 1.x and 2.0.x reject `--pinentry-mode'. + (version<= "2.1" + (alist-get + 'version (epg-find-configuration + (epg-context-protocol context)) + "1.0"))) (list "--pinentry-mode" (symbol-name (epg-context-pinentry-mode context)))) -- 2.11.1