diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2009-03-12 17:58:09 +0300 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2009-03-12 17:58:09 +0300 |
commit | 9a0362647374be48a29887d0571b8a665877be6b (patch) | |
tree | d2d5de53776d3b1b1faec6cd2254dccf31b81024 | |
parent | 2003dce62438e513e614056540c22f4f755ec88b (diff) | |
download | rspamd-9a0362647374be48a29887d0571b8a665877be6b.tar.gz rspamd-9a0362647374be48a29887d0571b8a665877be6b.zip |
* Some fixes to regexp module
* Add documentation for rspamd regexp module
-rw-r--r-- | README.utf8.txt | 33 | ||||
-rw-r--r-- | rspamd.conf.sample | 10 | ||||
-rw-r--r-- | src/cfg_utils.c | 25 | ||||
-rw-r--r-- | src/plugins/regexp.c | 7 | ||||
-rw-r--r-- | src/util.c | 5 |
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) { |