RFC 3676 establishes two parameters (Format and DelSP) to be used with the Text/Plain media type. In the presence of these parameters, trailing whitespace is used to indicate flowed lines and a canonical quote indicator is used to indicate quoted lines. mailinfo now unfolds, unquotes, and un-space-stuffs such messages. Signed-off-by: Jay Soffian <jaysoffian@xxxxxxxxx> --- It's been a while since I hacked C, so mucho scrutiny appreciated. The mailinfo testsuite still passes, and this patch is followed by one which adds a new test for this code, which also passes. This is based off next, but mailinfo hasn't changed in a while, so it should apply cleanly to master (didn't test that though). builtin-mailinfo.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-) diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c index 2600847..deaf92b 100644 --- a/builtin-mailinfo.c +++ b/builtin-mailinfo.c @@ -20,6 +20,13 @@ static enum { static enum { TYPE_TEXT, TYPE_OTHER, } message_type; +/* RFC 3676 Text/Plain Format and DelSp Parameters */ +static enum { + FORMAT_NONE, FORMAT_FIXED, FORMAT_FLOWED, +} tp_format; +static enum { + DELSP_NONE, DELSP_YES, DELSP_NO, +} tp_delsp; static char charset[256]; static int patch_lines; @@ -193,6 +200,18 @@ static int handle_content_type(char *line) if (strcasestr(line, "text/") == NULL) message_type = TYPE_OTHER; + else if (strcasestr(line, "text/plain")) { + char attr[256]; + if (slurp_attr(line, "format=", attr) && !strcasecmp(attr, "flowed")) { + tp_format = FORMAT_FLOWED; + if (slurp_attr(line, "delsp=", attr) && !strcasecmp(attr, "yes")) + tp_delsp = DELSP_YES; + else + tp_delsp = DELSP_NO; + } + else + tp_format = FORMAT_FIXED; + } if (slurp_attr(line, "boundary=", boundary + 2)) { memcpy(boundary, "--", 2); if (content_top++ >= &content[MAX_BOUNDARIES]) { @@ -681,6 +700,8 @@ again: transfer_encoding = TE_DONTCARE; charset[0] = 0; message_type = TYPE_TEXT; + tp_format = FORMAT_NONE; + tp_delsp = DELSP_NONE; /* slurp in this section's info */ while (read_one_header_line(line, sizeof(line), fin)) @@ -770,6 +791,24 @@ static int handle_filter(char *line, unsigned linesize) { static int filter = 0; + if (tp_format == FORMAT_FLOWED && !!strcmp(line, "-- \n")) { + char *cp = line; + while (*cp == '>' && *cp != 0) + cp++; + if (*cp == ' ') + cp++; + line = cp; + if (!!strcmp(line, "-- \n")) { + while (*cp != '\n' && *cp !=0) + cp++; + if (cp > line && *cp == '\n' && *(cp-1) == ' ') { + if (tp_delsp == DELSP_YES) + *(cp-1) = '\0'; + else + *cp = '\0'; + } + } + } /* filter tells us which part we left off on * a non-zero return indicates we hit a filter point */ @@ -818,6 +857,7 @@ static void handle_body(void) switch (transfer_encoding) { case TE_BASE64: + case TE_QP: { char *op = line; -- 1.5.4.1.1281.g75df - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html