From a87070a16587cd02f3c1d3f930186a0e957a098a Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 7 Mar 2017 11:38:05 +0000 Subject: [PATCH] [Fix] Fix parsing of cte in expressions --- rules/regexp/headers.lua | 3 ++- src/libmime/message.h | 15 ++++++++++++ src/libmime/mime_expressions.c | 42 ++++++++-------------------------- src/libmime/mime_parser.c | 25 +++++++++++++++++++- 4 files changed, 50 insertions(+), 35 deletions(-) diff --git a/rules/regexp/headers.lua b/rules/regexp/headers.lua index 30ccd5d0f..f58feeaf8 100644 --- a/rules/regexp/headers.lua +++ b/rules/regexp/headers.lua @@ -107,7 +107,8 @@ reconf['R_RCVD_SPAMBOTS'] = { -- Charset is missing in message reconf['R_MISSING_CHARSET'] = { - re = string.format('content_type_is_type(text) & !content_type_has_param(charset) & !%s', r_cte_7bit), + re = string.format('content_type_is_type(text) & !content_type_has_param(charset) & !%s', + r_cte_7bit), score = 2.5, description = 'Charset is missing in a message', group = 'header' diff --git a/src/libmime/message.h b/src/libmime/message.h index 6004d1759..03e0e8345 100644 --- a/src/libmime/message.h +++ b/src/libmime/message.h @@ -163,4 +163,19 @@ GPtrArray *rspamd_message_get_header_from_hash (GHashTable *htb, const gchar *field, gboolean strong); + +/** + * Converts string to cte + * @param str + * @return + */ +enum rspamd_cte rspamd_cte_from_string (const gchar *str); + +/** + * Converts cte to string + * @param ct + * @return + */ +const gchar* rspamd_cte_to_string (enum rspamd_cte ct); + #endif diff --git a/src/libmime/mime_expressions.c b/src/libmime/mime_expressions.c index 8a5672459..71b8d4bdc 100644 --- a/src/libmime/mime_expressions.c +++ b/src/libmime/mime_expressions.c @@ -1252,11 +1252,10 @@ rspamd_compare_transfer_encoding (struct rspamd_task * task, GArray * args, void *unused) { - GPtrArray *headerlist; struct expression_argument *arg; guint i; - struct rspamd_mime_header *rh; - static const char *hname = "Content-Transfer-Encoding"; + struct rspamd_mime_part *part; + enum rspamd_cte cte; if (args == NULL) { msg_warn_task ("no parameters to function"); @@ -1269,39 +1268,16 @@ rspamd_compare_transfer_encoding (struct rspamd_task * task, return FALSE; } - headerlist = rspamd_message_get_header_array (task, hname, FALSE); + cte = rspamd_cte_from_string (arg->data); - if (headerlist) { - for (i = 0; i < headerlist->len; i ++) { - rh = g_ptr_array_index (headerlist, i); - - if (rh->decoded == NULL) { - continue; - } - - if (g_ascii_strcasecmp (rh->decoded, arg->data) == 0) { - return TRUE; - } - } + if (cte == RSPAMD_CTE_UNKNOWN) { + msg_warn_task ("unknown cte: %s", arg->data); + return FALSE; } - /* - * In fact, we need to check 'Content-Transfer-Encoding' for each part - * as gmime has 'strange' assumptions - */ - headerlist = rspamd_message_get_mime_header_array (task, - arg->data, - FALSE); - - if (headerlist) { - for (i = 0; i < headerlist->len; i ++) { - rh = g_ptr_array_index (headerlist, i); - - if (rh->decoded == NULL) { - continue; - } - - if (g_ascii_strcasecmp (rh->decoded, arg->data) == 0) { + PTR_ARRAY_FOREACH (task->parts, i, part) { + if (IS_CT_TEXT (part->ct)) { + if (part->cte == cte) { return TRUE; } } diff --git a/src/libmime/mime_parser.c b/src/libmime/mime_parser.c index b16983287..a9bb0748a 100644 --- a/src/libmime/mime_parser.c +++ b/src/libmime/mime_parser.c @@ -81,7 +81,7 @@ rspamd_mime_parser_quark (void) return g_quark_from_static_string ("mime-parser"); } -static const gchar* +const gchar* rspamd_cte_to_string (enum rspamd_cte ct) { const gchar *ret = "unknown"; @@ -106,6 +106,29 @@ rspamd_cte_to_string (enum rspamd_cte ct) return ret; } +enum rspamd_cte +rspamd_cte_from_string (const gchar *str) +{ + enum rspamd_cte ret = RSPAMD_CTE_UNKNOWN; + + g_assert (str != NULL); + + if (strcmp (str, "7bit") == 0) { + ret = RSPAMD_CTE_7BIT; + } + else if (strcmp (str, "8bit") == 0) { + ret = RSPAMD_CTE_8BIT; + } + else if (strcmp (str, "quoted-printable") == 0) { + ret = RSPAMD_CTE_QP; + } + else if (strcmp (str, "base64") == 0) { + ret = RSPAMD_CTE_B64; + } + + return ret; +} + static void rspamd_mime_parser_init_lib (void) { -- 2.39.5