diff --git a/README b/README index dc804bb..8440206 100644 --- a/README +++ b/README @@ -14,6 +14,5 @@ indexer delta1 --rotate -indexer --merge main1 delta1 --rotate - +indexer --merge main1 delta1 --rotate --merge-dst-range deleted 0 0 diff --git a/etc/cron.jobs.in b/etc/cron.jobs.in index 40b8c63..37179c0 100644 --- a/etc/cron.jobs.in +++ b/etc/cron.jobs.in @@ -2,7 +2,7 @@ sphinx cronjob: -*/2 * * * * /usr/local/bin/indexer --quiet delta1 --rotate && sleep 2 && /usr/local/bin/indexer --quiet --merge main1 delta1 --rotate +*/2 * * * * /usr/local/bin/indexer --quiet delta1 --rotate && sleep 2 && /usr/local/bin/indexer --quiet --merge main1 delta1 --merge-dst-range deleted 0 0 --rotate */5 * * * * /usr/local/bin/indexer --quiet tag1 --rotate diff --git a/etc/sphinx.conf b/etc/sphinx.conf index dff3aea..50bf719 100644 --- a/etc/sphinx.conf +++ b/etc/sphinx.conf @@ -11,13 +11,15 @@ sql_pass = sphinx sql_query_pre = SET NAMES utf8 - sql_query = SELECT id, `from`, `to`, `subject`, `arrived`, `sent`, `body`, `size`, `attachments` FROM sph_index \ + sql_query = SELECT id, `from`, `to`, `subject`, `arrived`, `sent`, `body`, `size`, `attachments`, `deleted` FROM sph_index \ WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) sql_attr_uint = size sql_attr_uint = arrived sql_attr_uint = sent sql_attr_uint = attachments + sql_attr_bool = deleted + } source delta @@ -31,13 +33,14 @@ sql_query_pre = SET NAMES utf8 sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM sph_index sql_query_post_index = DELETE FROM sph_index WHERE id<=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) - sql_query = SELECT id, `from`, `to`, `subject`, `arrived`, `sent`, `body`, `size`, `attachments` FROM sph_index \ + sql_query = SELECT id, `from`, `to`, `subject`, `arrived`, `sent`, `body`, `size`, `attachments`, `deleted` FROM sph_index \ WHERE id <= (SELECT max_doc_id FROM sph_counter WHERE counter_id=1) sql_attr_uint = size sql_attr_uint = arrived sql_attr_uint = sent sql_attr_uint = attachments + sql_attr_bool = deleted } diff --git a/src/defs.h b/src/defs.h index 72260be..cbaf6c4 100644 --- a/src/defs.h +++ b/src/defs.h @@ -128,7 +128,7 @@ struct session_data { - char ttmpfile[SMALLBUFSIZE], tmpframe[SMALLBUFSIZE], tre; + char ttmpfile[SMALLBUFSIZE], tmpframe[SMALLBUFSIZE], tre, restored_copy; char mailfrom[SMALLBUFSIZE], rcptto[MAX_RCPT_TO][SMALLBUFSIZE], client_addr[SMALLBUFSIZE]; char acceptbuf[SMALLBUFSIZE]; char whitelist[MAXBUFSIZE], blacklist[MAXBUFSIZE]; diff --git a/src/parser.c b/src/parser.c index e43d2b4..3a850e6 100644 --- a/src/parser.c +++ b/src/parser.c @@ -82,6 +82,10 @@ state->line_num++; len = strlen(buf); + if(state->is_1st_header == 1 && (strncmp(buf, "Received: by piler", strlen("Received: by piler")) == 0 || strncmp(buf, "X-piler-id: ", strlen("X-piler-id: ")) == 0) ){ + sdata->restored_copy = 1; + } + //printf("buf: %s", buf); if(state->message_rfc822 == 0 && (buf[0] == '\r' || buf[0] == '\n') ){ diff --git a/src/session.c b/src/session.c index 82e46e4..9cbc1b0 100644 --- a/src/session.c +++ b/src/session.c @@ -180,7 +180,11 @@ if(db_conn == 1){ - if(AVIR_VIRUS == sdata.rav){ + if(sdata.restored_copy == 1){ + syslog(LOG_PRIORITY, "%s: discarding restored copy", sdata.ttmpfile); + inj = OK; + } + else if(AVIR_VIRUS == sdata.rav){ syslog(LOG_PRIORITY, "%s: found virus: %s", sdata.ttmpfile, virusinfo); counters.c_virus++; inj = OK; @@ -501,6 +505,7 @@ memset(sdata->whitelist, 0, MAXBUFSIZE); memset(sdata->blacklist, 0, MAXBUFSIZE); + sdata->restored_copy = 0; sdata->hdr_len = 0; sdata->tot_len = 0; diff --git a/src/test.c b/src/test.c index d6e50e4..535bffd 100644 --- a/src/test.c +++ b/src/test.c @@ -12,6 +12,7 @@ #include #include #include +#include #include @@ -44,6 +45,9 @@ return 0; } + mysql_real_query(&(sdata.mysql), "SET NAMES utf8", strlen("SET NAMES utf8")); + mysql_real_query(&(sdata.mysql), "SET CHARACTER SET utf8", strlen("SET CHARACTER SET utf8")); + printf("locale: %s\n", setlocale(LC_MESSAGES, cfg.locale)); setlocale(LC_CTYPE, cfg.locale); @@ -71,21 +75,27 @@ //printf("body: *%s*\n", state.b_body); make_body_digest(&sdata, &cfg); + + printf("hdr len: %d\n", sdata.hdr_len); + rule = check_againt_ruleset(data.rules, &state, st.st_size); - //printf("body digest: %s\n", sdata.bodydigest); + printf("body digest: %s\n", sdata.bodydigest); printf("rules check: %s\n", rule); - mysql_close(&(sdata.mysql)); - free_rule(data.rules); for(i=1; i<=state.n_attachments; i++){ printf("i:%d, name=*%s*, type: *%s*, size: %d, int.name: %s, digest: %s\n", i, state.attachments[i].filename, state.attachments[i].type, state.attachments[i].size, state.attachments[i].internalname, state.attachments[i].digest); } + printf("\n\n"); + mysql_close(&(sdata.mysql)); + return 0; } + + diff --git a/util/db-mysql.sql b/util/db-mysql.sql index c3c8700..a908e9b 100644 --- a/util/db-mysql.sql +++ b/util/db-mysql.sql @@ -32,7 +32,7 @@ `subject` text(512) default null, `arrived` int not null, `sent` int not null, - `deleted` int default 0, + `deleted` tinyint(1) default 0, `size` int default 0, `hlen` int default 0, `attachments` int default 0, @@ -46,6 +46,7 @@ create index metadata_idx on metadata(`piler_id`); create index metadata_idx2 on metadata(`message_id`); create index metadata_idx3 on metadata(`bodydigest`); +create index metadata_idx4 on metadata(`deleted`); drop table if exists `rcpt`;