aboutsummaryrefslogtreecommitdiffstats
path: root/src/libmime
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-03-07 11:38:05 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2017-03-07 11:49:17 +0000
commita87070a16587cd02f3c1d3f930186a0e957a098a (patch)
treee5cbf8d28cc058c38eceef0b525b010638c6df2d /src/libmime
parent152f1af776e055b48c0b23754bb1ced6d803b97d (diff)
downloadrspamd-a87070a16587cd02f3c1d3f930186a0e957a098a.tar.gz
rspamd-a87070a16587cd02f3c1d3f930186a0e957a098a.zip
[Fix] Fix parsing of cte in expressions
Diffstat (limited to 'src/libmime')
-rw-r--r--src/libmime/message.h15
-rw-r--r--src/libmime/mime_expressions.c42
-rw-r--r--src/libmime/mime_parser.c25
3 files changed, 48 insertions, 34 deletions
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)
{