* [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).