diff options
Diffstat (limited to 'src/libmime')
-rw-r--r-- | src/libmime/mime_expressions.c | 95 |
1 files changed, 70 insertions, 25 deletions
diff --git a/src/libmime/mime_expressions.c b/src/libmime/mime_expressions.c index 04a745c2e..3ab8cee32 100644 --- a/src/libmime/mime_expressions.c +++ b/src/libmime/mime_expressions.c @@ -1627,12 +1627,45 @@ rspamd_check_smtp_data (struct rspamd_task *task, GArray * args, void *unused) return FALSE; } +static inline gboolean +rspamd_check_ct_attr (const gchar *begin, gsize len, + struct expression_argument *arg_pattern) +{ + rspamd_regexp_t *re; + gboolean r = FALSE; + + if (arg_pattern->type == EXPRESSION_ARGUMENT_REGEXP) { + re = arg_pattern->data; + + if (len > 0) { + r = rspamd_regexp_search (re, + begin, len, + NULL, NULL, FALSE, NULL); + } + + if (r) { + return TRUE; + } + } + else { + /* Just do strcasecmp */ + gsize plen = strlen (arg_pattern->data); + + if (plen == len && + g_ascii_strncasecmp (arg_pattern->data, begin, len) == 0) { + return TRUE; + } + } + + return FALSE; +} + static gboolean rspamd_content_type_compare_param (struct rspamd_task * task, GArray * args, void *unused) { - rspamd_regexp_t *re; + struct expression_argument *arg, *arg1, *arg_pattern; gboolean recursive = FALSE; struct rspamd_mime_part *cur_part; @@ -1640,7 +1673,6 @@ rspamd_content_type_compare_param (struct rspamd_task * task, rspamd_ftok_t srch; struct rspamd_content_type_param *found = NULL, *cur; const gchar *param_name; - gboolean r = FALSE; if (args == NULL || args->len < 2) { msg_warn_task ("no parameters to function"); @@ -1672,32 +1704,33 @@ rspamd_content_type_compare_param (struct rspamd_task * task, } } - if (cur_part->ct->attrs) { - RSPAMD_FTOK_FROM_STR (&srch, param_name); + rspamd_ftok_t lit; + RSPAMD_FTOK_FROM_STR (&srch, param_name); + RSPAMD_FTOK_FROM_STR (&lit, "charset"); + if (rspamd_ftok_equal (&srch, &lit)) { + if (rspamd_check_ct_attr (cur_part->ct->charset.begin, + cur_part->ct->charset.len, arg_pattern)) { + return TRUE; + } + } + + RSPAMD_FTOK_FROM_STR (&lit, "boundary"); + if (rspamd_ftok_equal (&srch, &lit)) { + if (rspamd_check_ct_attr (cur_part->ct->orig_boundary.begin, + cur_part->ct->orig_boundary.len, arg_pattern)) { + return TRUE; + } + } + + if (cur_part->ct->attrs) { found = g_hash_table_lookup (cur_part->ct->attrs, &srch); if (found) { DL_FOREACH (found, cur) { - if (arg_pattern->type == EXPRESSION_ARGUMENT_REGEXP) { - re = arg_pattern->data; - - if (cur->value.len > 0) { - r = rspamd_regexp_search (re, - cur->value.begin, cur->value.len, - NULL, NULL, FALSE, NULL); - } - - if (r) { - return TRUE; - } - } - else { - /* Just do strcasecmp */ - RSPAMD_FTOK_FROM_STR (&srch, arg_pattern->data); - if (rspamd_ftok_casecmp (&srch, &cur->value) == 0) { - return TRUE; - } + if (rspamd_check_ct_attr (cur->value.begin, + cur->value.len, arg_pattern)) { + return TRUE; } } } @@ -1753,9 +1786,21 @@ rspamd_content_type_has_param (struct rspamd_task * task, } } - if (cur_part->ct->attrs) { - RSPAMD_FTOK_FROM_STR (&srch, param_name); + rspamd_ftok_t lit; + RSPAMD_FTOK_FROM_STR (&srch, param_name); + RSPAMD_FTOK_FROM_STR (&lit, "charset"); + + if (rspamd_ftok_equal (&srch, &lit)) { + return cur_part->ct->charset.len > 0; + } + + RSPAMD_FTOK_FROM_STR (&lit, "boundary"); + if (rspamd_ftok_equal (&srch, &lit)) { + return cur_part->ct->orig_boundary.len > 0; + } + + if (cur_part->ct->attrs) { found = g_hash_table_lookup (cur_part->ct->attrs, &srch); if (found) { |