diff --git a/configure b/configure index 422e7cb..6b5e712 100755 --- a/configure +++ b/configure @@ -4595,7 +4595,7 @@ CFLAGS="$static -O2 -Wall -g" LIBS="$antispam_libs $sunos_libs " -OBJS="dirs.o base64.o misc.o counters.o cfg.o sig.o decoder.o list.o parser.o parser_utils.o rules.o session.o message.o attachment.o digest.o store.o archive.o tai.o import.o imap.o pop3.o extract.o $objs" +OBJS="dirs.o base64.o misc.o counters.o cfg.o sig.o decoder.o list.o parser.o parser_utils.o rules.o session.o message.o attachment.o digest.o store.o archive.o tai.o import.o imap.o pop3.o extract.o mydomains.o $objs" ac_config_files="$ac_config_files Makefile src/Makefile etc/Makefile util/Makefile init.d/Makefile test/Makefile contrib/imap/Makefile" diff --git a/configure.in b/configure.in index 935d07a..387ad73 100644 --- a/configure.in +++ b/configure.in @@ -394,7 +394,7 @@ CFLAGS="$static -O2 -Wall -g" LIBS="$antispam_libs $sunos_libs " -OBJS="dirs.o base64.o misc.o counters.o cfg.o sig.o decoder.o list.o parser.o parser_utils.o rules.o session.o message.o attachment.o digest.o store.o archive.o tai.o import.o imap.o pop3.o extract.o $objs" +OBJS="dirs.o base64.o misc.o counters.o cfg.o sig.o decoder.o list.o parser.o parser_utils.o rules.o session.o message.o attachment.o digest.o store.o archive.o tai.o import.o imap.o pop3.o extract.o mydomains.o $objs" AC_CONFIG_FILES([Makefile src/Makefile etc/Makefile util/Makefile init.d/Makefile test/Makefile contrib/imap/Makefile]) AC_OUTPUT diff --git a/etc/example.conf b/etc/example.conf index 9c6adfd..ac8902b 100644 --- a/etc/example.conf +++ b/etc/example.conf @@ -95,11 +95,6 @@ ; minimum word length in mail body to index min_word_len=1 -; comma separated list of your domains. piler uses this information to determine -; the direction of the given email -mydomains= - - ; if piler detects this line in the mail header, then it will assume ; the message is a spam. You should include your own antispam solution's ; specific line. diff --git a/src/cfg.c b/src/cfg.c index 2792bf7..6876154 100644 --- a/src/cfg.c +++ b/src/cfg.c @@ -78,7 +78,6 @@ { "memcached_to_db_interval", "integer", (void*) int_parser, offsetof(struct __config, memcached_to_db_interval), "900", sizeof(int)}, { "memcached_ttl", "integer", (void*) int_parser, offsetof(struct __config, memcached_ttl), "86400", sizeof(int)}, { "min_word_len", "integer", (void*) int_parser, offsetof(struct __config, min_word_len), "1", sizeof(int)}, - { "mydomains", "string", (void*) string_parser, offsetof(struct __config, mydomains), "", MAXVAL-1}, { "mysqlhost", "string", (void*) string_parser, offsetof(struct __config, mysqlhost), "", MAXVAL-1}, { "mysqlport", "integer", (void*) int_parser, offsetof(struct __config, mysqlport), "", sizeof(int)}, { "mysqlsocket", "string", (void*) string_parser, offsetof(struct __config, mysqlsocket), "/tmp/mysql.sock", MAXVAL-1}, diff --git a/src/cfg.h b/src/cfg.h index 3c12789..f77b988 100644 --- a/src/cfg.h +++ b/src/cfg.h @@ -49,8 +49,6 @@ unsigned char key[KEYLEN]; unsigned char iv[MAXVAL]; - char mydomains[MAXVAL]; - char spam_header_line[MAXVAL]; int default_retention_days; diff --git a/src/config.h b/src/config.h index cd6b00d..9072653 100644 --- a/src/config.h +++ b/src/config.h @@ -13,7 +13,7 @@ #define VERSION "0.1.23-master-branch" -#define BUILD 744 +#define BUILD 748 #define HOSTID "mailarchiver" @@ -83,6 +83,7 @@ #define SQL_RETENTION_RULE_TABLE "retention_rule" #define SQL_COUNTER_TABLE "counter" #define SQL_OPTION_TABLE "option" +#define SQL_DOMAIN_TABLE "domain" #define SQL_MESSAGES_VIEW "v_messages" #define SQL_ATTACHMENTS_VIEW "v_attachment" diff --git a/src/defs.h b/src/defs.h index 41c8664..79bba2e 100644 --- a/src/defs.h +++ b/src/defs.h @@ -244,6 +244,7 @@ int folder; char recursive_folder_names; char starttls[TINYBUFSIZE]; + char mydomains[MAXBUFSIZE]; #ifdef HAVE_TRE struct rule *archiving_rules; diff --git a/src/import.c b/src/import.c index e271289..3efb548 100644 --- a/src/import.c +++ b/src/import.c @@ -69,7 +69,7 @@ sdata->sent = 0; sdata->delivered = 0; - state = parse_message(sdata, 1, cfg); + state = parse_message(sdata, 1, data, cfg); post_parse(sdata, &state, cfg); if(sdata->sent <= 0 && sdata->delivered > 0) sdata->sent = sdata->delivered; diff --git a/src/misc.c b/src/misc.c index a7702ab..32fa452 100644 --- a/src/misc.c +++ b/src/misc.c @@ -425,11 +425,11 @@ } -int is_email_address_on_my_domains(char *email, struct __config *cfg){ +int is_email_address_on_my_domains(char *email, struct __data *data){ int rc=0; char *p, *q=NULL; - if(email == NULL || cfg->mydomains == NULL) return rc; + if(email == NULL || data->mydomains[0] == '\0') return rc; p = strchr(email, '@'); @@ -441,7 +441,7 @@ if(q) *q = '\0'; - if(strcasestr(cfg->mydomains, p+1)) rc = 1; + if(strcasestr(data->mydomains, p+1)) rc = 1; if(q) *q = ' '; diff --git a/src/misc.h b/src/misc.h index 4732333..24c6a7c 100644 --- a/src/misc.h +++ b/src/misc.h @@ -34,7 +34,7 @@ void write_pid_file(char *pidfile); int drop_privileges(struct passwd *pwd); -int is_email_address_on_my_domains(char *email, struct __config *cfg); +int is_email_address_on_my_domains(char *email, struct __data *data); void init_session_data(struct session_data *sdata, unsigned char server_id); int read_from_stdin(struct session_data *sdata); void strtolower(char *s); diff --git a/src/mydomains.c b/src/mydomains.c new file mode 100644 index 0000000..83e9870 --- /dev/null +++ b/src/mydomains.c @@ -0,0 +1,44 @@ +/* + * mydomains.c, SJ + */ + +#include +#include +#include +#include +#include +#include + + +void load_mydomains(struct session_data *sdata, struct __data *data, struct __config *cfg){ + int clen=0, len=0, size=sizeof(data->mydomains); + char s[SMALLBUFSIZE]; + MYSQL_RES *res; + MYSQL_ROW row; + + memset(data->mydomains, 0, size); + + snprintf(s, sizeof(s)-1, "SELECT `domain` FROM `%s`", SQL_DOMAIN_TABLE); + + if(mysql_real_query(&(sdata->mysql), s, strlen(s)) == 0){ + res = mysql_store_result(&(sdata->mysql)); + if(res != NULL){ + while((row = mysql_fetch_row(res))){ + snprintf(s, sizeof(s)-1, "%s,", (char*)row[0]); + len = strlen(s); + + if(clen + len + 1 < size){ + memcpy(data->mydomains+clen, s, len); + clen += len; + } + else break; + } + + mysql_free_result(res); + } + + } + + if(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "mydomains: '%s'", data->mydomains); +} + diff --git a/src/parser.c b/src/parser.c index 5ebafb3..92d20a5 100644 --- a/src/parser.c +++ b/src/parser.c @@ -16,7 +16,7 @@ #include -struct _state parse_message(struct session_data *sdata, int take_into_pieces, struct __config *cfg){ +struct _state parse_message(struct session_data *sdata, int take_into_pieces, struct __data *data, struct __config *cfg){ FILE *f; int i, len; char *p, buf[MAXBUFSIZE], puf[SMALLBUFSIZE]; @@ -80,7 +80,7 @@ } while(fgets(buf, sizeof(buf)-1, f)){ - parse_line(buf, &state, sdata, take_into_pieces, &writebuffer[0], sizeof(writebuffer), &abuffer[0], sizeof(abuffer), cfg); + parse_line(buf, &state, sdata, take_into_pieces, &writebuffer[0], sizeof(writebuffer), &abuffer[0], sizeof(abuffer), data, cfg); } if(take_into_pieces == 1 && state.writebufpos > 0){ @@ -174,7 +174,7 @@ } -int parse_line(char *buf, struct _state *state, struct session_data *sdata, int take_into_pieces, char *writebuffer, int writebuffersize, char *abuffer, int abuffersize, struct __config *cfg){ +int parse_line(char *buf, struct _state *state, struct session_data *sdata, int take_into_pieces, char *writebuffer, int writebuffersize, char *abuffer, int abuffersize, struct __data *data, struct __config *cfg){ char *p, *q, puf[SMALLBUFSIZE]; unsigned char b64buffer[MAXBUFSIZE]; int t, n64, len, writelen, boundary_line=0; @@ -618,7 +618,7 @@ } } - if(is_email_address_on_my_domains(puf, cfg) == 1) sdata->internal_sender = 1; + if(is_email_address_on_my_domains(puf, data) == 1) sdata->internal_sender = 1; if(strlen(state->b_from) < SMALLBUFSIZE-len-1){ split_email_address(puf); @@ -643,7 +643,7 @@ state->tolen += len; if(does_it_seem_like_an_email_address(puf) == 1){ - if(is_email_address_on_my_domains(puf, cfg) == 1) sdata->internal_recipient = 1; + if(is_email_address_on_my_domains(puf, data) == 1) sdata->internal_recipient = 1; else sdata->external_recipient = 1; q = strchr(puf, '@'); diff --git a/src/parser.h b/src/parser.h index 2363472..6c47eaf 100644 --- a/src/parser.h +++ b/src/parser.h @@ -9,9 +9,9 @@ #include "config.h" #include "defs.h" -struct _state parse_message(struct session_data *sdata, int take_into_pieces, struct __config *cfg); +struct _state parse_message(struct session_data *sdata, int take_into_pieces, struct __data *data, struct __config *cfg); void post_parse(struct session_data *sdata, struct _state *state, struct __config *cfg); -int parse_line(char *buf, struct _state *state, struct session_data *sdata, int take_into_pieces, char *writebuffer, int writebuffersize, char *abuffer, int abuffersize, struct __config *cfg); +int parse_line(char *buf, struct _state *state, struct session_data *sdata, int take_into_pieces, char *writebuffer, int writebuffersize, char *abuffer, int abuffersize, struct __data *data, struct __config *cfg); void init_state(struct _state *state); unsigned long parse_date_header(char *s); diff --git a/src/piler.c b/src/piler.c index f29cb19..c508942 100644 --- a/src/piler.c +++ b/src/piler.c @@ -323,11 +323,11 @@ data.archiving_rules = NULL; data.retention_rules = NULL; - memset(data.starttls, 0, TINYBUFSIZE); + memset(data.starttls, 0, sizeof(data.starttls)); #ifdef HAVE_STARTTLS if(cfg.tls_enable > 0 && data.ctx == NULL && init_ssl() == OK){ - snprintf(data.starttls, TINYBUFSIZE-1, "250-STARTTLS\r\n"); + snprintf(data.starttls, sizeof(data.starttls)-1, "250-STARTTLS\r\n"); } #endif @@ -341,6 +341,8 @@ load_rules(&sdata, &(data.archiving_rules), SQL_ARCHIVING_RULE_TABLE); load_rules(&sdata, &(data.retention_rules), SQL_RETENTION_RULE_TABLE); + load_mydomains(&sdata, &data, &cfg); + mysql_close(&(sdata.mysql)); diff --git a/src/piler.h b/src/piler.h index 83d0346..236e735 100644 --- a/src/piler.h +++ b/src/piler.h @@ -62,5 +62,7 @@ int retrieve_file_from_archive(char *filename, int mode, char **buffer, FILE *dest, struct __config *cfg); +void load_mydomains(struct session_data *sdata, struct __data *data, struct __config *cfg); + #endif /* _PILER_H */ diff --git a/src/pilerimport.c b/src/pilerimport.c index 757112f..58e9baa 100644 --- a/src/pilerimport.c +++ b/src/pilerimport.c @@ -504,6 +504,8 @@ load_rules(&sdata, &(data.archiving_rules), SQL_ARCHIVING_RULE_TABLE); load_rules(&sdata, &(data.retention_rules), SQL_RETENTION_RULE_TABLE); + load_mydomains(&sdata, &data, &cfg); + if(emlfile) rc = import_message(emlfile, &sdata, &data, &cfg); if(mbox[0]){ diff --git a/src/reindex.c b/src/reindex.c index a255d26..4e8f20f 100644 --- a/src/reindex.c +++ b/src/reindex.c @@ -106,7 +106,7 @@ snprintf(sdata->filename, SMALLBUFSIZE-1, "%s", filename); - state = parse_message(sdata, 0, cfg); + state = parse_message(sdata, 0, data, cfg); post_parse(sdata, &state, cfg); sdata->now = strtoul(row[2], NULL, 10); @@ -224,6 +224,7 @@ 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")); + load_mydomains(&sdata, &data, &cfg); if(all == 1){ from_id = 1; diff --git a/src/session.c b/src/session.c index d1937f3..6207d19 100644 --- a/src/session.c +++ b/src/session.c @@ -155,7 +155,7 @@ gettimeofday(&tv1, &tz); - sstate = parse_message(&sdata, 1, cfg); + sstate = parse_message(&sdata, 1, data, cfg); post_parse(&sdata, &sstate, cfg); gettimeofday(&tv2, &tz); diff --git a/src/test.c b/src/test.c index be3d7b3..881afc8 100644 --- a/src/test.c +++ b/src/test.c @@ -60,6 +60,8 @@ load_rules(&sdata, &(data.archiving_rules), SQL_ARCHIVING_RULE_TABLE); load_rules(&sdata, &(data.retention_rules), SQL_RETENTION_RULE_TABLE); + load_mydomains(&sdata, &data, &cfg); + init_session_data(&sdata, cfg.server_id); sdata.sent = 0; @@ -70,7 +72,7 @@ snprintf(sdata.filename, SMALLBUFSIZE-1, "%s", argv[1]); snprintf(sdata.tmpframe, SMALLBUFSIZE-1, "%s.m", argv[1]); - state = parse_message(&sdata, 1, &cfg); + state = parse_message(&sdata, 1, &data, &cfg); post_parse(&sdata, &state, &cfg); printf("message-id: %s\n", state.message_id); diff --git a/test/debug.c b/test/debug.c index f1a2b2a..c589d73 100644 --- a/test/debug.c +++ b/test/debug.c @@ -16,6 +16,7 @@ struct stat st; struct session_data sdata; struct _state state; + struct __data data; struct __config cfg; @@ -44,7 +45,7 @@ cfg.debug = 1; - state = parse_message(&sdata, 0, &cfg); + state = parse_message(&sdata, 0, &data, &cfg); post_parse(&sdata, &state, &cfg); printf("message-id: %s\n", state.message_id); diff --git a/test/ptest.c b/test/ptest.c index 5b09bdd..74f864f 100644 --- a/test/ptest.c +++ b/test/ptest.c @@ -67,7 +67,7 @@ sdata->sent = 0; - state = parse_message(sdata, 1, cfg); + state = parse_message(sdata, 1, data, cfg); post_parse(sdata, &state, cfg); unlink(sdata->tmpframe); @@ -425,6 +425,8 @@ load_rules(&sdata, &(data.archiving_rules), SQL_ARCHIVING_RULE_TABLE); load_rules(&sdata, &(data.retention_rules), SQL_RETENTION_RULE_TABLE); + load_mydomains(&sdata, &data, &cfg); + if(emlfile) rc = import_message(emlfile, &sdata, &data, &cfg); if(mbox[0]){ for(i=0; i