Query for the signer when sending signed mail (with unknown signer)

* lisp/gnus/mml-sec.el (mml-secure-sender-sign-query): New
function (bug#40118).
(mml-secure-epg-sign): Use it to determine the signer (bug#40118).

* lisp/gnus/mml-sec.el
(mml-secure-allow-signing-with-unknown-recipient): Remove.
This commit is contained in:
Robert Pluim 2020-10-01 02:14:17 +02:00 committed by Lars Ingebrigtsen
parent aea7788b92
commit 7518596857
2 changed files with 55 additions and 13 deletions

View file

@ -938,9 +938,47 @@ If no one is selected, symmetric encryption will be performed. "
(signal (car error) (cdr error))))
cipher))
;; Should probably be removed and the interface should be different.
(defvar mml-secure-allow-signing-with-unknown-recipient nil
"Variable to bind to allow automatic recipient selection.")
(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.
@ -950,15 +988,20 @@ If no one is selected, symmetric encryption will be performed. "
(signers (mml-secure-signers context signer-names))
signature micalg)
(unless signers
(let ((maybe-msg
(if mml-secure-smime-sign-with-sender
"."
"; try setting `mml-secure-smime-sign-with-sender'.")))
;; If `mml-secure-smime-sign-with-sender' is already non-nil
;; then there's no point advising the user to examine it. If
;; there are any other variables worth examining, please
;; improve this error message by having it mention them.
(unless mml-secure-allow-signing-with-unknown-recipient
(if (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)

View file

@ -67,7 +67,6 @@ instead of gpg-agent."
(condition-case error
(let ((epg-gpg-home-directory
(expand-file-name "test/data/mml-sec" source-directory))
(mml-secure-allow-signing-with-unknown-recipient t)
(mml-smime-use 'epg)
;; Create debug output in empty epg-debug-buffer.
(epg-debug t)