mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-22 02:48:08 +01:00
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:
parent
fec5622add
commit
569ecf8c16
1 changed files with 9 additions and 14 deletions
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue