[notmuch] [PATCH 2/2] notmuch-reply.c: Handle munged `Reply-To' headers.

2010-02-05 Thread Jed Brown
On Thu, 04 Feb 2010 12:54:20 -0800, Carl Worth  wrote:
> And I'm glad I did because that turned up a bug in the patch, (using
> == instead of != for the return value of strcasestr resulted in *all*
> messages with a Reply-To header being considered as munged).

Yikes, I've been using this thing for two months and hadn't noticed.

> Here's one cleanup I made which you might find interesting as a style
> issue (where I prefer naming a function based on what it *does* rather
> than on what it's being *used* for):

Yup, I do the same, but must have been too lazy to think of a decent name.

Jed


Re: [notmuch] [PATCH 2/2] notmuch-reply.c: Handle munged `Reply-To' headers.

2010-02-05 Thread Jed Brown
On Thu, 04 Feb 2010 12:54:20 -0800, Carl Worth cwo...@cworth.org wrote:
 And I'm glad I did because that turned up a bug in the patch, (using
 == instead of != for the return value of strcasestr resulted in *all*
 messages with a Reply-To header being considered as munged).

Yikes, I've been using this thing for two months and hadn't noticed.

 Here's one cleanup I made which you might find interesting as a style
 issue (where I prefer naming a function based on what it *does* rather
 than on what it's being *used* for):

Yup, I do the same, but must have been too lazy to think of a decent name.

Jed
___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch


[notmuch] [PATCH 2/2] notmuch-reply.c: Handle munged `Reply-To' headers.

2010-02-04 Thread Carl Worth
On Sun, 29 Nov 2009 00:19:36 +0100, Jed Brown  wrote:
> Some mailing lists engage in the evil practice of changing the Reply-To
> header so that replies from all mailers go to the list by default, at
> the expense of not responding to the person who actually sent the
> message.  When this is detected, we reply to `From' and remove the
> duplicate response to the mailing list.  Consider a reply to the
> following message.

Thanks for the patch, Jed!

I've gone ahead and pushed this out, (along with some cleanups/fixes).

I augmented the notmuch test suite to actually test this case, (and the
related case of honoring Reply-To for a non-munged message). And I'm
glad I did because that turned up a bug in the patch, (using == instead
of != for the return value of strcasestr resulted in *all* messages with
a Reply-To header being considered as munged).

Here's one cleanup I made which you might find interesting as a style
issue (where I prefer naming a function based on what it *does* rather
than on what it's being *used* for):

commit d111c720bad53f98edba958aa605e857036a2bc8
Author: Carl Worth 
Date:   Thu Feb 4 12:39:11 2010 -0800

notmuch reply: Rename the mailing_list_munged_reply_to function

This function detects whether the address in the Reply-To header
already appears in either To or Cc. So give it a name that reflects
what it does (reply_to_header_is_redundant) rather than the old name
which described one possible use of the function, (as a simple
heuristic for detecting whether a mailing list had applied reply-to
munging).

-Carl
-- next part --
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: 



[notmuch] [PATCH 2/2] notmuch-reply.c: Handle munged `Reply-To' headers.

2009-11-29 Thread Jed Brown
Some mailing lists engage in the evil practice of changing the Reply-To
header so that replies from all mailers go to the list by default, at
the expense of not responding to the person who actually sent the
message.  When this is detected, we reply to `From' and remove the
duplicate response to the mailing list.  Consider a reply to the
following message.

  From: Some User 
  To: Sample users list 
  Reply-To: Sample users list 

Prior to this patch, `notmuch reply' produces

  To: Sample users list ,
  Sample users list 

and after the patch,

  To: Some User ,
  Sample users list 

Signed-off-by: Jed Brown 
---
 notmuch-reply.c |   47 ++-
 1 files changed, 46 insertions(+), 1 deletions(-)

diff --git a/notmuch-reply.c b/notmuch-reply.c
index b91a830..9b9e9ab 100644
--- a/notmuch-reply.c
+++ b/notmuch-reply.c
@@ -182,6 +182,39 @@ add_recipients_for_string (GMimeMessage *message,
 return add_recipients_for_address_list (message, config, type, list);
 }

+/* Some mailing lists munge the Reply-To header despite it being A Bad
+ * Thing, see http://www.unicom.com/pw/reply-to-harmful.html
+ *
+ * This function detects such munging so that reasonable headers can be
+ * generated anyway.  Returns 1 if munged, else 0.
+ *
+ * The current logic is fairly naive, Reply-To is diagnosed as munged if
+ * it contains exactly one address, and this address is also present in
+ * the To or Cc fields.
+ */
+static int
+mailing_list_munged_reply_to (notmuch_message_t *message)
+{
+const char *header, *addr;
+InternetAddressList *list;
+InternetAddress *address;
+InternetAddressMailbox *mailbox;
+
+header = notmuch_message_get_header (message, "reply-to");
+list = internet_address_list_parse_string (header);
+if (internet_address_list_length (list) != 1)
+   return 0;
+address = internet_address_list_get_address (list, 0);
+if (INTERNET_ADDRESS_IS_GROUP (address))
+   return 0;
+mailbox = INTERNET_ADDRESS_MAILBOX (address);
+addr = internet_address_mailbox_get_addr (mailbox);
+/* Note that strcasestr() is a GNU extension, strstr() might be sufficient 
*/
+if (strcasestr (notmuch_message_get_header (message, "to"), addr) == 0 ||
+   strcasestr (notmuch_message_get_header (message, "cc"), addr) == 0)
+   return 1;
+return 0; }
+
 /* Augments the recipients of reply from the headers of message.
  *
  * If any of the user's addresses were found in these headers, the first
@@ -192,7 +225,7 @@ add_recipients_from_message (GMimeMessage *reply,
 notmuch_config_t *config,
 notmuch_message_t *message)
 {
-static const struct {
+struct {
const char *header;
const char *fallback;
GMimeRecipientType recipient_type;
@@ -205,6 +238,18 @@ add_recipients_from_message (GMimeMessage *reply,
 const char *from_addr = NULL;
 unsigned int i;

+/* When we have detected Reply-To munging, we ignore the Reply-To
+ * field (because it appears in the To or Cc headers) and use the
+ * From header so that person will get pinged and will actually
+ * receive the response if not subscribed to the list.  Note that
+ * under no circumstances does this fail to reply to the address in
+ * the Reply-To header.
+ */
+if (mailing_list_munged_reply_to (message)) {
+   reply_to_map[0].header = "from";
+   reply_to_map[0].fallback = NULL;
+}
+
 for (i = 0; i < ARRAY_SIZE (reply_to_map); i++) {
const char *addr, *recipients;

-- 
1.6.5.3