-;;; epa-mail.el --- the EasyPG Assistant, minor-mode for mail composer
-;; Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+;;; epa-mail.el --- the EasyPG Assistant, minor-mode for mail composer -*- lexical-binding: t -*-
+;; Copyright (C) 2006-2013 Free Software Foundation, Inc.
;; Author: Daiki Ueno <ueno@unixuser.org>
;; Keywords: PGP, GnuPG, mail, message
;;;###autoload
(define-minor-mode epa-mail-mode
- "A minor-mode for composing encrypted/clearsigned mails."
+ "A minor-mode for composing encrypted/clearsigned mails.
+With a prefix argument ARG, enable the mode if ARG is positive,
+and disable it otherwise. If called from Lisp, enable the mode
+if ARG is omitted or nil."
nil " epa-mail" epa-mail-mode-map)
(defun epa-mail--find-usable-key (keys usage)
- "Find a usable key from KEYS for USAGE."
+ "Find a usable key from KEYS for USAGE.
+USAGE would be `sign' or `encrypt'."
(catch 'found
(while keys
(let ((pointer (epg-key-sub-key-list (car keys))))
(interactive
(save-excursion
(let ((verbose current-prefix-arg)
+ (config (epg-configuration))
(context (epg-make-context epa-protocol))
- recipients-string recipients recipient-key)
+ recipients-string recipients recipient-key sign)
(goto-char (point-min))
(save-restriction
(narrow-to-region (point)
(setq recipients (delete ""
(split-string recipients
"[ \t\n]*,[ \t\n]*"))))
+
+ ;; Process all the recipients thru the list of GnuPG groups.
+ ;; Expand GnuPG group names to what they stand for.
+ (setq recipients
+ (apply #'nconc
+ (mapcar
+ (lambda (recipient)
+ (or (epg-expand-group config recipient)
+ (list recipient)))
+ recipients)))
+
(goto-char (point-min))
(if (search-forward mail-header-separator nil t)
(forward-line))
If no one is selected, symmetric encryption will be performed. "
recipients)
(if recipients
- (mapcar
- (lambda (recipient)
- (setq recipient-key
- (epa-mail--find-usable-key
- (epg-list-keys
- (epg-make-context epa-protocol)
- (if (string-match "@" recipient)
- (concat "<" recipient ">")
- recipient))
- 'encrypt))
- (unless (or recipient-key
- (y-or-n-p
- (format
- "No public key for %s; skip it? "
- recipient)))
- (error "No public key for %s" recipient))
- recipient-key)
- recipients)))
+ (apply
+ 'nconc
+ (mapcar
+ (lambda (recipient)
+ (setq recipient-key
+ (epa-mail--find-usable-key
+ (epg-list-keys
+ (epg-make-context epa-protocol)
+ (if (string-match "@" recipient)
+ (concat "<" recipient ">")
+ recipient))
+ 'encrypt))
+ (unless (or recipient-key
+ (y-or-n-p
+ (format
+ "No public key for %s; skip it? "
+ recipient)))
+ (error "No public key for %s" recipient))
+ (if recipient-key (list recipient-key)))
+ recipients))))
(setq sign (if verbose (y-or-n-p "Sign? ")))
(if sign
(epa-select-keys context
"Select keys for signing. "))))))
- (epa-encrypt-region start end recipients sign signers))
+ ;; Don't let some read-only text stop us from encrypting.
+ (let ((inhibit-read-only t))
+ (epa-encrypt-region start end recipients sign signers)))
;;;###autoload
(defun epa-mail-import-keys ()
;;;###autoload
(define-minor-mode epa-global-mail-mode
- "Minor mode to hook EasyPG into Mail mode."
+ "Minor mode to hook EasyPG into Mail mode.
+With a prefix argument ARG, enable the mode if ARG is positive,
+and disable it otherwise. If called from Lisp, enable the mode
+if ARG is omitted or nil."
:global t :init-value nil :group 'epa-mail :version "23.1"
(remove-hook 'mail-mode-hook 'epa-mail-mode)
(if epa-global-mail-mode