Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
Vsevolod Stakhov c01a88e64c * Add error handling for regexps 14 år sedan
cgi * Add action to form in cgi 14 år sedan
compat * Fix compatibility issues 14 år sedan
conf * Fix lua representing of invalid ip (nil, not 255.255.255.255) 14 år sedan
contrib/exim * Fix issue with folding multiline headers (submitted by Anton Nekhoroshikh). 14 år sedan
doc * Add multimap documentation 14 år sedan
freebsd * Improve reopenlog command in rc script 14 år sedan
perl * Some optimizations to client library 14 år sedan
src * Add error handling for regexps 14 år sedan
test * Fix some problems with TXT records 14 år sedan
utils * Call has_forked method to inform POE about fork 14 år sedan
.hgtags Added tag 0.3.1 for changeset 90c8a471ba4d 14 år sedan
CMakeLists.txt * Adopt foreach for cmake 2.6 14 år sedan
Makefile.in * Add simple utility for sending mail to rspamd 15 år sedan
README-classify.utf8.txt * Use utf8 in description files 15 år sedan
README.en.txt * Rework structure of sample configs 15 år sedan
README.utf8.txt * Add simple html parser and tag balancing detector 15 år sedan
config.h.in * Fix compatibility issues 14 år sedan
rspamc.pl.in * Add ability to assign several actions to one metric 14 år sedan
rspamd.xml.sample * Change metric logic 14 år sedan

README.utf8.txt

API Rspamd.
===========

API rspamd описано подробно в Doxygen документации.

Логика работы фильтров rspamd.
==============================

1) Все фильтры регистрируются в конфиг файле в описании цепочек фильтров:
header_filters=regexp,my_func
где имя фильтра - это либо название c модуля, либо название перл функции
Типы фильтров:
* header_filters - фильтр заголовков
* mime_filters - фильтр для каждой mime части
* message_filters - фильтр всего сообщения целиком
* url_filters - фильтры URL ссылок
Свои результаты фильтры регистрируют при помощи добавления результата в метрику.

2) Метрика - это символьное значение, в котором регистрируют свои результаты фильтры
Существует метрика по умолчанию - "default", в которой регистрируют результаты фильтры,
для которых явно не определена метрика
Для каждой метрики существует специальная функция консолидации, которая рассчитывает коэффициенты
результатов согласно внутренней логике соответствия символов и коэффициентов. По умолчанию такой
функцией является простая сумма, которая настраивается особым образом в конфигурационном файле:

# Блок factors
factors {
# Например, "SURBL_DNS"=5.0
"SYMBOL_NAME" = coefficient;
};
Также для метрики можно зарегистрировать особую функцию, прописав в описании метрики
metric {
name = "test_metric";
function = "some_function";
required_score = 20.0;
};
Пока поддерживаются только перловые функции.

3) Результат - это пара значений: SYMBOL:FLAG, при этом, SYMBOL - это
строчка, характеризующая результат, а FLAG - сработал данный фильтр или нет
(1 или 0). Результат добавляется в метрику, после чего передается функции консолидации.

4) Итог - на выходе мы имеем обработанное сообщение, список метрик и их символов и результаты
проверки.

Протокол.
=========

Формат ответа:
SPAMD/1.1 0 EX_OK
\ / \/
Версия Код
ошибки
Spam: False ; 2 / 5
Это формат совместимости с sa-spamd (без метрик)

Новый формат ответа:
RSPAMD/1.0 0 EX_OK
Metric: Name; Spam_Result; Spam_Mark / Spam_Mark_Required
Metric: Name2 ; Spam_Result2 ; Spam_Mark2 / Spam_Mark_Required2

Заголовков типа metric может быть несколько.
Формат вывода символов:
SYMBOL1, SYMBOL2, SYMBOL3 -- формат совместимости с sa-spamd
Symbol: Name; Param1,Param2,Param3 -- формат rspamd

Формат ответа зависит от формата запроса:
PROCESS SPAMC/1.2
\ / \ /
Команда Версия

SPAMC - протокол совместимости с sa-spamd
RSPAMC - новый протокол rspamd
В любом из режимов работы поддерживаются следующие заголовки:
Content-Length - длина сообщения
Helo - HELO, полученный от клиента
From - MAIL FROM
IP - IP клиента
Recipient-Number - число реципиентов
Rcpt - реципиент
Queue-ID - идентификатор очереди

Эти значения могут использоваться в фильтрах rspamd.

Регулярные выражения
====================

