return ret;
}
+static inline gboolean
+rspamd_email_address_check_and_add (const gchar *start, gsize len,
+ GPtrArray *res,
+ rspamd_mempool_t *pool,
+ GString *ns)
+{
+ struct rspamd_email_address addr;
+
+ /* The whole email is likely address */
+ rspamd_smtp_addr_parse (start, len, &addr);
+
+ if (addr.flags & RSPAMD_EMAIL_ADDR_VALID) {
+ rspamd_email_address_add (pool, res, &addr, ns);
+ }
+ else {
+ /* Try heuristic */
+ if (rspamd_email_address_parse_heuristic (start,
+ len, &addr)) {
+ rspamd_email_address_add (pool, res, &addr, ns);
+
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
GPtrArray *
rspamd_email_address_from_mime (rspamd_mempool_t *pool,
const gchar *hdr, guint len,
{
GPtrArray *res = src;
gboolean seen_at = FALSE;
- struct rspamd_email_address addr;
+
const gchar *p = hdr, *end = hdr + len, *c = hdr, *t;
GString *ns;
gint obraces, ebraces;
t --;
}
- rspamd_smtp_addr_parse (c, t - c + 1, &addr);
-
- if (addr.flags & RSPAMD_EMAIL_ADDR_VALID) {
- rspamd_email_address_add (pool, res, &addr, ns);
- }
- else {
- /* Try heuristic */
- if (seen_at &&
- rspamd_email_address_parse_heuristic (c,
- t - c + 1, &addr)) {
- rspamd_email_address_add (pool, res, &addr, ns);
- }
- else {
- rspamd_email_address_add (pool, res, NULL, ns);
- }
+ if (!rspamd_email_address_check_and_add (c, t - c + 1,
+ res, pool, ns)) {
+ rspamd_email_address_add (pool, res, NULL, ns);
}
/* Cleanup for the next use */
}
g_string_append_len (ns, c, t - c + 1);
+
+ if (seen_at) {
+ if (!rspamd_email_address_check_and_add (c, t - c + 1,
+ res, pool, ns)) {
+ rspamd_email_address_add (pool, res, NULL, ns);
+ }
+
+ g_string_set_size (ns, 0);
+ seen_at = FALSE;
+ }
}
c = p;
break;
case parse_addr:
if (*p == '>') {
- rspamd_smtp_addr_parse (c, p - c + 1, &addr);
-
- if (addr.flags & RSPAMD_EMAIL_ADDR_VALID) {
- rspamd_email_address_add (pool, res, &addr, ns);
- }
- else {
- /* Try heuristic */
- if (seen_at &&
- rspamd_email_address_parse_heuristic (c,
- p - c + 1, &addr)) {
- rspamd_email_address_add (pool, res, &addr, ns);
- }
- else {
- rspamd_email_address_add (pool, res, NULL, ns);
- }
+ if (!rspamd_email_address_check_and_add (c, p - c + 1,
+ res, pool, ns)) {
+ rspamd_email_address_add (pool, res, NULL, ns);
}
/* Cleanup for the next use */
if (obraces == ebraces) {
if (next_state == parse_name) {
- /* Include comment in name */
- if (p > c) {
- t = p - 1;
+ if (ns->len > 0) {
+ /* Include comment in name if it has been seen */
+ if (p > c) {
+ t = p - 1;
- while (t > c && g_ascii_isspace (*t)) {
- t --;
- }
+ while (t > c && g_ascii_isspace (*t)) {
+ t --;
+ }
- g_string_append_len (ns, c, t - c + 1);
+ g_string_append_len (ns, c, t - c + 1);
+ }
}
c = p;
}
+
state = next_state;
}
p ++;
p --;
}
- if (seen_at) {
- /* The whole email is likely address */
- rspamd_smtp_addr_parse (c, p - c, &addr);
-
- 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);
+ if (p > c) {
+ if (seen_at) {
+ /* The whole email is likely address */
+ if (!rspamd_email_address_check_and_add (c, p - c,
+ res, pool, ns)) {
+ if (res->len == 0) {
+ rspamd_email_address_add (pool, res, NULL, ns);
+ }
}
- else {
+ } else {
+ /* No @ seen */
+ g_string_append_len (ns, c, p - c);
+
+ if (res->len == 0) {
rspamd_email_address_add (pool, res, NULL, ns);
}
}
}
- else {
- /* No @ seen */
- g_string_append_len (ns, c, p - c);
+ else if (res->len == 0) {
rspamd_email_address_add (pool, res, NULL, ns);
}
}
break;
case parse_addr:
if (p > c) {
- rspamd_smtp_addr_parse (c, p - c, &addr);
-
- 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);
+ if (!rspamd_email_address_check_and_add (c, p - c,
+ res, pool, ns)) {
+ if (res->len == 0) {
+ rspamd_email_address_add (pool, res, NULL, ns);
}
}
}