Fix code extracting the MTA from Received: headers

The previous code made too many assumptions about the (sadly not
standardized) format of the Received headers. This version should
be more robust to deal with different variations.

Signed-off-by: Dirk Hohndel <hohndel@infradead.org>
This commit is contained in:
Dirk Hohndel 2010-04-07 13:38:29 -07:00 committed by Carl Worth
parent fec5622add
commit 569ecf8c16

View file

@ -296,28 +296,23 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message
received = notmuch_message_get_header (message, "received"); received = notmuch_message_get_header (message, "received");
by = strstr (received, " by "); by = strstr (received, " by ");
if (by && *(by+4)) { if (by && *(by+4)) {
/* we know that there are 4 characters after by - either the 4th one /* sadly, the format of Received: headers is a bit inconsistent,
* is '\0' (broken header) or it is the first letter of the hostname * depending on the MTA used. So we try to extract just the MTA
* that last received this email - which we'll use to guess the right * here by removing leading whitespace and assuming that the MTA
* from email address * name ends at the next whitespace
* we test for *(by+4) to be non-'\0' to make sure there's something
* there at all - and then assume that the first whitespace delimited
* token that follows is the last receiving server
*/ */
mta = strdup (by+4); mta = strdup (by+4);
if (mta == NULL) if (mta == NULL)
return NULL; return NULL;
token = strtok(mta," \t");
/* After the MTA comes its IP address (or HELO response) in parenthesis. if (token == NULL)
* so let's terminate the string there
*/
if ((ptr = strchr (mta, '(')) == NULL) {
free (mta);
return NULL; return NULL;
}
*ptr = '\0';
/* Now extract the last two components of the MTA host name /* Now extract the last two components of the MTA host name
* as domain and tld * as domain and tld
*/ */
token = mta;
while ((ptr = strsep (&token, delim)) != NULL) { while ((ptr = strsep (&token, delim)) != NULL) {
if (*ptr == '\0') if (*ptr == '\0')
continue; continue;