diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-02-15 15:50:25 +0300 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-02-15 15:50:25 +0300 |
commit | b3928c8e33fe8fe7b5d496c6beeb8f66dcdfa104 (patch) | |
tree | 32c3f399c6f2627db6106257156d08024881854d | |
parent | 97182882b0d460ddd33450aaf82485b998b72115 (diff) | |
download | rspamd-b3928c8e33fe8fe7b5d496c6beeb8f66dcdfa104.tar.gz rspamd-b3928c8e33fe8fe7b5d496c6beeb8f66dcdfa104.zip |
Remove some legacy from source tree.
-rw-r--r-- | README-classify.utf8.txt | 93 | ||||
-rw-r--r-- | README.en.txt | 170 | ||||
-rw-r--r-- | README.utf8.txt | 180 | ||||
-rw-r--r-- | conf/drugs.inc | 68 | ||||
-rw-r--r-- | conf/fraud.inc | 56 | ||||
-rw-r--r-- | conf/headers.inc | 173 | ||||
-rw-r--r-- | conf/html.inc | 28 | ||||
-rw-r--r-- | conf/lotto.inc | 16 | ||||
-rwxr-xr-x | rspamc.pl.in | 332 | ||||
-rw-r--r-- | src/perl.c | 261 | ||||
-rw-r--r-- | src/perl.h | 22 |
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|\ï\;)[_\W]?(?:a|\à|\å)\;?[_\W]?g[_\W]?r[_\W]?(?:a|\à|\å)\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 |