2017-05-10 17:30:16 +02:00
|
|
|
|
;;; enchive-mode.el --- automatic encrypt/decrypt -*- lexical-binding: t; -*-
|
|
|
|
|
|
|
|
|
|
;; This is free and unencumbered software released into the public domain.
|
|
|
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
|
2017-12-24 03:46:51 +01:00
|
|
|
|
;; Load this file, then M-x `enchive-mode' (global minor mode) to
|
|
|
|
|
;; enable automatic encryption and decryption of Enchive files.
|
2017-05-10 17:30:16 +02:00
|
|
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
|
|
|
|
|
(defgroup enchive ()
|
|
|
|
|
"Interface to Enchive subprocess."
|
|
|
|
|
:group 'data)
|
|
|
|
|
|
|
|
|
|
(defcustom enchive-program-name "enchive"
|
|
|
|
|
"Path to the locally installed enchive binary.")
|
|
|
|
|
|
2018-05-19 13:00:59 +02:00
|
|
|
|
(defvar enchive-handler-entry (cons "\\.enchive\\'" #'enchive-file-handler)
|
2017-05-10 17:30:16 +02:00
|
|
|
|
"Entry for `enchive-mode' in `file-name-handler-alist'.")
|
|
|
|
|
|
2018-05-19 13:00:59 +02:00
|
|
|
|
(defvar enchive-auto-mode-entry (list "\\.enchive\\'" nil 'enchive)
|
|
|
|
|
"Entry for `enchive-mode' in `auto-mode-alist'.")
|
|
|
|
|
|
2017-05-10 17:30:16 +02:00
|
|
|
|
(defun enchive-file-handler (operation &rest args)
|
|
|
|
|
"Handler for `file-name-handler-alist' for automatic encrypt/decrypt."
|
2018-05-19 13:46:34 +02:00
|
|
|
|
(cond ((eq operation 'insert-file-contents)
|
|
|
|
|
(let ((file (car args)))
|
|
|
|
|
(unless (= 0 (call-process enchive-program-name file '(t nil) nil
|
|
|
|
|
"--pinentry" "--agent" "extract"))
|
|
|
|
|
(error "Enchive subprocess failed"))
|
|
|
|
|
(setf buffer-file-name file)
|
|
|
|
|
(list file (buffer-size))))
|
|
|
|
|
((eq operation 'write-region)
|
|
|
|
|
(call-process-region (nth 0 args) (nth 1 args)
|
|
|
|
|
enchive-program-name nil nil nil
|
|
|
|
|
"archive" "/dev/stdin" (nth 2 args)))
|
|
|
|
|
;; Handle any operation we don’t know about.
|
|
|
|
|
(t (let ((inhibit-file-name-handlers
|
|
|
|
|
(cons 'enchive-file-handler
|
|
|
|
|
(and (eq inhibit-file-name-operation operation)
|
|
|
|
|
inhibit-file-name-handlers)))
|
|
|
|
|
(inhibit-file-name-operation operation))
|
|
|
|
|
(apply operation args)))))
|
2017-05-10 17:30:16 +02:00
|
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
|
(define-minor-mode enchive-mode
|
|
|
|
|
"Global minor mode to automatically encrypt/decrypt enchive files."
|
|
|
|
|
:global t
|
|
|
|
|
(setf file-name-handler-alist
|
|
|
|
|
(delq enchive-handler-entry file-name-handler-alist))
|
2018-05-19 13:00:59 +02:00
|
|
|
|
(setf auto-mode-alist
|
|
|
|
|
(delq enchive-auto-mode-entry auto-mode-alist))
|
|
|
|
|
(when enchive-mode
|
|
|
|
|
(setf file-name-handler-alist
|
|
|
|
|
(cons enchive-handler-entry file-name-handler-alist))
|
|
|
|
|
(setf auto-mode-alist
|
|
|
|
|
(cons enchive-auto-mode-entry auto-mode-alist))))
|
2017-05-10 17:30:16 +02:00
|
|
|
|
|
|
|
|
|
(provide 'enchive-mode)
|
|
|
|
|
|
|
|
|
|
;;; enchive-mode.el ends here
|