added google xoauth2 support + fixed a journaling issue

This commit is contained in:
SJ
2012-09-28 10:34:04 +02:00
parent f930aacc84
commit 55de53bb26
111 changed files with 38812 additions and 4 deletions

View File

@ -13,7 +13,7 @@
#define VERSION "0.1.21"
#define BUILD 706
#define BUILD 708
#define HOSTID "mailarchiver"

View File

@ -162,7 +162,7 @@ struct _state {
int bodylen;
int tolen;
char ms_journal;
char ms_journal, ms_journal_dropped;
};

View File

@ -84,6 +84,8 @@ struct _state parse_message(struct session_data *sdata, int take_into_pieces, st
}
if(take_into_pieces == 1 && state.writebufpos > 0){
if(state.ms_journal == 1) remove_trailing_journal_boundary(&writebuffer[0], &state);
len = write(state.mfd, writebuffer, state.writebufpos);
memset(writebuffer, 0, sizeof(writebuffer));
state.writebufpos = 0;
@ -212,6 +214,7 @@ int parse_line(char *buf, struct _state *state, struct session_data *sdata, int
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(writebuffer, state);
n = write(state->mfd, writebuffer, state->writebufpos); state->writebufpos = 0; memset(writebuffer, 0, writebuffersize);
}
memcpy(writebuffer+state->writebufpos, buf, len); state->writebufpos += len;
@ -327,6 +330,7 @@ int parse_line(char *buf, struct _state *state, struct session_data *sdata, int
else if(strncasecmp(buf, "Subject:", strlen("Subject:")) == 0) state->message_state = MSG_SUBJECT;
else if(strncasecmp(buf, "Recipient:", strlen("Recipient:")) == 0) state->message_state = MSG_RECIPIENT;
else if(strncasecmp(buf, "Date:", strlen("Date:")) == 0 && sdata->sent == 0) sdata->sent = parse_date_header(buf);
else if(strncasecmp(buf, "Received:", strlen("Received:")) == 0) state->message_state = MSG_RECEIVED;
if(state->message_state == MSG_MESSAGE_ID && state->message_id[0] == 0){
p = strchr(buf+11, ' ');
@ -357,6 +361,14 @@ int parse_line(char *buf, struct _state *state, struct session_data *sdata, int
if(p) *p = '\0';
}
if(state->message_state == MSG_RECEIVED && state->ms_journal == 1 && state->ms_journal_dropped == 0){
state->ms_journal_dropped = 1;
state->writebufpos = 0; memset(writebuffer, 0, writebuffersize);
memcpy(writebuffer+state->writebufpos, buf, len); state->writebufpos += strlen(buf);
memcpy(writebuffer+state->writebufpos, "\n", 1); state->writebufpos++;
}
if(state->is_1st_header == 1 && state->message_state == MSG_REFERENCES){
if(strncasecmp(buf, "References:", 11) == 0) parse_reference(state, buf+11);
else parse_reference(state, buf);

View File

@ -34,5 +34,6 @@ char *determine_attachment_type(char *filename, char *type);
char *get_attachment_extractor_by_filename(char *filename);
void parse_reference(struct _state *state, char *s);
int base64_decode_attachment_buffer(char *p, int plen, unsigned char *b, int blen);
void remove_trailing_journal_boundary(char *writebuffer, struct _state *state);
#endif /* _PARSER_H */

View File

@ -96,6 +96,7 @@ void init_state(struct _state *state){
state->bodylen = 0;
state->ms_journal = 0;
state->ms_journal_dropped = 0;
}
@ -811,3 +812,21 @@ int base64_decode_attachment_buffer(char *p, int plen, unsigned char *b, int ble
return b64len;
}
void remove_trailing_journal_boundary(char *writebuffer, struct _state *state){
char *p;
p = strstr(writebuffer, state->boundaries->s);
if(p){
state->writebufpos -= strlen(p);
*p = '\0';
p = strrchr(writebuffer, '\n');
if(p){
state->writebufpos -= strlen(p);
*p = '\0';
}
}
}