diff options
Diffstat (limited to 'lisp/gnus/mml-sec.el')
-rw-r--r-- | lisp/gnus/mml-sec.el | 64 |
1 files changed, 62 insertions, 2 deletions
diff --git a/lisp/gnus/mml-sec.el b/lisp/gnus/mml-sec.el index 8d77916e997..74af99da7e3 100644 --- a/lisp/gnus/mml-sec.el +++ b/lisp/gnus/mml-sec.el @@ -665,8 +665,9 @@ The passphrase is read and cached." (epg-user-id-string uid)))) (equal (downcase (car (mail-header-parse-address (epg-user-id-string uid)))) - (downcase (car (mail-header-parse-address - recipient)))) + (downcase (or (car (mail-header-parse-address + recipient)) + recipient))) (not (memq (epg-user-id-validity uid) '(revoked expired)))) (throw 'break t)))))) @@ -937,6 +938,48 @@ If no one is selected, symmetric encryption will be performed. " (signal (car error) (cdr error)))) cipher)) +(defun mml-secure-sender-sign-query (protocol sender) + "Query whether to use SENDER to sign when using PROTOCOL. +PROTOCOL will be `OpenPGP' or `CMS' (smime). +This can also save the resulting value of +`mml-secure-smime-sign-with-sender' or +`mml-secure-openpgp-sign-with-sender' via Customize. +Returns non-nil if the user has chosen to use SENDER." + (let ((buffer (get-buffer-create "*MML sender signing options*")) + (options '((?a "always" "Sign using this sender now and sign with message sender in future.") + (?s "session only" "Sign using this sender now, and sign with message sender for this session only.") + (?n "no" "Do not sign this message (and error out)"))) + answer done val) + (save-window-excursion + (pop-to-buffer buffer) + (erase-buffer) + (insert (format "No %s signing key was found for this message.\nThe sender of this message is \"%s\".\nWould you like to attempt looking up a signing key based on it?" + (if (eq protocol 'OpenPGP) + "openpgp" "smime") + sender)) + (while (not done) + (setq answer (read-multiple-choice "Sign this message using the sender?" options)) + (cl-case (car answer) + (?a + (if (eq protocol 'OpenPGP) + (progn + (setq mml-secure-openpgp-sign-with-sender t) + (customize-save-variable + 'mml-secure-openpgp-sign-with-sender t)) + (setq mml-secure-smime-sign-with-sender t) + (customize-save-variable 'mml-secure-smime-sign-with-sender t)) + (setq done t + val t)) + (?s + (if (eq protocol 'OpenPGP) + (setq mml-secure-openpgp-sign-with-sender t) + (setq mml-secure-smime-sign-with-sender t)) + (setq done t + val t)) + (?n + (setq done t))))) + val)) + (defun mml-secure-epg-sign (protocol mode) ;; Based on code appearing inside mml2015-epg-sign. (let* ((context (epg-make-context protocol)) @@ -944,6 +987,23 @@ If no one is selected, symmetric encryption will be performed. " (signer-names (mml-secure-signer-names protocol sender)) (signers (mml-secure-signers context signer-names)) signature micalg) + (unless signers + (if (and (not noninteractive) + (mml-secure-sender-sign-query protocol sender)) + (setq signer-names (mml-secure-signer-names protocol sender) + signers (mml-secure-signers context signer-names))) + (unless signers + (let ((maybe-msg + (if (or mml-secure-smime-sign-with-sender + mml-secure-openpgp-sign-with-sender) + "." + "; try setting `mml-secure-smime-sign-with-sender' or 'mml-secure-openpgp-sign-with-sender'."))) + ;; If `mml-secure-smime-sign-with-sender' or + ;; `mml-secure-openpgp-sign-with-sender' are already non-nil + ;; then there's no point advising the user to examine them. + ;; If there are any other variables worth examining, please + ;; improve this error message by having it mention them. + (error "Couldn't find any signer names%s" maybe-msg)))) (when (eq 'OpenPGP protocol) (setf (epg-context-armor context) t) (setf (epg-context-textmode context) t) |