X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=epa-file.el;h=202ccdfa0453dad9ab3335d5496c434b4339f712;hb=3108e5ea8d6bb54dd79688a9369067b54b1af4f7;hp=e2169991086689b435fc6995d20e0d878c51e0e3;hpb=d9a0c1d079435cd5041e28380e5236e9479f1a23;p=elisp%2Fepg.git diff --git a/epa-file.el b/epa-file.el index e216999..202ccdf 100644 --- a/epa-file.el +++ b/epa-file.el @@ -25,7 +25,7 @@ (require 'epa) -(defgroup 'epa-file +(defgroup epa-file nil "The EasyPG Assistant hooks for transparent file encryption" :group 'epa) @@ -35,35 +35,73 @@ :group 'epa-file) (defvar epa-file nil) +(defvar epa-passphrase nil) +(defun epa-file-passphrase-callback-function (key-id buffer) + (save-excursion + (set-buffer buffer) + (if (and (eq key-id 'SYM) + epa-file) + (or epa-passphrase + (let ((passphrase (epg-passphrase-callback-function + key-id buffer))) + (setq epa-passphrase (copy-sequence passphrase)) + passphrase)) + (epg-passphrase-callback-function key-id buffer)))) + +(defvar last-coding-system-used) (defun epa-find-file () (when (string-match epa-file-name-regexp (buffer-file-name)) - (if (= (buffer-size) 0) - (progn - (set-auto-mode) - (hack-local-variables) - (auto-save-mode nil)) + (when (file-exists-p (expand-file-name (buffer-file-name))) + (if (fboundp 'set-buffer-multibyte) + (set-buffer-multibyte t)) (goto-char (point-min)) - (insert (epg-decrypt-file (epg-make-context) - (expand-file-name (buffer-file-name)) - nil)) - (delete-region (point) (point-max))) + (let ((context (epg-make-context))) + (epg-context-set-passphrase-callback + context + (cons #'epa-file-passphrase-callback-function + (current-buffer))) + (insert (epg-decrypt-file context + (expand-file-name (buffer-file-name)) + nil))) + (delete-region (point) (point-max)) + (decode-coding-region (point-min) (point-max) 'undecided) + (if (boundp 'last-coding-system-used) + (set-buffer-file-coding-system last-coding-system-used)) + (set-auto-mode) + (hack-local-variables) + (auto-save-mode nil) + (set-buffer-modified-p nil) + (setq buffer-undo-list nil)) (make-local-variable 'epa-file) - (setq epa-file (buffer-file-name)))) + (setq epa-file (buffer-file-name)) + (make-local-variable 'epa-passphrase))) (defun epa-write-file () (when epa-file - (write-region - (epg-encrypt-string - (epg-make-context) - (buffer-string) - (mapcar (lambda (key) - (epg-sub-key-id - (car (epg-key-sub-key-list key)))) - (epa-select-keys - "Select recipents for encryption. -If no one is selected, symmetric encryption will be performed. "))) - nil (expand-file-name (buffer-file-name))) + (let* ((coding-system (if (boundp 'last-coding-system-used) + (condition-case nil + (write-region (point-min) (point-max) "/") + (error last-coding-system-used)) + buffer-file-coding-system)) + (coding-system-for-write 'binary) + (context (epg-make-context))) + (epg-context-set-passphrase-callback + context + (cons #'epa-file-passphrase-callback-function + (current-buffer))) + (write-region + (epg-encrypt-string + context + (encode-coding-string (buffer-string) coding-system) + (mapcar (lambda (key) + (epg-sub-key-id (car (epg-key-sub-key-list key)))) + (unless epa-passphrase + (epa-select-keys + "Select recipents for encryption. +If no one is selected, symmetric encryption will be performed. ")))) + nil (expand-file-name (buffer-file-name)))) + (set-visited-file-modtime) (set-buffer-modified-p nil) t))