* [PATCH 1/2] cli: add user address matching helpers for notmuch reply @ 2012-05-11 14:33 Jani Nikula 2012-05-11 14:33 ` [PATCH 2/2] cli: clean up user address matching code in guess_from_received_header() Jani Nikula 2012-05-24 1:54 ` [PATCH 1/2] cli: add user address matching helpers for notmuch reply David Bremner 0 siblings, 2 replies; 5+ messages in thread From: Jani Nikula @ 2012-05-11 14:33 UTC (permalink / raw) To: notmuch Add a multi-purpose address_match() function for matching strings against user's configured primary and other email addresses. Add thin wrappers user_address_in_string() and string_in_user_address() for ease of use, and also convert existing address_is_users() to wrapper for the same. No functional changes. Signed-off-by: Jani Nikula <jani@nikula.org> --- notmuch-reply.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 10 deletions(-) diff --git a/notmuch-reply.c b/notmuch-reply.c index 7184a5d..0c82755 100644 --- a/notmuch-reply.c +++ b/notmuch-reply.c @@ -98,25 +98,77 @@ format_part_reply (mime_node_t *node) format_part_reply (mime_node_child (node, i)); } -/* Is the given address configured as one of the user's "personal" or - * "other" addresses. */ -static int -address_is_users (const char *address, notmuch_config_t *config) +typedef enum { + USER_ADDRESS_IN_STRING, + STRING_IN_USER_ADDRESS, + STRING_IS_USER_ADDRESS, +} address_match_t; + +/* Match given string against given address according to mode. */ +static notmuch_bool_t +match_address (const char *str, const char *address, address_match_t mode) +{ + switch (mode) { + case USER_ADDRESS_IN_STRING: + return strcasestr (str, address) != NULL; + case STRING_IN_USER_ADDRESS: + return strcasestr (address, str) != NULL; + case STRING_IS_USER_ADDRESS: + return strcasecmp (address, str) == 0; + } + + return FALSE; +} + +/* Match given string against user's configured "primary" and "other" + * addresses according to mode. */ +static const char * +address_match (const char *str, notmuch_config_t *config, address_match_t mode) { const char *primary; const char **other; size_t i, other_len; + if (!str || *str == '\0') + return NULL; + primary = notmuch_config_get_user_primary_email (config); - if (strcasecmp (primary, address) == 0) - return 1; + if (match_address (str, primary, mode)) + return primary; other = notmuch_config_get_user_other_email (config, &other_len); - for (i = 0; i < other_len; i++) - if (strcasecmp (other[i], address) == 0) - return 1; + for (i = 0; i < other_len; i++) { + if (match_address (str, other[i], mode)) + return other[i]; + } - return 0; + return NULL; +} + +/* Does the given string contain an address configured as one of the + * user's "primary" or "other" addresses. If so, return the matching + * address, NULL otherwise. */ +static const char * +user_address_in_string (const char *str, notmuch_config_t *config) +{ + return address_match (str, config, USER_ADDRESS_IN_STRING); +} + +/* Do any of the addresses configured as one of the user's "primary" + * or "other" addresses contain the given string. If so, return the + * matching address, NULL otherwise. */ +static const char * +string_in_user_address (const char *str, notmuch_config_t *config) +{ + return address_match (str, config, STRING_IN_USER_ADDRESS); +} + +/* Is the given address configured as one of the user's "primary" or + * "other" addresses. */ +static notmuch_bool_t +address_is_users (const char *address, notmuch_config_t *config) +{ + return address_match (address, config, STRING_IS_USER_ADDRESS) != NULL; } /* Scan addresses in 'list'. -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] cli: clean up user address matching code in guess_from_received_header() 2012-05-11 14:33 [PATCH 1/2] cli: add user address matching helpers for notmuch reply Jani Nikula @ 2012-05-11 14:33 ` Jani Nikula 2012-05-12 15:48 ` Austin Clements 2012-05-24 1:54 ` [PATCH 1/2] cli: add user address matching helpers for notmuch reply David Bremner 1 sibling, 1 reply; 5+ messages in thread From: Jani Nikula @ 2012-05-11 14:33 UTC (permalink / raw) To: notmuch Get rid of user address matching code duplication in guess_from_received_header() by using the new address matching helpers. No functional changes. Signed-off-by: Jani Nikula <jani@nikula.org> --- notmuch-reply.c | 64 +++++++++++++++++-------------------------------------- 1 file changed, 19 insertions(+), 45 deletions(-) diff --git a/notmuch-reply.c b/notmuch-reply.c index 0c82755..51cb6de 100644 --- a/notmuch-reply.c +++ b/notmuch-reply.c @@ -377,20 +377,15 @@ add_recipients_from_message (GMimeMessage *reply, static const char * guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message) { - const char *received,*primary,*by; - const char **other; - char *tohdr; + const char *addr, *received, *by; char *mta,*ptr,*token; char *domain=NULL; char *tld=NULL; const char *delim=". \t"; - size_t i,j,other_len; + size_t i; const char *to_headers[] = {"Envelope-to", "X-Original-To"}; - primary = notmuch_config_get_user_primary_email (config); - other = notmuch_config_get_user_other_email (config, &other_len); - /* sadly, there is no standard way to find out to which email * address a mail was delivered - what is in the headers depends * on the MTAs used along the way. So we are trying a number of @@ -405,23 +400,13 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message * 'by' part of Received headers * If none of these work, we give up and return NULL */ - for (i = 0; i < sizeof(to_headers)/sizeof(*to_headers); i++) { - tohdr = xstrdup(notmuch_message_get_header (message, to_headers[i])); - if (tohdr && *tohdr) { - /* tohdr is potentialy a list of email addresses, so here we - * check if one of the email addresses is a substring of tohdr - */ - if (strcasestr(tohdr, primary)) { - free(tohdr); - return primary; - } - for (j = 0; j < other_len; j++) - if (strcasestr (tohdr, other[j])) { - free(tohdr); - return other[j]; - } - free(tohdr); - } + for (i = 0; i < ARRAY_SIZE (to_headers); i++) { + const char *tohdr = notmuch_message_get_header (message, to_headers[i]); + + /* Note: tohdr potentially contains a list of email addresses. */ + addr = user_address_in_string (tohdr, config); + if (addr) + return addr; } /* We get the concatenated Received: headers and search from the @@ -439,19 +424,12 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message * header */ ptr = strstr (received, " for "); - if (ptr) { - /* the text following is potentialy a list of email addresses, - * so again we check if one of the email addresses is a - * substring of ptr - */ - if (strcasestr(ptr, primary)) { - return primary; - } - for (i = 0; i < other_len; i++) - if (strcasestr (ptr, other[i])) { - return other[i]; - } - } + + /* Note: ptr potentially contains a list of email addresses. */ + addr = user_address_in_string (ptr, config); + if (addr) + return addr; + /* Finally, we parse all the " by MTA ..." headers to guess the * email address that this was originally delivered to. * We extract just the MTA here by removing leading whitespace and @@ -492,15 +470,11 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message */ *(tld-1) = '.'; - if (strcasestr(primary, domain)) { - free(mta); - return primary; + addr = string_in_user_address (domain, config); + if (addr) { + free (mta); + return addr; } - for (i = 0; i < other_len; i++) - if (strcasestr (other[i],domain)) { - free(mta); - return other[i]; - } } free (mta); } -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] cli: clean up user address matching code in guess_from_received_header() 2012-05-11 14:33 ` [PATCH 2/2] cli: clean up user address matching code in guess_from_received_header() Jani Nikula @ 2012-05-12 15:48 ` Austin Clements 2012-05-12 17:23 ` Jani Nikula 0 siblings, 1 reply; 5+ messages in thread From: Austin Clements @ 2012-05-12 15:48 UTC (permalink / raw) To: Jani Nikula; +Cc: notmuch Series LGTM. This is a nice cleanup. My one comment is that it seems like we should be stricter about matching email address lists, since a naive substring match could yield strange results. That's not something that should be changed in this patch, though. Does the context of this patch conflict with id:"21a946917c5c8dd63295b7c87b7c2d1ebcb6e71e.1336746160.git.jani@nikula.org" ? It seems like both have context that's changed by the other patch. Quoth Jani Nikula on May 11 at 5:33 pm: > Get rid of user address matching code duplication in > guess_from_received_header() by using the new address matching > helpers. > > No functional changes. > > Signed-off-by: Jani Nikula <jani@nikula.org> > --- > notmuch-reply.c | 64 +++++++++++++++++-------------------------------------- > 1 file changed, 19 insertions(+), 45 deletions(-) > > diff --git a/notmuch-reply.c b/notmuch-reply.c > index 0c82755..51cb6de 100644 > --- a/notmuch-reply.c > +++ b/notmuch-reply.c > @@ -377,20 +377,15 @@ add_recipients_from_message (GMimeMessage *reply, > static const char * > guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message) > { > - const char *received,*primary,*by; > - const char **other; > - char *tohdr; > + const char *addr, *received, *by; > char *mta,*ptr,*token; > char *domain=NULL; > char *tld=NULL; > const char *delim=". \t"; > - size_t i,j,other_len; > + size_t i; > > const char *to_headers[] = {"Envelope-to", "X-Original-To"}; > > - primary = notmuch_config_get_user_primary_email (config); > - other = notmuch_config_get_user_other_email (config, &other_len); > - > /* sadly, there is no standard way to find out to which email > * address a mail was delivered - what is in the headers depends > * on the MTAs used along the way. So we are trying a number of > @@ -405,23 +400,13 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message > * 'by' part of Received headers > * If none of these work, we give up and return NULL > */ > - for (i = 0; i < sizeof(to_headers)/sizeof(*to_headers); i++) { > - tohdr = xstrdup(notmuch_message_get_header (message, to_headers[i])); > - if (tohdr && *tohdr) { > - /* tohdr is potentialy a list of email addresses, so here we > - * check if one of the email addresses is a substring of tohdr > - */ > - if (strcasestr(tohdr, primary)) { > - free(tohdr); > - return primary; > - } > - for (j = 0; j < other_len; j++) > - if (strcasestr (tohdr, other[j])) { > - free(tohdr); > - return other[j]; > - } > - free(tohdr); > - } > + for (i = 0; i < ARRAY_SIZE (to_headers); i++) { > + const char *tohdr = notmuch_message_get_header (message, to_headers[i]); > + > + /* Note: tohdr potentially contains a list of email addresses. */ > + addr = user_address_in_string (tohdr, config); > + if (addr) > + return addr; > } > > /* We get the concatenated Received: headers and search from the > @@ -439,19 +424,12 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message > * header > */ > ptr = strstr (received, " for "); > - if (ptr) { > - /* the text following is potentialy a list of email addresses, > - * so again we check if one of the email addresses is a > - * substring of ptr > - */ > - if (strcasestr(ptr, primary)) { > - return primary; > - } > - for (i = 0; i < other_len; i++) > - if (strcasestr (ptr, other[i])) { > - return other[i]; > - } > - } > + > + /* Note: ptr potentially contains a list of email addresses. */ > + addr = user_address_in_string (ptr, config); > + if (addr) > + return addr; > + > /* Finally, we parse all the " by MTA ..." headers to guess the > * email address that this was originally delivered to. > * We extract just the MTA here by removing leading whitespace and > @@ -492,15 +470,11 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message > */ > *(tld-1) = '.'; > > - if (strcasestr(primary, domain)) { > - free(mta); > - return primary; > + addr = string_in_user_address (domain, config); > + if (addr) { > + free (mta); > + return addr; > } > - for (i = 0; i < other_len; i++) > - if (strcasestr (other[i],domain)) { > - free(mta); > - return other[i]; > - } > } > free (mta); > } ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] cli: clean up user address matching code in guess_from_received_header() 2012-05-12 15:48 ` Austin Clements @ 2012-05-12 17:23 ` Jani Nikula 0 siblings, 0 replies; 5+ messages in thread From: Jani Nikula @ 2012-05-12 17:23 UTC (permalink / raw) To: Austin Clements; +Cc: notmuch On Sat, 12 May 2012, Austin Clements <amdragon@MIT.EDU> wrote: > Series LGTM. This is a nice cleanup. Thanks for the review. > My one comment is that it seems like we should be stricter about > matching email address lists, since a naive substring match could > yield strange results. That's not something that should be changed in > this patch, though. Agreed. Especially the Received: header matching should be scrutinized, as *all* the Received: headers in a message are merged into one by notmuch_message_file_get_header(). But that should be another patch, another time. > Does the context of this patch conflict with > id:"21a946917c5c8dd63295b7c87b7c2d1ebcb6e71e.1336746160.git.jani@nikula.org" > ? It seems like both have context that's changed by the other patch. Ooops, you're right. The two series do *merge* on top of each other in either order, but as patches they apply only on master. I wanted to keep the series separate. Once either gets pushed, I'll rebase the other. BR, Jani. > > Quoth Jani Nikula on May 11 at 5:33 pm: >> Get rid of user address matching code duplication in >> guess_from_received_header() by using the new address matching >> helpers. >> >> No functional changes. >> >> Signed-off-by: Jani Nikula <jani@nikula.org> >> --- >> notmuch-reply.c | 64 +++++++++++++++++-------------------------------------- >> 1 file changed, 19 insertions(+), 45 deletions(-) >> >> diff --git a/notmuch-reply.c b/notmuch-reply.c >> index 0c82755..51cb6de 100644 >> --- a/notmuch-reply.c >> +++ b/notmuch-reply.c >> @@ -377,20 +377,15 @@ add_recipients_from_message (GMimeMessage *reply, >> static const char * >> guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message) >> { >> - const char *received,*primary,*by; >> - const char **other; >> - char *tohdr; >> + const char *addr, *received, *by; >> char *mta,*ptr,*token; >> char *domain=NULL; >> char *tld=NULL; >> const char *delim=". \t"; >> - size_t i,j,other_len; >> + size_t i; >> >> const char *to_headers[] = {"Envelope-to", "X-Original-To"}; >> >> - primary = notmuch_config_get_user_primary_email (config); >> - other = notmuch_config_get_user_other_email (config, &other_len); >> - >> /* sadly, there is no standard way to find out to which email >> * address a mail was delivered - what is in the headers depends >> * on the MTAs used along the way. So we are trying a number of >> @@ -405,23 +400,13 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message >> * 'by' part of Received headers >> * If none of these work, we give up and return NULL >> */ >> - for (i = 0; i < sizeof(to_headers)/sizeof(*to_headers); i++) { >> - tohdr = xstrdup(notmuch_message_get_header (message, to_headers[i])); >> - if (tohdr && *tohdr) { >> - /* tohdr is potentialy a list of email addresses, so here we >> - * check if one of the email addresses is a substring of tohdr >> - */ >> - if (strcasestr(tohdr, primary)) { >> - free(tohdr); >> - return primary; >> - } >> - for (j = 0; j < other_len; j++) >> - if (strcasestr (tohdr, other[j])) { >> - free(tohdr); >> - return other[j]; >> - } >> - free(tohdr); >> - } >> + for (i = 0; i < ARRAY_SIZE (to_headers); i++) { >> + const char *tohdr = notmuch_message_get_header (message, to_headers[i]); >> + >> + /* Note: tohdr potentially contains a list of email addresses. */ >> + addr = user_address_in_string (tohdr, config); >> + if (addr) >> + return addr; >> } >> >> /* We get the concatenated Received: headers and search from the >> @@ -439,19 +424,12 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message >> * header >> */ >> ptr = strstr (received, " for "); >> - if (ptr) { >> - /* the text following is potentialy a list of email addresses, >> - * so again we check if one of the email addresses is a >> - * substring of ptr >> - */ >> - if (strcasestr(ptr, primary)) { >> - return primary; >> - } >> - for (i = 0; i < other_len; i++) >> - if (strcasestr (ptr, other[i])) { >> - return other[i]; >> - } >> - } >> + >> + /* Note: ptr potentially contains a list of email addresses. */ >> + addr = user_address_in_string (ptr, config); >> + if (addr) >> + return addr; >> + >> /* Finally, we parse all the " by MTA ..." headers to guess the >> * email address that this was originally delivered to. >> * We extract just the MTA here by removing leading whitespace and >> @@ -492,15 +470,11 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message >> */ >> *(tld-1) = '.'; >> >> - if (strcasestr(primary, domain)) { >> - free(mta); >> - return primary; >> + addr = string_in_user_address (domain, config); >> + if (addr) { >> + free (mta); >> + return addr; >> } >> - for (i = 0; i < other_len; i++) >> - if (strcasestr (other[i],domain)) { >> - free(mta); >> - return other[i]; >> - } >> } >> free (mta); >> } ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] cli: add user address matching helpers for notmuch reply 2012-05-11 14:33 [PATCH 1/2] cli: add user address matching helpers for notmuch reply Jani Nikula 2012-05-11 14:33 ` [PATCH 2/2] cli: clean up user address matching code in guess_from_received_header() Jani Nikula @ 2012-05-24 1:54 ` David Bremner 1 sibling, 0 replies; 5+ messages in thread From: David Bremner @ 2012-05-24 1:54 UTC (permalink / raw) To: Jani Nikula, notmuch Jani Nikula <jani@nikula.org> writes: > Add a multi-purpose address_match() function for matching strings > against user's configured primary and other email addresses. Add thin > wrappers user_address_in_string() and string_in_user_address() for > ease of use, and also convert existing address_is_users() to wrapper > for the same. pushed d P.S. I marked the other series as stale. ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-05-24 1:54 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-05-11 14:33 [PATCH 1/2] cli: add user address matching helpers for notmuch reply Jani Nikula 2012-05-11 14:33 ` [PATCH 2/2] cli: clean up user address matching code in guess_from_received_header() Jani Nikula 2012-05-12 15:48 ` Austin Clements 2012-05-12 17:23 ` Jani Nikula 2012-05-24 1:54 ` [PATCH 1/2] cli: add user address matching helpers for notmuch reply David Bremner
Code repositories for project(s) associated with this public inbox https://yhetil.org/notmuch.git/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).