From f91aee963066d3f5a85c8e7bab8fc4849f9eef74 Mon Sep 17 00:00:00 2001 From: Michael Elkins Date: Sat, 11 Sep 2010 07:34:26 -0700 Subject: [PATCH] Allow setting message security in send2-hook This patch delays checking the message security options until after the user has an initial chance to edit the message. This allows the security options to be set in a send2-hook when using $edit_headers. Without this patch, the user has no way of automatically setting security based on recipients since the to/cc prompts are bypassed. The other change in behavior is if the user happened to use a send2-hook to see if the message had security applied *prior* to editing the message, that no longer works. --- send.c | 141 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 74 insertions(+), 67 deletions(-) diff --git a/send.c b/send.c index f9384231..bc000a7b 100644 --- a/send.c +++ b/send.c @@ -1333,73 +1333,6 @@ ci_send_message (int flags, /* send mode */ if (!option (OPTSIGONTOP) && ! (flags & (SENDMAILX|SENDKEY|SENDBATCH)) && Editor && mutt_strcmp (Editor, "builtin") != 0) append_signature (tempfp); - - /* - * this wants to be done _after_ generate_body, so message-hooks - * can take effect. - */ - - if (WithCrypto && !(flags & (SENDMAILX|SENDBATCH))) - { - if (option (OPTCRYPTAUTOSIGN)) - msg->security |= SIGN; - if (option (OPTCRYPTAUTOENCRYPT)) - msg->security |= ENCRYPT; - if (option (OPTCRYPTREPLYENCRYPT) && cur && (cur->security & ENCRYPT)) - msg->security |= ENCRYPT; - if (option (OPTCRYPTREPLYSIGN) && cur && (cur->security & SIGN)) - msg->security |= SIGN; - if (option (OPTCRYPTREPLYSIGNENCRYPTED) && cur && (cur->security & ENCRYPT)) - msg->security |= SIGN; - if (WithCrypto & APPLICATION_PGP && (msg->security & (ENCRYPT | SIGN))) - { - if (option (OPTPGPAUTOINLINE)) - msg->security |= INLINE; - if (option (OPTPGPREPLYINLINE) && cur && (cur->security & INLINE)) - msg->security |= INLINE; - } - } - - if (WithCrypto && msg->security) - { - /* - * When replying / forwarding, use the original message's - * crypto system. According to the documentation, - * smime_is_default should be disregarded here. - * - * Problem: At least with forwarding, this doesn't really - * make much sense. Should we have an option to completely - * disable individual mechanisms at run-time? - */ - if (cur) - { - if ((WithCrypto & APPLICATION_PGP) && option (OPTCRYPTAUTOPGP) - && (cur->security & APPLICATION_PGP)) - msg->security |= APPLICATION_PGP; - else if ((WithCrypto & APPLICATION_SMIME) && option (OPTCRYPTAUTOSMIME) - && (cur->security & APPLICATION_SMIME)) - msg->security |= APPLICATION_SMIME; - } - - /* - * No crypto mechanism selected? Use availability + smime_is_default - * for the decision. - */ - if (!(msg->security & (APPLICATION_SMIME | APPLICATION_PGP))) - { - if ((WithCrypto & APPLICATION_SMIME) && option (OPTCRYPTAUTOSMIME) - && option (OPTSMIMEISDEFAULT)) - msg->security |= APPLICATION_SMIME; - else if ((WithCrypto & APPLICATION_PGP) && option (OPTCRYPTAUTOPGP)) - msg->security |= APPLICATION_PGP; - else if ((WithCrypto & APPLICATION_SMIME) && option (OPTCRYPTAUTOSMIME)) - msg->security |= APPLICATION_SMIME; - } - } - - /* No permissible mechanisms found. Don't sign or encrypt. */ - if (!(msg->security & (APPLICATION_SMIME|APPLICATION_PGP))) - msg->security = 0; } /* @@ -1494,6 +1427,80 @@ ci_send_message (int flags, /* send mode */ } } + /* + * Set the message security unless: + * 1) crypto support is not enabled (WithCrypto==0) + * 2) pgp: header field was present during message editing with $edit_headers (msg->security != 0) + * 3) we are resending a message + * 4) we are recalling a postponed message (don't override the user's saved settings) + * 5) we are in mailx mode + * 6) we are in batch mode + * + * This is done after allowing the user to edit the message so that security + * settings can be configured with send2-hook and $edit_headers. + */ + if (WithCrypto && (msg->security == 0) && !(flags & (SENDBATCH | SENDMAILX | SENDPOSTPONED | SENDRESEND))) + { + if (option (OPTCRYPTAUTOSIGN)) + msg->security |= SIGN; + if (option (OPTCRYPTAUTOENCRYPT)) + msg->security |= ENCRYPT; + if (option (OPTCRYPTREPLYENCRYPT) && cur && (cur->security & ENCRYPT)) + msg->security |= ENCRYPT; + if (option (OPTCRYPTREPLYSIGN) && cur && (cur->security & SIGN)) + msg->security |= SIGN; + if (option (OPTCRYPTREPLYSIGNENCRYPTED) && cur && (cur->security & ENCRYPT)) + msg->security |= SIGN; + if (WithCrypto & APPLICATION_PGP && (msg->security & (ENCRYPT | SIGN))) + { + if (option (OPTPGPAUTOINLINE)) + msg->security |= INLINE; + if (option (OPTPGPREPLYINLINE) && cur && (cur->security & INLINE)) + msg->security |= INLINE; + } + + if (msg->security) + { + /* + * When replying / forwarding, use the original message's + * crypto system. According to the documentation, + * smime_is_default should be disregarded here. + * + * Problem: At least with forwarding, this doesn't really + * make much sense. Should we have an option to completely + * disable individual mechanisms at run-time? + */ + if (cur) + { + if ((WithCrypto & APPLICATION_PGP) && option (OPTCRYPTAUTOPGP) + && (cur->security & APPLICATION_PGP)) + msg->security |= APPLICATION_PGP; + else if ((WithCrypto & APPLICATION_SMIME) && option (OPTCRYPTAUTOSMIME) + && (cur->security & APPLICATION_SMIME)) + msg->security |= APPLICATION_SMIME; + } + + /* + * No crypto mechanism selected? Use availability + smime_is_default + * for the decision. + */ + if (!(msg->security & (APPLICATION_SMIME | APPLICATION_PGP))) + { + if ((WithCrypto & APPLICATION_SMIME) && option (OPTCRYPTAUTOSMIME) + && option (OPTSMIMEISDEFAULT)) + msg->security |= APPLICATION_SMIME; + else if ((WithCrypto & APPLICATION_PGP) && option (OPTCRYPTAUTOPGP)) + msg->security |= APPLICATION_PGP; + else if ((WithCrypto & APPLICATION_SMIME) && option (OPTCRYPTAUTOSMIME)) + msg->security |= APPLICATION_SMIME; + } + } + + /* No permissible mechanisms found. Don't sign or encrypt. */ + if (!(msg->security & (APPLICATION_SMIME|APPLICATION_PGP))) + msg->security = 0; + } + /* specify a default fcc. if we are in batchmode, only save a copy of * the message if the value of $copy is yes or ask-yes */ -- 2.40.0