From: Vsevolod Stakhov Date: Wed, 28 Dec 2016 15:23:01 +0000 (+0000) Subject: [Feature] Add heuristic to process broken email addresses X-Git-Tag: 1.5.0~469 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=baa008ed3bb6f0f31783478d8069e5e8fc5ae7d4;p=thirdparty%2Frspamd.git [Feature] Add heuristic to process broken email addresses --- diff --git a/src/libmime/email_addr.c b/src/libmime/email_addr.c index de620ac28e..b00ddba1ee 100644 --- a/src/libmime/email_addr.c +++ b/src/libmime/email_addr.c @@ -152,6 +152,43 @@ rspamd_email_address_add (rspamd_mempool_t *pool, g_ptr_array_add (ar, elt); } +/* + * Tries to parse an email address that doesn't conform RFC + */ +static gboolean +rspamd_email_address_parse_heuristic (const char *data, size_t len, + struct rspamd_email_address *addr) +{ + const gchar *p = data; + + memset (addr, 0, sizeof (*addr)); + + if (*p == '<' && len > 1) { + /* Angled address */ + addr->addr_len = rspamd_memcspn (p + 1, ">", len - 1); + + if (addr->addr_len > 1) { + addr->addr_len --; + } + + addr->addr = p + 1; + addr->raw = p; + addr->raw_len = len; + + return TRUE; + } + else if (len > 0) { + addr->addr = p; + addr->addr_len = len; + addr->raw = p; + addr->raw_len = len; + + return TRUE; + } + + return FALSE; +} + GPtrArray * rspamd_email_address_from_mime (rspamd_mempool_t *pool, const gchar *hdr, guint len, @@ -225,6 +262,13 @@ rspamd_email_address_from_mime (rspamd_mempool_t *pool, if (addr.flags & RSPAMD_EMAIL_ADDR_VALID) { rspamd_email_address_add (pool, res, &addr, ns); } + else { + /* Try heuristic */ + if (rspamd_email_address_parse_heuristic (c, t - c + 1, + &addr)) { + rspamd_email_address_add (pool, res, &addr, ns); + } + } /* Cleanup for the next use */ g_string_set_size (ns, 0); @@ -253,6 +297,13 @@ rspamd_email_address_from_mime (rspamd_mempool_t *pool, if (addr.flags & RSPAMD_EMAIL_ADDR_VALID) { rspamd_email_address_add (pool, res, &addr, ns); } + else { + /* Try heuristic */ + if (rspamd_email_address_parse_heuristic (c, p - c + 1, + &addr)) { + rspamd_email_address_add (pool, res, &addr, ns); + } + } /* Cleanup for the next use */ g_string_set_size (ns, 0); @@ -284,6 +335,13 @@ rspamd_email_address_from_mime (rspamd_mempool_t *pool, if (addr.flags & RSPAMD_EMAIL_ADDR_VALID) { rspamd_email_address_add (pool, res, &addr, ns); } + else { + /* Try heuristic */ + if (rspamd_email_address_parse_heuristic (c, p - c, + &addr)) { + rspamd_email_address_add (pool, res, &addr, ns); + } + } } break; case parse_quoted: