summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2009-04-21 16:39:02 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2009-04-21 16:39:02 +0400
commit16c56baa23eb1de585b978b653907b31aceae153 (patch)
treed010acabc261d9db6a072f80699090702d5dfa32
parentf074850e41e357aa7a2c5a86d2eef8121710cc47 (diff)
downloadrspamd-16c56baa23eb1de585b978b653907b31aceae153.tar.gz
rspamd-16c56baa23eb1de585b978b653907b31aceae153.zip
* Write simple approach of chartable module for raw mode texts
* Add description and usage sample for chartable module
-rw-r--r--README.utf8.txt20
-rw-r--r--rspamd.conf.sample6
-rw-r--r--src/plugins/chartable.c64
3 files changed, 62 insertions, 28 deletions
diff --git a/README.utf8.txt b/README.utf8.txt
index 4d761da76..a52e380f4 100644
--- a/README.utf8.txt
+++ b/README.utf8.txt
@@ -156,3 +156,23 @@ SOME_SYMBOL = "${to_blah} & !(${from_blah} | ${subject_blah})"
* has_only_html_part - функция возвращает TRUE, если в сообщении есть только одна HTML часть
* compare_recipients_distance - вычисляет процент схожих получателей письма. Принимает аргумент - порог в процентах похожести.
* is_recipients_sorted - возвращает TRUE, если список получателей сортирован (работает только если число получателей >= 5).
+
+Модуль 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/rspamd.conf.sample b/rspamd.conf.sample
index 838fa6bd3..900eb0599 100644
--- a/rspamd.conf.sample
+++ b/rspamd.conf.sample
@@ -140,6 +140,12 @@ $subject_blah = "Subject=/blah/H";
BLAH_SYMBOL = "${to_blah} & !(${from_blah} | ${subject_blah})";
};
+.module 'chartable' {
+ metric = "default";
+ symbold = "R_MIXED_CHARSET";
+ threshold = "0.1";
+};
+
# If enables threat each regexp as raw regex and do not try to convert
# each text part to utf8 encoding. Save a lot of resources but less
# portable.
diff --git a/src/plugins/chartable.c b/src/plugins/chartable.c
index 95987e48a..fe2ed858e 100644
--- a/src/plugins/chartable.c
+++ b/src/plugins/chartable.c
@@ -114,40 +114,54 @@ chartable_module_reconfig (struct config_file *cfg)
}
static gboolean
-check_part (struct mime_text_part *part)
+check_part (struct mime_text_part *part, gboolean raw_mode)
{
- char *p, *p1;
+ unsigned char *p, *p1;
gunichar c, t;
GUnicodeScript scc, sct;
uint32_t mark = 0, total = 0;
uint32_t remain = part->content->len;
- if (part->is_raw) {
- return FALSE;
- }
-
p = part->content->data;
- while (remain > 0) {
- c = g_utf8_get_char (p);
- scc = g_unichar_get_script (c);
- p1 = g_utf8_next_char (p);
- remain -= p1 - p;
- p = p1;
-
- if (remain > 0) {
- t = g_utf8_get_char (p);
- sct = g_unichar_get_script (t);
- if (g_unichar_isalnum (c) && g_unichar_isalnum (t)) {
- /* We have two unicode alphanumeric characters, so we can check its script */
- if (sct != scc) {
- mark ++;
- }
+ if (part->is_raw || raw_mode) {
+ while (remain > 1) {
+ if ((g_ascii_isalpha (*p) && (*(p + 1) & 0x80)) ||
+ ((*p & 0x80) && g_ascii_isalpha (*(p + 1)))) {
+ mark ++;
total ++;
}
+ /* Current and next symbols are of one class */
+ else if (((*p & 0x80) && (*(p + 1) & 0x80)) ||
+ (g_ascii_isalpha (*p) && g_ascii_isalpha (*(p + 1)))) {
+ total ++;
+ }
+ p ++;
+ remain --;
+ }
+ }
+ else {
+ while (remain > 0) {
+ c = g_utf8_get_char (p);
+ scc = g_unichar_get_script (c);
p1 = g_utf8_next_char (p);
remain -= p1 - p;
p = p1;
+
+ if (remain > 0) {
+ t = g_utf8_get_char (p);
+ sct = g_unichar_get_script (t);
+ if (g_unichar_isalnum (c) && g_unichar_isalnum (t)) {
+ /* We have two unicode alphanumeric characters, so we can check its script */
+ if (sct != scc) {
+ mark ++;
+ }
+ total ++;
+ }
+ p1 = g_utf8_next_char (p);
+ remain -= p1 - p;
+ p = p1;
+ }
}
}
@@ -159,15 +173,9 @@ chartable_mime_filter (struct worker_task *task)
{
GList *cur;
- /* XXX: write translation tables for this */
- if (task->cfg->raw_mode) {
- msg_warn ("chartable_mime_filter: cannot work in non-unicode mode");
- return 0;
- }
-
cur = g_list_first (task->text_parts);
while (cur) {
- if (check_part ((struct mime_text_part *)cur->data)) {
+ if (check_part ((struct mime_text_part *)cur->data, task->cfg->raw_mode)) {
insert_result (task, chartable_module_ctx->metric, chartable_module_ctx->symbol, 1, NULL);
}
cur = g_list_next (cur);