;;; epa-file.el --- the EasyPG Assistant hooks for transparent file encryption ;; Copyright (C) 2006 Daiki Ueno ;; Author: Daiki Ueno ;; Keywords: PGP, GnuPG ;; This file is part of EasyPG. ;; This program 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. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; 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. ;;; Code: (require 'epa) (defgroup epa-file nil "The EasyPG Assistant hooks for transparent file encryption" :group 'epa) (defcustom epa-file-name-regexp "\\.gpg\\'" "Regexp which matches filenames to be encrypted with GnuPG." :type 'regexp :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)) (when (file-exists-p (expand-file-name (buffer-file-name))) (if (fboundp 'set-buffer-multibyte) (set-buffer-multibyte t)) (goto-char (point-min)) (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)) (make-local-variable 'epa-passphrase))) (defun epa-write-file () (when epa-file (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)) (provide 'epa-file) ;;; epa-file.el ends here