Mercurial > emacs
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 |