summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2011-02-15 15:50:25 +0300
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2011-02-15 15:50:25 +0300
commitb3928c8e33fe8fe7b5d496c6beeb8f66dcdfa104 (patch)
tree32c3f399c6f2627db6106257156d08024881854d
parent97182882b0d460ddd33450aaf82485b998b72115 (diff)
downloadrspamd-b3928c8e33fe8fe7b5d496c6beeb8f66dcdfa104.tar.gz
rspamd-b3928c8e33fe8fe7b5d496c6beeb8f66dcdfa104.zip
Remove some legacy from source tree.
-rw-r--r--README-classify.utf8.txt93
-rw-r--r--README.en.txt170
-rw-r--r--README.utf8.txt180
-rw-r--r--conf/drugs.inc68
-rw-r--r--conf/fraud.inc56
-rw-r--r--conf/headers.inc173
-rw-r--r--conf/html.inc28
-rw-r--r--conf/lotto.inc16
-rwxr-xr-xrspamc.pl.in332
-rw-r--r--src/perl.c261
-rw-r--r--src/perl.h22
11 files changed, 0 insertions, 1399 deletions
diff --git a/README-classify.utf8.txt b/README-classify.utf8.txt
deleted file mode 100644
index 9f3934c90..000000000
--- a/README-classify.utf8.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-Особенности классификации и статистического анализа
-===================================================
-
-В rspamd используется алгоритм ортогональных разреженных биграмм (OSB),
-который основан на следующем принципе:
-
-
- н -----------------------------------
- а -----------------------------------
- б -----------------------------------
- о | w1 | w2 | w3 | w4 | w5 |
- р | | | | | | --> выходные токены
- ы -----------------------------------
- / Текущий набор хешей и весов
- /
-Входные токены
-
-То есть, процесс преобразования можно представить следующим образом:
-для каждого набора весов (w1..w5) составляется набор хешей. Первоначальный
-шаг выглядит так: берем 5 токенов, помещаем их в текущий набор, умножаем на
-веса, складываем, получаем выходной токен. Далее применяем последовательно для каждого
-набора весов. То есть, из одного набора хешей мы получаем число выходных токенов,
-равное числу наборов весов. Далее мы в w1 помещаем новый хеш и сдвигаем w1..w4 на
-1 вправо. С набором хешей w1',w1..w4 проделываем аналогичные операции. И так до
-тех пор, пока входные токены не закончатся. Выходных токенов больше, чем входных,
-в число раз, равное числу наборов весов.
-Сейчас в rspamd для формирования наборов весов используется алгоритм ортогональных
-разреженных биграмм. Число наборов в данном алгоритме равно N=W-1, где W - длина
-набора хешей (окно). Наборы весов формируются следующим образом (для W=5):
-{ 1, 7, 0, 0, 0 },
-{ 3, 0, 13, 0, 0 },
-{ 5, 0, 0, 29, 0 },
-{ 11, 0, 0, 0, 51 },
-
-После этого мы должны вычислить принадлежность потока выходных токенов к некоторому
-классу. Для этого используется алгоритм Winnow.
-
-Here's a quick synopsys of the algorithm:
-Идея алгоритма очень проста:
-1) Каждый возможный входной токен имеет вес 1.0 (то есть, нас интересуют только те
-токены, которые не равны 1.0)
-2) Для обучения проделываем следующие шаги:
- - генерируем набор токенов путем OSB алгоритма
- - удаляем все дупликаты
- - если данный входной набор принадлежит классу (например, спам или неспам), то умножаем вес
- каждого встреченного токена на т.н. Promotion Constant, которая равна 1,23
- - если данный входной набор не принадлежит классу, то умножаем каждый найденный токен на
- Demotion Constant в данном классе, которая равна 0,83
- - абсолютно неважно, сколько раз встречался данный токен во входном потоке, мы его умножаем
- на promotion или demotion только один раз
-3) Для классификации потока мы поступаем следующим образом:
- - генерируем набор токенов путем OSB алгоритма
- - удаляем все дупликаты
- - суммируем веса всех токенов, найденных в каждом из файлов данных статистики (при этом те токены,
- которые мы не нашли, имеют вес 1)
- - затем мы делим полученную сумму на число токенов и смотрим, какой из классов (файлов данных) набрал
- больше очков и делаем заключение о принадлежности входного текста к классу
-
-Файлы данных статистики представляют собой следующие структуры:
-{
-Header,
-{ feature_block1..feature_blockN }
-}
-Заголовок файла очень прост:
-struct {
- char magic[3] = { 'r', 's', 'd' };
- u_char version[2] = { '1', '0' };
- uint64_t create_time;
-}
-Каждый feature_block состоит из 4-х полей:
-struct {
- uint32_t hash1;
- uint32_t hash2;
- uint32_t value; /* На самом деле это float */
- uint32_t last_access;
-}
-Итого 16 байт на каждый feature. 0-е значения показывают свободную ячейку.
-Значение hash1 используется в качестве индекса:
-idx = hash1 % filesize;
-Где filesize - размер в количестве feature_block'ов. При этом данный токен
-должен помещаться в заданную ячейку или ячейку за ним. При этом образуется
-цепочка токенов:
-
-idx
- \
-| занят | занят | занят | свободен |
- \-----^ \-----^ \-----^
-При этом, длина такой цепочки должна быть лимитирована некоторым разумным числом,
-например 128. Тогда максимальное время доступа будет не более 128-и итераций.
-Если мы не нашли за 128 итераций свободную ячейку, то мы можем поместить новый токен
-на место того, который меньше всего использовался (min (last_access)). При этом
-при доступе к ячейке необходимо обновлять last_access: last_access = now - creation_time.
-Такая организация позволяет замещать только наименее используемые токены.
diff --git a/README.en.txt b/README.en.txt
deleted file mode 100644
index 2bfd33faf..000000000
--- a/README.en.txt
+++ /dev/null
@@ -1,170 +0,0 @@
-API.
-===========
-
-API of rspamd is described in Doxygen documentation.
-
-Logic of operation of rspamd filters.
-==============================
-
-1) All filters are registered in a config a file in the description of chains of filters:
-header_filters = "regexp, my_func"
-Where the filter name is or the name c the unit, or the name of script (lua or perl) function
-Types of filters:
-* header_filters - the filters of headers
-* mime_filters - the filters for every mime part
-* message_filters - the filters of message without mime parsing
-* url_filters - filters of URLs in messages
-
-Filter register their results in metrics.
-
-2) The Metric is a character value in which filters register their results.
-There is a metrics by default - "default".
-For each metrics there is a special function of consolidation which calculates coefficients
-of results according to the internal logic of correspondence of characters and coefficients.
-By default the such function is the simple sum that can be configured in a configuration file:
-
-# the Block factors
-factors {
- # For example, "SURBL_DNS" =5.0
- "SYMBOL_NAME" = coefficient;
-};
-
-Also for the metrics it is possible to register special consolidation function:
-
-metric {
- name = "test_metric";
- function = "some_function";
- required_score = 20.0;
-};
-
-
-The protocol.
-=========
-
-Answer format:
-SPAMD/1.1 0 EX_OK
- \/ \/ \/
- Version Code Errors
-Spam: False; 2 / 5
-It is a format of compatibility with sa-spamd (without metrics)
-
-New format of the answer:
-RSPAMD/1.0 0 EX_OK
-Metric: Name; Spam_Result; Spam_Mark / Spam_Mark_Required
-Metric: Name2; Spam_Result2; Spam_Mark2 / Spam_Mark_Required2
-
-Type headers metric can be a little.
-Format of output of characters:
-SYMBOL1, SYMBOL2, SYMBOL3 - a format of compatibility with sa-spamd
-Symbol: Name; Param1, Param2, Param3 - a format rspamd
-
-The answer format:
-PROCESS SPAMC/1.2
-\/ \/
-Command Version
-
-SPAMC - the protocol of compatibility with sa-spamd
-RSPAMC - new rspamd protocol
-In any of operating modes following headers are supported:
-Content-Length - Length of the message
-Helo - HELO, received from the client
-From - MAIL FROM
-IP - IP of the client
-Recipient-Number - Number of recipients
-Rcpt - the recipient
-Queue-ID - The queue identifier
-
-These values can be used in filters rspamd.
-
-Regular expressions
-====================
-
-Regular expressions are described in regexp module
-.module ' regexp ' {
- SYMBOL = "regexp_expression";
-};
-header_filters = "regexp";
-
-Format of regular expression:
-"/pattern/flags"
-Also for header lines there is special regexp line:
-headername =/pattern/flags
-
-Flags of regexp:
-i, m, s, x, u, o - same, as at perl/pcre
-r - raw not coded in utf8 regexp
-H - searches for a header
-M - searches in undecoded message
-P - searches in decoded mime parts
-U - searches in urls
-X - searches in undecoded headers
-
-Expression can contain regular expressions, functions, operators of logic and brackets:
-SOME_SYMBOL = "To =/blah@blah/H AND! (From =/blah@blah/H | Subject =/blah/H)"
-
-Also it is possible to use variables:
-$to_blah = "To =/blah@blah/H";
-$from_blah = "From =/blah@blah/H";
-$subject_blah = "Subject =/blah/H";
-
-Then the previous expression will be such:
-
-SOME_SYMBOL = "$ {to_blah} AND! ($ {from_blah} | $ {subject_blah})"
-
-Logic expressions rspamd
-===========================
-
-Expressions containing regular expressions, functions, logic operations, brackets, can be used
-for the filtering. General rules:
-- Logic operations can be boolean "And": ' & ', boolean "OR": ' | ' and boolean negation: '! '.
-- A priority of logic operations: &| -> !, for priority change it is possible to use brackets:
- (A AND! B) |! (C|D)
-- Space symbols in expressions are ignored
-- The operand containing/re/args or string =/re/args is considered regular expression, in regular
-expressions all symbols ' / ' and ' "' should be escaped by a symbol ' \', but symbol '\' is not need to be escaped.
-- The operand which accepts arguments, is considered function. Arguments of function can be expressions, regexps or other functions.
-Arguments in function are evaluated from left to right.
-- There is a number of built-in functions:
- * header_exists - accepts header's name as argument, returns true if such heading exists
- * compare_parts_distance - accepts as argument number from 0 to 100 which reflects a difference in percentage
- between letter parts. Function works with the messages containing 2 text parts (text/plain and text/html) and
- returns true when these parts differ more than on N percent. If the argument is not specified,
- function searches for completely different parts.
- * compare_transfer_encoding - compares Content-Transfer-Encoding with the argument
- * content_type_compare_param - compares Content-Type param with regular expression or line:
- content_type_compare_param (Charset,/windows-\d +/)
- content_type_compare_param (Charset, ascii)
- * content_type_has_param - checks for specified Content-Type parameter
- * content_type_is_subtype - compares a subtype of content-type to regular expression or line
- * content_type_is_type - compares type of content-type to regular expression or line
- content_type_is_type (text)
- content_type_is_subtype (/?.html/)
- * regexp_match_number - accepts as the number of matched expressions as first parameter number and list of expressions.
- If the number of matched expressions is more than first argument function returns TRUE, for example:
- regexp_match_number (2, $ {__ RE1}, $ {__ RE2}, header_exists (Subject))
- * has_only_html_part - function returns TRUE if there is only HTML part in the message
- * compare_recipients_distance - calculates percent of similar recipients of the message. Accepts argument - a threshold in
- percentage of similar recipients.
- * is_recipients_sorted - returns TRUE if the list of addressees is sorted (works only if the number of addressees> = 5).
- * is_html_balanced - returns TRUE if tags in all html parts are balanced
- * has_html_tag - returns TRUE if specified html tag is found
-
-The module chartable.
-================
-
-The module is intended for search of words with the mixed symbols, for example:
-kашa - a part in a Latin, and a part in Cyrillics.
-Module parametres:
-
-.module ' chartable ' {
- metric = "default";
- symbold = "R_MIXED_CHARSET";
- threshold = "0.1";
-};
-
-threshold is a relation of transitions between codings to total number of symbols in words, for example, we have a word
-"kаша" (the first letter Latin), then total number of transitions - 3, and number of transitions between codings - 1, then
-The relation - 1/3.
-
-For inclusion of the module he is necessary for adding in the list mime_filters:
-mime_filters = "chartable";
diff --git a/README.utf8.txt b/README.utf8.txt
deleted file mode 100644
index b27e2876f..000000000
--- a/README.utf8.txt
+++ /dev/null
@@ -1,180 +0,0 @@
-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";
diff --git a/conf/drugs.inc b/conf/drugs.inc
deleted file mode 100644
index 444bc8596..000000000
--- a/conf/drugs.inc
+++ /dev/null
@@ -1,68 +0,0 @@
-# Rspamd variables for drugs emails
-
-$__DRUGS_DIET1="/(?:\b|\s)[_\W]{0,3}p[_\W]{0,3}h[_\W]{0,3}[e3\xE8-\xEB][_\W]{0,3}n[_\W]{0,3}t[_\W]{0,3}[e3\xE8-\xEB][_\W]{0,3}r[_\W]{0,3}m[_\W]{0,3}[i1!|l\xEC-\xEF][_\W]{0,3}n[_\W]{0,3}[e3\xE8-\xEB][_\W]{0,3}(?:\b|\s)/irP";
-$__DRUGS_DIET2="/(?:\b|\s)_{0,3}[i1!|l\xEC-\xEF][_\W]?o[_\W]?n[_\W]?[a4\xE0-\xE6@][_\W]?m[_\W]?[i1!|l\xEC-\xEF][_\W]?n_{0,3}\b/irP";
-$__DRUGS_DIET3="/\bbontril\b/irP";
-$__DRUGS_DIET4="/\bphendimetrazine\b/irP";
-$__DRUGS_DIET5="/\bdiethylpropion\b/irP";
-$__DRUGS_DIET6="/(?:\b|\s)[_\W]{0,3}M[_\W]{0,3}[e3\xE8-\xEB][_\W]{0,3}r[_\W]{0,3}[i1!|l\xEC-\xEF][_\W]{0,3}d[_\W]{0,3}[i1!|l\xEC-\xEF][_\W]{0,3}[a4\xE0-\xE6@][_\W]{0,3}(?:\b|\s)/irP";
-$__DRUGS_DIET7="/\b_{0,3}t[_\W]?[e3\xE8-\xEB][_\W]?n[_\W]?u[_\W]?a[_\W]?t[_\W]?[e3\xE8-\xEB]_{0,3}(?:\b|\s)/irP";
-$__DRUGS_DIET8="/\b_{0,3}d[_\W]?[i1!|l\xEC-\xEF][_\W]?d[_\W]?r[_\W][e3\xE8-\xEB[_\W]?xx?_{0,3}\b/irP";
-$__DRUGS_DIET9="/\b_{0,3}a[_\W]?d[_\W]?[i1!|l\xEC-\xEF][_\W]?p[_\W]?[e3\xE8-\xEB][_\W]?x_{0,3}\b/irP";
-$__DRUGS_DIET10="/\b_{0,3}x?x[_\W]?[e3\xE8-\xEB][_\W]?n[_\W]?[i1!|l\xEC-\xEF][_\W]?c[_\W]?[a4\xE0-\xE6@][_\W]?l_{0,3}\b/irP";
-$DRUGS_DIET="(${R_UNDISC_RCPT} | ${R_BAD_CTE_7BIT} | ${R_NO_SPACE_IN_FROM}) & (${__DRUGS_DIET1} | ${__DRUGS_DIET2} | ${__DRUGS_DIET3} | ${__DRUGS_DIET4} | ${__DRUGS_DIET5} | ${__DRUGS_DIET6} | ${__DRUGS_DIET7} | ${__DRUGS_DIET8} | ${__DRUGS_DIET9} | ${__DRUGS_DIET10})";
-
-$__DRUGS_ERECTILE1="/(?:\b|\s)[_\W]{0,3}(?:\\\/|V)[_\W]{0,3}[ij1!|l\xEC\xED\xEE\xEF][_\W]{0,3}[a40\xE0-\xE6@][_\W]{0,3}[xyz]?[gj][_\W]{0,3}r[_\W]{0,3}[a40\xE0-\xE6@][_\W]{0,3}x?[_\W]{0,3}(?:\b|\s)/irP";
-$__DRUGS_ERECTILE2="/\bV(?:agira|igara|iaggra|iaegra)\b/irP";
-$__DRUGS_ERECTILE3="/(?:\A|[\s\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f])[_\W]{0,3}C[_\W]{0,3}[ij1!|l\xEC\xED\xEE\xEF][_\W]{0,3}[a4\xE0-\xE6@][_\W]{0,3}l?[l!|1][_\W]{0,3}[i1!|l\xEC-\xEF][_\W]{0,3}s[_\W]{0,3}(?:\b|\s)/irP";
-$__DRUGS_ERECTILE4="/\bC(?:alis|ilias|ilais)\b/irP";
-$__DRUGS_ERECTILE5="/\b_{0,3}s[_\W]?[i1!|l\xEC-\xEF][_\W]?l[_\W]?d[_\W]?[e3\xE8-\xEB][_\W]?n[_\W]?[a4\xE0-\xE6@][_\W]?f[_\W]?[i1!|l\xEC-\xEF][_\W]?l c[_\W]?[i1!|l\xEC-\xEF][_\W]?t[_\W]?r[_\W]?[a4\xE0-\xE6@][_\W]?t[_\W]?[e3\xE8-\xEB]_{0,3}(?:\b|\s)/irP";
-$__DRUGS_ERECTILE6="/\b_{0,3}L[_\W]?[e3\xE8-\xEB][_\W]?(?:\\\/|V)[_\W]?[i1!|l\xEC-\xEF][_\W]?t[_\W]?r[_\W]?[a4\xE0-\xE6@][_\W]?(?:\b|\s)/irP";
-$__DRUGS_ERECTILE8="/\b_{0,3}T[_\W]?[a4\xE0-\xE6@][_\W]?d[_\W]?[a4\xE0-\xE6@][_\W]?l[_\W]?[a4\xE0-\xE6@][_\W]?f[_\W]?[i1!|l\xEC-\xEF][_\W]?l_{0,3}\b/irP";
-$__DRUGS_ERECTILE10="/\b_{0,3}V[_\W]?(?:i|\&iuml\;)[_\W]?(?:a|\&agrave|\&aring)\;?[_\W]?g[_\W]?r[_\W]?(?:a|\&agrave|\&aring)\b/irP";
-$__DRUGS_ERECTILE11="/(?:\b|\s)_{0,3}[a4\xE0-\xE6@][_\W]{0,3}p[_\W]{0,3}c[_\W]{0,3}[a4\xE0-\xE6@][_\W]{0,3}[l!|1][_\W]{0,3}[i1!|l\xEC-\xEF][_\W]{0,3}s_{0,3}\b/irP";
-$DRUGS_ERECTILE="(${R_UNDISC_RCPT} | ${R_BAD_CTE_7BIT} | ${R_NO_SPACE_IN_FROM}) & (${__DRUGS_ERECTILE1} | ${__DRUGS_ERECTILE2} | ${__DRUGS_ERECTILE3} | ${__DRUGS_ERECTILE4} | ${__DRUGS_ERECTILE5} | ${__DRUGS_ERECTILE6} | ${__DRUGS_ERECTILE8} | ${__DRUGS_ERECTILE10} | ${__DRUGS_ERECTILE11})";
-
-$__DRUGS_ANXIETY1="/(?:\b|\s)[_\W]{0,3}x?x[_\W]{0,3}[a4\xE0-\xE6@][_\W]{0,3}n[_\W]{0,3}[ea4\xE1\xE2\xE3@][_\W]{0,3}xx?_{0,3}\b/irP";
-$__DRUGS_ANXIETY2="/\bAlprazolam\b/irP";
-$__DRUGS_ANXIETY3="/(?:\b|\s)[_\W]{0,3}(?:\\\/|V)[_\W]{0,3}[a4\xE0-\xE6@][_\W]{0,3}[l|][_\W]{0,3}[i1!|l\xEC-\xEF][_\W]{0,3}[u\xB5\xF9-\xFC][_\W]{0,3}m\b/irP";
-$__DRUGS_ANXIETY4="/\b_{0,3}D[_\W]?[i1!|l\xEC-\xEF][_\W]?[a4\xE0-\xE6@][_\W]?z[_\W]?[ea3\xE9\xEA\xEB][_\W]?p[_\W]?[a4\xE0-\xE6@][_\W]?m_{0,3}\b/irP";
-$__DRUGS_ANXIETY5="/(?:\b|\s)[a4\xE0-\xE6@][_\W]?t[_\W]?[i1!|l\xEC-\xEF][_\W]?v[_\W]?[a4\xE0-\xE6@][_\W]?n_{0,3}\b/irP";
-$__DRUGS_ANXIETY6="/\b_{0,3}l[_\W]?[o0\xF2-\xF6][_\W]?r[_\W]?[a4\xE0-\xE6@][_\W]?z[_\W]?[e3\xE8-\xEB][_\W]?p[_\W]?[a4\xE0-\xE6@][_\W]?m_{0,3}\b/irP";
-$__DRUGS_ANXIETY7="/\b_{0,3}c[_\W]?l[_\W]?[o0\xF2-\xF6][_\W]?n[_\W]?[a4\xE0-\xE6@][_\W]?z[_\W]?e[_\W]?p[_\W]?[a4\xE0-\xE6@][_\W]?m\b/irP";
-$__DRUGS_ANXIETY8="/\bklonopin\b/irP";
-$__DRUGS_ANXIETY9="/\brivotril\b/irP";
-$DRUGS_ANXIETY="(${R_UNDISC_RCPT} | ${R_BAD_CTE_7BIT} | ${R_NO_SPACE_IN_FROM}) & (${__DRUGS_ANXIETY1} | ${__DRUGS_ANXIETY2} | ${__DRUGS_ANXIETY3} | ${__DRUGS_ANXIETY4} | ${__DRUGS_ANXIETY5} | ${__DRUGS_ANXIETY6} | ${__DRUGS_ANXIETY7} | ${__DRUGS_ANXIETY8} | ${__DRUGS_ANXIETY9})";
-$DRUGS_ANXIETY_EREC="${DRUGS_ERECTILE} & ${DRUGS_ANXIETY}";
-
-$__DRUGS_PAIN1="/\b_{0,3}h[_\W]?y[_\W]?d[_\W]?r[_\W]?[o0\xF2-\xF6][_\W]?c[_\W]?[o0\xF2-\xF6][_\W]?d[_\W]?[o0\xF2-\xF6][_\W]?n[_\W]?e_{0,3}\b/irP";
-$__DRUGS_PAIN2="/\b_{0,3}c[o0\xF2-\xF6]deine_{0,3}\b/irP";
-$__DRUGS_PAIN3="/(?:\b|\s)[_\W]{0,3}[u\xB5\xF9-\xFC][_\W]{0,3}l[_\W]{0,3}t[_\W]{0,3}r[_\W]{0,3}[a4\xE0-\xE6@][_\W]{0,3}m_{0,3}\b/irP";
-$__DRUGS_PAIN4="/(?:\b|\s)[_\W]{0,3}(?:\\\/|V)[_\W]{0,3}[i1!|l\xEC-\xEF][_\W]{0,3}c[_\W]{0,3}[o0\xF2-\xF6][_\W]{0,3}d[_\W]{0,3}[i1!|l\xEC-\xEF][_\W]{0,3}ns?[_\W]{0,3}(?:\b|\s)/irP";
-$__DRUGS_PAIN5="/\b_{0,3}t[_\W]?r[_\W]?[a4\xE0-\xE6@][_\W]?m[_\W]?[a4\xE0-\xE6@][_\W]?d[_\W]?[o0\xF2-\xF6][_\W]?[l!|1]_{0,3}\b/irP";
-$__DRUGS_PAIN6="/\b_{0,3}u[_\W]?l[_\W]?t[_\W]?r[_\W]?a[_\W]?c[_\W]?e[_\W]?t_{0,3}\b/irP";
-$__DRUGS_PAIN7="/\b_{0,3}f[_\W]?[i1!|l\xEC-\xEF][_\W]?[o0\xF2-\xF6][_\W]?r[_\W]?[i1!|l\xEC-\xEF][_\W]?c[_\W]?[e3\xE8-\xEB][_\W]?[t7]_{0,3}\b/irP";
-$__DRUGS_PAIN8="/\b_{0,3}c[_\W]?[e3\xE8-\xEB][_\W]?l[_\W]?[e3\xE8-\xEB][_\W]?b[_\W]?r[_\W]?[e3\xE8-\xEB][_\W]?x_{0,3}\b/irP";
-$__DRUGS_PAIN9="/(?:\b|\s)_{0,3}[i1!|l\xEC-\xEF]m[i1!|l\xEC-\xEF]tr[e3\xE8-\xEB]x_{0,3}\b/irP";
-$__DRUGS_PAIN10="/(?:\b|\s)[_\W]{0,3}(?:\\\/|V)[_\W]{0,3}[i1!|l\xEC-\xEF][_\W]{0,3}[o0\xF2-\xF6][_\W]{0,3}x[_\W]{0,3}xx?_{0,3}\b/irP";
-$__DRUGS_PAIN11="/\bzebutal\b/irP";
-$__DRUGS_PAIN12="/\besgic plus\b/irP";
-$__DRUGS_PAIN13="/\bD[_\W]?[a4\xE0-\xE6@][_\W]?r[_\W]?v[_\W]?[o0\xF2-\xF6][_\W]?n\b/irP";
-$__DRUGS_PAIN14="/N[o0\xF2-\xF6]rc[o0\xF2-\xF6]/irP";
-$__DRUGS_PAIN="(${R_UNDISC_RCPT} | ${R_BAD_CTE_7BIT} | ${R_NO_SPACE_IN_FROM}) & (${__DRUGS_PAIN1} | ${__DRUGS_PAIN2} | ${__DRUGS_PAIN3} | ${__DRUGS_PAIN4} | ${__DRUGS_PAIN5} | ${__DRUGS_PAIN6} | ${__DRUGS_PAIN7} | ${__DRUGS_PAIN8} | ${__DRUGS_PAIN9} | ${__DRUGS_PAIN10} | ${__DRUGS_PAIN11} | ${__DRUGS_PAIN12} || ${__DRUGS_PAIN13} | ${__DRUGS_PAIN14})";
-
-$__DRUGS_SLEEP1="/(?:\b|\s)[_\W]{0,3}[a4\xE0-\xE6@][_\W]{0,3}m[_\W]{0,3}b[_\W]{0,3}[i1!|l\xEC-\xEF][_\W]{0,3}[e3\xE8-\xEB][_\W]{0,3}n[_\W]{0,3}(?:\b|\s)/irP";
-$__DRUGS_SLEEP2="/(?:\b|\s)[_\W]{0,3}S[_\W]{0,3}[o0\xF2-\xF6][_\W]{0,3}n[_\W]{0,3}[a4\xE0-\xE6@][_\W]{0,3}t[_\W]{0,3}[a4\xE0-\xE6@][_\W]{0,3}(?:\b|\s)/irP";
-$__DRUGS_SLEEP3="/\b_{0,3}R[_\W]?[e3\xE8-\xEB][_\W]?s[_\W]?t[_\W]?[o0\xF2-\xF6][_\W]?r[_\W]?i[_\W]?l_{0,3}\b/irP";
-$__DRUGS_SLEEP4="/\b_{0,3}H[_\W]?[a4\xE0-\xE6@][_\W]?l[_\W]?c[_\W]?i[_\W]?[o0\xF2-\xF6][_\W]?n_{0,3}\b/irP";
-$__DRUGS_SLEEP="${__DRUGS_SLEEP1} | ${__DRUGS_SLEEP2} | ${__DRUGS_SLEEP3} | ${__DRUGS_SLEEP4}";
-
-$__DRUGS_MUSCLE1="/(?:\b|\s)[_\W]{0,3}s[_\W]{0,3}[o0\xF2-\xF6][_\W]{0,3}m[_\W]{0,3}[a4\xE0-\xE6@][_\W]{0,3}(?:\b|\s)/irP";
-$__DRUGS_MUSCLE2="/\b_{0,3}cycl[o0\xF2-\xF6]b[e3\xE8-\xEB]nz[a4\xE0-\xE6@]pr[i1!|l\xEC-\xEF]n[e3\xE8-\xEB]_{0,3}(?:\b|\s)/irP";
-$__DRUGS_MUSCLE3="/\b_{0,3}f[_\W]?l[_\W]?[e3\xE8-\xEB][_\W]?x[_\W]?[e3\xE8-\xEB][_\W]?r[_\W]?[i1!|l\xEC-\xEF]_{0,3}[_\W]?l_{0,3}\b/irP";
-$__DRUGS_MUSCLE4="/\b_{0,3}z[_\W]?a[_\W]?n[_\W]?a[_\W]?f[_\W]?l[_\W]?e[_\W]?x_{0,3}\b/irP";
-$__DRUGS_MUSCLE5="/\bskelaxin\b/irP";
-$DRUGS_MUSCLE="(${R_UNDISC_RCPT} | ${R_BAD_CTE_7BIT} | ${R_NO_SPACE_IN_FROM}) & (${__DRUGS_MUSCLE1} | ${__DRUGS_MUSCLE2} | ${__DRUGS_MUSCLE3} | ${__DRUGS_MUSCLE4} | ${__DRUGS_MUSCLE5})";
-
-$DRUGS_MANYKINDS="(${R_UNDISC_RCPT} | ${R_BAD_CTE_7BIT} | ${R_NO_SPACE_IN_FROM}) & regexp_match_number(3, ${DRUGS_ERECTILE}, ${DRUGS_DIET}, ${__DRUGS_PAIN}, ${__DRUGS_SLEEP}, ${DRUGS_MUSCLE}, ${DRUGS_ANXIETY})";
-
diff --git a/conf/fraud.inc b/conf/fraud.inc
deleted file mode 100644
index 2c52471a1..000000000
--- a/conf/fraud.inc
+++ /dev/null
@@ -1,56 +0,0 @@
-# Advance fee spam
-
-$__FRAUD_DBI="/(?:\bdollars?\b|\busd(?:ollars)?(?:[0-9]|\b)|\bus\$|\$[0-9,.]{6,}|\$[0-9].{0,8}[mb]illion|\$[0-9.,]{2,10} ?m|\beuros?\b|u[.]?s[.]? [0-9.]+ m)/irP";
-$__FRAUD_KJV="/(?:claim|concerning) (?:the|this) money/irP";
-$__FRAUD_IRJ="/(?:finance|holding|securit(?:ies|y)) (?:company|firm|storage house)/irP";
-$__FRAUD_NEB="/(?:government|bank) of nigeria/irP";
-$__FRAUD_XJR="/(?:who was a|as a|an? honest|you being a|to any) foreigner/irP";
-$__FRAUD_DPR="/\b(?:(?:respond|reply) (?:urgently|immediately)|(?:urgent|immediate|earliest) (?:reply|response))\b/irP";
-$__FRAUD_PTS="/\b(?:ass?ass?inat(?:ed|ion)|murder(?:e?d)?|kill(?:ed|ing)\b[^.]{0,99}\b(?:war veterans|rebels?))\b/irP";
-$__FRAUD_BEP="/\b(?:bank of nigeria|central bank of|trust bank|apex bank|amalgamated bank)\b/irP";
-$__FRAUD_TDP="/\b(?:business partner(?:s|ship)?|silent partner(?:s|ship)?)\b/irP";
-$__FRAUD_GAN="/\b(?:charles taylor|serena|abacha|gu[eéè]i|sese[- ]?seko|kabila)\b/irP";
-$__FRAUD_IRT="/\b(?:compliments? of the|dear friend|dear sir|yours faithfully|season'?s greetings)\b/irP";
-$__FRAUD_AON="/\b(?:confidential|private|alternate|alternative) (?:(?:e-? *)?mail)\b/irP";
-$__FRAUD_WNY="/\b(?:disburse?(?:ment)?|incurr?(?:ed)?|remunerr?at(?:ed?|ion)|remm?itt?(?:ed|ance|ing)?)\b/irP";
-$__FRAUD_IPK="/\b(?:in|to|visit) your country\b/irP";
-$__FRAUD_QXX="/\b(?:my name is|i am) (?:mrs?|engr|barrister|dr|prince(?:ss)?)[. ]/irP";
-$__FRAUD_IOU="/\b(?:no risks?|risk-? *free|free of risks?|100% safe)\b/irP";
-$__FRAUD_EZY="/\b(?:of|the) late president\b/irP";
-$__FRAUD_MLY="/\b(?:reply|respond)\b[^.]{0,50}\b(?:to|through)\b[^.]{0,50}\@\b/irP";
-$__FRAUD_ZFJ="/\b(?:wife|son|brother|daughter) of the late\b/irP";
-$__FRAUD_KDT="/\bU\.?S\.?(?:D\.?)?\s*(?:\$\s*)?(?:\d+,\d+,\d+|\d+\.\d+\.\d+|\d+(?:\.\d+)?\s*milli?on)/irP";
-$__FRAUD_ULK="/\baffidavits?\b/irP";
-$__FRAUD_BGP="/\battached to ticket number\b/irP";
-$__FRAUD_FBI="/\bdisburs/irP";
-$__FRAUD_JBU="/\bforeign account\b/irP";
-$__FRAUD_YWW="/\bfurnish you with\b/irP";
-$__FRAUD_JYG="/\bgive\s+you .{0,15}(?:fund|money|total|sum|contact|percent)\b/irP";
-$__FRAUD_XVW="/\bhonest cooperation\b/irP";
-$__FRAUD_UUY="/\blegitimate business(?:es)?\b/irP";
-$__FRAUD_SNT="/\blocate(?: .{1,20})? extended relative/irP";
-$__FRAUD_LTX="/\bmilli?on (?:.{1,25} thousand\s*)?(?:(?:united states|u\.?s\.?) dollars|(?i:U\.?S\.?D?))\b/irP";
-$__FRAUD_JNB="/\boperat(?:e|ing)\b[^.]{0,99}\b(?:for(?:ei|ie)gn|off-? ?shore|over-? ?seas?) (?:bank )?accounts?\b/irP";
-$__FRAUD_QFY="/\bover-? *(?:invoiced?|cost(?:s|ing)?)\b/irP";
-$__FRAUD_WDR="/\bprivate lawyer\b/irP";
-$__FRAUD_WFC="/\bsecur(?:e|ing) (?:the )?(?:funds?|monies)\b/irP";
-$__FRAUD_AUM="/\bthe desk of\b/irP";
-$__FRAUD_MCQ="/\btransaction\b.{1,30}\b(?:magnitude|diplomatic|strict|absolute|secret|confiden(?:tial|ce)|guarantee)/irP";
-$__FRAUD_ETX="/\byour\b[^.]{0,99}\b(?:contact (?:details|information)|private (?:e?[- ]?mail|telephone|tel|phone|fax))\b/irP";
-$__FRAUD_PVN="/as the beneficiary/irP";
-$__FRAUD_FVU="/award notification/irP";
-$__FRAUD_CKF="/computer ballot system/irP";
-$__FRAUD_FCW="/fiduciary agent/irP";
-$__FRAUD_MQO="/foreign (?:business partner|customer)/irP";
-$__FRAUD_TCC="/foreign (?:offshore )?(?:bank|account)/irP";
-$__FRAUD_GBW="/god gives .{1,10}second chance/irP";
-$__FRAUD_NRG="/i am contacting you/irP";
-$__FRAUD_RLX="/lott(?:o|ery) (?:co,?ordinator|international)/irP";
-$__FRAUD_AXF="/magnanimity/irP";
-$__FRAUD_THJ="/modalit(?:y|ies)/irP";
-$__FRAUD_YQV="/nigerian? (?:national|government)/irP";
-$__FRAUD_YJA="/over-invoice/irP";
-$__FRAUD_YPO="/the total sum/irP";
-$__FRAUD_UOQ="/vital documents/irP";
-$ADVANCE_FEE_2="(${R_UNDISC_RCPT} | ${R_BAD_CTE_7BIT} | ${R_NO_SPACE_IN_FROM}) & regexp_match_number(2, ${__FRAUD_KJV}, ${__FRAUD_IRJ}, ${__FRAUD_NEB}, ${__FRAUD_XJR}, ${__FRAUD_EZY}, ${__FRAUD_ZFJ}, ${__FRAUD_KDT}, ${__FRAUD_BGP}, ${__FRAUD_FBI}, ${__FRAUD_JBU}, ${__FRAUD_JYG}, ${__FRAUD_XVW}, ${__FRAUD_SNT}, ${__FRAUD_LTX}, ${__FRAUD_MCQ}, ${__FRAUD_PVN}, ${__FRAUD_FVU}, ${__FRAUD_CKF}, ${__FRAUD_FCW}, ${__FRAUD_MQO}, ${__FRAUD_TCC}, ${__FRAUD_GBW}, ${__FRAUD_NRG}, ${__FRAUD_RLX}, ${__FRAUD_AXF}, ${__FRAUD_THJ}, ${__FRAUD_YQV}, ${__FRAUD_YJA}, ${__FRAUD_YPO}, ${__FRAUD_UOQ}, ${__FRAUD_DBI}, ${__FRAUD_BEP}, ${__FRAUD_DPR}, ${__FRAUD_QXX}, ${__FRAUD_QFY}, ${__FRAUD_PTS}, ${__FRAUD_TDP}, ${__FRAUD_GAN}, ${__FRAUD_IPK}, ${__FRAUD_AON}, ${__FRAUD_WNY}, ${__FRAUD_AUM}, ${__FRAUD_WFC}, ${__FRAUD_YWW}, ${__FRAUD_ULK}, ${__FRAUD_IOU}, ${__FRAUD_JNB}, ${__FRAUD_IRT}, ${__FRAUD_ETX}, ${__FRAUD_WDR}, ${__FRAUD_UUY}, ${__FRAUD_MLY})";
-$ADVANCE_FEE_3="(${R_UNDISC_RCPT} | ${R_BAD_CTE_7BIT} | ${R_NO_SPACE_IN_FROM}) & regexp_match_number(3, ${__FRAUD_KJV}, ${__FRAUD_IRJ}, ${__FRAUD_NEB}, ${__FRAUD_XJR}, ${__FRAUD_EZY}, ${__FRAUD_ZFJ}, ${__FRAUD_KDT}, ${__FRAUD_BGP}, ${__FRAUD_FBI}, ${__FRAUD_JBU}, ${__FRAUD_JYG}, ${__FRAUD_XVW}, ${__FRAUD_SNT}, ${__FRAUD_LTX}, ${__FRAUD_MCQ}, ${__FRAUD_PVN}, ${__FRAUD_FVU}, ${__FRAUD_CKF}, ${__FRAUD_FCW}, ${__FRAUD_MQO}, ${__FRAUD_TCC}, ${__FRAUD_GBW}, ${__FRAUD_NRG}, ${__FRAUD_RLX}, ${__FRAUD_AXF}, ${__FRAUD_THJ}, ${__FRAUD_YQV}, ${__FRAUD_YJA}, ${__FRAUD_YPO}, ${__FRAUD_UOQ}, ${__FRAUD_DBI}, ${__FRAUD_BEP}, ${__FRAUD_DPR}, ${__FRAUD_QXX}, ${__FRAUD_QFY}, ${__FRAUD_PTS}, ${__FRAUD_TDP}, ${__FRAUD_GAN}, ${__FRAUD_IPK}, ${__FRAUD_AON}, ${__FRAUD_WNY}, ${__FRAUD_AUM}, ${__FRAUD_WFC}, ${__FRAUD_YWW}, ${__FRAUD_ULK}, ${__FRAUD_IOU}, ${__FRAUD_JNB}, ${__FRAUD_IRT}, ${__FRAUD_ETX}, ${__FRAUD_WDR}, ${__FRAUD_UUY}, ${__FRAUD_MLY})";
diff --git a/conf/headers.inc b/conf/headers.inc
deleted file mode 100644
index 9e303b872..000000000
--- a/conf/headers.inc
+++ /dev/null
@@ -1,173 +0,0 @@
-# Different headers violation
-
-# Subject need encoding
-$__SUBJECT_ENCODED_B64 = "Subject=/=\?\S+\?B\?/iX";
-$__SUBJECT_ENCODED_QP="Subject=/=\?\S+\?Q\?/iX";
-$__SUBJECT_NEEDS_MIME="Subject=/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff]/X";
-$SUBJECT_NEEDS_ENCODING = "!${__SUBJECT_ENCODED_B64} & !${__SUBJECT_ENCODED_QP} & ${__SUBJECT_NEEDS_MIME}";
-$__HAS_SUBJECT="header_exists(Subject)";
-$__EMPTY_SUBJECT="Subject=/^$/";
-$MISSING_SUBJECT="!${__HAS_SUBJECT} | ${__EMPTY_SUBJECT}";
-$__R_RCVD_POCHTA_RU="Received=/by mail\d\.ks\.pochta\.ru \( sendmail 8\.\d{2}\.\d\/8\.\d{2}\.\d\) with esmtpa id/H";
-$__R_MUA_OUTLOOK="X-Mailer=/^Microsoft Outlook Express/Hr";
-$__R_MUA_THEBAT="X-Mailer=/^The Bat!/H";
-$__R_CTYPE_TEXT="content_type_is_type(text)";
-$__R_CTE_7BIT="compare_transfer_encoding(7bit)";
-$__R_BODY_8BIT="/[^\x01-\x7f]/Pr";
-$R_BAD_CTE_7BIT="${__R_CTYPE_TEXT} & ${__R_CTE_7BIT} & ${__R_BODY_8BIT}";
-$R_TLD_TK = "/\.tk$/U";
-$R_POCHTA_RU = "${__R_RCVD_POCHTA_RU} & ${R_TLD_TK} & ${SUBJECT_NEEDS_ENCODING}";
-$R_TMP_SPAMMY_MAILER = "X-Mailer=/^(?:Exim 3\.12|Gentoo|Qmail 2\.67|Sendmail 3\.84\/3\.84|WebPOP 1\.0|mLogic)/H";
-$R_WWW_EKONF_COM = "${__R_MEGA_TABLE} & ${__R_GREEK_SYMBOLS}";
-$R_FREE_HOSTING_NAROD = "/\.narod\.ru/U";
-$R_TINYURL = "/http:\/\/(?:tinyurl\.com|snipr\.com|b23\.ru)\/\w/U";
-$R_FREE_HOSTING = "/\.(?:fromru\.com|front\.ru|hotbox\.ru|hotmail\.ru|krovatka\.su|land\.ru|mail15\.com|mail333\.com|newmail\.ru|nightmail\.ru|nm\.ru|pisem\.net|pochtamt\.ru|pop3\.ru|rbcmail\.ru|smtp\.ru)/U";
-
-$__HAS_TO="header_exists(To)";
-$MISSING_TO="!${__HAS_TO}";
-$__UNDISC_RCPT="To=/^<?undisclosed-recipient/Hi";
-$R_UNDISC_RCPT="${MISSING_TO} | ${__UNDISC_RCPT}";
-
-$__HAS_MID="header_exists(Message-Id)";
-$MISSING_MID="!${__HAS_MID}";
-$R_RCVD_SPAMBOTS="Received=/^from \[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\] by [-.\w+]{5,255}; [SMTWF][a-z][a-z], [\s\d]?\d [JFMAJSOND][a-z][a-z] \d{4} \d{2}:\d{2}:\d{2} [-+]\d{4}$/mH";
-$R_TO_SEEMS_AUTO="To=/\"?(?<bt>[-.\w]{1,64})\"?\s<\k<bt>\@/H";
-$R_MISSING_CHARSET="content_type_is_type(text) & !content_type_has_param(charset)";
-$R_SAJDING="Subject=/\bsajding(?:om|a)?\b/iH";
-$__R_MUA_MPOP_WEBMAIL="X-Mailer=/^mPOP Web-Mail \d\.\d{2}$/H";
-$__R_MID_MAILRU="Message-Id=/\@w+\.mail\.ru>$/H";
-$__R_RCVD_FROM_MAILRU="Received=/ by [a-z\.]+\d*\.mail\.ru with /H";
-$__R_X_RCVD_FROM_MAILRU="X-Received=/ by [a-z\.]+\d*\.mail\.ru with /H";
-$R_FORGED_MPOP_WEBMAIL="${__R_MUA_MPOP_WEBMAIL} & !(${__R_RCVD_FROM_MAILRU} | ${__R_X_RCVD_FROM_MAILRU} | ${__R_MID_MAILRU})";
-$__R_BGCOLOR="/BGCOLOR=/iM";
-$__R_FONT_COLOR="/font color=[\"']?\#FFFFFF[\"']?/iM";
-$R_WHITE_ON_WHITE="(!${__R_BGCOLOR} & ${__R_FONT_COLOR})";
-$R_NO_SPACE_IN_FROM="From=/\S<[-\w\.]+\@[-\w\.]+>/X";
-$R_FLASH_REDIR_IMGSHACK="/^(?:http:\/\/)?img\d{1,5}\.imageshack\.us\/\S+\.swf/U";
-$__R_RCVD_FROM_VALUEHOST="Received=/\sb0\.valuehost\.ru/H";
-$__R_CYR_PHONE="/8 \(\xD799\)/P";
-
-$R_SPAM_FROM_VALUEHOST="${__R_RCVD_FROM_VALUEHOST} & ${__R_CYR_PHONE}";
-$__HAS_USER_AGENT="header_exists(User-Agent)";
-$__HAS_X_MAILER="header_exists(X-Mailer)";
-
-$__R_RCVD_FROM_MTU="Received=/smtp\d*\.mtu\.ru/H";
-$__R_MID_MTU="Message-Id=/\@smtp\d*\.mtu\.ru>$/H";
-
-$__R_RCVD_FROM_ONO="Received=/smtp\d*\.ono\.com/H";
-$__R_MID_ONO="Message-Id=/\@ono\.com>$/H";
-
-$__R_RCVD_FROM_VERSATEL="Received=/mail\d*do\.versatel\.de/H";
-$__R_MID_VERSATEL="Message-Id=/\@versanet\.de>$/H";
-
-$__R_RCVD_FROM_LIBERO="Received=/cp-out\d+\.libero\.it/H";
-$__R_MID_LIBERO="Message-Id=/[\da-f]{12}\.[\da-f]{16}@/H";
-
-$R_SPAM_FROM_MTU="!(${__HAS_X_MAILER} | ${__HAS_USER_AGENT}) & ${__R_RCVD_FROM_MTU} & ${__R_MID_MTU}";
-$R_SPAM_FROM_ONO="!(${__HAS_X_MAILER} | ${__HAS_USER_AGENT}) & ${__R_RCVD_FROM_ONO} & ${__R_MID_ONO}";
-$R_SPAM_FROM_VERSATEL="!(${__HAS_X_MAILER} | ${__HAS_USER_AGENT}) & ${__R_RCVD_FROM_VERSATEL} & ${__R_MID_VERSATEL}";
-$R_SPAM_FROM_LIBERO="!(${__HAS_X_MAILER} | ${__HAS_USER_AGENT}) & ${__R_RCVD_FROM_LIBERO} & ${__R_MID_LIBERO}";
-#$R_FAKE_OUTLOOK="${__R_MUA_OUTLOOK}";
-# $R_FAKE_OUTLOOK="${__R_MUA_OUTLOOK} & (${SUBJECT_NEEDS_ENCODING} | ${R_BAD_CTE_7BIT})";
-$R_FAKE_OUTLOOK="${__R_MUA_OUTLOOK} & ${R_BAD_CTE_7BIT}";
-$R_FAKE_THEBAT="${__R_MUA_THEBAT} & ${SUBJECT_NEEDS_ENCODING}";
-
-$__YAHOO_BULK="Received=/from \[\S+\] by \S+\.(?:groups|scd|dcn)\.yahoo\.com with NNFMP/H";
-$__ANY_OUTLOOK_MUA="X-Mailer=/^Microsoft Outlook\b/H";
-$MIME_HTML_ONLY="has_only_html_part()";
-$FORGED_OUTLOOK_HTML="!${__YAHOO_BULK} & ${__ANY_OUTLOOK_MUA} & ${MIME_HTML_ONLY}";
-$SUSPICIOUS_RECIPS="compare_recipients_distance(0.85)";
-$SORTED_RECIPS="is_recipients_sorted()";
-$TRACKER_ID="/^[a-z0-9]{6,24}[-_a-z0-9]{2,36}[a-z0-9]{6,24}\s*\z/isPr";
-$__FROM_ENCODED_B64="From=/\=\?\S+\?B\?/iX";
-$__FROM_NEEDS_MIME="From=/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff]/H";
-$FROM_EXCESS_BASE64="${__FROM_ENCODED_B64} & !${__FROM_NEEDS_MIME}";
-
-$__OE_MUA="X-Mailer=/\bOutlook Express [456]\./H";
-$__OE_MSGID_1="Message-Id=/^[A-Za-z0-9-]{7}[A-Za-z0-9]{20}\@hotmail\.com$/mH";
-$__OE_MSGID_2="Message-Id=/^(?:[0-9a-f]{8}|[0-9a-f]{12})\$[0-9a-f]{8}\$[0-9a-f]{8}\@\S+$/mH";
-$__LYRIS_EZLM_REMAILER="List-Unsubscribe=/<mailto:(?:leave-\S+|\S+-unsubscribe)\@\S+>$/H";
-#$__GATED_THROUGH_RCVD_REMOVER="gated_through_received_hdr_remover()";
-$__WACKY_SENDMAIL_VERSION="Received=/\/CWT\/DCE\)/H";
-$__IPLANET_MESSAGING_SERVER="Received=/iPlanet Messaging Server/H";
-$__HOTMAIL_BAYDAV_MSGID="Message-Id=/^BAY\d+-DAV\d+[A-Z0-9]{25}\@phx\.gbl$/mH";
-$__SYMPATICO_MSGID="Message-Id=/^BAYC\d+-PASMTP\d+[A-Z0-9]{25}\@CEZ\.ICE$/mH";
-# $__UNUSABLE_MSGID="${__LYRIS_EZLM_REMAILER} | ${__GATED_THROUGH_RCVD_REMOVER} | ${__WACKY_SENDMAIL_VERSION} | ${__IPLANET_MESSAGING_SERVER} | ${__HOTMAIL_BAYDAV_MSGID} | ${__SYMPATICO_MSGID}";
-$__UNUSABLE_MSGID="${__LYRIS_EZLM_REMAILER} | ${__WACKY_SENDMAIL_VERSION} | ${__IPLANET_MESSAGING_SERVER} | ${__HOTMAIL_BAYDAV_MSGID} | ${__SYMPATICO_MSGID}";
-$__FORGED_OE="${__OE_MUA} & !{__OE_MSGID_1 & !${__OE_MSGID_2} & !{__UNUSABLE_MSGID}";
-$__OUTLOOK_DOLLARS_MUA="X-Mailer=/^Microsoft Outlook(?: 8| CWS, Build 9|, Build 10)\./H";
-$__OUTLOOK_DOLLARS_OTHER="Message-Id=/^\!\~\!/mH";
-$__VISTA_MSGID="Message-Id=/^[A-F\d]{32}\@\S+$/mH";
-$__IMS_MSGID="Message-Id=/^[A-F\d]{36,40}\@\S+$/mH";
-$__FORGED_OUTLOOK_DOLLARS="${__OUTLOOK_DOLLARS_MUA} & !${__OE_MSGID_2} & !${__OUTLOOK_DOLLARS_OTHER} & !${__VISTA_MSGID} & !${__IMS_MSGID} & !${__UNUSABLE_MSGID}";
-$__FMO_EXCL_O3416="X-Mailer=/^Microsoft Outlook, Build 10.0.3416$/H";
-$__FMO_EXCL_OE3790="X-Mailer=/^Microsoft Outlook Express 6.00.3790.3959$/H";
-$FORGED_MUA_OUTLOOK="(${__FORGED_OE} | ${__FORGED_OUTLOOK_DOLLARS}) & !${__FMO_EXCL_O3416} & !${__FMO_EXCL_OE3790} & !${__VISTA_MSGID}";
-
-$__SANE_MSGID="Message-Id=/^[^<>\\ \t\n\r\x0b\x80-\xff]+\@[^<>\\ \t\n\r\x0b\x80-\xff]+\s*$/mH";
-$__MSGID_COMMENT="Message-Id=/\(.*\)/mH";
-$INVALID_MSGID="${__HAS_MID} & !(${__SANE_MSGID} | ${__MSGID_COMMENT})";
-$HTML_MIME_NO_HTML_TAG="${MIME_HTML_ONLY} & !${__TAG_EXISTS_HTML}";
-$__CD="header_exists(Content-Disposition)";
-$__CTE="header_exists(Content-Transfer-Encoding)";
-$__CT="header_exists(Content-Type)";
-$__MIME_VERSION="raw_header_exists(MIME-Version)";
-#$__CT_TEXT_PLAIN="Content-Type=/^text\/plain\b/iH";
-$__CT_TEXT_PLAIN="content_type_is_type(text) & content_type_is_subtype(plain)";
-$MIME_HEADER_CTYPE_ONLY="!${__CD} & !${__CTE} & ${__CT} & !${__MIME_VERSION} & !${__CT_TEXT_PLAIN}";
-
-$__HAS_MSMAIL_PRI="header_exists(X-MSMail-Priority)";
-$__HAS_MIMEOLE="header_exists(X-MimeOLE)";
-$__HAS_SQUIRRELMAIL_IN_MAILER="X-Mailer=/SquirrelMail\b/H";
-$MISSING_MIMEOLE="${__HAS_MSMAIL_PRI} & !${__HAS_MIMEOLE} & !${__HAS_SQUIRRELMAIL_IN_MAILER}";
-$__MSGID_DOLLARS_OK="Message-Id=/[0-9a-f]{4,}\$[0-9a-f]{4,}\$[0-9a-f]{4,}\@\S+/Hr";
-$__MIMEOLE_MS="X-MimeOLE=/^Produced By Microsoft MimeOLE/H";
-$__RCVD_WITH_EXCHANGE="Received=/with Microsoft Exchange Server/H";
-$RATWARE_MS_HASH="${__MSGID_DOLLARS_OK} & !${__MIMEOLE_MS} & !${__RCVD_WITH_EXCHANGE}";
-$STOX_REPLY_TYPE="Content-Type=/text\/plain; .* reply-type=original/H";
-$__FHELO_VERIZON="X-Spam-Relays-Untrusted=/^[^\]]+ helo=[^ ]+verizon\.net /iH";
-$__FHOST_VERIZON="X-Spam-Relays-Untrusted=/^[^\]]+ rdns=[^ ]+verizon\.net /iH";
-$FM_FAKE_HELO_VERIZON="${__FHELO_VERIZON} & !${__FHOST_VERIZON}";
-$__AT_YAHOO_MSGID="Message-Id=/\@yahoo\.com\b/iH";
-$__FROM_YAHOO_COM="From=/\@yahoo\.com\b/iH";
-$FORGED_MSGID_YAHOO="${__AT_YAHOO_MSGID} & !${__FROM_YAHOO_COM}";
-
-$__THEBAT_MUA_V1="X-Mailer=/^The Bat! \(v1\./H";
-$__CTYPE_HAS_BOUNDARY="Content-Type=/boundary/iH";
-$__BAT_BOUNDARY="Content-Type=/boundary=\"?-{10}/H";
-$__MAILMAN_21="X-Mailman-Version=/\d/H";
-$__DOUBLE_IP_SPAM_1="Received=/from \[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\] by \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} with/H";
-$__DOUBLE_IP_SPAM_2="Received=/from\s+\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s+by\s+\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3};/H";
-$FORGED_MUA_THEBAT_BOUN="${__THEBAT_MUA_V1} & ${__CTYPE_HAS_BOUNDARY} & !${__BAT_BOUNDARY} & !${__MAILMAN_21}";
-$RCVD_DOUBLE_IP_SPAM="${__DOUBLE_IP_SPAM_1} | ${__DOUBLE_IP_SPAM_2}";
-
-$__REPTO_QUOTE="Reply-To=/\".*\"\s*\</H";
-$__FROM_YAHOO_COM="From=/\@yahoo\.com\b/iH";
-$__AT_YAHOO_MSGID="Message-Id=/\@yahoo\.com\b/iH";
-$REPTO_QUOTE_YAHOO="${__REPTO_QUOTE} & (${__FROM_YAHOO_COM} | ${__AT_YAHOO_MSGID})";
-
-
-$__XM_GNUS="X-Mailer=/^Gnus v/H";
-$__XM_MSOE5="X-Mailer=/^Microsoft Outlook Express 5/H";
-$__XM_MSOE6="X-Mailer =~ /^Microsoft Outlook Express 6/H";
-$__XM_MOZ4="X-Mailer=/^Mozilla 4/H";
-$__XM_SKYRI="X-Mailer=/^SKYRiXgreen/H";
-$__XM_WWWMAIL="X-Mailer=/^WWW-Mail \d/H";
-$__UA_GNUS="User-Agent=/^Gnus/H";
-$__UA_KNODE="User-Agent=/^KNode/H";
-$__UA_MUTT="User-Agent=/^Mutt/H";
-$__UA_PAN="User-Agent=/^Pan/H";
-$__UA_XNEWS="User-Agent=/^Xnews/H";
-$__NO_INR_YES_REF="${__XM_GNUS} | ${__XM_MSOE5} | ${__XM_MSOE6} | ${__XM_MOZ4} | ${__XM_SKYRI} | ${__XM_WWWMAIL} | ${__UA_GNUS} | ${__UA_KNODE} | ${__UA_MUTT} | ${__UA_PAN} | ${__UA_XNEWS}";
-
-$__SUBJ_RE="Subject=/^R[eE]:/H";
-$__HAS_REF="header_exists(References)";
-$__MISSING_REF="!${__HAS_REF}";
-$FAKE_REPLY_C="${__SUBJ_RE} & ${__MISSING_REF} & ${__NO_INR_YES_REF}";
-
-# Vowel rules
-$FROM_DOMAIN_NOVOWEL="From=/\@\S*[bcdfghjklmnpqrstvwxz]{7}/Hi";
-$FROM_LOCAL_NOVOWEL="From=/[bcdfghjklmnpqrstvwxz]{7}\S*\@/Hi";
-$FROM_LOCAL_HEX="From=/[0-9a-f]{11}\S*\@/iH";
-$FROM_LOCAL_DIGITS="From=/\d{11}\S*\@/iH";
-
diff --git a/conf/html.inc b/conf/html.inc
deleted file mode 100644
index 997b3375a..000000000
--- a/conf/html.inc
+++ /dev/null
@@ -1,28 +0,0 @@
-# HTML related rules
-
-$__MIME_HTML="content_type_is_type(text) & content_type_is_subtype(/.?html/)";
-$__TAG_EXISTS_HTML="/<html/iPr";
-$__TAG_EXISTS_HEAD="/<head>/iPr";
-$__TAG_EXISTS_META="/<meta /iPr";
-$__TAG_EXISTS_BODY="/<body/iPr";
-$FORGED_OUTLOOK_TAGS="!${__YAHOO_BULK} & ${__ANY_OUTLOOK_MUA} & ${__MIME_HTML} & !(${__TAG_EXISTS_HTML} & ${__TAG_EXISTS_HEAD} & ${__TAG_EXISTS_META} & ${__TAG_EXISTS_BODY})";
-$__HTML_LENGTH_1024_1536="has_content_part_len('text', 'html', 1024, 1536)";
-$__HTML_LINK_IMAGE="/<img /iPr";
-$HTML_SHORT_LINK_IMG_2="${__HTML_LENGTH_1024_1536} & ${__HTML_LINK_IMAGE}";
-
-$__R_BGCOLOR="/BGCOLOR=/iM";
-$__R_FONT_COLOR="/font color=[\"']?\#FFFFFF[\"']?/iM";
-$R_WHITE_ON_WHITE="(!${__R_BGCOLOR} & ${__R_FONT_COLOR})";
-$R_NO_SPACE_IN_FROM="From=/\S<[-\w\.]+\@[-\w\.]+>/X";
-$R_FLASH_REDIR_IMGSHACK="/^(?:http:\/\/)?img\d{1,5}\.imageshack\.us\/\S+\.swf/U";
-$__R_RCVD_FROM_VALUEHOST="Received=/\sb0\.valuehost\.ru/H";
-$__R_CYR_PHONE="/8 \(\xD799\)/P";
-
-$R_SPAM_FROM_VALUEHOST="${__R_RCVD_FROM_VALUEHOST} & ${__R_CYR_PHONE}";
-
-$__R_MEGA_TABLE = "/<table border=\"0\" width=\"1\" height=\"30\">\n\s+?<tr>\n\s+?<td bgcolor=\"\#000000\"><\/td>\n\s+?<td><\/td>\n\s+?<td bgcolor=\"\#000000\"><\/td>\n\s+?<td><\/td>\n\s+?<td bgcolor=\"\#000000\"><\/td>\n\s+?<td><\/td>\n\s+?<td bgcolor=\"\#000000\"><\/td>\n\s+?<td><\/td>\n\s+?<td bgcolor=\"\#000000\"><\/td>\n\s+?<td><\/td>\n\s+?<td bgcolor=\"\#000000\"><\/td>\n\s+?<td><\/td>\n\s+?<td><\/td>\n\s+?<td><\/td>/Ps";
-$__R_GREEK_SYMBOLS = "/&\#(?:1293|261|1218|1197|1245|1187|1116|569|1117|267|1179|593|1008|1247|311||311|491)/P";
-
-$MIME_HTML_ONLY="has_only_html_part()";
-$FORGED_OUTLOOK_HTML="!${__YAHOO_BULK} & ${__ANY_OUTLOOK_MUA} & ${MIME_HTML_ONLY}";
-
diff --git a/conf/lotto.inc b/conf/lotto.inc
deleted file mode 100644
index 1df1a4c0b..000000000
--- a/conf/lotto.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-# Rules for lottery spam
-
-
-$__R_LOTTO_FROM="From=/(?:lottery|News center|congratulation to you|NED INFO|BRITISH NATIONAL HEADQUATERS|MICROSOFT ON LINE SUPPORT TEAM|prize|online notification)/iH";
-$__R_LOTTO_SUBJECT="Subject=/(?:\xA3\d|pounds?|FINAL NOTIFICATION|FOR YOUR ATTENTION|File in Your Claims?|ATTN|prize|Claims requirement|amount|confirm|your e-mail address won|congratulations)/iH";
-$__R_LOTTO_BODY="/(?:won|winning|\xA3\d|pounds?|GBP|LOTTERY|awards|prize)/isrP";
-$__KAM_LOTTO1="/(e-?mail address (have emerged a winner|has won|attached to (ticket|reference)|was one of the ten winners)|random selection in our computerized email selection system)/isrP";
-$__KAM_LOTTO2="/((ticket|serial|lucky) number|secret pin ?code|batch number|reference number|promotion date)/isrP";
-$__KAM_LOTTO3="/(won|claim|cash prize|pounds? sterling)/isrP";
-$__KAM_LOTTO4="/(claims (officer|agent)|lottery coordinator|fiduciary (officer|agent)|fiduaciary claims)/isrP";
-$__KAM_LOTTO5="/(freelotto group|Royal Heritage Lottery|UK National (Online)? Lottery|U\.?K\.? Grand Promotions|Lottery Department UK|Euromillion Loteria|Luckyday International Lottery|International Lottery)/isrP";
-$__KAM_LOTTO6="/(Dear Lucky Winner|Winning Notification|Attention:Winner|Dear Winner)/isrP";
-$__KAM_LOTTO7="Subject=/(Your Lucky Day|(Attention:|ONLINE) WINNER)/iH";
-$KAM_LOTTO1="regexp_match_number(3, ${__KAM_LOTTO1}, ${__KAM_LOTTO2}, ${__KAM_LOTTO3}, ${__KAM_LOTTO4}, ${__KAM_LOTTO5}, ${__KAM_LOTTO6}, ${__KAM_LOTTO7})";
-$R_LOTTO="regexp_match_number(3, ${__KAM_LOTTO1}, ${__KAM_LOTTO2}, ${__KAM_LOTTO3}, ${__KAM_LOTTO4}, ${__KAM_LOTTO5}, ${__KAM_LOTTO6})";
-
diff --git a/rspamc.pl.in b/rspamc.pl.in
deleted file mode 100755
index 9843bf384..000000000
--- a/rspamc.pl.in
+++ /dev/null
@@ -1,332 +0,0 @@
-#!/usr/bin/perl -w
-
-# Simple script that read message from STDIN and test it on rspamd server
-# using specified command.
-#
-# Usage: rspamc.pl [-c conf_file] [command] [-s statfile]
-#
-# By default rspamc.pl would read ./rspamd.conf and default command is SYMBOLS
-
-use Socket qw(:DEFAULT :crlf);
-use Term::Cap;
-use Mail::Rspamd::Client;
-use Mail::Rspamd::Config;
-use Data::Dumper;
-
-my %cfg = (
- 'conf_file' => '@CMAKE_INSTALL_PREFIX@/etc/rspamd.xml',
- 'command' => 'SYMBOLS',
- 'hosts' => ['localhost:11333', ],
- 'require_input' => 0,
- 'password' => '',
- 'control' => 0,
- 'statfile' => '',
- 'deliver_to'=> '',
- 'weight' => 1,
- 'imap_search' => 'ALL',
- 'ip' => '127.0.0.1',
-);
-
-my $terminal;
-my $is_tty = 1;
-
-$main::VERSION = '@RSPAMD_VERSION@';
-
-sub HELP_MESSAGE {
- print <<EOD;
-Usage: rspamc.pl [-h host] [-H hosts_list] [-P password] [-c conf_file] [-s statfile] [-d user\@domain] [command] [path]
--h host to connect (in format host:port) or unix socket path
--H path to file that contains list of hosts
--P define control password
--c config file to parse
--s statfile to use for learn commands
-
-Additional options:
--d define deliver-to header
--w define weight for fuzzy operations
--S define search string for IMAP operations
--i emulate that message was send from specified IP
--p pass message throught all filters
-
-Notes:
-imap format: imap:user:<username>:password:[<password>]:host:<hostname>:mbox:<mboxname>
-Password may be omitted and then it would be asked in terminal
-imaps requires IO::Socket::SSL
-
-Version: @RSPAMD_VERSION@
-EOD
- exit;
-};
-
-sub load_hosts_file {
- my $file = shift;
-
- open (HOSTS, "< $file") or die "cannot open file $file";
- $cfg{'hosts'} = [ ];
- while (<HOSTS>) {
- chomp;
- next if $_ =~ /^\s*#/;
- if ($_ =~ /^\s*(([^:]+):(\d+))\s*$/) {
- push (@{ $cfg{'hosts'} }, $1);
- }
- elsif ($_ =~ /^\s*([^:]+)\s*$/) {
- if ($cfg{'control'}) {
- push (@{ $cfg{'hosts'} }, "$1:11334");
- }
- else {
- push (@{ $cfg{'hosts'} }, "$1:11333");
- }
- }
- elsif ($_ =~ /^\s*(\/\S*)\s*$/) {
- push (@{ $cfg{'hosts'} }, "$1");
- }
- }
- close HOSTS;
-}
-
-# Load rspamd config params
-sub parse_config {
- my ($is_ctrl) = @_;
-
- my $parser = Mail::Rspamd::Config->new();
-
- $parser->load($cfg{'conf_file'});
-
- if (defined ($parser->{workers})) {
- foreach my $worker (@{ $parser->{workers} }) {
- if ($is_ctrl && $worker->{'type'} eq 'controller') {
- $cfg{'hosts'} = [ $worker->{'bind_socket'} ];
- $cfg{'password'} = $worker->{options}->{password};
- }
- elsif (!$is_ctrl && $worker->{'type'} eq 'normal') {
- $cfg{'hosts'} = [ $worker->{'bind_socket'} ];
- }
- }
- }
-}
-
-sub print_control_result {
- my ($host, $res) = @_;
-
- $terminal->Tputs( 'md', 1, *STDOUT ) if $is_tty;
- print "Results for host $host:\n\n";
- $terminal->Tputs( 'me', 1, *STDOUT ) if $is_tty;
- if ($res->{error_code} == 0) {
- print "$res->{error}\n";
- }
- else {
- print "Error occured: $res->{error_code}:\n$res->{error}\n";
- }
-}
-
-sub print_rspamc_result {
- my ($host, $res) = @_;
-
- $terminal->Tputs( 'md', 1, *STDOUT ) if $is_tty;
- print "Results for host $host:\n\n";
- $terminal->Tputs( 'me', 1, *STDOUT ) if $is_tty;
-
- if (defined($res->{error})) {
- print "Error occured: $res->{error}\n\n";
- }
- else {
- while (my ($metric, $result) = each (%{ $res })) {
- $terminal->Tputs( 'md', 1, *STDOUT ) if $is_tty;
- print "$metric: ";
- $terminal->Tputs( 'me', 1, *STDOUT ) if $is_tty;
- print "$result->{isspam}, [ $result->{score} / $result->{threshold} ]\n";
-
- $terminal->Tputs( 'md', 1, *STDOUT ) if $is_tty;
- print "Symbols: ";
- $terminal->Tputs( 'me', 1, *STDOUT ) if $is_tty;
- print join("; ", @{ $result->{symbols} }) . "\n";
-
- $terminal->Tputs( 'md', 1, *STDOUT ) if $is_tty;
- print "Action: ";
- $terminal->Tputs( 'me', 1, *STDOUT ) if $is_tty;
- print "$result->{action}\n";
-
- $terminal->Tputs( 'md', 1, *STDOUT ) if $is_tty;
- print "Urls: ";
- $terminal->Tputs( 'me', 1, *STDOUT ) if $is_tty;
- print join(", ", @{ $result->{urls} }) . "\n";
-
- foreach my $msg (@{ $result->{messages} }) {
- $terminal->Tputs( 'md', 1, *STDOUT ) if $is_tty;
- print "Message: ";
- $terminal->Tputs( 'me', 1, *STDOUT ) if $is_tty;
- print "$msg\n";
- }
- print "\n\n";
- }
- }
-}
-
-sub print_item_result {
- my ($file, $res) = @_;
- $terminal->Tputs( 'md', 1, *STDOUT ) if $is_tty;
- print "Results for item $file:\n\n";
- $terminal->Tputs( 'me', 1, *STDOUT ) if $is_tty;
-
- while (my ($host, $result) = each (%{ $res })) {
- if ($cfg{control}) {
- print_control_result ($host, $result);
- }
- else {
- print_rspamc_result ($host, $result);
- }
- }
-
-}
-############################# Main part ###########################################
-my %args;
-
-HELP_MESSAGE() unless scalar @ARGV >= 1;
-
-while (my $opt = shift @ARGV) {
- if ($opt eq '-c') {
- $args{c} = shift @ARGV;
- }
- elsif ($opt eq '-h') {
- $args{h} = shift @ARGV;
- }
- elsif ($opt eq '-P') {
- $args{P} = shift @ARGV;
- }
- elsif ($opt eq '-s') {
- $args{s} = shift @ARGV;
- }
- elsif ($opt eq '-w') {
- $args{w} = shift @ARGV;
- }
- elsif ($opt eq '-d') {
- $args{d} = shift @ARGV;
- }
- elsif ($opt eq '-S') {
- $args{S} = shift @ARGV;
- }
- elsif ($opt eq '-H') {
- $args{H} = shift @ARGV;
- }
- elsif ($opt eq '-i') {
- $args{i} = shift @ARGV;
- }
- elsif ($opt eq '-p') {
- $args{p} = 1;
- }
- elsif ($opt eq '-?' || $opt eq '--help') {
- HELP_MESSAGE();
- }
- elsif ($opt eq '--') {
- last;
- }
- else {
- unshift @ARGV,$opt;
- last;
- }
-}
-
-my $cmd = shift @ARGV;
-my @path = shift @ARGV;
-
-if (!defined ($cmd) || $cmd eq '') {
- $cmd = 'SYMBOLS';
-}
-
-if (defined ($args{c})) {
- if (-r $args{c}) {
- $cfg{'conf_file'} = $args{c};
- }
- else {
- die "config file $args{c} is not readable";
- }
-
-}
-
-if ($cmd =~ /(SYMBOLS|PROCESS|CHECK|URLS|EMAILS)/i) {
- $cfg{'command'} = $1;
- $cfg{'control'} = 0;
-}
-elsif ($cmd =~ /(STAT|LEARN|SHUTDOWN|RELOAD|UPTIME|COUNTERS|FUZZY_ADD|FUZZY_DEL|WEIGHTS)/i) {
- $cfg{'command'} = $1;
- $cfg{'control'} = 1;
- $cfg{'hosts'} = ['localhost:11334'];
-}
-else {
- die "unknown command $cmd";
-}
-
-if (-r $cfg{'conf_file'}) {
- # Try to parse config
- parse_config ($cfg{'control'});
-}
-
-if (defined ($args{S})) {
- $cfg{'imap_search'} = $args{S};
-}
-
-if (defined ($args{s})) {
- if ($args{s}) {
- $cfg{'statfile'} = $args{s};
- }
- else {
- main::HELP_MESSAGE();
- }
-}
-if (defined ($args{h})) {
- $cfg{'hosts'} = [ $args{h} ];
-}
-if (defined ($args{P})) {
- $cfg{'password'} = $args{P};
-}
-if (defined ($args{d})) {
- $cfg{'deliver_to'} = $args{d};
-}
-if (defined ($args{w})) {
- $cfg{'weight'} = $args{w};
-}
-if (defined ($args{i})) {
- $cfg{'ip'} = $args{i};
-}
-if (exists ($args{p})) {
- $cfg{'pass_all'} = 1;
-}
-
-if ($cmd =~ /SYMBOLS|SCAN|PROCESS|CHECK|REPORT_IFSPAM|REPORT|URLS|EMAILS|LEARN|FUZZY_ADD|FUZZY_DEL|WEIGHTS/i) {
- $cfg{'require_input'} = 1;
-}
-
-if (defined ($args{H})) {
- load_hosts_file ($args{H});
-}
-
-my $rspamd = Mail::Rspamd::Client->new(\%cfg);
-
-if (-t STDOUT) {
- $terminal = Tgetent Term::Cap { TERM => undef, OSPEED => 9600 };
-}
-else {
- $is_tty = 0;
-}
-
-if (!defined ($path[0]) || ! $cfg{'require_input'}) {
- my $input;
- if ($cfg{'require_input'}) {
- while (defined (my $line = <>)) {
- $input .= $line;
- }
- }
-
- my $res = $rspamd->do_all_cmd ($input);
- while (my ($host, $result) = each (%{ $res })) {
- if ($cfg{control}) {
- print_control_result ($host, $result);
- }
- else {
- print_rspamc_result ($host, $result);
- }
- }
-}
-else {
- $rspamd->process_path (\&print_item_result, @path);
-}
diff --git a/src/perl.c b/src/perl.c
deleted file mode 100644
index 342a0e75f..000000000
--- a/src/perl.c
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (c) 2009, Rambler media
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY Rambler media ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL Rambler BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "url.h"
-#include "main.h"
-#include "perl.h"
-#include "cfg_file.h"
-
-#include <EXTERN.h> /* from the Perl distribution */
-#include <perl.h> /* from the Perl distribution */
-
-#ifndef PERL_IMPLICIT_CONTEXT
-# undef dTHXa
-# define dTHXa(a)
-#endif
-
-/* Perl module init function */
-#define MODULE_INIT_FUNC "module_init"
-
-PerlInterpreter *perl_interpreter;
-
-static HV *rspamd_task_stash;
-static HV *rspamd_cfg_stash;
-
-extern void boot_DynaLoader (pTHX_ CV * cv);
-extern void boot_Socket (pTHX_ CV * cv);
-
-void
-xs_init (pTHX)
-{
- dXSUB_SYS;
- /* DynaLoader is a special case */
- newXS ("DynaLoader::boot_DynaLoader", boot_DynaLoader, __FILE__);
-
- rspamd_task_stash = gv_stashpv ("rspamd_task", TRUE);
- rspamd_cfg_stash = gv_stashpv ("rspamd_config", TRUE);
-}
-
-void
-init_perl_filters (struct config_file *cfg)
-{
- struct perl_module *module;
- gchar *init_func;
- size_t funclen;
- SV *sv;
-
- dTHXa (perl_interpreter);
- PERL_SET_CONTEXT (perl_interpreter);
-
- dSP;
- LIST_FOREACH (module, &cfg->perl_modules, next) {
- if (module->path) {
- require_pv (module->path);
- ENTER;
- SAVETMPS;
-
- PUSHMARK (SP);
- sv = sv_2mortal (sv_bless (newRV_noinc (newSViv (PTR2IV (cfg))), rspamd_cfg_stash));
- XPUSHs (sv);
- PUTBACK;
- /* Call module init function */
- funclen = strlen (module->path) + sizeof ("::") + sizeof (MODULE_INIT_FUNC) - 1;
- init_func = g_malloc (funclen);
- snprintf (init_func, funclen, "%s::%s", module->path, MODULE_INIT_FUNC);
- call_pv (init_func, G_DISCARD);
-
- FREETMPS;
- LEAVE;
- }
- }
-}
-
-
-gint
-perl_call_header_filter (const gchar *function, struct worker_task *task)
-{
- gint result;
- SV *sv;
-
- dTHXa (perl_interpreter);
- PERL_SET_CONTEXT (perl_interpreter);
-
- dSP;
- ENTER;
- SAVETMPS;
-
- PUSHMARK (SP);
- sv = sv_2mortal (sv_bless (newRV_noinc (newSViv (PTR2IV (task))), rspamd_task_stash));
- XPUSHs (sv);
- PUTBACK;
-
- call_pv (function, G_SCALAR);
-
- SPAGAIN;
-
- result = POPi;
- debug_task ("call of %s with returned mark %d\n", function, result);
-
- PUTBACK;
- FREETMPS;
- LEAVE;
-
- return result;
-}
-
-gint
-perl_call_chain_filter (const gchar *function, struct worker_task *task, gint *marks, guint number)
-{
- gint result, i;
- AV *av;
- SV *sv;
-
- dTHXa (perl_interpreter);
- PERL_SET_CONTEXT (perl_interpreter);
-
- dSP;
-
- ENTER;
- SAVETMPS;
- av = newAV ();
- av_extend (av, number);
- for (i = 0; i < number; i++) {
- av_push (av, sv_2mortal (newSViv (marks[i])));
- }
- PUSHMARK (SP);
- sv = sv_2mortal (sv_bless (newRV_noinc (newSViv (PTR2IV (task))), rspamd_task_stash));
- XPUSHs (sv);
- XPUSHs (sv_2mortal ((SV *) AvARRAY (av)));
- PUTBACK;
-
- call_pv (function, G_SCALAR);
-
- SPAGAIN;
-
- result = POPi;
- debug_task ("call of %s returned mark %d\n", function, result);
-
- PUTBACK;
- FREETMPS;
- av_undef (av);
- LEAVE;
-
-
- return result;
-}
-
-void
-perl_call_memcached_callback (memcached_ctx_t * ctx, memc_error_t error, void *data)
-{
- struct {
- SV *callback;
- struct worker_task *task;
- } *callback_data = data;
- SV *sv;
-
- dTHXa (perl_interpreter);
- PERL_SET_CONTEXT (perl_interpreter);
-
- dSP;
-
- ENTER;
- SAVETMPS;
- PUSHMARK (SP);
- sv = sv_2mortal (sv_bless (newRV_noinc (newSViv (PTR2IV (callback_data->task))), rspamd_task_stash));
- XPUSHs (sv);
- XPUSHs (sv_2mortal (newSViv (error)));
- XPUSHs (sv_2mortal (newSVpv (ctx->param->buf, ctx->param->bufsize)));
- PUTBACK;
-
- call_sv (callback_data->callback, G_SCALAR);
-
- /* Set save point */
- callback_data->task->save.saved = 0;
- process_filters (callback_data->task);
-
- SPAGAIN;
- FREETMPS;
- LEAVE;
-
-}
-
-/*
- * Perl custom consolidation function
- */
-struct consolidation_callback_data {
- struct worker_task *task;
- double score;
- const gchar *func;
-};
-
-static void
-perl_consolidation_callback (gpointer key, gpointer value, gpointer arg)
-{
- double res;
- struct symbol *s = (struct symbol *)value;
- struct consolidation_callback_data *data = (struct consolidation_callback_data *)arg;
-
- dTHXa (perl_interpreter);
- PERL_SET_CONTEXT (perl_interpreter);
-
- dSP;
- ENTER;
- SAVETMPS;
-
- PUSHMARK (SP);
-
- XPUSHs (sv_2mortal (newSVpv ((const gchar *)key, 0)));
- XPUSHs (sv_2mortal (newSVnv (s->score)));
- PUTBACK;
-
- call_pv (data->func, G_SCALAR);
-
- SPAGAIN;
-
- res = POPi;
-
- data->score += res;
-}
-
-double
-perl_consolidation_func (struct worker_task *task, const gchar *metric_name, const gchar *function_name)
-{
- struct metric_result *metric_res;
- double res = 0.;
- struct consolidation_callback_data data = { task, 0, function_name };
-
- if (function_name == NULL) {
- return 0;
- }
-
- metric_res = g_hash_table_lookup (task->results, metric_name);
- if (metric_res == NULL) {
- return res;
- }
-
- g_hash_table_foreach (metric_res->symbols, perl_consolidation_callback, &data);
-
- return data.score;
-}
diff --git a/src/perl.h b/src/perl.h
deleted file mode 100644
index 5bc75cd3e..000000000
--- a/src/perl.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef RSPAM_PERL_H
-#define RSPAM_PERL_H
-
-
-#include "config.h"
-#include "memcached.h"
-
-
-struct uri;
-struct worker_task;
-struct config_file;
-
-void init_perl_filters (struct config_file *cfg);
-
-gint perl_call_filter (const gchar *function, struct worker_task *task);
-gint perl_call_chain_filter (const gchar *function, struct worker_task *task, gint *marks, guint number);
-
-void perl_call_memcached_callback (memcached_ctx_t *ctx, memc_error_t error, void *data);
-
-double perl_consolidation_func (struct worker_task *task, const gchar *metric_name, const gchar *function_name);
-
-#endif