]> granicus.if.org Git - mutt/commitdiff
Add $abort_noattach and $abort_noattach_regexp options.
authorKevin McCarthy <kevin@8t8.us>
Sun, 11 Mar 2018 19:48:46 +0000 (12:48 -0700)
committerKevin McCarthy <kevin@8t8.us>
Sun, 11 Mar 2018 19:48:46 +0000 (12:48 -0700)
$abort_noattach_regexp is matched against the body of a message.  If
so, the $abort_noattach quadoption is used to prompt whether to abort
sending.

Thanks to Antonio Radici for bringing the original version of the
patch to our attention, which he pulled from
https://github.com/tlvince/pkgbuild/blob/master/mutt-kiss/mutt-attach.patch

This version was rewritten to use a regexp, to fix a few issues, and
to better fit in with Mutt styles and conventions.

init.h
mutt.h
mutt_regex.h
send.c

diff --git a/init.h b/init.h
index 1f38d4ab234244fe3b5a2f0eda8f796f62629021..bdd225430cd73f3ce0f30ee1a02dae60919dea94 100644 (file)
--- a/init.h
+++ b/init.h
@@ -88,6 +88,25 @@ struct option_t
 
 struct option_t MuttVars[] = {
   /*++*/
+  { "abort_noattach", DT_QUAD, R_NONE, OPT_ABORTNOATTACH, MUTT_NO },
+  /*
+  ** .pp
+  ** When the body of the message matches $$abort_noattach_regexp and
+  ** there are no attachments, this quadoption controls whether to
+  ** abort sending the message.
+  */
+  { "abort_noattach_regexp",  DT_RX,  R_NONE, UL &AbortNoattachRegexp, UL "attach" },
+  /*
+  ** .pp
+  ** Specifies a regular expression to match against the body of the
+  ** message, to determine if an attachment was mentioned but
+  ** mistakenly forgotten.  If it matches, $$abort_noattach will be
+  ** consulted to determine if message sending will be aborted.
+  ** .pp
+  ** Like other regular expressions in Mutt, the search is case
+  ** sensitive if the pattern contains at least one upper case letter,
+  ** and case insensitive otherwise.
+  */
   { "abort_nosubject", DT_QUAD, R_NONE, OPT_SUBJECT, MUTT_ASKYES },
   /*
   ** .pp
diff --git a/mutt.h b/mutt.h
index e619353ebf67b83eece013b062aaa842c87f0c25..4fe7ce49b4c7645faf60c2f8198560cb2a53c3b4 100644 (file)
--- a/mutt.h
+++ b/mutt.h
@@ -284,6 +284,7 @@ enum
 enum
 {
   OPT_ABORT,
+  OPT_ABORTNOATTACH,
   OPT_BOUNCE,
   OPT_COPY,
   OPT_DELETE,
index 1cc4a3e2e9772723444d67d492a7ccf6c31504a4..afdbd41e156a7ac86eed7f64924a9ac35c4548a8 100644 (file)
@@ -46,6 +46,7 @@ typedef struct
   int not;             /* do not match */
 } REGEXP;
 
+WHERE REGEXP AbortNoattachRegexp;
 WHERE REGEXP Mask;
 WHERE REGEXP QuoteRegexp;
 WHERE REGEXP ReplyRegexp;
diff --git a/send.c b/send.c
index 7554217e1bd86910e003e6198163bb2afe85de6d..6f7f9e6f3173a28a788f03530f17a89a68f92afc 100644 (file)
--- a/send.c
+++ b/send.c
@@ -1133,6 +1133,31 @@ static int has_recips (ADDRESS *a)
   return c;
 }
 
+static int has_attach_keyword (char *filename)
+{
+  int match = 0;
+  char buffer[LONG_STRING];
+  FILE *fp;
+
+  if ((fp = safe_fopen (filename, "r")) == NULL)
+  {
+    mutt_perror (filename);
+    return 0;
+  }
+
+  while (fgets (buffer, sizeof(buffer), fp) != NULL)
+  {
+    if (regexec (AbortNoattachRegexp.rx, buffer, 0, NULL, 0) == 0)
+    {
+      match = 1;
+      break;
+    }
+  }
+  safe_fclose (&fp);
+
+  return match;
+}
+
 /*
  * Returns 0 if the message was successfully sent
  *        -1 if the message was aborted or an error occurred
@@ -1715,6 +1740,24 @@ main_loop:
     goto main_loop;
   }
 
+  /* Scan for a mention of an attachment in the message body and
+   * prompt if there is none. */
+  if (!(flags & SENDBATCH) &&
+      (quadoption (OPT_ABORTNOATTACH) != MUTT_NO) &&
+      AbortNoattachRegexp.pattern &&
+      !msg->content->next &&
+      (msg->content->type == TYPETEXT) &&
+      !ascii_strcasecmp (msg->content->subtype, "plain") &&
+      has_attach_keyword (msg->content->filename))
+  {
+    if (query_quadoption (OPT_ABORTNOATTACH, _("No attachments, abort sending?")) != MUTT_NO)
+    {
+      if (quadoption (OPT_ABORTNOATTACH) == MUTT_YES)
+        mutt_error _("Attachment referenced in message is missing");
+      goto main_loop;
+    }
+  }
+
   if (msg->content->next)
     msg->content = mutt_make_multipart (msg->content);