]> source.dussan.org Git - rspamd.git/commitdiff
* Some fixes to regexp module
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Thu, 12 Mar 2009 14:58:09 +0000 (17:58 +0300)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Thu, 12 Mar 2009 14:58:09 +0000 (17:58 +0300)
* Add documentation for rspamd regexp module

README.utf8.txt
rspamd.conf.sample
src/cfg_utils.c
src/plugins/regexp.c
src/util.c

index e68b2b2f60bb300d1d6822aeb8aee3e4b889b4e9..c49da2476c276d7094c3513c635cf071684fcd0a 100644 (file)
@@ -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})"
index 14744c77173f4813f609afa7a00f0345580bf066..f786f744672e0845ba5d9da069f6ea27f7f6485c 100644 (file)
@@ -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";
index 7efb9390d764c63ae14a6359d1f844d6aa7aadfa..3d2ce611c3ccad63dc925b46878dfe97eaa42fd0 100644 (file)
@@ -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);
index a2079bffad5416d73bd1d5c1680b1079ea29f82f..06da6932fe1d00f66b07c2d0a8c21acb8b7fc402 100644 (file)
@@ -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;
index cbe6d9821c17befd8ff0eac886289e418637603a..a60bafea66927e47c300a3171d9489779bda3798 100644 (file)
@@ -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) {