aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--rules/regexp/headers.lua3
-rw-r--r--src/libmime/message.h15
-rw-r--r--src/libmime/mime_expressions.c42
-rw-r--r--src/libmime/mime_parser.c25
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)
{