]> code.delx.au - gnu-emacs/blobdiff - lisp/epa-file.el
Merge from emacs-23
[gnu-emacs] / lisp / epa-file.el
index 6c577448512a3a2c664744e9790b858385b87fd7..1f9500ded8167928b512bd1010c99dab1b6c9f88 100644 (file)
@@ -3,6 +3,7 @@
 
 ;; Author: Daiki Ueno <ueno@unixuser.org>
 ;; Keywords: PGP, GnuPG
+;; Package: epa
 
 ;; This file is part of GNU Emacs.
 
@@ -34,9 +35,16 @@ way."
   :type 'boolean
   :group 'epa-file)
 
-(defcustom epa-file-select-keys nil
-  "If non-nil, always asks user to select recipients."
-  :type 'boolean
+(defcustom epa-file-select-keys 'silent
+  "Control whether or not to pop up the key selection dialog.
+
+If t, always asks user to select recipients.
+If nil, query user only when `epa-file-encrypt-to' is not set.
+If neither t nor nil, doesn't ask user.  In this case, symmetric
+encryption is used."
+  :type '(choice (const :tag "Ask always" t)
+                (const :tag "Ask when recipients are not set" nil)
+                (const :tag "Don't ask" silent))
   :group 'epa-file)
 
 (defvar epa-file-passphrase-alist nil)
@@ -66,10 +74,11 @@ way."
                        (cons entry
                              epa-file-passphrase-alist)))
                (setq passphrase (epa-passphrase-callback-function context
-                                                                  key-id nil))
+                                                                  key-id
+                                                                  file))
                (setcdr entry (copy-sequence passphrase))
                passphrase))))
-    (epa-passphrase-callback-function context key-id nil)))
+    (epa-passphrase-callback-function context key-id file)))
 
 ;;;###autoload
 (defun epa-file-handler (operation &rest args)
@@ -101,6 +110,14 @@ way."
     (insert (epa-file--decode-coding-string string (or coding-system-for-read
                                                       'undecided)))))
 
+(defvar epa-file-error nil)
+(defun epa-file--find-file-not-found-function ()
+  (let ((error epa-file-error))
+    (save-window-excursion
+      (kill-buffer))
+    (signal 'file-error
+           (cons "Opening input file" (cdr error)))))
+
 (defvar last-coding-system-used)
 (defun epa-file-insert-file-contents (file &optional visit beg end replace)
   (barf-if-buffer-read-only)
@@ -131,6 +148,16 @@ way."
            (error
             (if (setq entry (assoc file epa-file-passphrase-alist))
                 (setcdr entry nil))
+            ;; Hack to prevent find-file from opening empty buffer
+            ;; when decryption failed (bug#6568).  See the place
+            ;; where `find-file-not-found-functions' are called in
+            ;; `find-file-noselect-1'.
+            (when (file-exists-p local-file)
+              (make-local-variable 'epa-file-error)
+              (setq epa-file-error error)
+              (add-hook 'find-file-not-found-functions
+                        'epa-file--find-file-not-found-function
+                        nil t))
             (signal 'file-error
                     (cons "Opening input file" (cdr error)))))
          (make-local-variable 'epa-file-encrypt-to)
@@ -139,12 +166,17 @@ way."
          (if (or beg end)
              (setq string (substring string (or beg 0) end)))
          (save-excursion
-           (save-restriction
-             (narrow-to-region (point) (point))
-             (epa-file-decode-and-insert string file visit beg end replace)
-             (setq length (- (point-max) (point-min))))
-           (if replace
-               (delete-region (point) (point-max)))
+           ;; If visiting, bind off buffer-file-name so that
+           ;; file-locking will not ask whether we should
+           ;; really edit the buffer.
+           (let ((buffer-file-name
+                  (if visit nil buffer-file-name)))
+             (save-restriction
+               (narrow-to-region (point) (point))
+               (epa-file-decode-and-insert string file visit beg end replace)
+               (setq length (- (point-max) (point-min))))
+             (if replace
+                 (delete-region (point) (point-max))))
            (if visit
                (set-visited-file-modtime))))
       (if (and local-copy
@@ -193,9 +225,10 @@ way."
                         end (point-max)))
                 (epa-file--encode-coding-string (buffer-substring start end)
                                                 coding-system))
-              (if (or epa-file-select-keys
-                      (not (local-variable-p 'epa-file-encrypt-to
-                                             (current-buffer))))
+              (if (or (eq epa-file-select-keys t)
+                      (and (null epa-file-select-keys)
+                           (not (local-variable-p 'epa-file-encrypt-to
+                                                  (current-buffer)))))
                   (epa-select-keys
                    context
                    "Select recipents for encryption.