X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/266a86bd7fedf743225c2497956b73ecb2245196..6b26f14f789112bb929f65a8d44caeda11418432:/lisp/epa-mail.el diff --git a/lisp/epa-mail.el b/lisp/epa-mail.el index 09b3086811..6ba29d3748 100644 --- a/lisp/epa-mail.el +++ b/lisp/epa-mail.el @@ -1,5 +1,5 @@ -;;; epa-mail.el --- the EasyPG Assistant, minor-mode for mail composer -;; Copyright (C) 2006, 2007, 2008, 2009, 2010 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 ;; Keywords: PGP, GnuPG, mail, message @@ -47,11 +47,15 @@ ;;;###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)))) @@ -116,24 +120,42 @@ Don't use this command in Lisp programs!" (interactive (save-excursion (let ((verbose current-prefix-arg) + (config (epg-configuration)) (context (epg-make-context epa-protocol)) - recipients recipient-key) + recipients-string recipients recipient-key sign) (goto-char (point-min)) (save-restriction (narrow-to-region (point) (if (search-forward mail-header-separator nil 0) (match-beginning 0) (point))) + (setq recipients-string + (mapconcat #'identity + (nconc (mail-fetch-field "to" nil nil t) + (mail-fetch-field "cc" nil nil t) + (mail-fetch-field "bcc" nil nil t)) + ",")) (setq recipients (mail-strip-quoted-names - (mapconcat #'identity - (nconc (mail-fetch-field "to" nil nil t) - (mail-fetch-field "cc" nil nil t) - (mail-fetch-field "bcc" nil nil t)) - ",")))) + (with-temp-buffer + (insert "to: " recipients-string "\n") + (expand-mail-aliases (point-min) (point-max)) + (car (mail-fetch-field "to" nil nil t)))))) (if recipients (setq recipients (delete "" - (split-string recipients "[ \t\n]+")))) + (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)) @@ -148,27 +170,33 @@ Don't use this command in Lisp programs!" 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) - (concat "<" 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 () @@ -181,7 +209,10 @@ Don't use this command in Lisp programs!" ;;;###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 @@ -189,5 +220,4 @@ Don't use this command in Lisp programs!" (provide 'epa-mail) -;; arch-tag: a6f82b3f-d177-4a11-af95-040da55927d2 ;;; epa-mail.el ends here