From: Daiki Ueno <ueno@gnu.org>
Date: Thu, 16 Jul 2015 06:43:03 +0000 (+0900)
Subject: epg: Automatically start pinentry server
X-Git-Tag: emacs-25.0.90~1486
X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=bd8b5ac77250d9fe0634d58a30a3bf6d2497725a;p=emacs.git

epg: Automatically start pinentry server

* epg-config.el (epg-gpgconf-program): New variable.
* epg.el (epg--start): Call `pinentry-start' if
allow-emacs-pinentry is set in ~/.gnupg/gpg-agent.conf.
---

diff --git a/lisp/epg-config.el b/lisp/epg-config.el
index 10f0dd3f4bf..db2951306d0 100644
--- a/lisp/epg-config.el
+++ b/lisp/epg-config.el
@@ -51,6 +51,11 @@
   :group 'epg
   :type 'string)
 
+(defcustom epg-gpgconf-program "gpgconf"
+  "The `gpgconf' executable."
+  :group 'epg
+  :type 'string)
+
 (defcustom epg-gpg-home-directory nil
   "The directory which contains the configuration files of `epg-gpg-program'."
   :group 'epg
diff --git a/lisp/epg.el b/lisp/epg.el
index b3d39bb8505..4ba96272aae 100644
--- a/lisp/epg.el
+++ b/lisp/epg.el
@@ -602,6 +602,16 @@ callback data (if any)."
       (setq process-environment
 	    (cons (concat "GPG_TTY=" terminal-name)
 		  (cons "TERM=xterm" process-environment))))
+    ;; Start the Emacs Pinentry server if allow-emacs-pinentry is set
+    ;; in ~/.gnupg/gpg-agent.conf.
+    (when (and (fboundp 'pinentry-start)
+               (with-temp-buffer
+                 (when (= (call-process epg-gpgconf-program nil t nil
+                                        "--list-options" "gpg-agent")
+                          0)
+                   (goto-char (point-min))
+                   (re-search-forward "^allow-emacs-pinentry:.*:1$" nil t))))
+      (pinentry-start))
     (setq process-environment
           (cons (format "INSIDE_EMACS=%s,epg" emacs-version)
                 process-environment))