diff --git a/src/defs.h b/src/defs.h index 7506b0e..9c68a13 100644 --- a/src/defs.h +++ b/src/defs.h @@ -162,7 +162,6 @@ int bodylen; int tolen; - char ms_journal, ms_journal_dropped; }; @@ -181,6 +180,8 @@ char bodydigest[2*DIGEST_LENGTH+1]; char digest[2*DIGEST_LENGTH+1]; time_t now, sent, retained; + char ms_journal, ms_journal_dropped; + int journal_envelope_length, journal_bottom_length; #ifdef NEED_MYSQL MYSQL mysql; #endif diff --git a/src/digest.c b/src/digest.c index 13046b2..2bbd1f8 100644 --- a/src/digest.c +++ b/src/digest.c @@ -33,7 +33,7 @@ int make_digests(struct session_data *sdata, struct __config *cfg){ - int i=0, n, fd, offset=3, hdr_len=0; + int i=0, n, fd, offset=3, hdr_len=0, len=0; char *body=NULL; unsigned char buf[BIGBUFSIZE], md[DIGEST_LENGTH], md2[DIGEST_LENGTH]; SHA256_CTX context, context2; @@ -47,7 +47,15 @@ fd = open(sdata->filename, O_RDONLY); if(fd == -1) return -1; + if(sdata->ms_journal == 1 && sdata->journal_envelope_length < sizeof(buf)){ + n = read(fd, buf, sdata->journal_envelope_length); + } + + while((n = read(fd, buf, sizeof(buf))) > 0){ + len += n; + + if(sdata->ms_journal == 1 && len > sdata->tot_len) n -= len - sdata->tot_len; SHA256_Update(&context2, buf, n); diff --git a/src/misc.c b/src/misc.c index 99155c0..24dc62b 100644 --- a/src/misc.c +++ b/src/misc.c @@ -396,6 +396,11 @@ sdata->tot_len = 0; sdata->num_of_rcpt_to = 0; + sdata->ms_journal = 0; + sdata->ms_journal_dropped = 0; + sdata->journal_envelope_length = 0; + sdata->journal_bottom_length = 0; + sdata->tre = '-'; sdata->rav = AVIR_OK; diff --git a/src/parser.c b/src/parser.c index 8c88059..82cd862 100644 --- a/src/parser.c +++ b/src/parser.c @@ -84,7 +84,7 @@ } if(take_into_pieces == 1 && state.writebufpos > 0){ - if(state.ms_journal == 1) remove_trailing_journal_boundary(sdata, &state, &writebuffer[0]); + if(sdata->ms_journal == 1) remove_trailing_journal_boundary(sdata, &state, &writebuffer[0]); len = write(state.mfd, writebuffer, state.writebufpos); memset(writebuffer, 0, sizeof(writebuffer)); @@ -95,6 +95,10 @@ close(state.mfd); state.mfd = 0; } + if(sdata->ms_journal == 1){ + sdata->tot_len -= sdata->journal_envelope_length + sdata->journal_bottom_length; + } + fclose(f); return state; @@ -168,8 +172,8 @@ sdata->spam_message = 1; } - if(state->is_1st_header == 1 && state->ms_journal == 0 && strncmp(buf, "X-MS-Journal-Report:", strlen("X-MS-Journal-Report:")) == 0){ - state->ms_journal = 1; + if(state->is_1st_header == 1 && sdata->ms_journal == 0 && strncmp(buf, "X-MS-Journal-Report:", strlen("X-MS-Journal-Report:")) == 0){ + sdata->ms_journal = 1; memset(state->message_id, 0, SMALLBUFSIZE); memset(state->b_from, 0, SMALLBUFSIZE); @@ -177,6 +181,11 @@ } + if(sdata->ms_journal_dropped == 0){ + sdata->journal_envelope_length += len; + } + + if(state->message_rfc822 == 0 && (buf[0] == '\r' || buf[0] == '\n') ){ state->message_state = MSG_BODY; @@ -184,7 +193,7 @@ state->is_1st_header = 0; } - if(state->ms_journal == 1 && strncasecmp(buf, "Received:", strlen("Received:")) == 0){ + if(sdata->ms_journal == 1 && strncasecmp(buf, "Received:", strlen("Received:")) == 0){ state->is_1st_header = 1; state->is_header = 1; memset(state->b_body, 0, BIGBUFSIZE); @@ -214,7 +223,7 @@ state->saved_size += len; //n = write(state->mfd, buf, len); // WRITE if(len + state->writebufpos > writebuffersize-1){ - if(state->ms_journal == 1) remove_trailing_journal_boundary(sdata, state, writebuffer); + if(sdata->ms_journal == 1) remove_trailing_journal_boundary(sdata, state, writebuffer); n = write(state->mfd, writebuffer, state->writebufpos); state->writebufpos = 0; memset(writebuffer, 0, writebuffersize); } memcpy(writebuffer+state->writebufpos, buf, len); state->writebufpos += len; @@ -350,7 +359,7 @@ } - if(state->message_state == MSG_BODY && state->ms_journal == 1 && strncasecmp(buf, "Recipient:", strlen("Recipient:")) == 0){ + if(state->message_state == MSG_BODY && sdata->ms_journal == 1 && strncasecmp(buf, "Recipient:", strlen("Recipient:")) == 0){ state->is_header = 1; state->is_1st_header = 1; state->message_state = MSG_RECIPIENT; @@ -361,10 +370,11 @@ if(p) *p = '\0'; } - if(state->message_state == MSG_RECEIVED && state->ms_journal == 1 && state->ms_journal_dropped == 0){ - state->ms_journal_dropped = 1; + if(state->message_state == MSG_RECEIVED && sdata->ms_journal == 1 && sdata->ms_journal_dropped == 0){ + sdata->ms_journal_dropped = 1; + sdata->journal_envelope_length -= len; state->writebufpos = 0; memset(writebuffer, 0, writebuffersize); - memcpy(writebuffer+state->writebufpos, buf, len); state->writebufpos += strlen(buf); + memcpy(writebuffer+state->writebufpos, buf, strlen(buf)); state->writebufpos += strlen(buf); memcpy(writebuffer+state->writebufpos, "\n", 1); state->writebufpos++; } diff --git a/src/parser_utils.c b/src/parser_utils.c index b85d1ca..c77c118 100644 --- a/src/parser_utils.c +++ b/src/parser_utils.c @@ -94,9 +94,6 @@ state->tolen = 0; state->bodylen = 0; - - state->ms_journal = 0; - state->ms_journal_dropped = 0; } @@ -820,14 +817,14 @@ p = strstr(writebuffer, state->boundaries->s); if(p){ len = strlen(p); + sdata->journal_bottom_length = len; state->writebufpos -= len; - sdata->tot_len -= len; *p = '\0'; p = strrchr(writebuffer, '\n'); if(p){ len = strlen(p); + sdata->journal_bottom_length += len; state->writebufpos -= len; - sdata->tot_len -= len; *p = '\0'; } } diff --git a/src/test.c b/src/test.c index 7834c01..a1caa1a 100644 --- a/src/test.c +++ b/src/test.c @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include