summaryrefslogtreecommitdiffstats
path: root/src/libmime
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-12-28 15:23:01 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-12-28 15:23:01 +0000
commitbaa008ed3bb6f0f31783478d8069e5e8fc5ae7d4 (patch)
treef4899086e772b1cee3a082d4cf19c44023a151a0 /src/libmime
parentf3353317a8ee89c6aaf63c73e4c09c905d265c35 (diff)
downloadrspamd-baa008ed3bb6f0f31783478d8069e5e8fc5ae7d4.tar.gz
rspamd-baa008ed3bb6f0f31783478d8069e5e8fc5ae7d4.zip
[Feature] Add heuristic to process broken email addresses
Diffstat (limited to 'src/libmime')
-rw-r--r--src/libmime/email_addr.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/libmime/email_addr.c b/src/libmime/email_addr.c
index de620ac28..b00ddba1e 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: