X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/ed7f1a6c5caaf4159125c08db5d18c5471fdd032..a9ba094b81d899218e8762a66377b2fe71274d35:/lisp/epa-mail.el diff --git a/lisp/epa-mail.el b/lisp/epa-mail.el index a3f11f7867..896fc2a954 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 -*- lexical-binding: t -*- -;; Copyright (C) 2006-2011 Free Software Foundation, Inc. +;; 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)))) @@ -105,78 +109,127 @@ If no one is selected, default secret key is used. " (if verbose (epa--read-signature-type) 'clear))))) - (epa-sign-region start end signers mode)) + (let ((inhibit-read-only t)) + (epa-sign-region start end signers mode))) + +(defun epa-mail-default-recipients () + "Return the default list of encryption recipients for a mail buffer." + (let ((config (epg-configuration)) + recipients-string real-recipients) + (save-excursion + (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-string + (mail-strip-quoted-names + (with-temp-buffer + (insert "to: " recipients-string "\n") + (expand-mail-aliases (point-min) (point-max)) + (car (mail-fetch-field "to" nil nil t)))))) + + (setq real-recipients + (split-string recipients-string "," t "[ \t\n]*")) + + ;; Process all the recipients thru the list of GnuPG groups. + ;; Expand GnuPG group names to what they stand for. + (setq real-recipients + (apply #'nconc + (mapcar + (lambda (recipient) + (or (epg-expand-group config recipient) + (list recipient))) + real-recipients))) + + ;; Process all the recipients thru the user's list + ;; of encryption aliases. + (setq real-recipients + (apply #'nconc + (mapcar + (lambda (recipient) + (let ((tem (assoc recipient epa-mail-aliases))) + (if tem (cdr tem) + (list recipient)))) + real-recipients))) + ))) ;;;###autoload -(defun epa-mail-encrypt (start end recipients sign signers) - "Encrypt the current buffer. -The buffer is expected to contain a mail message. +(defun epa-mail-encrypt (&optional recipients signers) + "Encrypt the outgoing mail message in the current buffer. +Takes the recipients from the text in the header in the buffer +and translates them through `epa-mail-aliases'. +With prefix argument, asks you to select among them interactively +and also whether and how to sign. -Don't use this command in Lisp programs!" +Called from Lisp, the optional argument RECIPIENTS is a list +of recipient addresses, t to perform symmetric encryption, +or nil meaning use the defaults. + +SIGNERS is a list of keys to sign the message with." (interactive - (save-excursion - (let ((verbose current-prefix-arg) - (context (epg-make-context epa-protocol)) - 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 - (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]*,[ \t\n]*")))) - (goto-char (point-min)) - (if (search-forward mail-header-separator nil t) - (forward-line)) - (setq epa-last-coding-system-specified - (or coding-system-for-write - (epa--select-safe-coding-system (point) (point-max)))) - (list (point) (point-max) - (if verbose - (epa-select-keys - context - "Select recipients for encryption. + (let ((verbose current-prefix-arg) + (context (epg-make-context epa-protocol))) + (list (if verbose + (or (epa-select-keys + context + "Select recipients for encryption. 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))) - (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)) + (epa-mail-default-recipients)) + t)) + (and verbose (y-or-n-p "Sign? ") + (epa-select-keys context + "Select keys for signing. "))))) + (let (start recipient-keys default-recipients) + (save-excursion + (setq recipient-keys + (cond ((eq recipients t) + nil) + (recipients recipients) + (t + (setq default-recipients + (epa-mail-default-recipients)) + ;; Convert recipients to keys. + (apply + 'nconc + (mapcar + (lambda (recipient) + (let ((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)))) + default-recipients))))) + + (goto-char (point-min)) + (if (search-forward mail-header-separator nil t) + (forward-line)) + (setq start (point)) + + (setq epa-last-coding-system-specified + (or coding-system-for-write + (epa--select-safe-coding-system (point) (point-max))))) + + ;; Don't let some read-only text stop us from encrypting. + (let ((inhibit-read-only t)) + (epa-encrypt-region start (point-max) recipient-keys signers signers)))) ;;;###autoload (defun epa-mail-import-keys () @@ -189,7 +242,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