[gmime] Properly deal with obsolete address routing



commit 0583d117f675b86e8229f6d1209460738716de65
Author: Jeffrey Stedfast <fejj gnome org>
Date:   Thu Aug 8 12:21:43 2013 -0400

    Properly deal with obsolete address routing
    
    2013-08-08  Jeffrey Stedfast  <fejj gnome org>
    
        * gmime/internet-address.c (decode_address): Properly deal with
        obsolete routing information.

 ChangeLog                |    5 ++++
 gmime/internet-address.c |   55 +++++++++++++++++++++++++++++++++++++++++++--
 tests/test-mime.c        |    8 ++++++
 3 files changed, 65 insertions(+), 3 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index da3312e..f5cf460 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2013-08-08  Jeffrey Stedfast  <fejj gnome org>
 
+       * gmime/internet-address.c (decode_address): Properly deal with
+       obsolete routing information.
+
+2013-08-08  Jeffrey Stedfast  <fejj gnome org>
+
        * README: Bumped version
 
        * configure.ac: Bumped version to 2.6.17
diff --git a/gmime/internet-address.c b/gmime/internet-address.c
index 9a29d8a..ad215dc 100644
--- a/gmime/internet-address.c
+++ b/gmime/internet-address.c
@@ -1417,7 +1417,7 @@ decode_address (const char **in)
                 *             /  "." / "[" / "]"              ;  within a word.
                 */
                if (*inptr == ':') {
-                       /* group */
+                       /* rfc2822 group */
                        inptr++;
                        addr = decode_group (&inptr);
                        decode_lwsp (&inptr);
@@ -1428,12 +1428,54 @@ decode_address (const char **in)
                                inptr++;
                        break;
                } else if (*inptr == '<') {
-                       /* mailbox route-addr */
+                       /* rfc2822 angle-addr */
                        inptr++;
+                       
+                       /* check for obsolete routing... */
+                       if (*inptr == '@') {
+                               GString *route = g_string_new ("");
+                               
+                               do {
+                                       inptr++;
+                                       
+                                       g_string_append_c (route, '@');
+                                       if (!decode_domain (&inptr, route))
+                                               break;
+                                       
+                                       decode_lwsp (&inptr);
+                                       if (*inptr == ',') {
+                                               g_string_append_c (route, ',');
+                                               inptr++;
+                                               decode_lwsp (&inptr);
+                                               
+                                               /* obs-domain-lists allow commas with nothing between them... 
*/
+                                               while (*inptr == ',') {
+                                                       inptr++;
+                                                       decode_lwsp (&inptr);
+                                               }
+                                       }
+                               } while (*inptr == '@');
+                               
+                               if (*inptr != ':') {
+                                       w(g_warning ("Invalid obs-angle-addr, missing ':': %.*s", inptr - 
start, start));
+                                       
+                                       while (*inptr && *inptr != '>' && *inptr != ',')
+                                               inptr++;
+                                       
+                                       if (*inptr == '>')
+                                               inptr++;
+                                       
+                                       break;
+                               }
+                               
+                               inptr++;
+                       }
+                       
+                       /* rfc2822 addr-spec */
                        addr = decode_addrspec (&inptr);
                        decode_lwsp (&inptr);
                        if (*inptr != '>') {
-                               w(g_warning ("Invalid route-addr, missing closing '>': %.*s",
+                               w(g_warning ("Invalid rfc2822 angle-addr, missing closing '>': %.*s",
                                             inptr - start, start));
                                
                                while (*inptr && *inptr != '>' && *inptr != ',')
@@ -1574,6 +1616,13 @@ internet_address_list_parse_string (const char *str)
                decode_lwsp (&inptr);
                if (*inptr == ',') {
                        inptr++;
+                       decode_lwsp (&inptr);
+                       
+                       /* obs-mbox-list and obs-addr-list allow for empty members (commas with nothing 
between them) */
+                       while (*inptr == ',') {
+                               inptr++;
+                               decode_lwsp (&inptr);
+                       }
                } else if (*inptr) {
                        w(g_warning ("Parse error at '%s': expected ','", inptr));
                        /* try skipping to the next address */
diff --git a/tests/test-mime.c b/tests/test-mime.c
index 43f540c..e080293 100644
--- a/tests/test-mime.c
+++ b/tests/test-mime.c
@@ -194,6 +194,14 @@ static struct {
        { "sdfasf wp pl,c tert wp pl,sffdg rtre op pl",
          "sdfasf wp pl, c, sffdg rtre op pl",
          "sdfasf wp pl, c, sffdg rtre op pl" },
+       
+       /* obsolete routing address syntax tests */
+       { "<@route:user domain com>",
+         "user domain com",
+         "user domain com" },
+       { "<@route1,,@route2,,,@route3:user domain com>",
+         "user domain com",
+         "user domain com" },
 };
 
 static struct {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]