]> code.delx.au - gnu-emacs/blobdiff - lisp/epa-file.el
Merge from origin/emacs-24
[gnu-emacs] / lisp / epa-file.el
index 20d34f82223cb90480b2c89bb0e23cee32570ef3..2e46cf9da24d1131d72efc5d72383084f5b110a2 100644 (file)
@@ -105,9 +105,9 @@ encryption is used."
        (insert (if enable-multibyte-characters
                    (string-to-multibyte string)
                  string))
-         (decode-coding-inserted-region
-          (point-min) (point-max)
-          (substring file 0 (string-match epa-file-name-regexp file))
+       (decode-coding-inserted-region
+        (point-min) (point-max)
+        (substring file 0 (string-match epa-file-name-regexp file))
         visit beg end replace))
     (insert (epa-file--decode-coding-string string (or coding-system-for-read
                                                       'undecided)))))
@@ -144,6 +144,7 @@ encryption is used."
      context
      (cons #'epa-progress-callback-function
           (format "Decrypting %s" file)))
+    (setf (epg-context-pinentry-mode context) epa-pinentry-mode)
     (unwind-protect
        (progn
          (if replace
@@ -153,15 +154,24 @@ encryption is used."
            (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'.
+            ;; If the decryption program can't be found,
+            ;; signal that as a non-file error
+            ;; so that find-file-noselect-1 won't handle it.
+            ;; Borrowed from jka-compr.el.
+            (if (and (eq (car error) 'file-error)
+                     (equal (cadr error) "Searching for program"))
+                (error "Decryption program `%s' not found"
+                       (nth 3 error)))
             (when (file-exists-p local-file)
+              ;; 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'.
               (setq-local epa-file-error error)
               (add-hook 'find-file-not-found-functions
                         'epa-file--find-file-not-found-function
-                        nil t))
+                        nil t)
+              (epa-display-error context))
             (signal 'file-error
                     (cons "Opening input file" (cdr error)))))
           (set-buffer buf) ;In case timer/filter changed/killed it (bug#16029)!
@@ -221,7 +231,8 @@ encryption is used."
      context
      (cons #'epa-progress-callback-function
           (format "Encrypting %s" file)))
-    (epg-context-set-armor context epa-armor)
+    (setf (epg-context-armor context) epa-armor)
+    (setf (epg-context-pinentry-mode context) epa-pinentry-mode)
     (condition-case error
        (setq string
              (epg-encrypt-string
@@ -255,6 +266,7 @@ If no one is selected, symmetric encryption will be performed.  "
                 (if epa-file-encrypt-to
                     (epg-list-keys context recipients)))))
       (error
+       (epa-display-error context)
        (if (setq entry (assoc file epa-file-passphrase-alist))
           (setcdr entry nil))
        (signal 'file-error (cons "Opening output file" (cdr error)))))