dnl dnl Поддержка Spamoborona 2.x dnl dnl ВНИМАНИЕ!!! dnl при использовании spamooborona2 необходимо включить использование dnl системного фильтра (см. параметр confSYSTEM_FILTER) dnl dnl команда получения названия и версии демона SO2 dnl define(`confSO2_NAME_VERSION', `rpm -q spamooborona_daemon | perl -p -e "s/\n//"') dnl define(`confSO2_NAME_VERSION', `rpm -q spamooborona_daemon | perl -p -e "s/\w+(_\w)?-/Spamoborona /;s/\n//"') dnl define(`confSO2_NAME_VERSION', `pkg_info -I spamooborona_daemon\* | perl -p -e "s/\s+.+\n//"') dnl define(`confSO2_NAME_VERSION', `pkg_info -I spamooborona_daemon\* | perl -p -e "s/\s+.+//;s/\w+(_\w)?-/Spamoborona /;s/\n//"') dnl define(`confSO2_NAME_VERSION_DEFAULT', `Spamoborona 2') dnl dnl параметры подключения к SO2 dnl define(`confSO2_ADDRESS', `127.0.0.1 2525') dnl define(`confSO2_ADDRESS', `/var/run/sp-daemon.sock') dnl dnl действие в случае отсутствия ответа от SO2 либо возврата кода ошибки dnl NO - возвращать клиенту 4xx dnl YES - продолжать обработку письма dnl define(`confSO2_DEFER_OK', `YES') dnl dnl действие для писем, опознанных как SPAM dnl REJECT - отказ в приеме письма (возврат клиенту кода 5xx) dnl DENY - синоним для REJECT dnl DROP - отказ в приеме сообщения с обрывом соединения dnl DISCARD - прием письма без доставки получателю dnl QUARANTINE - вывод в лог файл предупреждения и помещение письма в карантин dnl QUARANTINE_MAILLIST - сохранение в карантине писем из списков рассылки вместо отказа в приеме письма dnl (используется только одновременно с REJECT) dnl DISCARD_MAILLIST - игнорирование писем из списков рассылки вместо отказа в приеме письма dnl (используется только одновременно с REJECT) dnl define(`confSO2_ACTION', `NO')dnl dnl если не будут указаны действия REJECT, DROP или DISCARD, то письмо будет просто помечено dnl действие QUARANTINE можно указывать вместо с REJECT и DISCARD через пробел dnl действия QUARANTINE_MAILLIST и DISCARD_MAILLIST можно указывать вместе с REJECT и DROP dnl dnl значение по умолчанию времени жизни записи о хосте в кеше greylisting'а в минутах dnl define(`confSO2_GREYLIST_PERIOD', `eval(24*60)')dnl dnl dnl сообщение полностью исключается из проверки, если в значении $acl_m_wl_flag_msg dnl поля white_list_relays, white_list_senders или white_list_compat равны 1 dnl и поле spam_hater не равно 1 dnl dnl действие для старых заголовков dnl RENAME - переименование старых заголовков (в конец имени добавляется -Old) dnl REMOVE - удаление старых заголовков dnl NOTHING - оставлять заголовки без изменений dnl define(`confSO2_OLD_HEADERS', `RENAME')dnl dnl dnl заголовки SO2 dnl define(`confSO2_HEADERS', `:X-Spam-Yversion:X-SO-Flag:X-Spam-Ystatus') dnl dnl confSO2_GREYLIST_PERIOD ifelse(SECTION, `ACLS_ADDITIONAL', `dnl acl_check_data_so2: warn set acl_m0 = ${dlfunc{confDLFUNC_PATH/confDLFUNC_FNAME}{spamooborona2}\ {confSO2_ADDRESS}{defer_ok}ifdef(`confSO2_ZLIB', `ifelse(confSO2_ZLIB, `NO', `{}', `{use_zlib}')',`{}')ifdef(`confSO2_RCPTTO', `{confSO2_RCPTTO}')} warn condition = ${if eq{$acl_m0}{}{yes}{no}} # logwrite = SO2 check failed set acl_m_contentscan_result = defer warn condition = ${if match{$acl_m0}{\N^so dlfunc:\s*DEFER(:\s*(.+))?$\N}{yes}{no}} set acl_m1 = ${if match{$acl_m0}{\N^so dlfunc:\s*DEFER(:\s*(.+))?$\N}{: $2}{}} # logwrite = SO2 check DEFER${acl_m1} set acl_m0 = set acl_m_contentscan_result = defer # warn condition = ${if match{$acl_m0}{\N^so dlfunc:\s*REJECT(:\s*(.+))?$\N}{yes}{no}} # set acl_m1 = ${if match{$acl_m0}{\N^so dlfunc:\s*REJECT(:\s*(.+))?$\N}{: $2}{}} # logwrite = SO2 check REJECT${acl_m1} # set acl_m0 = # warn condition = ${if match{$acl_m0}{\N^so dlfunc:\s*ACCEPT\N}{yes}{no}} # logwrite = SO2 check ACCEPT # warn set acl_m1 = # condition = ${if match{$acl_m0}{\N(?m)^so dlfunc:\s*(ACCEPT|REJECT)\N}{yes}{no}} # set acl_m1 = ${if match{$acl_m0}{\N(?m)^so dlfunc:\s*(ACCEPT|REJECT).*\r?\n((.+\r?\n?)+.*)$\N}{$2}{}} # logwrite = headers added by SO2${if eq{$acl_m1}{}{ not found}{: $acl_m1}} warn condition = ${if match{$acl_m0}{\N(?m)^(X-SO-Flag|X-Spam-Flag):\s*(\S+)\N}{yes}{no}} set acl_m1 = ${if match{$acl_m0}{\N(?m)^(X-SO-Flag|X-Spam-Flag):\s*(\S+)\N}{$2}{}} # logwrite = X-SO-Flag${if eq{$acl_m0}{}{ not found}{: $acl_m1}} add_header = X-SO-Flag: ${if eq{$acl_m0}{}{not found}{$acl_m1}} warn condition = ${if match{$acl_m0}{\N(?m)^X-Spam-Yversion:\s*(.+)\N}{yes}{no}} set acl_m1 = ${if match{$acl_m0}{\NX-Spam-Yversion:\s*(.+)\N}{$1}{}} # logwrite = X-Spam-Yversion${if eq{$acl_m0}{}{ not found}{: $acl_m1}} add_header = X-Spam-Yversion: ${if eq{$acl_m0}{}{not found}{$acl_m1}} warn condition = ${if match{$acl_m0}{\N(?m)^X-Spam-Ystatus:\s*hits=(-?\d+(\.\d+)?)\N}{yes}{no}} set acl_m1 = ${if match{$acl_m0}{\NX-Spam-Ystatus:\s*(.+\r?\n(\s.+\r?\n)*)\N}{$1}{}} # logwrite = X-Spam-Ystatus${if eq{$acl_m0}{}{ not found}{: $acl_m1}} add_header = X-Spam-Ystatus: ${if eq{$acl_m0}{}{not found}{$acl_m1}} warn set acl_m_certainly_spam = condition = ${if match{$acl_m0}{\N(?m)^(X-SO-Flag|X-Spam-Flag):\s*(\S+)\N}{yes}{no}} set acl_m1 = ${if match{$acl_m0}{\N(?m)^(X-SO-Flag|X-Spam-Flag):\s*(\S+)\N}{$2}{}} logwrite = SO2 check: X-SO-Flag value ${if eq{$acl_m0}{}{not found}{is $acl_m1}} condition = ${if eq{$acl_m1}{YES}{yes}{no}} set acl_m_certainly_spam = certainly_spam accept ') dnl ifelse(SECTION, `ACLS_ADDITIONAL', `') ifelse(SECTION, `ACL_CHECK_DATA_TOP', `dnl ifelse(confSO2_OLD_HEADERS, `REMOVE', `dnl warn remove_header = confSO2_HEADERS ') dnl ifelse(confSO2_OLD_HEADERS, `REMOVE', `') ifelse(confSO2_OLD_HEADERS, `RENAME', `dnl warn remove_header = confSO2_HEADERS RENAME_HEADERS(confSO2_HEADERS) ') dnl ifelse(confSO2_OLD_HEADERS, `RENAME', `') ') dnl ifelse(SECTION, `ACL_CHECK_DATA_TOP', `') ifelse(SECTION, `ACL_CHECK_DATA', `dnl # SO2 ifdef(`confSO2_NAME_VERSION',`define(`_SO2_VER_', `esyscmd(confSO2_NAME_VERSION)')')dnl ifelse(len(X`'_SO2_VER_), `1', `ifdef(`confSO2_NAME_VERSION_DEFAULT',`define(`_SO2_VER_', confSO2_NAME_VERSION_DEFAULT)',`define(`_SO2_VER_', `Spamoborona 2 Server')')')dnl # добавляем информацию о версии SO2 # warn add_header = X-SO2-Version: _SO2_VER_ on $primary_hostname\n warn condition = ${if eq{$acl_m_contentscan_skip}{skip}{no}{yes}} acl = acl_check_data_so2 warn set acl_m0 = condition = ${if eq{$acl_m_contentscan_skip}{skip}{no}{yes}} condition = ${if eq{$acl_m_contentscan_result}{defer}{no}{yes}} condition = ${if eq{$acl_m_certainly_spam}{certainly_spam}{yes}{no}} set acl_m0 = certainly_spam add_header = X-Spam-Original-Recipients: $recipients\n dnl ifelse_strstr(confSO2_ACTION, `SUBMIT_GREYLIST', `ENTERPRISE(`greylist', `submit_so2')') dnl ifelse_strstr(confSO2_ACTION, `SUBMIT_MYSQL', `ENTERPRISE(`mysql', `submit_so2')') dnl ifelse_strstr(confSO2_ACTION, `SUBMIT_SQLITE', `ENTERPRISE(`sqlite', `submit_so2')') ifdef(`confSO2_DEFER_OK', `ifelse(confSO2_DEFER_OK, `YES', `dnl warn condition = ${if eq{$acl_m_contentscan_skip}{skip}{no}{yes}} condition = ${if eq{$acl_m_contentscan_result}{defer}{yes}{no}} add_header = X-SO2-Info: SO2 connection deferred on $primary_hostname\n log_message = SO2 connection deferred ', ` dnl ifdef(`confSO2_DEFER_OK', `ifelse(confSO2_DEFER_OK, `YES', `')') defer condition = ${if eq{$acl_m_contentscan_skip}{skip}{no}{yes}} condition = ${if eq{$acl_m_contentscan_result}{defer}{yes}{no}} message = System busy. Try again later log_message = SO2 connection deferred ')') dnl ifdef(`confSO2_DEFER_OK', `ifelse(confSO2_DEFER_OK, `YES', `')') dnl define(`confSO2_ACTION', confSO2_ACTION` ') ifelse_strstr(confSO2_ACTION` ', `REJECT ', ` dnl ifelse_strstr(confSO2_ACTION` ', `QUARANTINE_MAILLIST ', ` # Quarantine spam messages warn condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} logwrite = SO2 check: Spam is blocked and quarantined set acl_m_quarantined = $acl_m_quarantined content_scanner add_header = X-Spam-Action: quarantined\n accept condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} logwrite = original recipients: $recipients ') dnl ifelse_strstr(confSO2_ACTION` ', `QUARANTINE_MAILLIST ', `') dnl ifelse_strstr(confSO2_ACTION` ', `DISCARD_MAILLIST ', ` # Discard spam messages discard condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} logwrite = SO2 check: Spam is discarded ') dnl ifelse_strstr(confSO2_ACTION` ', `DISCARD_MAILLIST ', `') dnl ifelse_strstr(confSO2_ACTION` ', `QUARANTINE ', ` # Reject and quarantine spam messages warn condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} control = fakereject/Spam is blocked (${message_id}) logwrite = SO2 check: Spam is blocked and quarantined set acl_m_quarantined = $acl_m_quarantined content_scanner add_header = X-Spam-Action: quarantined\n accept condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} logwrite = original recipients: $recipients ',` dnl ifelse_strstr(confSO2_ACTION` ', `QUARANTINE ', `') # Reject spam messages deny condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} logwrite = SO2 check: Spam is rejected message = Spam is blocked (${message_id}) ') dnl ifelse_strstr(confSO2_ACTION` ', `QUARANTINE ', `') ') dnl ifelse_strstr(confSO2_ACTION` ', `REJECT ', `') ifelse_strstr(confSO2_ACTION` ', `DROP ', ` dnl ifelse_strstr(confSO2_ACTION` ', `QUARANTINE_MAILLIST ', ` # Quarantine spam messages warn condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} logwrite = SO2 check: Spam is blocked and quarantined set acl_m_quarantined = $acl_m_quarantined content_scanner add_header = X-Spam-Action: quarantined\n accept condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} logwrite = original recipients: $recipients ') dnl ifelse_strstr(confSO2_ACTION` ', `QUARANTINE_MAILLIST ', `') dnl ifelse_strstr(confSO2_ACTION` ', `DISCARD_MAILLIST ', ` # Discard spam messages discard condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} condition = ${if or{{!eq{$h_List-Id:}{}}{eq{$h_Precedence:}{list}}}{yes}{no}} logwrite = SO2 check: Spam is discarded ') dnl ifelse_strstr(confSO2_ACTION` ', `DISCARD_MAILLIST ', `') dnl # Drop spam messages drop condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} logwrite = SO2 check: Spam is dropped message = Spam is blocked (${message_id}) ') dnl ifelse_strstr(confSO2_ACTION` ', `DROP ', `') ifelse_strstr(confSO2_ACTION` ', `DISCARD ', ` ifelse_strstr(confSO2_ACTION` ', `QUARANTINE ', ` # Discard and quarantine spam messages warn condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} logwrite = SO2 check: Spam is quarantined set acl_m_quarantined = $acl_m_quarantined content_scanner add_header = X-Spam-Action: quarantined\n accept condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} logwrite = original recipients: $recipients ',` dnl ifelse_strstr(confSO2_ACTION` ', `QUARANTINE ', `') # Discard spam messages discard condition = ${if eq{$acl_m0}{certainly_spam}{yes}{no}} logwrite = SO2 check: Spam is discarded ') dnl ifelse_strstr(confSO2_ACTION` ', `QUARANTINE ', `') ') dnl ifelse_strstr(confSO2_ACTION` ', `DISCARD ', `') ') dnl ifelse(SECTION, `ACL_CHECK_DATA', `')