diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c index d5e7e830e71e436096647447d9a63581e55f8c6b..5ebfccf64de6186381cf196362104712607aeb9a 100644 --- a/src/smblib/smblib.c +++ b/src/smblib/smblib.c @@ -902,7 +902,7 @@ static void set_convenience_ptr(smbmsg_t* msg, uint16_t hfield_type, size_t len, p += 13; SKIP_WHITESPACE(p); msg->content_type = p; - smb_parse_content_type(p, &(msg->text_subtype), &(msg->text_charset)); + smb_parse_content_type(p, &(msg->text_subtype), &(msg->text_charset), &(msg->hdr.auxattr)); break; } if (strnicmp(p, "Content-Transfer-Encoding:", 26) == 0) { diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h index 8f262b97c71070ea2d58695cdfc50a04e900989f..34061a0c7c474ce996d0a575e1bf9767f92cf162 100644 --- a/src/smblib/smblib.h +++ b/src/smblib/smblib.h @@ -268,7 +268,7 @@ SMBEXPORT char* smb_getmsgtxt(smb_t*, smbmsg_t*, uint mode); SMBEXPORT char* smb_getplaintext(smbmsg_t*, char* body); SMBEXPORT uint8_t* smb_getattachment(smbmsg_t*, char* body, char* filename, size_t filename_len, uint32_t* filelen, int index); SMBEXPORT uint smb_countattachments(smb_t*, smbmsg_t*, const char* body); -SMBEXPORT void smb_parse_content_type(const char* content_type, char** subtype, char** charset); +SMBEXPORT void smb_parse_content_type(const char* content_type, char** subtype, char** charset, uint32_t* auxattr); /* smbfile.c */ SMBEXPORT int smb_feof(FILE* fp); diff --git a/src/smblib/smbtxt.c b/src/smblib/smbtxt.c index a8a0f67cd2142ae1f39d29da30f472450854e2ba..211bad069c8cf81f7cf98e45a80006d4ffd9cff8 100644 --- a/src/smblib/smbtxt.c +++ b/src/smblib/smbtxt.c @@ -361,7 +361,7 @@ static bool mime_getattachment(const char* beg, const char* end, char* attachmen } // Parses a MIME text/* content-type header field -void smb_parse_content_type(const char* content_type, char** subtype, char** charset) +void smb_parse_content_type(const char* content_type, char** subtype, char** charset, uint32_t* auxattr) { if (subtype != NULL) { FREE_AND_NULL(*subtype); @@ -389,6 +389,31 @@ void smb_parse_content_type(const char* content_type, char** subtype, char** cha *tp = 0; } } + char* format; + if (auxattr != NULL && + ((format = strcasestr(p, " format=")) != NULL + || (format = strcasestr(p, ";foramt=")) != NULL + || (format = strcasestr(p, "\tformat=")) != NULL)) { + bool quoted = false; + format += 8; + if (*format == '"') { + quoted = true; + format++; + } + char* tp = format; + FIND_WHITESPACE(tp); + *tp = 0; + tp = format; + if (quoted) { + FIND_CHAR(tp, '"'); + } else { + FIND_CHAR(tp, ';'); + } + *tp = 0; + if (stricmp(format, "fixed") == 0) + *auxattr |= MSG_FIXED_FORMAT; + } + char* parms = p; if (charset != NULL && ((p = strcasestr(parms, " charset=")) != NULL @@ -491,7 +516,7 @@ static const char* mime_getpart(const char* buf, const char* content_type, const if (encoding != NULL) *encoding = mime_getxferencoding(txt, p); if (charset != NULL) - smb_parse_content_type(content_type, NULL, charset); + smb_parse_content_type(content_type, NULL, charset, NULL); txt = p + 4; // strlen("\r\n\r\n") SKIP_WHITESPACE(txt);