diff options
author | albrechtd <albrecht.dress@arcor.de> | 2019-01-28 21:50:43 +0100 |
---|---|---|
committer | Jeffrey Stedfast <jestedfa@microsoft.com> | 2019-01-28 15:50:43 -0500 |
commit | d7d6254cceb87169616d96ceacd502f9505bbfda (patch) | |
tree | 8d9978f692c60eda8dd2783102aa72e2643af6fa | |
parent | 6219f9121736d5b50d2d14e22ed9430947cf28e8 (diff) | |
download | gmime-d7d6254cceb87169616d96ceacd502f9505bbfda.tar.gz |
Report violations of RFC 5322 address specifications (#55)
Use the GMimeParserWarning facility to report a warning if
(1) parsing an address failed with any error or
(2) multiple adresses in a mailbox-list are not separated properly.
-rw-r--r-- | examples/msgcheck.c | 2 | ||||
-rw-r--r-- | gmime/gmime-parser-options.h | 4 | ||||
-rw-r--r-- | gmime/internet-address.c | 11 |
3 files changed, 16 insertions, 1 deletions
diff --git a/examples/msgcheck.c b/examples/msgcheck.c index 88addefc..2f78a616 100644 --- a/examples/msgcheck.c +++ b/examples/msgcheck.c @@ -52,6 +52,8 @@ errcode2str(GMimeParserWarning errcode) return "truncated message"; case GMIME_WARN_MALFORMED_MESSAGE: return "malformed message"; + case GMIME_WARN_INVALID_ADDRESS_SPEC: + return "invalid address specification"; case GMIME_CRIT_INVALID_HEADER_NAME: return "invalid header name, parser may skip the message or parts of it"; case GMIME_CRIT_CONFLICTING_HEADER: diff --git a/gmime/gmime-parser-options.h b/gmime/gmime-parser-options.h index a8dedbee..2c17b798 100644 --- a/gmime/gmime-parser-options.h +++ b/gmime/gmime-parser-options.h @@ -52,6 +52,7 @@ typedef enum { * @GMIME_WARN_MALFORMED_MULTIPART: no items in a `multipart/...` * @GMIME_WARN_TRUNCATED_MESSAGE: the message is truncated * @GMIME_WARN_MALFORMED_MESSAGE: the message is malformed + * @GMIME_WARN_INVALID_ADDRESS_SPEC: invalid address specification * @GMIME_CRIT_INVALID_HEADER_NAME: invalid header name, the parser may skip the message or parts of it * @GMIME_CRIT_CONFLICTING_HEADER: conflicting header * @GMIME_CRIT_CONFLICTING_PARAMETER: conflicting header parameter @@ -73,7 +74,8 @@ typedef enum { GMIME_CRIT_CONFLICTING_HEADER, GMIME_CRIT_CONFLICTING_PARAMETER, GMIME_CRIT_MULTIPART_WITHOUT_BOUNDARY, - GMIME_WARN_INVALID_PARAMETER + GMIME_WARN_INVALID_PARAMETER, + GMIME_WARN_INVALID_ADDRESS_SPEC } GMimeParserWarning; /** diff --git a/gmime/internet-address.c b/gmime/internet-address.c index d515088e..b899d471 100644 --- a/gmime/internet-address.c +++ b/gmime/internet-address.c @@ -2050,6 +2050,8 @@ address_parse (GMimeParserOptions *options, AddressParserFlags flags, const char } error: + if (g_mime_parser_options_get_warning_callback (options) != NULL) + _g_mime_parser_options_warn (options, offset, GMIME_WARN_INVALID_ADDRESS_SPEC, *in); *address = NULL; *in = inptr; @@ -2059,6 +2061,7 @@ address_parse (GMimeParserOptions *options, AddressParserFlags flags, const char static gboolean address_list_parse (InternetAddressList *list, GMimeParserOptions *options, const char **in, gboolean is_group, gint64 offset) { + gboolean can_warn = g_mime_parser_options_get_warning_callback (options) != NULL; InternetAddress *address; const char *charset; const char *inptr; @@ -2072,6 +2075,8 @@ address_list_parse (InternetAddressList *list, GMimeParserOptions *options, cons return FALSE; while (*inptr) { + gboolean separator_between_addrs = FALSE; + if (is_group && *inptr == ';') break; @@ -2086,6 +2091,9 @@ address_list_parse (InternetAddressList *list, GMimeParserOptions *options, cons if (charset) address->charset = g_strdup (charset); + + if (INTERNET_ADDRESS_IS_GROUP(address)) + separator_between_addrs = TRUE; } /* Note: we loop here in case there are any null addresses between commas */ @@ -2099,8 +2107,11 @@ address_list_parse (InternetAddressList *list, GMimeParserOptions *options, cons if (*inptr != ',') break; + separator_between_addrs = TRUE; inptr++; } while (TRUE); + if (can_warn && !(separator_between_addrs || (*inptr == '\0') || (is_group && (*inptr == ';')))) + _g_mime_parser_options_warn (options, offset, GMIME_WARN_INVALID_ADDRESS_SPEC, *in); } *in = inptr; |