]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Unescape and unquote smtp addresses
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 25 Apr 2016 09:10:16 +0000 (10:10 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 25 Apr 2016 09:10:16 +0000 (10:10 +0100)
src/libmime/email_addr.c
src/libmime/email_addr.h
src/libmime/parsers/smtp_addr_parser.c
src/ragel/smtp_addr_parser.rl
src/ragel/smtp_address.rl

index 6dfc6f0c627d18cc05ffb1016bab41c1cc4bef03..9305e4693096a4e1b711aaee66dcfa8fa53cd5da 100644 (file)
 static void
 rspamd_email_addr_dtor (struct rspamd_email_address *addr)
 {
-       if (addr->flags & RSPAMD_EMAIL_ADDR_ALLOCATED) {
+       if (addr->flags & RSPAMD_EMAIL_ADDR_ADDR_ALLOCATED) {
                g_free ((void *)addr->addr);
        }
+
+       if (addr->flags & RSPAMD_EMAIL_ADDR_USER_ALLOCATED) {
+               g_free ((void *)addr->user);
+       }
+
        g_slice_free1 (sizeof (*addr), addr);
 }
 
+static void
+rspamd_email_address_unescape (struct rspamd_email_address *addr)
+{
+       const char *h, *end;
+       char *t, *d;
+
+       if (addr->user_len == 0) {
+               return;
+       }
+
+       d = g_malloc (addr->user_len);
+       t = d;
+       h = addr->user;
+       end = h + addr->user_len;
+
+       while (h < end) {
+               if (*h != '\\') {
+                       *t++ = *h;
+               }
+               h ++;
+       }
+
+       addr->user = d;
+       addr->user_len = t - d;
+       addr->flags |= RSPAMD_EMAIL_ADDR_USER_ALLOCATED;
+}
+
 struct rspamd_email_address *
 rspamd_email_address_from_smtp (const gchar *str, guint len)
 {
@@ -47,13 +79,18 @@ rspamd_email_address_from_smtp (const gchar *str, guint len)
                memcpy (ret, &addr, sizeof (addr));
 
                if ((ret->flags & RSPAMD_EMAIL_ADDR_QUOTED) && ret->addr[0] == '"') {
+                       if (ret->flags & RSPAMD_EMAIL_ADDR_HAS_BACKSLASH) {
+                               /* We also need to unquote user */
+                               rspamd_email_address_unescape (ret);
+                       }
+
                        /* We need to unquote addr */
                        nlen = ret->domain_len + ret->user_len + 2;
                        ret->addr = g_malloc (nlen + 1);
                        ret->addr_len = rspamd_snprintf ((char *)ret->addr, nlen, "%*s@%*s",
                                        (gint)ret->user_len, ret->user,
                                        (gint)ret->domain_len, ret->domain);
-                       ret->flags |= RSPAMD_EMAIL_ADDR_ALLOCATED;
+                       ret->flags |= RSPAMD_EMAIL_ADDR_ADDR_ALLOCATED;
                }
 
                REF_INIT_RETAIN (ret, rspamd_email_addr_dtor);
index 7009c472dd4e72143a7b7ff45b6e2ca97fcd2fc6..98be33abe640049961c409dd5e942c6ae584d0c3 100644 (file)
@@ -28,7 +28,9 @@ enum rspamd_email_address_flags {
        RSPAMD_EMAIL_ADDR_QUOTED = (1 << 3),
        RSPAMD_EMAIL_ADDR_EMPTY = (1 << 4),
        RSPAMD_EMAIL_ADDR_SMTP = (1 << 5),
-       RSPAMD_EMAIL_ADDR_ALLOCATED = (1 << 6),
+       RSPAMD_EMAIL_ADDR_HAS_BACKSLASH = (1 << 6),
+       RSPAMD_EMAIL_ADDR_ADDR_ALLOCATED = (1 << 7),
+       RSPAMD_EMAIL_ADDR_USER_ALLOCATED = (1 << 8),
 };
 
 /*
index f5476054f889f0062b18159607f0b0ab87c39cc9..12cf5eecb71a44d2544ea8e977e0366dbf4815c7 100644 (file)
@@ -1,7 +1,7 @@
 
 #line 1 "src/ragel/smtp_addr_parser.rl"
 
-#line 76 "src/ragel/smtp_addr_parser.rl"
+#line 80 "src/ragel/smtp_addr_parser.rl"
 
 
 
@@ -10,26 +10,27 @@ static const char _smtp_addr_parser_trans_keys[] = {
        0, 0, 9, 126, 33, 126, 33, 126, 48, 122, 48, 122, 48, 122, 48, 122,
        46, 122, 48, 57, 46, 57, 48, 57, 46, 57, 48, 57, 48, 93, 48, 93,
        93, 93, 46, 57, 46, 46, 46, 57, 46, 46, 46, 122, 46, 122, 48, 122,
-       33, 126, 33, 126, 48, 122, 32, 126, 32, 126, 64, 64, 32, 126, 33, 126,
-       33, 126, 33, 126, 48, 122, 46, 122, 48, 122, 48, 122, 48, 122, 46, 122,
-       48, 57, 46, 57, 48, 57, 46, 57, 48, 57, 48, 93, 48, 93, 93, 93,
-       62, 62, 46, 57, 46, 46, 46, 57, 46, 46, 46, 122, 46, 122, 48, 122,
-       33, 126, 33, 126, 48, 122, 32, 126, 32, 126, 64, 64, 32, 126, 48, 122,
-       44, 122, 64, 64, 33, 126, 48, 122, 48, 122, 44, 122, 64, 64, 33, 126,
-       48, 122, 9, 122, 9, 32, 9, 32, 9, 32, 9, 32, 0
+       33, 126, 33, 126, 48, 122, 32, 126, 32, 126, 64, 64, 32, 126, 32, 126,
+       33, 126, 33, 126, 33, 126, 48, 122, 46, 122, 48, 122, 48, 122, 48, 122,
+       46, 122, 48, 57, 46, 57, 48, 57, 46, 57, 48, 57, 48, 93, 48, 93,
+       93, 93, 62, 62, 46, 57, 46, 46, 46, 57, 46, 46, 46, 122, 46, 122,
+       48, 122, 33, 126, 33, 126, 48, 122, 32, 126, 32, 126, 64, 64, 32, 126,
+       32, 126, 48, 122, 44, 122, 64, 64, 33, 126, 48, 122, 48, 122, 44, 122,
+       64, 64, 33, 126, 48, 122, 9, 122, 9, 32, 9, 32, 9, 32, 9, 32,
+       0
 };
 
 static const char _smtp_addr_parser_key_spans[] = {
        0, 118, 94, 94, 75, 75, 75, 75,
        77, 10, 12, 10, 12, 10, 46, 46,
        1, 12, 1, 12, 1, 77, 77, 75,
-       94, 94, 75, 95, 95, 1, 95, 94,
-       94, 94, 75, 77, 75, 75, 75, 77,
-       10, 12, 10, 12, 10, 46, 46, 1,
-       1, 12, 1, 12, 1, 77, 77, 75,
-       94, 94, 75, 95, 95, 1, 95, 75,
-       79, 1, 94, 75, 75, 79, 1, 94,
-       75, 114, 24, 24, 24, 24
+       94, 94, 75, 95, 95, 1, 95, 95,
+       94, 94, 94, 75, 77, 75, 75, 75,
+       77, 10, 12, 10, 12, 10, 46, 46,
+       1, 1, 12, 1, 12, 1, 77, 77,
+       75, 94, 94, 75, 95, 95, 1, 95,
+       95, 75, 79, 1, 94, 75, 75, 79,
+       1, 94, 75, 114, 24, 24, 24, 24
 };
 
 static const short _smtp_addr_parser_index_offsets[] = {
@@ -37,12 +38,12 @@ static const short _smtp_addr_parser_index_offsets[] = {
        613, 691, 702, 715, 726, 739, 750, 797,
        844, 846, 859, 861, 874, 876, 954, 1032,
        1108, 1203, 1298, 1374, 1470, 1566, 1568, 1664,
-       1759, 1854, 1949, 2025, 2103, 2179, 2255, 2331,
-       2409, 2420, 2433, 2444, 2457, 2468, 2515, 2562,
-       2564, 2566, 2579, 2581, 2594, 2596, 2674, 2752,
-       2828, 2923, 3018, 3094, 3190, 3286, 3288, 3384,
-       3460, 3540, 3542, 3637, 3713, 3789, 3869, 3871,
-       3966, 4042, 4157, 4182, 4207, 4232
+       1760, 1855, 1950, 2045, 2121, 2199, 2275, 2351,
+       2427, 2505, 2516, 2529, 2540, 2553, 2564, 2611,
+       2658, 2660, 2662, 2675, 2677, 2690, 2692, 2770,
+       2848, 2924, 3019, 3114, 3190, 3286, 3382, 3384,
+       3480, 3576, 3652, 3732, 3734, 3829, 3905, 3981,
+       4061, 4063, 4158, 4234, 4349, 4374, 4399, 4424
 };
 
 static const char _smtp_addr_parser_indicies[] = {
@@ -242,321 +243,345 @@ static const char _smtp_addr_parser_indicies[] = {
        38, 38, 38, 38, 38, 38, 38, 38,
        38, 38, 38, 38, 38, 38, 38, 38,
        38, 38, 38, 38, 38, 38, 1, 41,
-       1, 38, 38, 38, 38, 38, 38, 38,
-       38, 38, 38, 38, 38, 38, 38, 38,
-       38, 38, 38, 38, 38, 38, 38, 38,
-       38, 38, 38, 38, 38, 38, 38, 38,
-       38, 38, 38, 38, 38, 38, 38, 38,
-       38, 38, 38, 38, 38, 38, 38, 38,
-       38, 38, 38, 38, 38, 38, 38, 38,
-       38, 38, 38, 38, 38, 38, 38, 38,
-       38, 38, 38, 38, 38, 38, 38, 38,
-       38, 38, 38, 38, 38, 38, 38, 38,
-       38, 38, 38, 38, 38, 38, 38, 38,
-       38, 38, 38, 38, 38, 38, 38, 38,
-       1, 42, 43, 42, 42, 42, 42, 42,
-       1, 1, 42, 42, 1, 1, 1, 42,
+       1, 42, 42, 42, 42, 42, 42, 42,
        42, 42, 42, 42, 42, 42, 42, 42,
-       42, 42, 1, 1, 1, 42, 44, 42,
-       45, 42, 42, 42, 42, 42, 42, 42,
        42, 42, 42, 42, 42, 42, 42, 42,
        42, 42, 42, 42, 42, 42, 42, 42,
-       42, 42, 42, 1, 1, 1, 42, 42,
        42, 42, 42, 42, 42, 42, 42, 42,
        42, 42, 42, 42, 42, 42, 42, 42,
        42, 42, 42, 42, 42, 42, 42, 42,
-       42, 42, 42, 42, 42, 42, 42, 1,
-       46, 1, 46, 46, 46, 46, 46, 1,
-       1, 46, 46, 1, 1, 47, 46, 46,
-       46, 46, 46, 46, 46, 46, 46, 46,
-       46, 1, 1, 1, 46, 1, 46, 48,
-       46, 46, 46, 46, 46, 46, 46, 46,
-       46, 46, 46, 46, 46, 46, 46, 46,
-       46, 46, 46, 46, 46, 46, 46, 46,
-       46, 46, 1, 1, 1, 46, 46, 46,
-       46, 46, 46, 46, 46, 46, 46, 46,
-       46, 46, 46, 46, 46, 46, 46, 46,
-       46, 46, 46, 46, 46, 46, 46, 46,
-       46, 46, 46, 46, 46, 46, 1, 46,
-       1, 46, 46, 46, 46, 46, 1, 1,
-       46, 46, 1, 1, 1, 46, 46, 46,
-       46, 46, 46, 46, 46, 46, 46, 46,
-       1, 1, 1, 46, 1, 46, 1, 46,
+       42, 42, 42, 42, 42, 42, 42, 42,
+       42, 42, 42, 42, 42, 42, 42, 42,
+       42, 42, 42, 42, 42, 42, 42, 42,
+       42, 42, 42, 42, 42, 42, 42, 42,
+       42, 42, 42, 42, 42, 42, 42, 42,
+       1, 43, 43, 44, 43, 43, 43, 43,
+       43, 43, 43, 43, 43, 43, 43, 43,
+       43, 43, 43, 43, 43, 43, 43, 43,
+       43, 43, 43, 43, 43, 43, 43, 43,
+       43, 43, 43, 43, 43, 43, 43, 43,
+       43, 43, 43, 43, 43, 43, 43, 43,
+       43, 43, 43, 43, 43, 43, 43, 43,
+       43, 43, 43, 43, 43, 45, 43, 43,
+       43, 43, 43, 43, 43, 43, 43, 43,
+       43, 43, 43, 43, 43, 43, 43, 43,
+       43, 43, 43, 43, 43, 43, 43, 43,
+       43, 43, 43, 43, 43, 43, 43, 43,
+       1, 46, 47, 46, 46, 46, 46, 46,
+       1, 1, 46, 46, 1, 1, 1, 46,
        46, 46, 46, 46, 46, 46, 46, 46,
+       46, 46, 1, 1, 1, 46, 48, 46,
+       49, 46, 46, 46, 46, 46, 46, 46,
        46, 46, 46, 46, 46, 46, 46, 46,
        46, 46, 46, 46, 46, 46, 46, 46,
-       46, 1, 1, 1, 46, 46, 46, 46,
+       46, 46, 46, 1, 1, 1, 46, 46,
        46, 46, 46, 46, 46, 46, 46, 46,
        46, 46, 46, 46, 46, 46, 46, 46,
        46, 46, 46, 46, 46, 46, 46, 46,
-       46, 46, 46, 46, 46, 1, 49, 49,
-       49, 49, 49, 49, 49, 49, 49, 49,
-       1, 1, 1, 1, 1, 1, 1, 49,
-       49, 49, 49, 49, 49, 49, 49, 49,
-       49, 49, 49, 49, 49, 49, 49, 49,
-       49, 49, 49, 49, 49, 49, 49, 49,
-       49, 50, 1, 1, 1, 1, 1, 49,
-       49, 49, 49, 49, 49, 49, 49, 49,
-       49, 49, 49, 49, 49, 49, 49, 49,
-       49, 49, 49, 49, 49, 49, 49, 49,
-       49, 1, 51, 1, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 1, 1,
-       1, 1, 53, 1, 1, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 1,
-       1, 1, 1, 54, 1, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 1,
-       52, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 1, 1, 1, 1, 1, 1,
-       1, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 1, 1, 1, 1, 1,
-       1, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 1, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 1, 1,
-       1, 1, 1, 1, 1, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 1,
-       1, 1, 1, 54, 1, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 52,
-       52, 52, 52, 52, 52, 52, 52, 1,
-       55, 55, 55, 55, 55, 55, 55, 55,
-       55, 55, 1, 1, 1, 1, 1, 1,
+       46, 46, 46, 46, 46, 46, 46, 1,
+       50, 1, 50, 50, 50, 50, 50, 1,
+       1, 50, 50, 1, 1, 51, 50, 50,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       50, 1, 1, 1, 50, 1, 50, 52,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       50, 50, 1, 1, 1, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 1, 50,
+       1, 50, 50, 50, 50, 50, 1, 1,
+       50, 50, 1, 1, 1, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       1, 1, 1, 50, 1, 50, 1, 50,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       50, 1, 1, 1, 50, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       50, 50, 50, 50, 50, 50, 50, 50,
+       50, 50, 50, 50, 50, 1, 53, 53,
+       53, 53, 53, 53, 53, 53, 53, 53,
+       1, 1, 1, 1, 1, 1, 1, 53,
+       53, 53, 53, 53, 53, 53, 53, 53,
+       53, 53, 53, 53, 53, 53, 53, 53,
+       53, 53, 53, 53, 53, 53, 53, 53,
+       53, 54, 1, 1, 1, 1, 1, 53,
+       53, 53, 53, 53, 53, 53, 53, 53,
+       53, 53, 53, 53, 53, 53, 53, 53,
+       53, 53, 53, 53, 53, 53, 53, 53,
+       53, 1, 55, 1, 56, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 1, 1,
+       1, 1, 57, 1, 1, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 56, 1,
+       1, 1, 1, 58, 1, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 56, 1,
+       56, 56, 56, 56, 56, 56, 56, 56,
+       56, 56, 1, 1, 1, 1, 1, 1,
        1, 56, 56, 56, 56, 56, 56, 56,
        56, 56, 56, 56, 56, 56, 56, 56,
        56, 56, 56, 56, 56, 56, 56, 56,
-       56, 56, 56, 1, 1, 1, 1, 57,
+       56, 56, 56, 1, 1, 1, 1, 1,
        1, 56, 56, 56, 56, 56, 56, 56,
        56, 56, 56, 56, 56, 56, 56, 56,
        56, 56, 56, 56, 56, 56, 56, 56,
-       56, 56, 56, 1, 58, 1, 59, 59,
+       56, 56, 56, 1, 56, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 1, 1,
+       1, 1, 1, 1, 1, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 56, 1,
+       1, 1, 1, 58, 1, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 56, 56,
+       56, 56, 56, 56, 56, 56, 56, 1,
        59, 59, 59, 59, 59, 59, 59, 59,
-       60, 1, 1, 1, 1, 1, 1, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 1, 1, 1, 1, 62, 1, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 1, 63, 63, 63, 63, 63, 63,
-       63, 63, 63, 63, 1, 64, 1, 65,
+       59, 59, 1, 1, 1, 1, 1, 1,
+       1, 60, 60, 60, 60, 60, 60, 60,
+       60, 60, 60, 60, 60, 60, 60, 60,
+       60, 60, 60, 60, 60, 60, 60, 60,
+       60, 60, 60, 1, 1, 1, 1, 61,
+       1, 60, 60, 60, 60, 60, 60, 60,
+       60, 60, 60, 60, 60, 60, 60, 60,
+       60, 60, 60, 60, 60, 60, 60, 60,
+       60, 60, 60, 1, 62, 1, 63, 63,
+       63, 63, 63, 63, 63, 63, 63, 63,
+       64, 1, 1, 1, 1, 1, 1, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 1, 1, 1, 1, 66, 1, 65,
        65, 65, 65, 65, 65, 65, 65, 65,
-       65, 1, 66, 66, 66, 66, 66, 66,
-       66, 66, 66, 66, 1, 67, 1, 68,
-       68, 68, 68, 68, 68, 68, 68, 68,
-       68, 1, 69, 69, 69, 69, 69, 69,
-       69, 69, 69, 69, 1, 70, 70, 70,
-       70, 70, 70, 70, 70, 70, 70, 1,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 1, 67, 67, 67, 67, 67, 67,
+       67, 67, 67, 67, 1, 68, 1, 69,
+       69, 69, 69, 69, 69, 69, 69, 69,
+       69, 1, 70, 70, 70, 70, 70, 70,
+       70, 70, 70, 70, 1, 71, 1, 72,
+       72, 72, 72, 72, 72, 72, 72, 72,
+       72, 1, 73, 73, 73, 73, 73, 73,
+       73, 73, 73, 73, 1, 74, 74, 74,
+       74, 74, 74, 74, 74, 74, 74, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
-       1, 1, 71, 1, 72, 72, 72, 72,
-       72, 72, 72, 72, 72, 72, 1, 1,
+       1, 1, 75, 1, 76, 76, 76, 76,
+       76, 76, 76, 76, 76, 76, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
-       1, 71, 1, 71, 1, 73, 1, 67,
-       1, 74, 74, 74, 74, 74, 74, 74,
-       74, 74, 74, 1, 67, 1, 64, 1,
-       75, 75, 75, 75, 75, 75, 75, 75,
-       75, 75, 1, 64, 1, 58, 1, 76,
-       76, 76, 76, 76, 76, 76, 76, 76,
-       76, 60, 1, 1, 1, 1, 1, 1,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 1, 1, 1, 1, 62, 1,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 1, 58, 1, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 60,
-       1, 1, 1, 1, 1, 1, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       1, 1, 1, 1, 62, 1, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       1, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 60, 1, 1, 1, 1,
-       1, 1, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 1, 1, 1, 1,
-       62, 1, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 1, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 1,
-       1, 1, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 1, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 1, 1,
-       71, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 77, 77, 77, 77, 77, 77,
-       77, 77, 1, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 1, 1, 1,
-       1, 1, 1, 1, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 1, 1,
-       1, 1, 62, 1, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 61, 61,
-       61, 61, 61, 61, 61, 61, 1, 78,
-       78, 79, 78, 78, 78, 78, 78, 78,
-       78, 78, 78, 78, 78, 78, 78, 78,
-       78, 78, 78, 78, 78, 78, 78, 78,
-       78, 78, 78, 78, 78, 78, 78, 78,
-       78, 78, 78, 78, 78, 78, 78, 78,
-       78, 78, 78, 78, 78, 78, 78, 78,
-       78, 78, 78, 78, 78, 78, 78, 78,
-       78, 78, 78, 80, 78, 78, 78, 78,
-       78, 78, 78, 78, 78, 78, 78, 78,
-       78, 78, 78, 78, 78, 78, 78, 78,
-       78, 78, 78, 78, 78, 78, 78, 78,
-       78, 78, 78, 78, 78, 78, 1, 81,
-       81, 82, 81, 81, 81, 81, 81, 81,
-       81, 81, 81, 81, 81, 81, 81, 81,
-       81, 81, 81, 81, 81, 81, 81, 81,
+       1, 75, 1, 75, 1, 77, 1, 71,
+       1, 78, 78, 78, 78, 78, 78, 78,
+       78, 78, 78, 1, 71, 1, 68, 1,
+       79, 79, 79, 79, 79, 79, 79, 79,
+       79, 79, 1, 68, 1, 62, 1, 80,
+       80, 80, 80, 80, 80, 80, 80, 80,
+       80, 64, 1, 1, 1, 1, 1, 1,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 1, 1, 1, 1, 66, 1,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 1, 62, 1, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 64,
+       1, 1, 1, 1, 1, 1, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       1, 1, 1, 1, 66, 1, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       1, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 64, 1, 1, 1, 1,
+       1, 1, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 1, 1, 1, 1,
+       66, 1, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 1, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
-       81, 81, 81, 83, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
+       81, 81, 81, 81, 81, 81, 81, 1,
+       1, 1, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
-       81, 81, 81, 81, 81, 81, 1, 84,
-       1, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
+       81, 81, 81, 1, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
+       81, 81, 81, 81, 81, 81, 1, 1,
+       75, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
        81, 81, 81, 81, 81, 81, 81, 81,
-       1, 85, 85, 85, 85, 85, 85, 85,
-       85, 85, 85, 1, 1, 1, 1, 1,
-       1, 1, 85, 85, 85, 85, 85, 85,
+       81, 81, 1, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 1, 1, 1,
+       1, 1, 1, 1, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 1, 1,
+       1, 1, 66, 1, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 65, 65,
+       65, 65, 65, 65, 65, 65, 1, 82,
+       82, 83, 82, 82, 82, 82, 82, 82,
+       82, 82, 82, 82, 82, 82, 82, 82,
+       82, 82, 82, 82, 82, 82, 82, 82,
+       82, 82, 82, 82, 82, 82, 82, 82,
+       82, 82, 82, 82, 82, 82, 82, 82,
+       82, 82, 82, 82, 82, 82, 82, 82,
+       82, 82, 82, 82, 82, 82, 82, 82,
+       82, 82, 82, 84, 82, 82, 82, 82,
+       82, 82, 82, 82, 82, 82, 82, 82,
+       82, 82, 82, 82, 82, 82, 82, 82,
+       82, 82, 82, 82, 82, 82, 82, 82,
+       82, 82, 82, 82, 82, 82, 1, 85,
+       85, 86, 85, 85, 85, 85, 85, 85,
        85, 85, 85, 85, 85, 85, 85, 85,
        85, 85, 85, 85, 85, 85, 85, 85,
-       85, 85, 85, 85, 1, 1, 1, 1,
-       1, 1, 85, 85, 85, 85, 85, 85,
        85, 85, 85, 85, 85, 85, 85, 85,
        85, 85, 85, 85, 85, 85, 85, 85,
-       85, 85, 85, 85, 1, 86, 1, 87,
-       1, 85, 85, 85, 85, 85, 85, 85,
-       85, 85, 85, 88, 1, 1, 1, 1,
-       1, 1, 85, 85, 85, 85, 85, 85,
        85, 85, 85, 85, 85, 85, 85, 85,
        85, 85, 85, 85, 85, 85, 85, 85,
-       85, 85, 85, 85, 1, 1, 1, 1,
-       89, 1, 85, 85, 85, 85, 85, 85,
+       85, 85, 85, 87, 85, 85, 85, 85,
        85, 85, 85, 85, 85, 85, 85, 85,
        85, 85, 85, 85, 85, 85, 85, 85,
-       85, 85, 85, 85, 1, 87, 1, 90,
-       91, 90, 90, 90, 90, 90, 1, 1,
-       90, 90, 1, 1, 1, 90, 90, 90,
+       85, 85, 85, 85, 85, 85, 85, 85,
+       85, 85, 85, 85, 85, 85, 1, 88,
+       1, 89, 89, 89, 89, 89, 89, 89,
+       89, 89, 89, 89, 89, 89, 89, 89,
+       89, 89, 89, 89, 89, 89, 89, 89,
+       89, 89, 89, 89, 89, 89, 89, 89,
+       89, 89, 89, 89, 89, 89, 89, 89,
+       89, 89, 89, 89, 89, 89, 89, 89,
+       89, 89, 89, 89, 89, 89, 89, 89,
+       89, 89, 89, 89, 89, 89, 89, 89,
+       89, 89, 89, 89, 89, 89, 89, 89,
+       89, 89, 89, 89, 89, 89, 89, 89,
+       89, 89, 89, 89, 89, 89, 89, 89,
+       89, 89, 89, 89, 89, 89, 89, 89,
+       1, 90, 90, 91, 90, 90, 90, 90,
        90, 90, 90, 90, 90, 90, 90, 90,
-       1, 1, 1, 90, 1, 90, 1, 90,
        90, 90, 90, 90, 90, 90, 90, 90,
        90, 90, 90, 90, 90, 90, 90, 90,
        90, 90, 90, 90, 90, 90, 90, 90,
-       90, 1, 1, 1, 90, 90, 90, 90,
        90, 90, 90, 90, 90, 90, 90, 90,
        90, 90, 90, 90, 90, 90, 90, 90,
+       90, 90, 90, 90, 90, 92, 90, 90,
        90, 90, 90, 90, 90, 90, 90, 90,
-       90, 90, 90, 90, 90, 1, 85, 85,
-       85, 85, 85, 85, 85, 85, 85, 85,
-       1, 1, 1, 1, 1, 1, 1, 85,
-       85, 85, 85, 85, 85, 85, 85, 85,
-       85, 85, 85, 85, 85, 85, 85, 85,
-       85, 85, 85, 85, 85, 85, 85, 85,
-       85, 1, 1, 1, 1, 89, 1, 85,
-       85, 85, 85, 85, 85, 85, 85, 85,
-       85, 85, 85, 85, 85, 85, 85, 85,
-       85, 85, 85, 85, 85, 85, 85, 85,
-       85, 1, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 1, 1, 1, 1,
-       1, 1, 1, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 1, 1, 1,
-       1, 1, 1, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 1, 93, 1,
-       94, 1, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 95, 1, 1, 1,
-       1, 1, 1, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 1, 1, 1,
-       1, 96, 1, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 1, 94, 1,
-       97, 98, 97, 97, 97, 97, 97, 1,
-       1, 97, 97, 1, 1, 1, 97, 97,
-       97, 97, 97, 97, 97, 97, 97, 97,
-       97, 1, 1, 1, 97, 1, 97, 1,
-       97, 97, 97, 97, 97, 97, 97, 97,
-       97, 97, 97, 97, 97, 97, 97, 97,
-       97, 97, 97, 97, 97, 97, 97, 97,
-       97, 97, 1, 1, 1, 97, 97, 97,
-       97, 97, 97, 97, 97, 97, 97, 97,
-       97, 97, 97, 97, 97, 97, 97, 97,
-       97, 97, 97, 97, 97, 97, 97, 97,
-       97, 97, 97, 97, 97, 97, 1, 92,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 1, 1, 1, 1, 1, 1, 1,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 1, 1, 1, 1, 96, 1,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 92, 92, 92, 92, 92, 92,
-       92, 92, 1, 99, 99, 99, 99, 99,
+       90, 90, 90, 90, 90, 90, 90, 90,
+       90, 90, 90, 90, 90, 90, 90, 90,
+       90, 90, 90, 90, 90, 90, 90, 90,
+       1, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 1, 1, 1, 1, 1,
+       1, 1, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 1, 1, 1, 1,
+       1, 1, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 1, 94, 1, 95,
+       1, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 96, 1, 1, 1, 1,
+       1, 1, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 1, 1, 1, 1,
+       97, 1, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 1, 95, 1, 98,
+       99, 98, 98, 98, 98, 98, 1, 1,
+       98, 98, 1, 1, 1, 98, 98, 98,
+       98, 98, 98, 98, 98, 98, 98, 98,
+       1, 1, 1, 98, 1, 98, 1, 98,
+       98, 98, 98, 98, 98, 98, 98, 98,
+       98, 98, 98, 98, 98, 98, 98, 98,
+       98, 98, 98, 98, 98, 98, 98, 98,
+       98, 1, 1, 1, 98, 98, 98, 98,
+       98, 98, 98, 98, 98, 98, 98, 98,
+       98, 98, 98, 98, 98, 98, 98, 98,
+       98, 98, 98, 98, 98, 98, 98, 98,
+       98, 98, 98, 98, 98, 1, 93, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       1, 1, 1, 1, 1, 1, 1, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 1, 1, 1, 1, 97, 1, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 93, 93, 93, 93, 93, 93, 93,
+       93, 1, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 1, 1, 1, 1,
+       1, 1, 1, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 1, 1, 1,
+       1, 1, 1, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 1, 101, 1,
+       102, 1, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 103, 1, 1, 1,
+       1, 1, 1, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 1, 1, 1,
+       1, 104, 1, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 1, 102, 1,
+       105, 106, 105, 105, 105, 105, 105, 1,
+       1, 105, 105, 1, 1, 1, 105, 105,
+       105, 105, 105, 105, 105, 105, 105, 105,
+       105, 1, 1, 1, 105, 1, 105, 1,
+       105, 105, 105, 105, 105, 105, 105, 105,
+       105, 105, 105, 105, 105, 105, 105, 105,
+       105, 105, 105, 105, 105, 105, 105, 105,
+       105, 105, 1, 1, 1, 105, 105, 105,
+       105, 105, 105, 105, 105, 105, 105, 105,
+       105, 105, 105, 105, 105, 105, 105, 105,
+       105, 105, 105, 105, 105, 105, 105, 105,
+       105, 105, 105, 105, 105, 105, 1, 100,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 1, 1, 1, 1, 1, 1, 1,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 1, 1, 1, 1, 104, 1,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 100, 100, 100, 100, 100, 100,
+       100, 100, 1, 107, 107, 107, 107, 107,
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
-       1, 1, 99, 1, 1, 1, 1, 1,
+       1, 1, 107, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
-       100, 1, 11, 11, 11, 11, 11, 11,
+       108, 1, 11, 11, 11, 11, 11, 11,
        11, 11, 11, 11, 1, 1, 1, 1,
        1, 1, 1, 11, 11, 11, 11, 11,
        11, 11, 11, 11, 11, 11, 11, 11,
@@ -565,37 +590,38 @@ static const char _smtp_addr_parser_indicies[] = {
        1, 12, 1, 11, 11, 11, 11, 11,
        11, 11, 11, 11, 11, 11, 11, 11,
        11, 11, 11, 11, 11, 11, 11, 11,
-       11, 11, 11, 11, 11, 1, 101, 101,
-       101, 101, 101, 1, 1, 1, 1, 1,
+       11, 11, 11, 11, 11, 1, 109, 109,
+       109, 109, 109, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
-       1, 1, 1, 1, 1, 101, 1, 102,
-       102, 102, 102, 102, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 109, 1, 110,
+       110, 110, 110, 110, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
-       1, 1, 1, 1, 1, 1, 102, 1,
-       103, 103, 103, 103, 103, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 110, 1,
+       111, 111, 111, 111, 111, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
-       1, 1, 1, 1, 1, 1, 1, 103,
-       1, 104, 104, 104, 104, 104, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 111,
+       1, 112, 112, 112, 112, 112, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
-       104, 1, 0
+       112, 1, 0
 };
 
 static const char _smtp_addr_parser_trans_targs[] = {
-       1, 0, 2, 27, 31, 68, 2, 3,
-       4, 73, 7, 73, 6, 8, 23, 26,
+       1, 0, 2, 27, 32, 70, 2, 3,
+       4, 75, 7, 75, 6, 8, 23, 26,
        9, 21, 24, 23, 26, 10, 11, 19,
-       12, 13, 17, 14, 15, 75, 16, 18,
+       12, 13, 17, 14, 15, 77, 16, 18,
        20, 22, 25, 28, 29, 30, 28, 29,
-       30, 4, 32, 59, 77, 63, 32, 33,
-       34, 35, 38, 36, 35, 76, 37, 39,
-       55, 58, 40, 53, 56, 55, 58, 41,
-       42, 51, 43, 44, 49, 45, 46, 48,
-       47, 76, 50, 52, 54, 57, 60, 61,
-       62, 60, 61, 62, 34, 64, 65, 63,
-       66, 67, 32, 59, 69, 70, 68, 71,
-       72, 2, 27, 74, 5, 74, 74, 74,
-       74
+       30, 4, 31, 28, 29, 30, 33, 60,
+       79, 65, 33, 34, 35, 36, 39, 37,
+       36, 78, 38, 40, 56, 59, 41, 54,
+       57, 56, 59, 42, 43, 52, 44, 45,
+       50, 46, 47, 49, 48, 78, 51, 53,
+       55, 58, 61, 62, 63, 61, 62, 63,
+       35, 64, 61, 62, 63, 66, 67, 65,
+       68, 69, 33, 60, 71, 72, 70, 73,
+       74, 2, 27, 76, 5, 76, 76, 76,
+       76
 };
 
 static const char _smtp_addr_parser_trans_actions[] = {
@@ -604,15 +630,16 @@ static const char _smtp_addr_parser_trans_actions[] = {
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 6, 0, 0,
        0, 0, 0, 7, 8, 7, 0, 3,
-       0, 9, 10, 11, 0, 11, 0, 0,
-       3, 4, 0, 0, 0, 12, 0, 5,
-       5, 5, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 6,
-       0, 13, 0, 0, 0, 0, 7, 8,
-       7, 0, 3, 0, 9, 0, 0, 0,
+       0, 9, 0, 10, 11, 10, 12, 13,
+       0, 13, 0, 0, 3, 4, 0, 0,
+       0, 14, 0, 5, 5, 5, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 6, 0, 15, 0, 0,
+       0, 0, 7, 8, 7, 0, 3, 0,
+       9, 0, 10, 11, 10, 0, 0, 0,
        0, 0, 7, 0, 0, 0, 0, 0,
-       0, 7, 0, 14, 0, 0, 15, 16,
-       17
+       0, 7, 0, 16, 0, 0, 17, 18,
+       19
 };
 
 static const char _smtp_addr_parser_eof_actions[] = {
@@ -625,17 +652,17 @@ static const char _smtp_addr_parser_eof_actions[] = {
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0,
-       0, 14, 0, 15, 16, 17
+       0, 0, 0, 16, 0, 17, 18, 19
 };
 
 static const int smtp_addr_parser_start = 1;
-static const int smtp_addr_parser_first_final = 73;
+static const int smtp_addr_parser_first_final = 75;
 static const int smtp_addr_parser_error = 0;
 
 static const int smtp_addr_parser_en_main = 1;
 
 
-#line 79 "src/ragel/smtp_addr_parser.rl"
+#line 83 "src/ragel/smtp_addr_parser.rl"
 
 static int
 rspamd_smtp_addr_parse (const char *data, size_t len, struct rspamd_email_address *addr)
@@ -650,14 +677,14 @@ rspamd_smtp_addr_parse (const char *data, size_t len, struct rspamd_email_addres
   eof = pe;
 
 
-#line 654 "src/libmime/parsers/smtp_addr_parser.c"
+#line 681 "src/libmime/parsers/smtp_addr_parser.c"
        {
        cs = smtp_addr_parser_start;
        }
 
-#line 93 "src/ragel/smtp_addr_parser.rl"
+#line 97 "src/ragel/smtp_addr_parser.rl"
 
-#line 661 "src/libmime/parsers/smtp_addr_parser.c"
+#line 688 "src/libmime/parsers/smtp_addr_parser.c"
        {
        int _slen;
        int _trans;
@@ -717,32 +744,38 @@ _resume:
     }
   }
        break;
-       case 9:
+       case 10:
 #line 36 "src/ragel/smtp_addr_parser.rl"
        {
+    addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH;
+  }
+       break;
+       case 9:
+#line 40 "src/ragel/smtp_addr_parser.rl"
+       {
     addr->flags |= RSPAMD_EMAIL_ADDR_QUOTED;
   }
        break;
-       case 16:
-#line 47 "src/ragel/smtp_addr_parser.rl"
+       case 18:
+#line 51 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_VALID;
   }
        break;
-       case 11:
-#line 51 "src/ragel/smtp_addr_parser.rl"
+       case 13:
+#line 55 "src/ragel/smtp_addr_parser.rl"
        {
     addr->addr = p;
   }
        break;
        case 2:
-#line 55 "src/ragel/smtp_addr_parser.rl"
+#line 59 "src/ragel/smtp_addr_parser.rl"
        {
     addr->addr = p;
   }
        break;
-       case 13:
-#line 59 "src/ragel/smtp_addr_parser.rl"
+       case 15:
+#line 63 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_BRACED;
     if (addr->addr) {
@@ -762,14 +795,14 @@ _resume:
     }
   }
        break;
-       case 12:
+       case 14:
 #line 19 "src/ragel/smtp_addr_parser.rl"
        {
     if (addr->domain) {
       addr->domain_len = p - addr->domain;
     }
   }
-#line 59 "src/ragel/smtp_addr_parser.rl"
+#line 63 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_BRACED;
     if (addr->addr) {
@@ -777,21 +810,33 @@ _resume:
     }
   }
        break;
-       case 17:
-#line 40 "src/ragel/smtp_addr_parser.rl"
+       case 11:
+#line 36 "src/ragel/smtp_addr_parser.rl"
+       {
+    addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH;
+  }
+#line 9 "src/ragel/smtp_addr_parser.rl"
+       {
+    if (addr->user) {
+      addr->user_len = p - addr->user;
+    }
+  }
+       break;
+       case 19:
+#line 44 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_EMPTY;
     addr->addr = "";
     addr->user = addr->addr;
     addr->domain = addr->addr;
   }
-#line 47 "src/ragel/smtp_addr_parser.rl"
+#line 51 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_VALID;
   }
        break;
-       case 10:
-#line 51 "src/ragel/smtp_addr_parser.rl"
+       case 12:
+#line 55 "src/ragel/smtp_addr_parser.rl"
        {
     addr->addr = p;
   }
@@ -801,7 +846,7 @@ _resume:
   }
        break;
        case 1:
-#line 55 "src/ragel/smtp_addr_parser.rl"
+#line 59 "src/ragel/smtp_addr_parser.rl"
        {
     addr->addr = p;
   }
@@ -810,39 +855,39 @@ _resume:
     addr->user = p;
   }
        break;
-       case 15:
-#line 66 "src/ragel/smtp_addr_parser.rl"
+       case 17:
+#line 70 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_BRACED;
     if (addr->addr) {
       addr->addr_len = p - addr->addr;
     }
   }
-#line 47 "src/ragel/smtp_addr_parser.rl"
+#line 51 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_VALID;
   }
        break;
-       case 14:
+       case 16:
 #line 19 "src/ragel/smtp_addr_parser.rl"
        {
     if (addr->domain) {
       addr->domain_len = p - addr->domain;
     }
   }
-#line 66 "src/ragel/smtp_addr_parser.rl"
+#line 70 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_BRACED;
     if (addr->addr) {
       addr->addr_len = p - addr->addr;
     }
   }
-#line 47 "src/ragel/smtp_addr_parser.rl"
+#line 51 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_VALID;
   }
        break;
-#line 846 "src/libmime/parsers/smtp_addr_parser.c"
+#line 891 "src/libmime/parsers/smtp_addr_parser.c"
        }
 
 _again:
@@ -854,65 +899,65 @@ _again:
        if ( p == eof )
        {
        switch ( _smtp_addr_parser_eof_actions[cs] ) {
-       case 16:
-#line 47 "src/ragel/smtp_addr_parser.rl"
+       case 18:
+#line 51 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_VALID;
   }
        break;
-       case 17:
-#line 40 "src/ragel/smtp_addr_parser.rl"
+       case 19:
+#line 44 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_EMPTY;
     addr->addr = "";
     addr->user = addr->addr;
     addr->domain = addr->addr;
   }
-#line 47 "src/ragel/smtp_addr_parser.rl"
+#line 51 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_VALID;
   }
        break;
-       case 15:
-#line 66 "src/ragel/smtp_addr_parser.rl"
+       case 17:
+#line 70 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_BRACED;
     if (addr->addr) {
       addr->addr_len = p - addr->addr;
     }
   }
-#line 47 "src/ragel/smtp_addr_parser.rl"
+#line 51 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_VALID;
   }
        break;
-       case 14:
+       case 16:
 #line 19 "src/ragel/smtp_addr_parser.rl"
        {
     if (addr->domain) {
       addr->domain_len = p - addr->domain;
     }
   }
-#line 66 "src/ragel/smtp_addr_parser.rl"
+#line 70 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_BRACED;
     if (addr->addr) {
       addr->addr_len = p - addr->addr;
     }
   }
-#line 47 "src/ragel/smtp_addr_parser.rl"
+#line 51 "src/ragel/smtp_addr_parser.rl"
        {
     addr->flags |= RSPAMD_EMAIL_ADDR_VALID;
   }
        break;
-#line 909 "src/libmime/parsers/smtp_addr_parser.c"
+#line 954 "src/libmime/parsers/smtp_addr_parser.c"
        }
        }
 
        _out: {}
        }
 
-#line 94 "src/ragel/smtp_addr_parser.rl"
+#line 98 "src/ragel/smtp_addr_parser.rl"
 
   return cs;
 }
index 64e1ae4fb1ba31ddbc7e4f1bd42c1ce5daa51739..55b8eefb05137f1ff9b192f3f9506ea65042644c 100644 (file)
     }
   }
 
+  action User_has_backslash {
+    addr->flags |= RSPAMD_EMAIL_ADDR_HAS_BACKSLASH;
+  }
+
   action Quoted_addr {
     addr->flags |= RSPAMD_EMAIL_ADDR_QUOTED;
   }
index 3c2a86ee61d9d4569ff19952cdd2de87f531df94..fddafe59d2365b88a036fa70700083ed911cff8f 100644 (file)
@@ -24,7 +24,7 @@
   Atom           = atext+;
   Dot_string     = Atom ("."  Atom)*;
 
-  QcontentSMTP   = qtextSMTP | quoted_pairSMTP;
+  QcontentSMTP   = qtextSMTP | quoted_pairSMTP %User_has_backslash;
   Quoted_string  = ( DQUOTE QcontentSMTP* >User_start %User_end DQUOTE ) %Quoted_addr;
   Local_part     = Dot_string >User_start %User_end | Quoted_string;
   String         = Atom | Quoted_string;