diff --git a/src/config.h b/src/config.h index 5b04af1..a2079ab 100644 --- a/src/config.h +++ b/src/config.h @@ -14,7 +14,7 @@ #define VERSION "0.1.25-master-branch" -#define BUILD 867 +#define BUILD 868 #define HOSTID "mailarchiver" diff --git a/src/defs.h b/src/defs.h index 7403000..971089c 100644 --- a/src/defs.h +++ b/src/defs.h @@ -148,6 +148,7 @@ int abufpos; char attachedfile[RND_STR_LEN+SMALLBUFSIZE]; char message_id[SMALLBUFSIZE]; + char message_id_hash[2*DIGEST_LENGTH+1]; char miscbuf[MAX_TOKEN_LEN]; char qpbuf[MAX_TOKEN_LEN]; unsigned long n_token; diff --git a/src/import.c b/src/import.c index a3c8b27..55bb2b7 100644 --- a/src/import.c +++ b/src/import.c @@ -98,6 +98,7 @@ } rc = process_message(sdata, &state, data, cfg); + unlink(state.message_id_hash); } unlink(sdata->tmpframe); diff --git a/src/message.c b/src/message.c index 624b7f0..bfe2d9e 100644 --- a/src/message.c +++ b/src/message.c @@ -240,7 +240,7 @@ int process_message(struct session_data *sdata, struct _state *state, struct __data *data, struct __config *cfg){ - int rc; + int rc, fd; /* discard if existing message_id */ @@ -257,6 +257,12 @@ return ERR_EXISTS; } + fd = open(state->message_id_hash, O_CREAT|O_EXCL|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR); + if(fd == -1){ + remove_stripped_attachments(state); + return ERR_EXISTS; + } + /* store base64 encoded file attachments */ diff --git a/src/parser.c b/src/parser.c index 2fd3522..4fc6ab2 100644 --- a/src/parser.c +++ b/src/parser.c @@ -145,6 +145,9 @@ else snprintf(state->message_id, SMALLBUFSIZE-1, "null"); } + + digest_string(state->message_id, &(state->message_id_hash[0])); + } diff --git a/src/parser_utils.c b/src/parser_utils.c index 8720bd5..af63c1f 100644 --- a/src/parser_utils.c +++ b/src/parser_utils.c @@ -48,6 +48,7 @@ state->content_type_is_set = 0; memset(state->message_id, 0, SMALLBUFSIZE); + memset(state->message_id_hash, 0, 2*DIGEST_LENGTH+1); memset(state->miscbuf, 0, MAX_TOKEN_LEN); memset(state->qpbuf, 0, MAX_TOKEN_LEN); diff --git a/src/session.c b/src/session.c index 59e52e2..c8a6d73 100644 --- a/src/session.c +++ b/src/session.c @@ -231,6 +231,7 @@ } else { inj = process_message(&sdata, &sstate, data, cfg); + unlink(sstate.message_id_hash); counters.c_size += sdata.tot_len; } @@ -258,7 +259,7 @@ counters.c_rcvd++; if(inj == ERR_EXISTS){ - syslog(LOG_PRIORITY, "%s: discarding: duplicate message, id: %llu", sdata.ttmpfile, sdata.duplicate_id); + syslog(LOG_PRIORITY, "%s: discarding: duplicate message, id: %llu, message-id: %s", sdata.ttmpfile, sdata.duplicate_id, sstate.message_id); counters.c_duplicate++; status = S_STATUS_DUPLICATE; } diff --git a/src/test.c b/src/test.c index 89ebfa8..fdfe6ac 100644 --- a/src/test.c +++ b/src/test.c @@ -78,7 +78,7 @@ printf("post parsing...\n"); post_parse(&sdata, &state, &cfg); - printf("message-id: %s\n", state.message_id); + printf("message-id: %s / %s\n", state.message_id, state.message_id_hash); printf("from: *%s (%s)*\n", state.b_from, state.b_from_domain); printf("to: *%s (%s)*\n", state.b_to, state.b_to_domain); printf("reference: *%s*\n", state.reference);