comparison lisp/pgg-gpg.el @ 69848:a80d40a59be6

Revert to revision 1.8 to allow the use of gpg-agent.
author Reiner Steib <Reiner.Steib@gmx.de>
date Fri, 07 Apr 2006 21:06:12 +0000
parents f5b96aac4371
children d69718b12697
comparison
equal deleted inserted replaced
69847:f0238be5a17b 69848:a80d40a59be6
2 2
3 ;; Copyright (C) 1999, 2000, 2002, 2003, 2004, 3 ;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
4 ;; 2005, 2006 Free Software Foundation, Inc. 4 ;; 2005, 2006 Free Software Foundation, Inc.
5 5
6 ;; Author: Daiki Ueno <ueno@unixuser.org> 6 ;; Author: Daiki Ueno <ueno@unixuser.org>
7 ;; Symmetric encryption added by: Sascha Wilde <wilde@sha-bang.de> 7 ;; Symmetric encryption and gpg-agent support added by:
8 ;; Sascha Wilde <wilde@sha-bang.de>
8 ;; Created: 1999/10/28 9 ;; Created: 1999/10/28
9 ;; Keywords: PGP, OpenPGP, GnuPG 10 ;; Keywords: PGP, OpenPGP, GnuPG
10 11
11 ;; This file is part of GNU Emacs. 12 ;; This file is part of GNU Emacs.
12 13
49 "GnuPG option to specify recipient." 50 "GnuPG option to specify recipient."
50 :group 'pgg-gpg 51 :group 'pgg-gpg
51 :type '(choice (const :tag "New `--recipient' option" "--recipient") 52 :type '(choice (const :tag "New `--recipient' option" "--recipient")
52 (const :tag "Old `--remote-user' option" "--remote-user"))) 53 (const :tag "Old `--remote-user' option" "--remote-user")))
53 54
55 (defcustom pgg-gpg-use-agent nil
56 "Whether to use gnupg agent for key caching."
57 :group 'pgg-gpg
58 :type 'boolean)
59
54 (defvar pgg-gpg-user-id nil 60 (defvar pgg-gpg-user-id nil
55 "GnuPG ID of your default identity.") 61 "GnuPG ID of your default identity.")
56 62
57 (defun pgg-gpg-process-region (start end passphrase program args) 63 (defun pgg-gpg-process-region (start end passphrase program args)
58 (let* ((output-file-name (pgg-make-temp-file "pgg-output")) 64 (let* ((use-agent (pgg-gpg-use-agent-p))
65 (output-file-name (pgg-make-temp-file "pgg-output"))
59 (args 66 (args
60 `("--status-fd" "2" 67 `("--status-fd" "2"
61 ,@(if passphrase '("--passphrase-fd" "0")) 68 ,@(if use-agent '("--use-agent")
69 (if passphrase '("--passphrase-fd" "0")))
62 "--yes" ; overwrite 70 "--yes" ; overwrite
63 "--output" ,output-file-name 71 "--output" ,output-file-name
64 ,@pgg-gpg-extra-args ,@args)) 72 ,@pgg-gpg-extra-args ,@args))
65 (output-buffer pgg-output-buffer) 73 (output-buffer pgg-output-buffer)
66 (errors-buffer pgg-errors-buffer) 74 (errors-buffer pgg-errors-buffer)
98 (if (file-exists-p output-file-name) 106 (if (file-exists-p output-file-name)
99 (delete-file output-file-name)) 107 (delete-file output-file-name))
100 (set-default-file-modes orig-mode)))) 108 (set-default-file-modes orig-mode))))
101 109
102 (defun pgg-gpg-possibly-cache-passphrase (passphrase &optional key notruncate) 110 (defun pgg-gpg-possibly-cache-passphrase (passphrase &optional key notruncate)
103 (if (and pgg-cache-passphrase 111 (if (and passphrase
112 pgg-cache-passphrase
104 (progn 113 (progn
105 (goto-char (point-min)) 114 (goto-char (point-min))
106 (re-search-forward "^\\[GNUPG:] \\(GOOD_PASSPHRASE\\>\\)\\|\\(SIG_CREATED\\)" nil t))) 115 (re-search-forward "^\\[GNUPG:] \\(GOOD_PASSPHRASE\\>\\)\\|\\(SIG_CREATED\\)" nil t)))
107 (pgg-add-passphrase-to-cache 116 (pgg-add-passphrase-to-cache
108 (or key 117 (or key
178 187
179 If optional PASSPHRASE is not specified, it will be obtained from the 188 If optional PASSPHRASE is not specified, it will be obtained from the
180 passphrase cache or user." 189 passphrase cache or user."
181 (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id)) 190 (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
182 (passphrase (or passphrase 191 (passphrase (or passphrase
183 (when sign 192 (when (and sign (not (pgg-gpg-use-agent-p)))
184 (pgg-read-passphrase 193 (pgg-read-passphrase
185 (format "GnuPG passphrase for %s: " 194 (format "GnuPG passphrase for %s: "
186 pgg-gpg-user-id) 195 pgg-gpg-user-id)
187 pgg-gpg-user-id)))) 196 pgg-gpg-user-id))))
188 (args 197 (args
210 "Encrypt the current region between START and END with symmetric cipher. 219 "Encrypt the current region between START and END with symmetric cipher.
211 220
212 If optional PASSPHRASE is not specified, it will be obtained from the 221 If optional PASSPHRASE is not specified, it will be obtained from the
213 passphrase cache or user." 222 passphrase cache or user."
214 (let* ((passphrase (or passphrase 223 (let* ((passphrase (or passphrase
215 (pgg-read-passphrase 224 (when (not (pgg-gpg-use-agent-p))
216 "GnuPG passphrase for symmetric encryption: "))) 225 (pgg-read-passphrase
226 "GnuPG passphrase for symmetric encryption: "))))
217 (args 227 (args
218 (append (list "--batch" "--armor" "--symmetric" ) 228 (append (list "--batch" "--armor" "--symmetric" )
219 (if pgg-text-mode (list "--textmode"))))) 229 (if pgg-text-mode (list "--textmode")))))
220 (pgg-gpg-process-region start end passphrase pgg-gpg-program args) 230 (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
221 (pgg-process-when-success))) 231 (pgg-process-when-success)))
238 (key-owner (and key (pgg-gpg-lookup-key-owner key t))) 248 (key-owner (and key (pgg-gpg-lookup-key-owner key t)))
239 (key-id (pgg-gpg-key-id-from-key-owner key-owner)) 249 (key-id (pgg-gpg-key-id-from-key-owner key-owner))
240 (pgg-gpg-user-id (or key-id key 250 (pgg-gpg-user-id (or key-id key
241 pgg-gpg-user-id pgg-default-user-id)) 251 pgg-gpg-user-id pgg-default-user-id))
242 (passphrase (or passphrase 252 (passphrase (or passphrase
243 (pgg-read-passphrase 253 (when (not (pgg-gpg-use-agent-p))
244 (format (if (pgg-gpg-symmetric-key-p message-keys) 254 (pgg-read-passphrase
245 "Passphrase for symmetric decryption: " 255 (format (if (pgg-gpg-symmetric-key-p message-keys)
246 "GnuPG passphrase for %s: ") 256 "Passphrase for symmetric decryption: "
247 (or key-owner "??")) 257 "GnuPG passphrase for %s: ")
248 pgg-gpg-user-id))) 258 (or key-owner "??"))
259 pgg-gpg-user-id))))
249 (args '("--batch" "--decrypt"))) 260 (args '("--batch" "--decrypt")))
250 (pgg-gpg-process-region start end passphrase pgg-gpg-program args) 261 (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
251 (with-current-buffer pgg-errors-buffer 262 (with-current-buffer pgg-errors-buffer
252 (pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id) 263 (pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id)
253 (goto-char (point-min)) 264 (goto-char (point-min))
273 284
274 (defun pgg-gpg-sign-region (start end &optional cleartext passphrase) 285 (defun pgg-gpg-sign-region (start end &optional cleartext passphrase)
275 "Make detached signature from text between START and END." 286 "Make detached signature from text between START and END."
276 (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id)) 287 (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
277 (passphrase (or passphrase 288 (passphrase (or passphrase
278 (pgg-read-passphrase 289 (when (not (pgg-gpg-use-agent-p))
279 (format "GnuPG passphrase for %s: " pgg-gpg-user-id) 290 (pgg-read-passphrase
280 pgg-gpg-user-id))) 291 (format "GnuPG passphrase for %s: "
292 pgg-gpg-user-id)
293 pgg-gpg-user-id))))
281 (args 294 (args
282 (append (list (if cleartext "--clearsign" "--detach-sign") 295 (append (list (if cleartext "--clearsign" "--detach-sign")
283 "--armor" "--batch" "--verbose" 296 "--armor" "--batch" "--verbose"
284 "--local-user" pgg-gpg-user-id) 297 "--local-user" pgg-gpg-user-id)
285 (if pgg-text-mode (list "--textmode")))) 298 (if pgg-text-mode (list "--textmode"))))
341 "" 354 ""
342 "\tSecret keys are imported.\n"))) 355 "\tSecret keys are imported.\n")))
343 (append-to-buffer pgg-output-buffer (point-min)(point-max)) 356 (append-to-buffer pgg-output-buffer (point-min)(point-max))
344 (pgg-process-when-success))) 357 (pgg-process-when-success)))
345 358
359 (defun pgg-gpg-update-agent ()
360 "Try to connet to gpg-agent and send UPDATESTARTUPTTY."
361 (if (fboundp 'make-network-process)
362 (let* ((agent-info (getenv "GPG_AGENT_INFO"))
363 (socket (and agent-info
364 (string-match "^\\([^:]*\\)" agent-info)
365 (match-string 1 agent-info)))
366 (conn (and socket
367 (make-network-process :name "gpg-agent-process"
368 :host 'local :family 'local
369 :service socket))))
370 (when (and conn (eq (process-status conn) 'open))
371 (process-send-string conn "UPDATESTARTUPTTY\n")
372 (delete-process conn)
373 t))
374 ;; We can't check, so assume gpg-agent is up.
375 t))
376
377 (defun pgg-gpg-use-agent-p ()
378 "Return t if `pgg-gpg-use-agent' is t and gpg-agent is available."
379 (and pgg-gpg-use-agent (pgg-gpg-update-agent)))
380
346 (provide 'pgg-gpg) 381 (provide 'pgg-gpg)
347 382
348 ;;; arch-tag: 2aa5d5d8-93a0-4865-9312-33e29830e000 383 ;;; arch-tag: 2aa5d5d8-93a0-4865-9312-33e29830e000
349 ;;; pgg-gpg.el ends here 384 ;;; pgg-gpg.el ends here