"If non-nil, epa commands treat input files as text."
:type 'boolean
:group 'epa)
-
+
+(defcustom epa-popup-info-window nil
+ "If non-nil, status information from epa commands is displayed on
+the separate window."
+ :type 'boolean
+ :group 'epa)
+
+(defcustom epa-info-window-height 5
+ "Number of lines used to display status information."
+ :type 'integer
+ :group 'epa)
+
(defgroup epa-faces nil
"Faces for epa-mode."
:group 'epa)
(defvar epa-key-buffer-alist nil)
(defvar epa-key nil)
(defvar epa-list-keys-arguments nil)
+(defvar epa-info-buffer nil)
(defvar epa-keys-mode-map
(let ((keymap (make-sparse-keymap)))
(define-key keymap "q" 'epa-exit-buffer)
keymap))
+(defvar epa-key-mode-map
+ (let ((keymap (make-sparse-keymap)))
+ (define-key keymap "q" 'bury-buffer)
+ keymap))
+
+(defvar epa-info-mode-map
+ (let ((keymap (make-sparse-keymap)))
+ (define-key keymap "q" 'delete-window)
+ keymap))
+
(defvar epa-exit-buffer-function #'bury-buffer)
(define-widget 'epa-key 'push-button
(make-local-variable 'epa-exit-buffer-function)
(run-hooks 'epa-keys-mode-hook))
-(defvar epa-key-mode-map
- (let ((keymap (make-sparse-keymap)))
- (define-key keymap "q" 'bury-buffer)
- keymap))
-
(defun epa-key-mode ()
"Major mode for `epa-show-key'."
(kill-all-local-variables)
(or (next-single-property-change point 'epa-list-keys)
(point-max)))
(goto-char point))
- (epa-list-keys-1 context name mode)
+ (epa-insert-keys context name mode)
(epa-keys-mode))
(make-local-variable 'epa-list-keys-arguments)
(setq epa-list-keys-arguments (list name mode protocol))
(goto-char (point-min))
(pop-to-buffer (current-buffer)))
-(defun epa-list-keys-1 (context name mode)
- (save-restriction
- (narrow-to-region (point) (point))
- (let ((inhibit-read-only t)
- buffer-read-only
- (keys (epg-list-keys context name mode))
- point)
- (while keys
- (setq point (point))
- (insert " ")
- (put-text-property point (point) 'epa-key (car keys))
- (widget-create 'epa-key :value (car keys))
- (insert "\n")
- (setq keys (cdr keys))))
- (put-text-property (point-min) (point-max) 'epa-list-keys t)))
+(defun epa-insert-keys (context name mode)
+ (save-excursion
+ (save-restriction
+ (narrow-to-region (point) (point))
+ (let ((keys (epg-list-keys context name mode))
+ point)
+ (while keys
+ (setq point (point))
+ (insert " ")
+ (add-text-properties point (point)
+ (list 'epa-key (car keys)
+ 'front-sticky nil
+ 'rear-nonsticky t
+ 'start-open t
+ 'end-open t))
+ (widget-create 'epa-key :value (car keys))
+ (insert "\n")
+ (setq keys (cdr keys))))
+ (add-text-properties (point-min) (point-max)
+ (list 'epa-list-keys t
+ 'front-sticky nil
+ 'rear-nonsticky t
+ 'start-open t
+ 'end-open t)))))
(defun epa-marked-keys ()
(or (save-excursion
(if names
(while names
(setq point (point))
- (epa-list-keys-1 context (car names) secret)
+ (epa-insert-keys context (car names) secret)
(goto-char point)
(epa-mark)
(goto-char (point-max))
(setq names (cdr names)))
- (epa-list-keys-1 context nil secret))
+ (if secret
+ (progn
+ (setq point (point))
+ (epa-insert-keys context nil secret)
+ (goto-char point)
+ (epa-mark))
+ (epa-insert-keys context nil nil)))
(epa-keys-mode)
(setq epa-exit-buffer-function #'abort-recursive-edit)
(goto-char (point-min))
(cdr (assq (epg-sub-key-algorithm (car pointer))
epg-pubkey-algorithm-alist))
"\n\tCreated: "
- (epg-sub-key-creation-time (car pointer))
+ (format-time-string "%Y-%m-%d"
+ (epg-sub-key-creation-time (car pointer)))
(if (epg-sub-key-expiration-time (car pointer))
- (format "\n\tExpires: %s" (epg-sub-key-expiration-time
- (car pointer)))
+ (format "\n\tExpires: %s"
+ (format-time-string "%Y-%m-%d"
+ (epg-sub-key-expiration-time
+ (car pointer))))
"")
"\n\tCapabilities: "
(mapconcat #'symbol-name
(interactive)
(funcall epa-exit-buffer-function))
+(defun epa-display-verify-result (verify-result)
+ (if epa-popup-info-window
+ (progn
+ (unless epa-info-buffer
+ (setq epa-info-buffer (generate-new-buffer "*Info*")))
+ (save-excursion
+ (set-buffer epa-info-buffer)
+ (let ((inhibit-read-only t)
+ buffer-read-only)
+ (erase-buffer)
+ (insert (epg-verify-result-to-string verify-result)))
+ (epa-info-mode))
+ (pop-to-buffer epa-info-buffer)
+ (if (> (window-height) epa-info-window-height)
+ (shrink-window (- (window-height) epa-info-window-height)))
+ (goto-char (point-min)))
+ (message "%s" (epg-verify-result-to-string verify-result))))
+
+(defun epa-info-mode ()
+ "Major mode for `epa-info-buffer'."
+ (kill-all-local-variables)
+ (buffer-disable-undo)
+ (setq major-mode 'epa-info-mode
+ mode-name "Info"
+ truncate-lines t
+ buffer-read-only t)
+ (use-local-map epa-info-mode-map)
+ (run-hooks 'epa-info-mode-hook))
+
;;;###autoload
(defun epa-decrypt-file (file)
"Decrypt FILE."
(epg-decrypt-file context file plain)
(message "Decrypting %s...done" (file-name-nondirectory file))
(if (epg-context-result-for context 'verify)
- (message "%s"
- (epg-verify-result-to-string
- (epg-context-result-for context 'verify))))))
+ (epa-display-verify-result (epg-context-result-for context 'verify)))))
;;;###autoload
(defun epa-verify-file (file)
(message "Verifying %s..." (file-name-nondirectory file))
(epg-verify-file context file plain)
(message "Verifying %s...done" (file-name-nondirectory file))
- (message "%s"
- (epg-verify-result-to-string
- (epg-context-result-for context 'verify)))))
+ (if (epg-context-result-for context 'verify)
+ (epa-display-verify-result (epg-context-result-for context 'verify)))))
;;;###autoload
(defun epa-sign-file (file signers mode)
(context (epg-make-context)))
(epg-context-set-armor context epa-armor)
(epg-context-set-textmode context epa-textmode)
- (message "Signing %s..." (file-name-nondirectory file))
(epg-context-set-signers context signers)
+ (message "Signing %s..." (file-name-nondirectory file))
(epg-sign-file context file signature mode)
(message "Signing %s...done" (file-name-nondirectory file))))
"Encrypt FILE for RECIPIENTS."
(interactive
(list (expand-file-name (read-file-name "File: "))
- (epa-select-keys (epg-make-context) "Select recipents for encryption.
+ (epa-select-keys (epg-make-context) "Select recipients for encryption.
If no one is selected, symmetric encryption will be performed. ")))
(let ((cipher (concat file (if epa-armor ".asc" ".gpg")))
(context (epg-make-context)))
;;;###autoload
(defun epa-decrypt-region (start end)
- "Decrypt the current region between START and END."
+ "Decrypt the current region between START and END.
+
+Don't use this command in Lisp programs!"
(interactive "r")
(save-excursion
(let ((context (epg-make-context))
- charset plain coding-system)
+ plain)
(message "Decrypting...")
- (setq plain (epg-decrypt-string context
- (buffer-substring start end)))
+ (setq plain (epg-decrypt-string context (buffer-substring start end)))
(message "Decrypting...done")
(delete-region start end)
(goto-char start)
(insert (decode-coding-string plain coding-system-for-read))
(if (epg-context-result-for context 'verify)
- (message "%s"
- (epg-verify-result-to-string
- (epg-context-result-for context 'verify)))))))
+ (epa-display-verify-result (epg-context-result-for context 'verify))))))
;;;###autoload
(defun epa-decrypt-armor-in-region (start end)
- "Decrypt OpenPGP armors in the current region between START and END."
+ "Decrypt OpenPGP armors in the current region between START and END.
+
+Don't use this command in Lisp programs!"
(interactive "r")
(save-excursion
(save-restriction
(narrow-to-region start end)
(goto-char start)
- (let (armor-start armor-end charset plain coding-system)
+ (let (armor-start armor-end charset coding-system)
(while (re-search-forward "-----BEGIN PGP MESSAGE-----$" nil t)
(setq armor-start (match-beginning 0)
armor-end (re-search-forward "^-----END PGP MESSAGE-----$"
;;;###autoload
(defun epa-verify-region (start end)
- "Verify the current region between START and END."
+ "Verify the current region between START and END.
+
+Don't use this command in Lisp programs!"
(interactive "r")
(let ((context (epg-make-context)))
(epg-verify-string context
(encode-coding-string
(buffer-substring start end)
coding-system-for-write))
- (message "%s"
- (epg-verify-result-to-string
- (epg-context-result-for context 'verify)))))
+ (if (epg-context-result-for context 'verify)
+ (epa-display-verify-result (epg-context-result-for context 'verify)))))
;;;###autoload
(defun epa-verify-armor-in-region (start end)
- "Verify OpenPGP armors in the current region between START and END."
+ "Verify OpenPGP armors in the current region between START and END.
+
+Don't use this command in Lisp programs!"
(interactive "r")
(save-excursion
(save-restriction
;;;###autoload
(defun epa-sign-region (start end signers mode)
- "Sign the current region between START and END by SIGNERS keys selected."
+ "Sign the current region between START and END by SIGNERS keys selected.
+
+Don't use this command in Lisp programs!"
(interactive
(list (region-beginning) (region-end)
(epa-select-keys (epg-make-context) "Select keys for signing.
signature)
(epg-context-set-armor context epa-armor)
(epg-context-set-textmode context epa-textmode)
- (message "Signing...")
(epg-context-set-signers context signers)
+ (message "Signing...")
(setq signature (epg-sign-string context
(encode-coding-string
(buffer-substring start end)
;;;###autoload
(defun epa-encrypt-region (start end recipients)
- "Encrypt the current region between START and END for RECIPIENTS."
+ "Encrypt the current region between START and END for RECIPIENTS.
+
+Don't use this command in Lisp programs!"
(interactive
(list (region-beginning) (region-end)
- (epa-select-keys (epg-make-context) "Select recipents for encryption.
+ (epa-select-keys (epg-make-context) "Select recipients for encryption.
If no one is selected, symmetric encryption will be performed. ")))
(save-excursion
(let ((context (epg-make-context))
(let ((context (epg-make-context)))
(message "Deleting...")
(epg-delete-keys context keys allow-secret)
- (apply #'epa-list-keys epa-list-keys-arguments)
- (message "Deleting...done")))
+ (message "Deleting...done")
+ (apply #'epa-list-keys epa-list-keys-arguments)))
;;;###autoload
(defun epa-import-keys (file)
(let ((context (epg-make-context)))
(message "Importing %s..." (file-name-nondirectory file))
(epg-import-keys-from-file context (expand-file-name file))
- (apply #'epa-list-keys epa-list-keys-arguments)
- (message "Importing %s...done" (file-name-nondirectory file))))
+ (message "Importing %s...done" (file-name-nondirectory file))
+ (apply #'epa-list-keys epa-list-keys-arguments)))
;;;###autoload
(defun epa-export-keys (keys file)