summaryrefslogtreecommitdiffstats
path: root/src/libserver/re_cache.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-04-09 13:18:20 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-04-09 13:18:20 +0100
commit197add7f46d4974a794fa3bacdd1fa6104037466 (patch)
tree3234d59bafb23260102bc4c6dcf085df2f4d4180 /src/libserver/re_cache.c
parenta36ee5a03288e9fabf82778a4a1a197bf0e69327 (diff)
downloadrspamd-197add7f46d4974a794fa3bacdd1fa6104037466.tar.gz
rspamd-197add7f46d4974a794fa3bacdd1fa6104037466.zip
[Feature] Add support of mime headers expressions
Diffstat (limited to 'src/libserver/re_cache.c')
-rw-r--r--src/libserver/re_cache.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/libserver/re_cache.c b/src/libserver/re_cache.c
index 0b416e25e..beb420a73 100644
--- a/src/libserver/re_cache.c
+++ b/src/libserver/re_cache.c
@@ -785,6 +785,46 @@ rspamd_re_cache_exec_re (struct rspamd_task *task,
debug_task ("checking allheader regexp: %s -> %d",
rspamd_regexp_get_pattern (re), ret);
break;
+ case RSPAMD_RE_MIMEHEADER:
+ headerlist = rspamd_message_get_mime_header_array (task,
+ re_class->type_data,
+ is_strong);
+
+ if (headerlist) {
+ scvec = g_malloc (sizeof (*scvec) * headerlist->len);
+ lenvec = g_malloc (sizeof (*lenvec) * headerlist->len);
+
+ for (i = 0; i < headerlist->len; i ++) {
+ rh = g_ptr_array_index (headerlist, i);
+
+ if (re_class->type == RSPAMD_RE_RAWHEADER) {
+ in = rh->value;
+ raw = TRUE;
+ lenvec[i] = strlen (rh->value);
+ }
+ else {
+ in = rh->decoded;
+ /* Validate input */
+ if (!in || !g_utf8_validate (in, -1, &end)) {
+ lenvec[i] = 0;
+ scvec[i] = (guchar *)"";
+ continue;
+ }
+ lenvec[i] = end - in;
+ }
+
+ scvec[i] = (guchar *)in;
+ }
+
+ ret = rspamd_re_cache_process_regexp_data (rt, re,
+ task->task_pool, scvec, lenvec, headerlist->len, raw);
+ debug_task ("checking mime header %s regexp: %s -> %d",
+ re_class->type_data,
+ rspamd_regexp_get_pattern (re), ret);
+ g_free (scvec);
+ g_free (lenvec);
+ }
+ break;
case RSPAMD_RE_MIME:
case RSPAMD_RE_RAWMIME:
/* Iterate through text parts */
@@ -999,6 +1039,9 @@ rspamd_re_cache_type_to_string (enum rspamd_re_type type)
case RSPAMD_RE_RAWHEADER:
ret = "raw header";
break;
+ case RSPAMD_RE_MIMEHEADER:
+ ret = "mime header";
+ break;
case RSPAMD_RE_ALLHEADER:
ret = "all headers";
break;
@@ -1049,6 +1092,9 @@ rspamd_re_cache_type_from_string (const char *str)
else if (strcmp (str, "allheader") == 0) {
ret = RSPAMD_RE_ALLHEADER;
}
+ else if (strcmp (str, "mimeheader") == 0) {
+ ret = RSPAMD_RE_MIMEHEADER;
+ }
}
return ret;