Регулярные выражения разбираются модулем regexp, поэтому их настройка выглядит следующим образом
.module 'regexp' {
SYMBOL = "regexp_expression";
};
header_filters = "regexp";

Обратите внимание, что модуль regexp надо регистрировать как header filter, так как иначе он не будет работать.
Эту проблему надо исправлять, но это не первоочередная задача.

Формат регэкспов такой:
/pattern/flags
При этом может быть такой формат:
headername=/pattern/flags
если регэксп ищет соответствие хедера и выражения
Флаги регэскпов:
i, m, s, x, u, o - такие же, как у perl/pcre
r - "сырой" незакодированный в utf8 regexp
H - ищет по заголовкам
M - ищет по всему сообщению (в "сыром" виде)
P - ищет по всем mime частям
U - ищет по url
X - ищет по "сырым" хедерам (тут нужно учитывать фолдинг и ставить, где надо, /m для multiline матчинга)

Выражение регэкспов может содержать сложные выражения из нескольких регэкспов, операторов логики и скобок:
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})"

Логические выражения rspamd
===========================

Условия, содержащие регулярные выражения, функции, логические операции, скобки, могут использоваться
для задания правил фильтрации. Общие правила работы:
- логическими операциями могут быть логическое "И": '&', логическое "ИЛИ": '|' и логическое отрицание:
'!'.
- приоритет логических операций такой: & и | -> !, для изменения приоритета можно пользоваться скобками:
(A&!B) | !(C|D)
- пробелы в выражениях игнорируются
- операнд, содержащий /re/args или же string=/re/args считается регулярным выражением, внутри регулярного
выражения все символы '/' и '"' должны экранироваться символом '\'. Сам '\' при этом экранировать не нужно.
- операнд, который принимает аргументы, считается функцией, аргументом функции может являться другая функция,
при этом порядок вызова функций-аргументов - справа налево (как это сделано в gcc)
- в rspamd встроен ряд функций:
* header_exists - принимает в качестве аргумента имя хедера, возвращает true, если такой заголовок существует
* compare_parts_distance - принимает в качестве аргумента число от 0 до 100, которое отражает разницу в процентах
между частями письма. Функция работает с сообщениями, содержащими 2 текстовые части (text/plain и text/html) и
возвращает true тогда, когда эти части различаются более чем на n процентов. Если аргумент не указан, то
по умолчанию ищется различие в 100% (полностью разные части).
* compare_transfer_encoding - сравнивает Content-Transfer-Encoding с заданной строкой
* content_type_compare_param - сравнивает параметр content-type заголовка с регулярным выражением или строкой:
content_type_compare_param(Charset, /windows-\d+/)
content_type_compare_param(Charset, ascii)
* content_type_has_param - проверяет, есть ли в заголовке content-type определенный параметр
* content_type_is_subtype - сравнивает подтип content-type с регулярным выражением или строкой
* content_type_is_type - сравнивает тип content-type с регулярным выражением или строкой
content_type_is_type(text)
content_type_is_subtype(/?.html/)
* regexp_match_number - принимает в качестве первого параметра число, которое означает порог сработавших регэкспов и
список регэкспов или функций, которые должны проверяться. Если число сработавших регэкспов или функций больше порога,
функция возвращает TRUE, иначе - FALSE, например:
regexp_match_number(2, ${__RE1}, ${__RE2}, header_exists(Subject))
* has_only_html_part - функция возвращает TRUE, если в сообщении есть только одна HTML часть
* compare_recipients_distance - вычисляет процент схожих получателей письма. Принимает аргумент - порог в процентах похожести.
* is_recipients_sorted - возвращает TRUE, если список получателей сортирован (работает только если число получателей >= 5).
* is_html_balanced - возвращает TRUE, если теги всех html частей сбалансированы
* has_html_tag - возвращает TRUE, если заданный html тег найден

Модуль chartable.
================

Модуль предназначен для поиска слов со смешанными символами, например:
kашa - часть в латинице, а часть в кириллице.
Параметры модуля:

.module 'chartable' {
metric = "default";
symbold = "R_MIXED_CHARSET";
threshold = "0.1";
};

threshold - это отношение переходов между кодировками к общему числу символов в словах, например, имеем слово
"kаша" (первая буква латинская), тогда общее число переходов - 3, а число переходов между кодировками - 1, тогда
отношение - 1/3.

Для включения модуля его необходимо добавить в список mime_filters:
mime_filters = "chartable";