]> code.delx.au - gnu-emacs/blobdiff - lisp/epa-file.el
(dired-pop-to-buffer): Try to make this behave the
[gnu-emacs] / lisp / epa-file.el
index 558048403ce8b3b0a77533bee57c95996d5361c1..fc753df312c71c9cc9a389a7dfe6ee9b67f919d4 100644 (file)
@@ -1,15 +1,15 @@
 ;;; epa-file.el --- the EasyPG Assistant, transparent file encryption
-;; Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 
 ;; Author: Daiki Ueno <ueno@unixuser.org>
 ;; Keywords: PGP, GnuPG
 
 ;; 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 3, 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
 ;; 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 <http://www.gnu.org/licenses/>.
 
 ;;; Code:
 
 (require 'epa)
-
-(defgroup epa-file nil
-  "The EasyPG Assistant hooks for transparent file encryption"
-  :version "23.1"
-  :group 'epa)
-
-(defun epa-file--file-name-regexp-set (variable value)
-  (set-default variable value)
-  (if (fboundp 'epa-file-name-regexp-update)
-      (epa-file-name-regexp-update)))
-
-(defcustom epa-file-name-regexp "\\.gpg\\(~\\|\\.~[0-9]+~\\)?\\'"
-  "Regexp which matches filenames to be encrypted with GnuPG.
-
-If you set this outside Custom while epa-file is already enabled, you
-have to call `epa-file-name-regexp-update' after setting it to
-properly update file-name-handler-alist.  Setting this through Custom
-does that automatically."
-  :type 'regexp
-  :group 'epa-file
-  :set 'epa-file--file-name-regexp-set)
+(require 'epa-hook)
 
 (defcustom epa-file-cache-passphrase-for-symmetric-encryption nil
   "If non-nil, cache passphrase for symmetric encryption."
   :type 'boolean
   :group 'epa-file)
 
-(defcustom epa-file-inhibit-auto-save t
-  "If non-nil, disable auto-saving when opening an encrypted file."
-  :type 'boolean
-  :group 'epa-file)
-
 (defcustom epa-file-select-keys nil
   "If non-nil, always asks user to select recipients."
   :type 'boolean
   :group 'epa-file)
 
-(defvar epa-file-encrypt-to nil
-  "*Recipient(s) used for encrypting files.
-May either be a string or a list of strings.")
-
-;;;###autoload
-(put 'epa-file-encrypt-to 'safe-local-variable
-     (lambda (val)
-       (or (stringp val)
-          (and (listp val)
-               (catch 'safe
-                 (mapc (lambda (elt)
-                         (unless (stringp elt)
-                           (throw 'safe nil)))
-                       val)
-                 t)))))
-
-;;;###autoload
-(put 'epa-file-encrypt-to 'permanent-local t)
-
-(defvar epa-file-handler
-  (cons epa-file-name-regexp 'epa-file-handler))
-
-(defvar epa-file-auto-mode-alist-entry
-  (list epa-file-name-regexp nil 'epa-file))
-
 (defvar epa-file-passphrase-alist nil)
 
 (eval-and-compile
@@ -98,11 +46,6 @@ May either be a string or a list of strings.")
       (defalias 'epa-file--decode-coding-string 'decode-coding-string)
     (defalias 'epa-file--decode-coding-string 'identity)))
 
-(defun epa-file-name-regexp-update ()
-  (interactive)
-  (unless (equal (car epa-file-handler) epa-file-name-regexp)
-    (setcar epa-file-handler epa-file-name-regexp)))
-
 (defun epa-file-passphrase-callback-function (context key-id file)
   (if (and epa-file-cache-passphrase-for-symmetric-encryption
           (eq key-id 'SYM))
@@ -123,12 +66,13 @@ May either be a string or a list of strings.")
                passphrase))))
     (epa-passphrase-callback-function context key-id nil)))
 
+;;;###autoload
 (defun epa-file-handler (operation &rest args)
   (save-match-data
     (let ((op (get operation 'epa-file)))
       (if op
-         (apply op args)
-       (epa-file-run-real-handler operation args)))))
+         (apply op args)
+       (epa-file-run-real-handler operation args)))))
 
 (defun epa-file-run-real-handler (operation args)
   (let ((inhibit-file-name-handlers
@@ -142,14 +86,13 @@ May either be a string or a list of strings.")
   (if (fboundp 'decode-coding-inserted-region)
       (save-restriction
        (narrow-to-region (point) (point))
-       (let ((multibyte enable-multibyte-characters))
-         (set-buffer-multibyte nil)
-         (insert string)
-         (set-buffer-multibyte multibyte)
+       (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))
-          visit beg end replace)))
+        visit beg end replace))
     (insert (epa-file--decode-coding-string string (or coding-system-for-read
                                                       'undecided)))))
 
@@ -160,7 +103,7 @@ May either be a string or a list of strings.")
       (error "Attempt to visit less than an entire file"))
   (setq file (expand-file-name file))
   (let* ((local-copy
-         (condition-case inl
+         (condition-case nil
              (epa-file-run-real-handler #'file-local-copy (list file))
            (error)))
         (local-file (or local-copy file))
@@ -196,7 +139,9 @@ May either be a string or a list of strings.")
              (epa-file-decode-and-insert string file visit beg end replace)
              (setq length (- (point-max) (point-min))))
            (if replace
-               (delete-region (point) (point-max)))))
+               (delete-region (point) (point-max)))
+           (if visit
+               (set-visited-file-modtime))))
       (if (and local-copy
               (file-exists-p local-copy))
          (delete-file local-copy)))
@@ -238,6 +183,9 @@ May either be a string or a list of strings.")
               context
               (if (stringp start)
                   (epa-file--encode-coding-string start coding-system)
+                (unless start
+                  (setq start (point-min)
+                        end (point-max)))
                 (epa-file--encode-coding-string (buffer-substring start end)
                                                 coding-system))
               (if (or epa-file-select-keys
@@ -273,13 +221,6 @@ If no one is selected, symmetric encryption will be performed.  "
        (message "Wrote %s" buffer-file-name))))
 (put 'write-region 'epa-file 'epa-file-write-region)
 
-(defun epa-file-find-file-hook ()
-  (if (and buffer-file-name
-          (string-match epa-file-name-regexp buffer-file-name)
-          epa-file-inhibit-auto-save)
-      (auto-save-mode 0))
-  (set-buffer-modified-p nil))
-
 (defun epa-file-select-keys ()
   "Select recipients for encryption."
   (interactive)
@@ -300,7 +241,7 @@ If no one is selected, symmetric encryption will be performed.  "))))
       (message "`epa-file' already enabled")
     (setq file-name-handler-alist
          (cons epa-file-handler file-name-handler-alist))
-    (add-hook 'find-file-hooks 'epa-file-find-file-hook)
+    (add-hook 'find-file-hook 'epa-file-find-file-hook)
     (setq auto-mode-alist (cons epa-file-auto-mode-alist-entry auto-mode-alist))
     (message "`epa-file' enabled")))
 
@@ -311,30 +252,12 @@ If no one is selected, symmetric encryption will be performed.  "))))
       (progn
        (setq file-name-handler-alist
              (delq epa-file-handler file-name-handler-alist))
-       (remove-hook 'find-file-hooks 'epa-file-find-file-hook)
+       (remove-hook 'find-file-hook 'epa-file-find-file-hook)
        (setq auto-mode-alist (delq epa-file-auto-mode-alist-entry
                                    auto-mode-alist))
        (message "`epa-file' disabled"))
     (message "`epa-file' already disabled")))
 
-;;;###autoload
-(define-minor-mode epa-file-mode
-  "Toggle automatic file encryption and decryption.
-With prefix argument ARG, turn auto encryption on if positive, else off.
-Return the new status of auto encryption (non-nil means on)."
-  :global t :init-value nil :group 'epa-file :version "23.1"
-  (setq file-name-handler-alist
-       (delq epa-file-handler file-name-handler-alist))
-  (remove-hook 'find-file-hooks 'epa-file-find-file-hook)
-  (setq auto-mode-alist (delq epa-file-auto-mode-alist-entry
-                             auto-mode-alist))
-  (when epa-file-mode
-    (setq file-name-handler-alist
-         (cons epa-file-handler file-name-handler-alist))
-    (add-hook 'find-file-hooks 'epa-file-find-file-hook)
-    (setq auto-mode-alist (cons epa-file-auto-mode-alist-entry
-                               auto-mode-alist))))
-
 (provide 'epa-file)
 
 ;; arch-tag: 5715152f-0eb1-4dbc-9008-07098775314d