aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2009-03-12 17:58:09 +0300
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2009-03-12 17:58:09 +0300
commit9a0362647374be48a29887d0571b8a665877be6b (patch)
treed2d5de53776d3b1b1faec6cd2254dccf31b81024
parent2003dce62438e513e614056540c22f4f755ec88b (diff)
downloadrspamd-9a0362647374be48a29887d0571b8a665877be6b.tar.gz
rspamd-9a0362647374be48a29887d0571b8a665877be6b.zip
* Some fixes to regexp module
* Add documentation for rspamd regexp module
-rw-r--r--README.utf8.txt33
-rw-r--r--rspamd.conf.sample10
-rw-r--r--src/cfg_utils.c25
-rw-r--r--src/plugins/regexp.c7
-rw-r--r--src/util.c5
5 files changed, 67 insertions, 13 deletions
diff --git a/README.utf8.txt b/README.utf8.txt
index e68b2b2f6..c49da2476 100644
--- a/README.utf8.txt
+++ b/README.utf8.txt
@@ -56,13 +56,13 @@ Spam: False ; 2 / 5
Новый формат ответа:
RSPAMD/1.0 0 EX_OK
-Metric: Name ; Spam_Result ; Spam_Mark / Spam_Mark_Required
+Metric: Name; Spam_Result; Spam_Mark / Spam_Mark_Required
Metric: Name2 ; Spam_Result2 ; Spam_Mark2 / Spam_Mark_Required2
Заголовков типа metric может быть несколько.
Формат вывода символов:
SYMBOL1, SYMBOL2, SYMBOL3 -- формат совместимости с sa-spamd
-Metric: SYMBOL1, SYMBOL2, SYMBOL3 -- формат rspamd
+Symbol: Name; Param1,Param2,Param3 -- формат rspamd
Формат ответа зависит от формата запроса:
PROCESS SPAMC/1.2
@@ -78,5 +78,34 @@ From - MAIL FROM
IP - IP клиента
Recipient-Number - число реципиентов
Rcpt - реципиент
+Queue-ID - идентификатор очереди
Эти значения могут использоваться в фильтрах rspamd.
+
+Регулярные выражения
+====================
+
+Регулярные выражения разбираются модулем regexp, поэтому их настройка выглядит следующим образом
+.module 'regexp' {
+ SYMBOL = "regexp_expression";
+};
+
+Формат регэкспов такой:
+/pattern/flags
+При этом может быть такой формат:
+headername=/pattern/flags
+если регэксп ищет соответствие хедера и выражения
+Флаги регэскпов:
+i, m, s, x, u, o - такие же, как у perl/pcre
+H - ищет по заголовкам
+M - ищет по всему сообщению
+P - ищет по всем mime частям
+U - ищет по url
+Выражение регэкспов может содержать сложные выражения из нескольких регэкспов, операторов логики и скобок:
+SOME_SYMBOL = "To=/blah@blah/H & !(From=/blah@blah/H | Subject=/blah/H)"
+Также можно использовать переменные:
+$to_blah = "To=/blah@blah/H";
+$from_blah = "From=/blah@blah/H";
+$subject_blah = "Subject=/blah/H";
+тогда предыдущее выражение будет таким
+SOME_SYMBOL = "${to_blah} & !(${from_blah} | ${subject_blah})"
diff --git a/rspamd.conf.sample b/rspamd.conf.sample
index 14744c771..f786f7446 100644
--- a/rspamd.conf.sample
+++ b/rspamd.conf.sample
@@ -131,4 +131,14 @@ delivery {
whitelist = "highsecure.ru,freebsd.org";
};
+
+$to_blah = "To=/blah@blah/H";
+$from_blah = "From=/blah@blah/H";
+$subject_blah = "Subject=/blah/H";
+
+.module 'regexp' {
+ BLAH_SYMBOL = "${to_blah} & !(${from_blah} | ${subject_blah})";
+};
+
url_filters = "surbl";
+header_filters = "regexp";
diff --git a/src/cfg_utils.c b/src/cfg_utils.c
index 7efb9390d..3d2ce611c 100644
--- a/src/cfg_utils.c
+++ b/src/cfg_utils.c
@@ -562,6 +562,13 @@ parse_regexp (memory_pool_t *pool, char *line)
GError *err = NULL;
result = memory_pool_alloc0 (pool, sizeof (struct rspamd_regexp));
+ /* Skip whitespaces */
+ while (g_ascii_isspace (*line)) {
+ line ++;
+ }
+ if (line == '\0') {
+ return NULL;
+ }
/* First try to find header name */
begin = strchr (line, '=');
if (begin != NULL) {
@@ -626,26 +633,26 @@ parse_regexp (memory_pool_t *pool, char *line)
break;
/* Type flags */
case 'H':
- if (type != REGEXP_NONE) {
- type = REGEXP_HEADER;
+ if (result->type == REGEXP_NONE) {
+ result->type = REGEXP_HEADER;
}
p ++;
break;
case 'M':
- if (type != REGEXP_NONE) {
- type = REGEXP_MESSAGE;
+ if (result->type == REGEXP_NONE) {
+ result->type = REGEXP_MESSAGE;
}
p ++;
break;
case 'P':
- if (type != REGEXP_NONE) {
- type = REGEXP_MIME;
+ if (result->type == REGEXP_NONE) {
+ result->type = REGEXP_MIME;
}
p ++;
break;
case 'U':
- if (type != REGEXP_NONE) {
- type = REGEXP_URL;
+ if (result->type == REGEXP_NONE) {
+ result->type = REGEXP_URL;
}
p ++;
break;
@@ -656,8 +663,6 @@ parse_regexp (memory_pool_t *pool, char *line)
}
}
- result = memory_pool_alloc (pool, sizeof (struct rspamd_regexp));
- result->type = type;
*end = '\0';
result->regexp = g_regex_new (begin, regexp_flags, 0, &err);
result->regexp_text = memory_pool_strdup (pool, begin);
diff --git a/src/plugins/regexp.c b/src/plugins/regexp.c
index a2079bffa..06da6932f 100644
--- a/src/plugins/regexp.c
+++ b/src/plugins/regexp.c
@@ -68,6 +68,8 @@ regexp_module_init (struct config_file *cfg, struct module_ctx **ctx)
regexp_module_ctx->url_filter = NULL;
regexp_module_ctx->regexp_pool = memory_pool_new (1024);
regexp_module_ctx->items = NULL;
+
+ *ctx = (struct module_ctx *)regexp_module_ctx;
return 0;
}
@@ -141,6 +143,11 @@ process_regexp (struct rspamd_regexp *re, struct worker_task *task)
GList *cur;
struct uri *url;
+ if (re == NULL) {
+ msg_info ("process_regexp: invalid regexp passed");
+ return 0;
+ }
+
switch (re->type) {
case REGEXP_NONE:
return 0;
diff --git a/src/util.c b/src/util.c
index cbe6d9821..a60bafea6 100644
--- a/src/util.c
+++ b/src/util.c
@@ -737,7 +737,10 @@ parse_expression (memory_pool_t *pool, char *line)
/* Copy operand */
str = memory_pool_alloc (pool, p - c + 1);
g_strlcpy (str, c, (p - c + 1));
- insert_expression (pool, &expr, EXPR_OPERAND, 0, str);
+ g_strstrip (str);
+ if (strlen (str) != 0) {
+ insert_expression (pool, &expr, EXPR_OPERAND, 0, str);
+ }
}
if (*p == ')') {
if (stack == NULL) {