X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/d709390421bc438bfcf6d24e4f07a51e20c84fa1..489cd5bd5a0128d6c3bee49fa2c451f2927ddea9:/lisp/pgg-gpg.el diff --git a/lisp/pgg-gpg.el b/lisp/pgg-gpg.el index 46dbf83331..e8375fe58f 100644 --- a/lisp/pgg-gpg.el +++ b/lisp/pgg-gpg.el @@ -1,7 +1,7 @@ ;;; pgg-gpg.el --- GnuPG support for PGG. ;; Copyright (C) 1999, 2000, 2002, 2003, 2004, -;; 2005, 2006 Free Software Foundation, Inc. +;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. ;; Author: Daiki Ueno ;; Symmetric encryption and gpg-agent support added by: @@ -11,10 +11,10 @@ ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -22,9 +22,7 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. +;; along with GNU Emacs. If not, see . ;;; Code: @@ -52,7 +50,7 @@ :type '(choice (const :tag "New `--recipient' option" "--recipient") (const :tag "Old `--remote-user' option" "--remote-user"))) -(defcustom pgg-gpg-use-agent nil +(defcustom pgg-gpg-use-agent t "Whether to use gnupg agent for key caching." :group 'pgg-gpg :type 'boolean) @@ -61,7 +59,7 @@ "GnuPG ID of your default identity.") (defun pgg-gpg-process-region (start end passphrase program args) - (let* ((use-agent (pgg-gpg-use-agent-p)) + (let* ((use-agent (and (null passphrase) (pgg-gpg-use-agent-p))) (output-file-name (pgg-make-temp-file "pgg-output")) (args `("--status-fd" "2" @@ -74,7 +72,10 @@ (errors-buffer pgg-errors-buffer) (orig-mode (default-file-modes)) (process-connection-type nil) - process status exit-status) + (inhibit-redisplay t) + process status exit-status + passphrase-with-newline + encoded-passphrase-with-new-line) (with-current-buffer (get-buffer-create errors-buffer) (buffer-disable-undo) (erase-buffer)) @@ -87,11 +88,25 @@ program args))) (set-process-sentinel process #'ignore) (when passphrase - (process-send-string process (concat passphrase "\n"))) + (setq passphrase-with-newline (concat passphrase "\n")) + (if pgg-passphrase-coding-system + (progn + (setq encoded-passphrase-with-new-line + (encode-coding-string + passphrase-with-newline + (coding-system-change-eol-conversion + pgg-passphrase-coding-system 'unix))) + (pgg-clear-string passphrase-with-newline)) + (setq encoded-passphrase-with-new-line passphrase-with-newline + passphrase-with-newline nil)) + (process-send-string process encoded-passphrase-with-new-line)) (process-send-region process start end) (process-send-eof process) (while (eq 'run (process-status process)) (accept-process-output process 5)) + ;; Accept any remaining pending output coming after the + ;; status change. + (accept-process-output process 5) (setq status (process-status process) exit-status (process-exit-status process)) (delete-process process) @@ -108,6 +123,10 @@ (error "%s exited abnormally: '%s'" program exit-status)) (if (= 127 exit-status) (error "%s could not be found" program)))) + (if passphrase-with-newline + (pgg-clear-string passphrase-with-newline)) + (if encoded-passphrase-with-new-line + (pgg-clear-string encoded-passphrase-with-new-line)) (if (and process (eq 'run (process-status process))) (interrupt-process process)) (if (file-exists-p output-file-name) @@ -170,9 +189,9 @@ Optional ALL non-nil means search all keys, including secret keys." (let ((args (list "--with-colons" "--no-greeting" "--batch" (if all "--list-secret-keys" "--list-keys") string)) - (key-regexp (concat "^\\(sec\\|pub\\)" + (key-regexp (concat "^\\(sec\\|pub\\|uid\\)" ":[^:]*:[^:]*:[^:]*:\\([^:]*\\):[^:]*" - ":[^:]*:[^:]*:[^:]*:\\([^:]*\\):"))) + ":[^:]*:[^:]*:[^:]*:\\([^:]+\\):"))) (with-temp-buffer (apply #'call-process pgg-gpg-program nil t nil args) (goto-char (point-min)) @@ -206,7 +225,7 @@ passphrase cache or user." (list "--batch" "--armor" "--always-trust" "--encrypt") (if pgg-text-mode (list "--textmode")) (if sign (list "--sign" "--local-user" pgg-gpg-user-id)) - (if recipients + (if (or recipients pgg-encrypt-for-me) (apply #'nconc (mapcar (lambda (rcpt) (list pgg-gpg-recipient-argument rcpt)) @@ -387,5 +406,5 @@ passphrase cache or user." (provide 'pgg-gpg) -;;; arch-tag: 2aa5d5d8-93a0-4865-9312-33e29830e000 +;; arch-tag: 2aa5d5d8-93a0-4865-9312-33e29830e000 ;;; pgg-gpg.el ends here