added reimport option for pilerimport

This commit is contained in:
SJ 2016-04-05 21:10:09 +02:00
parent 67891084e4
commit 65fc0b377e
47 changed files with 314 additions and 208 deletions

View File

@ -33,7 +33,7 @@ MAKE = `which make`
INSTALL = @INSTALL@
all: libpiler.a piler pilerconf pilerget pileraget pilerimport pilerexport pilerpurge reindex test fixmetadata
all: libpiler.a piler pilerconf pilerget pileraget pilerimport pilerexport pilerpurge reindex test
install: install-piler

View File

@ -222,7 +222,7 @@ int retrieve_email_from_archive(struct session_data *sdata, struct __data *data,
return 1;
}
attachments = query_attachments(sdata, data, &ptr_arr[0], cfg);
attachments = query_attachments(sdata, data, &ptr_arr[0]);
if(attachments == -1){
printf("problem querying the attachment of %s\n", sdata->ttmpfile);

View File

@ -21,8 +21,8 @@ int store_attachments(struct session_data *sdata, struct parser_state *state, st
int i, rc=1, found, affected_rows;
if(prepare_sql_statement(sdata, &(data->stmt_insert_into_attachment_table), SQL_PREPARED_STMT_INSERT_INTO_ATTACHMENT_TABLE, cfg) == ERR) return rc;
if(prepare_sql_statement(sdata, &(data->stmt_get_attachment_id_by_signature), SQL_PREPARED_STMT_GET_ATTACHMENT_ID_BY_SIGNATURE, cfg) == ERR) return rc;
if(prepare_sql_statement(sdata, &(data->stmt_insert_into_attachment_table), SQL_PREPARED_STMT_INSERT_INTO_ATTACHMENT_TABLE) == ERR) return rc;
if(prepare_sql_statement(sdata, &(data->stmt_get_attachment_id_by_signature), SQL_PREPARED_STMT_GET_ATTACHMENT_ID_BY_SIGNATURE) == ERR) return rc;
for(i=1; i<=state->n_attachments; i++){
@ -42,13 +42,13 @@ int store_attachments(struct session_data *sdata, struct parser_state *state, st
data->sql[data->pos] = (char *)&id; data->type[data->pos] = TYPE_LONGLONG; data->len[data->pos] = sizeof(uint64); data->pos++;
p_store_results(sdata, data->stmt_get_attachment_id_by_signature, data);
p_store_results(data->stmt_get_attachment_id_by_signature, data);
if(p_fetch_results(data->stmt_get_attachment_id_by_signature) == OK) found = 1;
p_free_results(data->stmt_get_attachment_id_by_signature);
}
if(found == 0){
if(store_file(sdata, state->attachments[i].internalname, 0, 0, cfg) == 0){
if(store_file(sdata, state->attachments[i].internalname, 0, cfg) == 0){
syslog(LOG_PRIORITY, "%s: error storing attachment: %s", sdata->ttmpfile, state->attachments[i].internalname);
goto CLOSE;
}
@ -91,10 +91,10 @@ CLOSE:
}
int query_attachment_pointers(struct session_data *sdata, struct __data *data, uint64 ptr, char *piler_id, int *id, struct __config *cfg){
int query_attachment_pointers(struct session_data *sdata, struct __data *data, uint64 ptr, char *piler_id, int *id){
int rc=0;
if(prepare_sql_statement(sdata, &(data->stmt_get_attachment_pointer), SQL_PREPARED_STMT_GET_ATTACHMENT_POINTER, cfg) == ERR) return rc;
if(prepare_sql_statement(sdata, &(data->stmt_get_attachment_pointer), SQL_PREPARED_STMT_GET_ATTACHMENT_POINTER) == ERR) return rc;
p_bind_init(data);
@ -108,7 +108,7 @@ int query_attachment_pointers(struct session_data *sdata, struct __data *data, u
data->sql[data->pos] = piler_id; data->type[data->pos] = TYPE_STRING; data->len[data->pos] = RND_STR_LEN; data->pos++;
data->sql[data->pos] = (char *)id; data->type[data->pos] = TYPE_LONG; data->len[data->pos] = sizeof(int); data->pos++;
p_store_results(sdata, data->stmt_get_attachment_pointer, data);
p_store_results(data->stmt_get_attachment_pointer, data);
if(p_fetch_results(data->stmt_get_attachment_pointer) == OK) rc = 1;
p_free_results(data->stmt_get_attachment_pointer);
@ -120,13 +120,13 @@ int query_attachment_pointers(struct session_data *sdata, struct __data *data, u
}
int query_attachments(struct session_data *sdata, struct __data *data, struct ptr_array *ptr_arr, struct __config *cfg){
int query_attachments(struct session_data *sdata, struct __data *data, struct ptr_array *ptr_arr){
int i, rc, id, attachments=0;
uint64 ptr;
for(i=0; i<MAX_ATTACHMENTS; i++) memset((char*)&ptr_arr[i], 0, sizeof(struct ptr_array));
if(prepare_sql_statement(sdata, &(data->stmt_query_attachment), SQL_PREPARED_STMT_QUERY_ATTACHMENT, cfg) == ERR) return attachments;
if(prepare_sql_statement(sdata, &(data->stmt_query_attachment), SQL_PREPARED_STMT_QUERY_ATTACHMENT) == ERR) return attachments;
p_bind_init(data);
@ -139,14 +139,14 @@ int query_attachments(struct session_data *sdata, struct __data *data, struct pt
data->sql[data->pos] = (char *)&id; data->type[data->pos] = TYPE_LONG; data->len[data->pos] = sizeof(int); data->pos++;
data->sql[data->pos] = (char *)&ptr; data->type[data->pos] = TYPE_LONGLONG; data->len[data->pos] = sizeof(uint64); data->pos++;
p_store_results(sdata, data->stmt_query_attachment, data);
p_store_results(data->stmt_query_attachment, data);
while(p_fetch_results(data->stmt_query_attachment) == OK){
if(id > 0 && id < MAX_ATTACHMENTS){
if(ptr > 0){
ptr_arr[id].ptr = ptr;
rc = query_attachment_pointers(sdata, data, ptr, &(ptr_arr[id].piler_id[0]), &(ptr_arr[id].attachment_id), cfg);
rc = query_attachment_pointers(sdata, data, ptr, &(ptr_arr[id].piler_id[0]), &(ptr_arr[id].attachment_id));
if(!rc){
attachments = -1;
goto CLOSE;

View File

@ -17,7 +17,7 @@ int string_parser(char *src, char *target, int limit){
return 0;
};
int multi_line_string_parser(char *src, char *target, int limit){
int multi_line_string_parser(char *src, char *target, unsigned int limit){
if(strlen(src) > 0 && strlen(target) + strlen(src) + 3 < limit){
strncat(target, src, limit-strlen(target));
strncat(target, "\r\n", limit-strlen(target));
@ -28,14 +28,14 @@ int multi_line_string_parser(char *src, char *target, int limit){
return 1;
};
int int_parser(char *src, int *target, int limit){
int int_parser(char *src, int *target){
*target = strtol(src, (char **) NULL, 10);
return 0;
};
int float_parser(char *src, float *target, int limit){
int float_parser(char *src, float *target){
*target = strtof(src, (char **) NULL);
return 0;
@ -110,7 +110,7 @@ struct _parse_rule config_parse_rules[] =
{ "verbosity", "integer", (void*) int_parser, offsetof(struct __config, verbosity), "1", sizeof(int)},
{ "workdir", "string", (void*) string_parser, offsetof(struct __config, workdir), WORK_DIR, MAXVAL-1},
{NULL, NULL, NULL, 0, 0}
{NULL, NULL, NULL, 0, 0, 0}
};

View File

@ -13,7 +13,7 @@
#define VERSION "1.2.0-master"
#define BUILD 941
#define BUILD 942
#define HOSTID "mailarchiver"
@ -94,10 +94,11 @@
#define SQL_ATTACHMENTS_VIEW "v_attachment"
#define SQL_PREPARED_STMT_GET_DOMAINS "SELECT `domain` FROM `" SQL_DOMAIN_TABLE "`"
#define SQL_PREPARED_STMT_GET_META_ID_BY_MESSAGE_ID "SELECT id FROM " SQL_METADATA_TABLE " WHERE message_id=?"
#define SQL_PREPARED_STMT_GET_META_ID_BY_MESSAGE_ID "SELECT id, piler_id FROM " SQL_METADATA_TABLE " WHERE message_id=?"
#define SQL_PREPARED_STMT_INSERT_INTO_RCPT_TABLE "INSERT INTO " SQL_RECIPIENT_TABLE " (`id`,`to`,`todomain`) VALUES(?,?,?)"
#define SQL_PREPARED_STMT_INSERT_INTO_SPHINX_TABLE "INSERT INTO " SQL_SPHINX_TABLE " (`id`, `from`, `to`, `fromdomain`, `todomain`, `subject`, `body`, `arrived`, `sent`, `size`, `direction`, `folder`, `attachments`, `attachment_types`) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
#define SQL_PREPARED_STMT_INSERT_INTO_META_TABLE "INSERT INTO " SQL_METADATA_TABLE " (`from`,`fromdomain`,`subject`,`spam`,`arrived`,`sent`,`retained`,`size`,`hlen`,`direction`,`attachments`,`piler_id`,`message_id`,`reference`,`digest`,`bodydigest`,`vcode`) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
#define SQL_PREPARED_STMT_UPDATE_META_TABLE "UPDATE " SQL_METADATA_TABLE " SET `from`=?,`fromdomain`=?,`subject`=?,`spam`=?,`arrived`=?,`sent`=?,`retained`=?,`size`=?,`hlen`=?,`direction`=?,`attachments`=?,`reference`=?,`digest`=?,`bodydigest`=?,`vcode`=? WHERE id=?"
#define SQL_PREPARED_STMT_INSERT_INTO_ATTACHMENT_TABLE "INSERT INTO " SQL_ATTACHMENT_TABLE " (`piler_id`,`attachment_id`,`sig`,`name`,`type`,`size`,`ptr`) VALUES(?,?,?,?,?,?,?)"
#define SQL_PREPARED_STMT_GET_ATTACHMENT_ID_BY_SIGNATURE "SELECT `id` FROM `" SQL_ATTACHMENT_TABLE "` WHERE `sig`=? AND `ptr`=0 AND `size`=?"
#define SQL_PREPARED_STMT_GET_ATTACHMENT_POINTER "SELECT `piler_id`, `attachment_id` FROM " SQL_ATTACHMENT_TABLE " WHERE id=?"
@ -105,7 +106,6 @@
#define SQL_PREPARED_STMT_GET_FOLDER_ID "SELECT `id` FROM " SQL_FOLDER_TABLE " WHERE `name`=? AND `parent_id`=?"
#define SQL_PREPARED_STMT_INSERT_INTO_FOLDER_TABLE "INSERT INTO `" SQL_FOLDER_TABLE "` (`name`, `parent_id`) VALUES(?,?)"
#define SQL_PREPARED_STMT_UPDATE_METADATA_REFERENCE "UPDATE " SQL_METADATA_TABLE " SET reference=? WHERE message_id=? AND reference=''"
#define SQL_PREPARED_STMT_UPDATE_META_TABLE "UPDATE " SQL_METADATA_TABLE " SET subject=?, attachments=? WHERE id=?"
#define SQL_PREPARED_STMT_GET_GUI_IMPORT_JOBS "SELECT id, type, username, password, server FROM " SQL_IMPORT_TABLE " WHERE started=0 ORDER BY id LIMIT 0,1"
#define SQL_PREPARED_STMT_INSERT_FOLDER_MESSAGE "INSERT INTO " SQL_FOLDER_MESSAGE_TABLE " (`folder_id`, `id`) VALUES(?,?)"

View File

@ -11,7 +11,7 @@
#include <piler.h>
struct __counters load_counters(struct session_data *sdata, struct __data *data, struct __config *cfg){
struct __counters load_counters(struct session_data *sdata, struct __data *data){
char buf[SMALLBUFSIZE];
struct __counters counters;
@ -20,7 +20,7 @@ struct __counters load_counters(struct session_data *sdata, struct __data *data,
snprintf(buf, SMALLBUFSIZE-1, "SELECT `rcvd`, `virus`, `duplicate`, `ignore`, `size`, `stored_size` FROM `%s`", SQL_COUNTER_TABLE);
if(prepare_sql_statement(sdata, &(data->stmt_generic), buf, cfg) == ERR) return counters;
if(prepare_sql_statement(sdata, &(data->stmt_generic), buf) == ERR) return counters;
p_bind_init(data);
@ -36,7 +36,7 @@ struct __counters load_counters(struct session_data *sdata, struct __data *data,
data->sql[data->pos] = (char *)&counters.c_size; data->type[data->pos] = TYPE_LONGLONG; data->len[data->pos] = sizeof(uint64); data->pos++;
data->sql[data->pos] = (char *)&counters.c_stored_size; data->type[data->pos] = TYPE_LONGLONG; data->len[data->pos] = sizeof(uint64); data->pos++;
p_store_results(sdata, data->stmt_generic, data);
p_store_results(data->stmt_generic, data);
p_fetch_results(data->stmt_generic);
p_free_results(data->stmt_generic);
}
@ -101,7 +101,7 @@ void update_counters(struct session_data *sdata, struct __data *data, struct __c
}
else {
c = load_counters(sdata, data, cfg);
c = load_counters(sdata, data);
snprintf(buf, SMALLBUFSIZE-1, "%ld", sdata->now); memcached_add(&(data->memc), MEMCACHED_COUNTERS_LAST_UPDATE, strlen(MEMCACHED_COUNTERS_LAST_UPDATE), buf, strlen(buf), 0, 0);

View File

@ -158,7 +158,8 @@ int decode_base64_to_buffer(char *p, int plen, unsigned char *b, int blen){
void decodeQP(char *p){
int i, k=0, a, b;
unsigned int i;
int k=0, a, b;
char c;
if(p == NULL) return;
@ -247,7 +248,8 @@ void decodeHTML(char *p, int utf8){
void decodeURL(char *p){
int i, c, k=0, a, b;
unsigned int i;
int c, k=0, a, b;
if(p == NULL) return;
@ -303,30 +305,21 @@ inline void utf8_encode_char(unsigned char c, unsigned char *buf, int buflen, in
count++;
}
else if(c <= 0x7FF){
else {
*(buf+count) = ( 0xC0 | (c >> 6) );
count++;
*(buf+count) = ( 0x80 | (c & 0x3F) );
count++;
}
else if (c <= 0xFFFF){
*(buf+count) = ( 0xE0 | (c >> 12) );
count++;
*(buf+count) = ( 0x80 | ((c >> 6) & 0x3F) );
count++;
*(buf+count) = ( 0x80 | (c & 0x3F) );
count++;
}
*len = count;
}
int utf8_encode(char *inbuf, int inbuflen, char *outbuf, int outbuflen, char *encoding){
iconv_t cd;
size_t size, inbytesleft, outbytesleft;
size_t inbytesleft, outbytesleft;
int ret = ERR;
memset(outbuf, 0, outbuflen);
@ -336,13 +329,14 @@ int utf8_encode(char *inbuf, int inbuflen, char *outbuf, int outbuflen, char *en
inbytesleft = inbuflen;
outbytesleft = outbuflen-1;
size = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
if(iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft) == (size_t) -1)
ret = ERR;
else
ret = OK;
iconv_close(cd);
if(size >= 0) return OK;
}
return ERR;
return ret;
}

View File

@ -294,6 +294,7 @@ struct import {
int download_only;
int keep_eml;
int timeout;
int reimport;
int cap_uidplus;
long total_size;
time_t started, updated, finished;

View File

@ -30,7 +30,7 @@ int update_meta_data(struct session_data *sdata, struct parser_state *state, str
subj = state->b_subject;
if(*subj == ' ') subj++;
if(prepare_sql_statement(sdata, &(data->stmt_update_metadata), SQL_PREPARED_STMT_UPDATE_META_TABLE, cfg) == ERR) return ret;
if(prepare_sql_statement(sdata, &(data->stmt_update_metadata), SQL_PREPARED_STMT_UPDATE_META_TABLE) == ERR) return ret;
p_bind_init(data);
@ -81,17 +81,8 @@ int main(int argc, char **argv){
inithash(data.mydomains);
//initrules(data.archiving_rules);
//initrules(data.retention_rules);
//initrules(data.folder_rules);
load_mydomains(&sdata, &data, &cfg);
//load_rules(&sdata, &data, data.archiving_rules, SQL_ARCHIVING_RULE_TABLE, &cfg);
//load_rules(&sdata, &data, data.retention_rules, SQL_RETENTION_RULE_TABLE, &cfg);
//load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE, &cfg);
init_session_data(&sdata, &cfg);
sdata.delivered = 0;

View File

@ -40,7 +40,7 @@ void clearhash(struct node *xhash[]){
}
struct node *makenewnode(struct node *xhash[], char *s){
struct node *makenewnode(char *s){
struct node *h;
int len;
@ -82,7 +82,7 @@ int addnode(struct node *xhash[], char *s){
key = DJBHash(s, len);
if(xhash[hash(key)] == NULL){
xhash[hash(key)] = makenewnode(xhash, s);
xhash[hash(key)] = makenewnode(s);
}
else {
q = xhash[hash(key)];
@ -95,7 +95,7 @@ int addnode(struct node *xhash[], char *s){
q = q->r;
}
}
if(p) p->r = makenewnode(xhash, s);
if(p) p->r = makenewnode(s);
}
return 1;

View File

@ -11,7 +11,7 @@
void inithash(struct node *xhash[]);
void clearhash(struct node *xhash[]);
struct node *makenewnode(struct node *xhash[], char *s);
struct node *makenewnode(char *s);
int addnode(struct node *xhash[], char *s);
struct node *findnode(struct node *xhash[], char *s);
int is_substr_in_hash(struct node *xhash[], char *s);

View File

@ -124,8 +124,8 @@ int process_imap_folder(int sd, int *seq, char *folder, struct session_data *sda
if(data->recursive_folder_names == 1){
data->folder = get_folder_id(sdata, data, folder, 0, cfg);
if(data->folder == ERR_FOLDER) data->folder = add_new_folder(sdata, data, folder, 0, cfg);
data->folder = get_folder_id(sdata, data, folder, 0);
if(data->folder == ERR_FOLDER) data->folder = add_new_folder(sdata, data, folder, 0);
}
@ -307,7 +307,7 @@ int process_imap_folder(int sd, int *seq, char *folder, struct session_data *sda
}
int connect_to_imap_server(int sd, int *seq, char *username, char *password, int port, struct __data *data, int use_ssl){
int connect_to_imap_server(int sd, int *seq, char *username, char *password, struct __data *data, int use_ssl){
int n;
char buf[MAXBUFSIZE];
X509* server_cert;

View File

@ -92,7 +92,10 @@ int import_message(char *filename, struct session_data *sdata, struct __data *da
return ERR;
}
rc = process_message(sdata, &state, data, cfg);
if(data->import->reimport == 1)
rc = reimport_message(sdata, &state, data, cfg);
else
rc = process_message(sdata, &state, data, cfg);
unlink(state.message_id_hash);
}
@ -103,11 +106,13 @@ int import_message(char *filename, struct session_data *sdata, struct __data *da
switch(rc) {
case OK:
bzero(&counters, sizeof(counters));
counters.c_rcvd = 1;
counters.c_size += sdata->tot_len;
counters.c_stored_size = sdata->stored_len;
update_counters(sdata, data, &counters, cfg);
if(data->import->reimport == 0){
bzero(&counters, sizeof(counters));
counters.c_rcvd = 1;
counters.c_size += sdata->tot_len;
counters.c_stored_size = sdata->stored_len;
update_counters(sdata, data, &counters, cfg);
}
break;
@ -130,10 +135,10 @@ int import_message(char *filename, struct session_data *sdata, struct __data *da
}
int get_folder_id(struct session_data *sdata, struct __data *data, char *foldername, int parent_id, struct __config *cfg){
int get_folder_id(struct session_data *sdata, struct __data *data, char *foldername, int parent_id){
int id=ERR_FOLDER;
if(prepare_sql_statement(sdata, &(data->stmt_get_folder_id), SQL_PREPARED_STMT_GET_FOLDER_ID, cfg) == ERR) return id;
if(prepare_sql_statement(sdata, &(data->stmt_get_folder_id), SQL_PREPARED_STMT_GET_FOLDER_ID) == ERR) return id;
p_bind_init(data);
data->sql[data->pos] = foldername; data->type[data->pos] = TYPE_STRING; data->pos++;
@ -144,7 +149,7 @@ int get_folder_id(struct session_data *sdata, struct __data *data, char *foldern
p_bind_init(data);
data->sql[data->pos] = (char *)&id; data->type[data->pos] = TYPE_LONG; data->len[data->pos] = sizeof(unsigned long); data->pos++;
p_store_results(sdata, data->stmt_get_folder_id, data);
p_store_results(data->stmt_get_folder_id, data);
p_fetch_results(data->stmt_get_folder_id);
p_free_results(data->stmt_get_folder_id);
}
@ -155,12 +160,12 @@ int get_folder_id(struct session_data *sdata, struct __data *data, char *foldern
}
int add_new_folder(struct session_data *sdata, struct __data *data, char *foldername, int parent_id, struct __config *cfg){
int add_new_folder(struct session_data *sdata, struct __data *data, char *foldername, int parent_id){
int id=ERR_FOLDER;
if(foldername == NULL) return id;
if(prepare_sql_statement(sdata, &(data->stmt_insert_into_folder_table), SQL_PREPARED_STMT_INSERT_INTO_FOLDER_TABLE, cfg) == ERR) return id;
if(prepare_sql_statement(sdata, &(data->stmt_insert_into_folder_table), SQL_PREPARED_STMT_INSERT_INTO_FOLDER_TABLE) == ERR) return id;
p_bind_init(data);
data->sql[data->pos] = foldername; data->type[data->pos] = TYPE_STRING; data->pos++;

View File

@ -17,10 +17,10 @@ int import_mbox_from_dir(char *directory, struct session_data *sdata, struct __d
int import_from_pop3_server(char *server, char *username, char *password, int port, struct session_data *sdata, struct __data *data, int dryrun, struct __config *cfg);
int import_from_imap_server(char *server, char *username, char *password, int port, struct session_data *sdata, struct __data *data, char *folder_imap, char *skiplist, int dryrun, struct __config *cfg);
int connect_to_pop3_server(int sd, char *username, char *password, int port, struct __data *data, int use_ssl);
int connect_to_pop3_server(int sd, char *username, char *password, struct __data *data, int use_ssl);
int process_pop3_emails(int sd, struct session_data *sdata, struct __data *data, int use_ssl, int dryrun, struct __config *cfg);
int connect_to_imap_server(int sd, int *seq, char *username, char *password, int port, struct __data *data, int use_ssl);
int connect_to_imap_server(int sd, int *seq, char *username, char *password, struct __data *data, int use_ssl);
int list_folders(int sd, int *seq, int use_ssl, struct __data *data);
int process_imap_folder(int sd, int *seq, char *folder, struct session_data *sdata, struct __data *data, int use_ssl, int dryrun, struct __config *cfg);
void send_imap_close(int sd, int *seq, struct __data *data, int use_ssl);

View File

@ -31,7 +31,7 @@ int read_gui_import_data(struct session_data *sdata, struct __data *data, char *
memset(s_password, 0, sizeof(s_password));
memset(s_server, 0, sizeof(s_server));
if(prepare_sql_statement(sdata, &(data->stmt_generic), SQL_PREPARED_STMT_GET_GUI_IMPORT_JOBS, cfg) == ERR) return ERR;
if(prepare_sql_statement(sdata, &(data->stmt_generic), SQL_PREPARED_STMT_GET_GUI_IMPORT_JOBS) == ERR) return ERR;
p_bind_init(data);
@ -45,7 +45,7 @@ int read_gui_import_data(struct session_data *sdata, struct __data *data, char *
data->sql[data->pos] = &s_password[0]; data->type[data->pos] = TYPE_STRING; data->len[data->pos] = sizeof(s_password)-2; data->pos++;
data->sql[data->pos] = &s_server[0]; data->type[data->pos] = TYPE_STRING; data->len[data->pos] = sizeof(s_server)-2; data->pos++;
p_store_results(sdata, data->stmt_generic, data);
p_store_results(data->stmt_generic, data);
if(p_fetch_results(data->stmt_generic) == OK) rc = OK;

View File

@ -57,7 +57,7 @@ int import_from_imap_server(char *server, char *username, char *password, int po
goto ENDE_IMAP;
}
if(connect_to_imap_server(sd, &seq, username, password, port, data, use_ssl) == ERR){
if(connect_to_imap_server(sd, &seq, username, password, data, use_ssl) == ERR){
close(sd);
ret = ERR;
goto ENDE_IMAP;

View File

@ -111,9 +111,9 @@ int import_mbox_from_dir(char *directory, struct session_data *sdata, struct __d
if(S_ISREG(st.st_mode)){
if(i == 0 && data->recursive_folder_names == 1){
folder = get_folder_id(sdata, data, fname, data->folder, cfg);
folder = get_folder_id(sdata, data, fname, data->folder);
if(folder == ERR_FOLDER){
folder = add_new_folder(sdata, data, fname, data->folder, cfg);
folder = add_new_folder(sdata, data, fname, data->folder);
if(folder == ERR_FOLDER){
printf("error: cannot get/add folder '%s' to parent id: %d\n", fname, data->folder);

View File

@ -60,9 +60,9 @@ int import_from_maildir(char *directory, struct session_data *sdata, struct __da
return ERR;
}
folder = get_folder_id(sdata, data, p, data->folder, cfg);
folder = get_folder_id(sdata, data, p, data->folder);
if(folder == ERR_FOLDER){
folder = add_new_folder(sdata, data, p, data->folder, cfg);
folder = add_new_folder(sdata, data, p, data->folder);
if(folder == ERR_FOLDER){
printf("error: cannot get/add folder '%s' to parent id: %d\n", p, data->folder);

View File

@ -53,7 +53,7 @@ int import_from_pop3_server(char *server, char *username, char *password, int po
}
if(connect_to_pop3_server(sd, username, password, port, data, use_ssl) == ERR){
if(connect_to_pop3_server(sd, username, password, data, use_ssl) == ERR){
close(sd);
ret = ERR;
goto ENDE_POP3;

View File

@ -29,7 +29,7 @@ int store_index_data(struct session_data *sdata, struct parser_state *state, str
if(*subj == ' ') subj++;
if(prepare_sql_statement(sdata, &(data->stmt_insert_into_sphinx_table), SQL_PREPARED_STMT_INSERT_INTO_SPHINX_TABLE, cfg) == ERR) return rc;
if(prepare_sql_statement(sdata, &(data->stmt_insert_into_sphinx_table), SQL_PREPARED_STMT_INSERT_INTO_SPHINX_TABLE) == ERR) return rc;
fix_email_address_for_sphinx(state->b_from);
@ -64,10 +64,10 @@ int store_index_data(struct session_data *sdata, struct parser_state *state, str
}
uint64 get_metaid_by_messageid(struct session_data *sdata, struct __data *data, char *message_id, struct __config *cfg){
uint64 get_metaid_by_messageid(struct session_data *sdata, struct __data *data, char *message_id, char *piler_id){
uint64 id=0;
if(prepare_sql_statement(sdata, &(data->stmt_get_meta_id_by_message_id), SQL_PREPARED_STMT_GET_META_ID_BY_MESSAGE_ID, cfg) == ERR) return id;
if(prepare_sql_statement(sdata, &(data->stmt_get_meta_id_by_message_id), SQL_PREPARED_STMT_GET_META_ID_BY_MESSAGE_ID) == ERR) return id;
p_bind_init(data);
data->sql[data->pos] = message_id; data->type[data->pos] = TYPE_STRING; data->pos++;
@ -76,8 +76,9 @@ uint64 get_metaid_by_messageid(struct session_data *sdata, struct __data *data,
p_bind_init(data);
data->sql[data->pos] = (char *)&id; data->type[data->pos] = TYPE_LONGLONG; data->len[data->pos] = sizeof(uint64); data->pos++;
data->sql[data->pos] = piler_id; data->type[data->pos] = TYPE_STRING; data->len[data->pos] = RND_STR_LEN; data->pos++;
p_store_results(sdata, data->stmt_get_meta_id_by_message_id, data);
p_store_results(data->stmt_get_meta_id_by_message_id, data);
p_fetch_results(data->stmt_get_meta_id_by_message_id);
@ -94,7 +95,7 @@ int store_recipients(struct session_data *sdata, struct __data *data, char *to,
int ret=OK, n=0;
char *p, *q, puf[SMALLBUFSIZE];
if(prepare_sql_statement(sdata, &(data->stmt_insert_into_rcpt_table), SQL_PREPARED_STMT_INSERT_INTO_RCPT_TABLE, cfg) == ERR) return ret;
if(prepare_sql_statement(sdata, &(data->stmt_insert_into_rcpt_table), SQL_PREPARED_STMT_INSERT_INTO_RCPT_TABLE) == ERR) return ret;
p = to;
do {
@ -128,12 +129,21 @@ int store_recipients(struct session_data *sdata, struct __data *data, char *to,
}
int store_folder_id(struct session_data *sdata, struct __data *data, uint64 id, struct __config *cfg){
void remove_recipients(struct session_data *sdata, uint64 id){
char s[SMALLBUFSIZE];
snprintf(s, sizeof(s)-1, "DELETE FROM " SQL_RECIPIENT_TABLE " WHERE id=%llu", id);
p_query(sdata, s);
}
int store_folder_id(struct session_data *sdata, struct __data *data, uint64 id){
int rc = ERR;
if(data->folder == ERR_FOLDER) return rc;
if(prepare_sql_statement(sdata, &(data->stmt_insert_into_folder_message_table), SQL_PREPARED_STMT_INSERT_FOLDER_MESSAGE, cfg) == ERR) return rc;
if(prepare_sql_statement(sdata, &(data->stmt_insert_into_folder_message_table), SQL_PREPARED_STMT_INSERT_FOLDER_MESSAGE) == ERR) return rc;
p_bind_init(data);
@ -147,10 +157,19 @@ int store_folder_id(struct session_data *sdata, struct __data *data, uint64 id,
}
void remove_folder_id(struct session_data *sdata, uint64 id){
char s[SMALLBUFSIZE];
snprintf(s, sizeof(s)-1, "DELETE FROM " SQL_FOLDER_MESSAGE_TABLE " WHERE id=%llu", id);
p_query(sdata, s);
}
int update_metadata_reference(struct session_data *sdata, struct parser_state *state, struct __data *data, char *ref, struct __config *cfg){
int ret = ERR;
if(prepare_sql_statement(sdata, &(data->stmt_update_metadata_reference), SQL_PREPARED_STMT_UPDATE_METADATA_REFERENCE, cfg) == ERR) return ret;
if(prepare_sql_statement(sdata, &(data->stmt_update_metadata_reference), SQL_PREPARED_STMT_UPDATE_METADATA_REFERENCE) == ERR) return ret;
p_bind_init(data);
@ -167,7 +186,7 @@ int update_metadata_reference(struct session_data *sdata, struct parser_state *s
}
int store_meta_data(struct session_data *sdata, struct parser_state *state, struct __data *data, struct __config *cfg){
int store_meta_data(struct session_data *sdata, struct parser_state *state, struct __data *data, uint64 old_id, struct __config *cfg){
int rc, ret=ERR, result;
char *subj, *p, s[MAXBUFSIZE], s2[SMALLBUFSIZE], vcode[2*DIGEST_LENGTH+1], ref[2*DIGEST_LENGTH+1];
uint64 id=0;
@ -187,7 +206,11 @@ int store_meta_data(struct session_data *sdata, struct parser_state *state, stru
}
if(prepare_sql_statement(sdata, &(data->stmt_insert_into_meta_table), SQL_PREPARED_STMT_INSERT_INTO_META_TABLE, cfg) == ERR) return ERR;
if(old_id > 0){
if(prepare_sql_statement(sdata, &(data->stmt_insert_into_meta_table), SQL_PREPARED_STMT_UPDATE_META_TABLE) == ERR) return ERR;
} else {
if(prepare_sql_statement(sdata, &(data->stmt_insert_into_meta_table), SQL_PREPARED_STMT_INSERT_INTO_META_TABLE) == ERR) return ERR;
}
memset(s2, 0, sizeof(s2));
@ -220,18 +243,34 @@ int store_meta_data(struct session_data *sdata, struct parser_state *state, stru
data->sql[data->pos] = (char *)&sdata->hdr_len; data->type[data->pos] = TYPE_LONG; data->pos++;
data->sql[data->pos] = (char *)&sdata->direction; data->type[data->pos] = TYPE_LONG; data->pos++;
data->sql[data->pos] = (char *)&state->n_attachments; data->type[data->pos] = TYPE_LONG; data->pos++;
data->sql[data->pos] = sdata->ttmpfile; data->type[data->pos] = TYPE_STRING; data->pos++;
data->sql[data->pos] = state->message_id; data->type[data->pos] = TYPE_STRING; data->pos++;
if(old_id == 0){
data->sql[data->pos] = sdata->ttmpfile; data->type[data->pos] = TYPE_STRING; data->pos++;
data->sql[data->pos] = state->message_id; data->type[data->pos] = TYPE_STRING; data->pos++;
}
data->sql[data->pos] = &ref[0]; data->type[data->pos] = TYPE_STRING; data->pos++;
data->sql[data->pos] = sdata->digest; data->type[data->pos] = TYPE_STRING; data->pos++;
data->sql[data->pos] = sdata->bodydigest; data->type[data->pos] = TYPE_STRING; data->pos++;
data->sql[data->pos] = &vcode[0]; data->type[data->pos] = TYPE_STRING; data->pos++;
if(old_id > 0){
data->sql[data->pos] = (char *)&id; data->type[data->pos] = TYPE_LONGLONG; data->pos++;
}
if(p_exec_query(sdata, data->stmt_insert_into_meta_table, data) == ERR){
ret = ERR_EXISTS;
}
else {
id = p_get_insert_id(data->stmt_insert_into_meta_table);
if(old_id > 0){
remove_recipients(sdata, old_id);
remove_folder_id(sdata, old_id);
id = old_id;
}
else {
id = p_get_insert_id(data->stmt_insert_into_meta_table);
}
rc = store_recipients(sdata, data, state->b_to, id, cfg);
@ -242,7 +281,7 @@ int store_meta_data(struct session_data *sdata, struct parser_state *state, stru
if(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: stored indexdata, rc=%d", sdata->ttmpfile, rc);
if(cfg->enable_folders == 1){
rc = store_folder_id(sdata, data, id, cfg);
rc = store_folder_id(sdata, data, id);
if(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: stored folderdata, rc=%d", sdata->ttmpfile, rc);
}
@ -264,10 +303,11 @@ void remove_stripped_attachments(struct parser_state *state){
int process_message(struct session_data *sdata, struct parser_state *state, struct __data *data, struct __config *cfg){
int rc, fd;
char piler_id[SMALLBUFSIZE];
/* discard if existing message_id */
sdata->duplicate_id = get_metaid_by_messageid(sdata, data, state->message_id, cfg);
sdata->duplicate_id = get_metaid_by_messageid(sdata, data, state->message_id, piler_id);
if(sdata->duplicate_id > 0){
remove_stripped_attachments(state);
@ -319,7 +359,7 @@ int process_message(struct session_data *sdata, struct parser_state *state, stru
}
rc = store_file(sdata, sdata->tmpframe, 0, 0, cfg);
rc = store_file(sdata, sdata->tmpframe, 0, cfg);
if(rc == 0){
syslog(LOG_PRIORITY, "%s: error storing message: %s", sdata->ttmpfile, sdata->tmpframe);
return ERR;
@ -328,7 +368,7 @@ int process_message(struct session_data *sdata, struct parser_state *state, stru
sdata->retained += query_retain_period(data, state, sdata->tot_len, sdata->spam_message, cfg);
rc = store_meta_data(sdata, state, data, cfg);
rc = store_meta_data(sdata, state, data, 0, cfg);
if(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: stored metadata, rc=%d", sdata->ttmpfile, rc);
if(rc == ERR_EXISTS){
@ -340,3 +380,55 @@ int process_message(struct session_data *sdata, struct parser_state *state, stru
return OK;
}
int reimport_message(struct session_data *sdata, struct parser_state *state, struct __data *data, struct __config *cfg){
int i, rc;
char piler_id[SMALLBUFSIZE];
char oldfile[SMALLBUFSIZE], newfile[SMALLBUFSIZE];
memset(piler_id, 0, sizeof(piler_id));
sdata->duplicate_id = get_metaid_by_messageid(sdata, data, state->message_id, &piler_id[0]);
if(sdata->duplicate_id == 0){
if(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "cannot find this message: %s", state->message_id);
return ERR;
}
/* store base64 encoded file attachments */
if(state->n_attachments > 0){
// rename .a* files!
for(i=1; i<=state->n_attachments; i++){
snprintf(oldfile, sizeof(oldfile)-1, "%s.a%d", sdata->ttmpfile, i);
snprintf(newfile, sizeof(newfile)-1, "%s.a%d", piler_id, i);
rename(oldfile, newfile);
}
rc = store_attachments(sdata, state, data, cfg);
remove_stripped_attachments(state);
if(rc) return ERR;
}
// rename .m file!
snprintf(oldfile, sizeof(oldfile)-1, "%s.m", sdata->ttmpfile);
snprintf(sdata->tmpframe, SMALLBUFSIZE-1, "%s.m", piler_id);
rename(oldfile, sdata->tmpframe);
rc = store_file(sdata, sdata->tmpframe, 0, cfg);
if(rc == 0){
syslog(LOG_PRIORITY, "%s: error storing message for reimport: %s", sdata->ttmpfile, sdata->tmpframe);
return ERR;
}
sdata->retained += query_retain_period(data, state, sdata->tot_len, sdata->spam_message, cfg);
rc = store_meta_data(sdata, state, data, sdata->duplicate_id, cfg);
if(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: update metadata, rc=%d", sdata->ttmpfile, rc);
return OK;
}

View File

@ -345,7 +345,7 @@ int get_random_bytes(unsigned char *buf, int len, unsigned char server_id){
* read random data from entropy pool
*/
int readFromEntropyPool(int fd, void *_s, size_t n){
int readFromEntropyPool(int fd, void *_s, ssize_t n){
char *s = _s;
ssize_t res, pos = 0;

View File

@ -29,7 +29,7 @@ int extractEmail(char *rawmail, char *email);
void make_random_string(char *buf, int buflen);
void create_id(char *id, unsigned char server_id);
int get_random_bytes(unsigned char *buf, int len, unsigned char server_id);
int readFromEntropyPool(int fd, void *_s, size_t n);
int readFromEntropyPool(int fd, void *_s, ssize_t n);
int recvtimeout(int s, char *buf, int len, int timeout);
int write1(int sd, void *buf, int buflen, int use_ssl, SSL *ssl);
int recvtimeoutssl(int s, char *buf, int len, int timeout, int use_ssl, SSL *ssl);

View File

@ -17,7 +17,7 @@ void load_mydomains(struct session_data *sdata, struct __data *data, struct __co
memset(s, 0, sizeof(s));
if(prepare_sql_statement(sdata, &(data->stmt_generic), SQL_PREPARED_STMT_GET_DOMAINS, cfg) == ERR) return;
if(prepare_sql_statement(sdata, &(data->stmt_generic), SQL_PREPARED_STMT_GET_DOMAINS) == ERR) return;
p_bind_init(data);
@ -28,7 +28,7 @@ void load_mydomains(struct session_data *sdata, struct __data *data, struct __co
data->sql[data->pos] = &s[0]; data->type[data->pos] = TYPE_STRING; data->len[data->pos] = sizeof(s)-2; data->pos++;
p_store_results(sdata, data->stmt_generic, data);
p_store_results(data->stmt_generic, data);
while(p_fetch_results(data->stmt_generic) == OK){
rc = addnode(data->mydomains, s);

View File

@ -123,7 +123,7 @@ int p_exec_query(struct session_data *sdata, MYSQL_STMT *stmt, struct __data *da
}
int p_store_results(struct session_data *sdata, MYSQL_STMT *stmt, struct __data *data){
int p_store_results(MYSQL_STMT *stmt, struct __data *data){
MYSQL_BIND bind[MAX_SQL_VARS];
int i, ret=ERR;
@ -205,7 +205,7 @@ int p_get_affected_rows(MYSQL_STMT *stmt){
}
int prepare_sql_statement(struct session_data *sdata, MYSQL_STMT **stmt, char *s, struct __config *cfg){
int prepare_sql_statement(struct session_data *sdata, MYSQL_STMT **stmt, char *s){
*stmt = mysql_stmt_init(&(sdata->mysql));
if(!*stmt){

View File

@ -18,7 +18,8 @@
struct parser_state parse_message(struct session_data *sdata, int take_into_pieces, struct __data *data, struct __config *cfg){
FILE *f;
int i, len;
int i;
unsigned int len;
char *p, buf[MAXBUFSIZE], puf[SMALLBUFSIZE];
char writebuffer[MAXBUFSIZE], abuffer[MAXBUFSIZE];
struct parser_state state;
@ -99,7 +100,8 @@ struct parser_state parse_message(struct session_data *sdata, int take_into_piec
void post_parse(struct session_data *sdata, struct parser_state *state, struct __config *cfg){
int i, len, rec=0;
int i, rec=0;
unsigned int len;
char *p;
clearhash(state->boundaries);
@ -173,7 +175,8 @@ int parse_line(char *buf, struct parser_state *state, struct session_data *sdata
char *p, *q, puf[SMALLBUFSIZE];
unsigned char b64buffer[MAXBUFSIZE];
char tmpbuf[MAXBUFSIZE];
int n64, len, writelen, boundary_line=0, result;
int n64, writelen, boundary_line=0, result;
unsigned int len;
if(cfg->debug == 1) printf("line: %s", buf);
@ -238,7 +241,7 @@ int parse_line(char *buf, struct parser_state *state, struct session_data *sdata
if(state->b64fd != -1){
abuffer[state->abufpos] = '\0';
if(state->base64 == 1){
n64 = base64_decode_attachment_buffer(abuffer, state->abufpos, &b64buffer[0], sizeof(b64buffer));
n64 = base64_decode_attachment_buffer(abuffer, &b64buffer[0], sizeof(b64buffer));
write(state->b64fd, b64buffer, n64);
}
else {
@ -383,14 +386,14 @@ int parse_line(char *buf, struct parser_state *state, struct session_data *sdata
if(strstr(buf, "=?") && strstr(buf, "?=")) fixupEncodedHeaderLine(buf, MAXBUFSIZE);
sdata->sent = parse_date_header(buf, cfg);
sdata->sent = parse_date_header(buf);
/* allow +2 days drift in the parsed Date: value */
if(sdata->sent - sdata->now > 2*86400) sdata->sent = sdata->now;
}
else if(strncasecmp(buf, "Delivery-date:", strlen("Delivery-date:")) == 0 && sdata->delivered == 0) sdata->delivered = parse_date_header(buf, cfg);
else if(strncasecmp(buf, "Delivery-date:", strlen("Delivery-date:")) == 0 && sdata->delivered == 0) sdata->delivered = parse_date_header(buf);
else if(strncasecmp(buf, "Received:", strlen("Received:")) == 0) state->message_state = MSG_RECEIVED;
else if(cfg->extra_to_field[0] != '\0' && strncasecmp(buf, cfg->extra_to_field, strlen(cfg->extra_to_field)) == 0) state->message_state = MSG_TO;
@ -577,7 +580,7 @@ int parse_line(char *buf, struct parser_state *state, struct session_data *sdata
if(state->b64fd != -1){
abuffer[state->abufpos] = '\0';
if(state->base64 == 1){
n64 = base64_decode_attachment_buffer(abuffer, state->abufpos, &b64buffer[0], sizeof(b64buffer));
n64 = base64_decode_attachment_buffer(abuffer, &b64buffer[0], sizeof(b64buffer));
write(state->b64fd, b64buffer, n64);
}
else {

View File

@ -14,7 +14,7 @@ void post_parse(struct session_data *sdata, struct parser_state *state, struct _
int parse_line(char *buf, struct parser_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 parser_state *state);
time_t parse_date_header(char *s, struct __config *cfg);
time_t parse_date_header(char *s);
int isHexNumber(char *p);
int extract_boundary(char *p, struct parser_state *state);
void fixupEncodedHeaderLine(char *buf, int buflen);
@ -33,6 +33,6 @@ void extractNameFromHeaderLine(char *s, char *name, char *resultbuf);
char *determine_attachment_type(char *filename, char *type);
char *get_attachment_extractor_by_filename(char *filename);
void parse_reference(struct parser_state *state, char *s);
int base64_decode_attachment_buffer(char *p, int plen, unsigned char *b, int blen);
int base64_decode_attachment_buffer(char *p, unsigned char *b, int blen);
#endif /* _PARSER_H */

View File

@ -112,7 +112,7 @@ long get_local_timezone_offset(){
}
time_t parse_date_header(char *datestr, struct __config *cfg){
time_t parse_date_header(char *datestr){
int n=0, len;
long offset=0;
time_t ts=0;
@ -257,10 +257,6 @@ time_t parse_date_header(char *datestr, struct __config *cfg){
ts += get_local_timezone_offset() - offset;
#ifdef HAVE_TWEAK_SENT_TIME
if(ts > 631148400) ts += cfg->tweak_sent_time_offset;
#endif
return ts;
}
@ -674,7 +670,8 @@ int does_it_seem_like_an_email_address(char *email){
*/
void reassembleToken(char *p){
int i, k=0;
unsigned int i;
int k=0;
for(i=0; i<strlen(p); i++){
@ -947,7 +944,7 @@ void parse_reference(struct parser_state *state, char *s){
}
int base64_decode_attachment_buffer(char *p, int plen, unsigned char *b, int blen){
int base64_decode_attachment_buffer(char *p, unsigned char *b, int blen){
int b64len=0;
char puf[2*SMALLBUFSIZE];

View File

@ -334,9 +334,9 @@ void initialise_configuration(){
return;
}
load_rules(&sdata, &data, data.archiving_rules, SQL_ARCHIVING_RULE_TABLE, &cfg);
load_rules(&sdata, &data, data.retention_rules, SQL_RETENTION_RULE_TABLE, &cfg);
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE, &cfg);
load_rules(&sdata, &data, data.archiving_rules, SQL_ARCHIVING_RULE_TABLE);
load_rules(&sdata, &data, data.retention_rules, SQL_RETENTION_RULE_TABLE);
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE);
load_mydomains(&sdata, &data, &cfg);

View File

@ -40,10 +40,11 @@ int handle_pilerget_request(int new_sd, struct __data *data, struct __config *cf
void remove_stripped_attachments(struct parser_state *state);
int process_message(struct session_data *sdata, struct parser_state *state, struct __data *data, struct __config *cfg);
int store_file(struct session_data *sdata, char *filename, int startpos, int len, struct __config *cfg);
int reimport_message(struct session_data *sdata, struct parser_state *state, struct __data *data, struct __config *cfg);
int store_file(struct session_data *sdata, char *filename, int len, struct __config *cfg);
int remove_stored_message_files(struct session_data *sdata, struct parser_state *state, struct __config *cfg);
int store_attachments(struct session_data *sdata, struct parser_state *state, struct __data *data, struct __config *cfg);
int query_attachments(struct session_data *sdata, struct __data *data, struct ptr_array *ptr_arr, struct __config *cfg);
int query_attachments(struct session_data *sdata, struct __data *data, struct ptr_array *ptr_arr);
struct __config read_config(char *configfile);
@ -54,8 +55,8 @@ void update_counters(struct session_data *sdata, struct __data *data, struct __c
int retrieve_email_from_archive(struct session_data *sdata, struct __data *data, FILE *dest, struct __config *cfg);
int file_from_archive_to_network(char *filename, int sd, int tls_enable, struct __data *data, struct __config *cfg);
int get_folder_id(struct session_data *sdata, struct __data *data, char *foldername, int parent_id, struct __config *cfg);
int add_new_folder(struct session_data *sdata, struct __data *data, char *foldername, int parent_id, struct __config *cfg);
int get_folder_id(struct session_data *sdata, struct __data *data, char *foldername, int parent_id);
int add_new_folder(struct session_data *sdata, struct __data *data, char *foldername, int parent_id);
int store_index_data(struct session_data *sdata, struct parser_state *state, struct __data *data, uint64 id, struct __config *cfg);

View File

@ -343,7 +343,7 @@ int export_emails_matching_to_query(struct session_data *sdata, struct __data *d
int rc=0;
if(prepare_sql_statement(sdata, &(data->stmt_generic), s, cfg) == ERR) return ERR;
if(prepare_sql_statement(sdata, &(data->stmt_generic), s) == ERR) return ERR;
p_bind_init(data);
@ -359,7 +359,7 @@ int export_emails_matching_to_query(struct session_data *sdata, struct __data *d
data->sql[data->pos] = &digest[0]; data->type[data->pos] = TYPE_STRING; data->len[data->pos] = sizeof(digest)-2; data->pos++;
data->sql[data->pos] = &bodydigest[0]; data->type[data->pos] = TYPE_STRING; data->len[data->pos] = sizeof(bodydigest)-2; data->pos++;
p_store_results(sdata, data->stmt_generic, data);
p_store_results(data->stmt_generic, data);
while(p_fetch_results(data->stmt_generic) == OK){

View File

@ -53,9 +53,11 @@ void usage(){
printf(" -R Assign IMAP folder names as Piler folder names\n");
printf(" -b <batch limit> Import only this many emails\n");
printf(" -s <start position> Start importing POP3 emails from this position\n");
printf(" -a <recipient> Add recipient to the To:/Cc: list\n");
printf(" -D Dry-run, do not import anything\n");
printf(" -o Only download emails for POP3/IMAP import\n");
printf(" -r Remove imported emails\n");
printf(" -z Reimport emails\n");
printf(" -q Quiet mode\n");
exit(0);
@ -81,7 +83,7 @@ int main(int argc, char **argv){
import.import_job_id = import.total_messages = import.total_size = import.processed_messages = import.batch_processing_limit = 0;
import.started = import.updated = import.finished = import.remove_after_import = 0;
import.started = import.updated = import.finished = import.remove_after_import = import.reimport = 0;
import.extra_recipient = import.move_folder = NULL;
import.start_position = 1;
import.download_only = 0;
@ -121,6 +123,7 @@ int main(int argc, char **argv){
{"remove-after-import",no_argument, 0, 'r' },
{"move-folder", required_argument, 0, 'g' },
{"only-download",no_argument, 0, 'o' },
{"reimport", no_argument, 0, 'z' },
{"gui-import", no_argument, 0, 'G' },
{"dry-run", no_argument, 0, 'D' },
{"help", no_argument, 0, 'h' },
@ -129,9 +132,9 @@ int main(int argc, char **argv){
int option_index = 0;
c = getopt_long(argc, argv, "c:m:M:e:d:i:K:u:p:P:x:F:f:a:b:t:s:g:GDRroqh?", long_options, &option_index);
c = getopt_long(argc, argv, "c:m:M:e:d:i:K:u:p:P:x:F:f:a:b:t:s:g:GDRrozqh?", long_options, &option_index);
#else
c = getopt(argc, argv, "c:m:M:e:d:i:K:u:p:P:x:F:f:a:b:t:s:g:GDRroqh?");
c = getopt(argc, argv, "c:m:M:e:d:i:K:u:p:P:x:F:f:a:b:t:s:g:GDRrozqh?");
#endif
if(c == -1) break;
@ -230,6 +233,10 @@ int main(int argc, char **argv){
data.import->start_position = atoi(optarg);
break;
case 'z' :
data.import->reimport = 1;
break;
case 'a' :
data.import->extra_recipient = optarg;
break;
@ -291,10 +298,10 @@ int main(int argc, char **argv){
#endif
if(folder){
data.folder = get_folder_id(&sdata, &data, folder, 0, &cfg);
data.folder = get_folder_id(&sdata, &data, folder, 0);
if(data.folder == ERR_FOLDER){
data.folder = add_new_folder(&sdata, &data, folder, 0, &cfg);
data.folder = add_new_folder(&sdata, &data, folder, 0);
}
if(data.folder == ERR_FOLDER){
@ -305,9 +312,9 @@ int main(int argc, char **argv){
}
load_rules(&sdata, &data, data.archiving_rules, SQL_ARCHIVING_RULE_TABLE, &cfg);
load_rules(&sdata, &data, data.retention_rules, SQL_RETENTION_RULE_TABLE, &cfg);
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE, &cfg);
load_rules(&sdata, &data, data.archiving_rules, SQL_ARCHIVING_RULE_TABLE);
load_rules(&sdata, &data, data.retention_rules, SQL_RETENTION_RULE_TABLE);
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE);
load_mydomains(&sdata, &data, &cfg);

View File

@ -31,10 +31,10 @@ unsigned long purged_size=0;
#define SQL_STMT_DELETE_FROM_ATTACHMENT_TABLE "DELETE FROM `" SQL_ATTACHMENT_TABLE "` WHERE `id` IN ("
int is_purge_allowed(struct session_data *sdata, struct __data *data, struct __config *cfg){
int is_purge_allowed(struct session_data *sdata, struct __data *data){
int rc=0;
if(prepare_sql_statement(sdata, &(data->stmt_generic), SQL_STMT_SELECT_PURGE_FROM_OPTION_TABLE, cfg) == ERR) return rc;
if(prepare_sql_statement(sdata, &(data->stmt_generic), SQL_STMT_SELECT_PURGE_FROM_OPTION_TABLE) == ERR) return rc;
p_bind_init(data);
@ -45,7 +45,7 @@ int is_purge_allowed(struct session_data *sdata, struct __data *data, struct __c
data->sql[data->pos] = (char *)&rc; data->type[data->pos] = TYPE_LONG; data->len[data->pos] = sizeof(int); data->pos++;
p_store_results(sdata, data->stmt_generic, data);
p_store_results(data->stmt_generic, data);
p_fetch_results(data->stmt_generic);
p_free_results(data->stmt_generic);
}
@ -105,7 +105,8 @@ int remove_attachments(char *in, struct session_data *sdata, struct __data *data
char filename[SMALLBUFSIZE];
char *a, buf[NUMBER_OF_ATTACHMENTS_TO_REMOVE_IN_ONE_ROUND*(RND_STR_LEN+1)+10], update_meta_sql[strlen(SQL_STMT_DELETE_FROM_META_TABLE_BY_PILER_ID)+NUMBER_OF_ATTACHMENTS_TO_REMOVE_IN_ONE_ROUND*(RND_STR_LEN+3)+10], delete_attachment_stmt[MAXBUFSIZE];
char piler_id[SMALLBUFSIZE], i[BUFLEN];
int n=0, m=0, len, attachment_id=0, blen=0, ulen=0, dlen=0, piler_id_len;
int n=0, m=0, len, attachment_id=0, piler_id_len;
unsigned int blen=0, ulen=0, dlen=0;
#ifdef HAVE_SUPPORT_FOR_COMPAT_STORAGE_LAYOUT
struct stat st;
#endif
@ -123,7 +124,7 @@ int remove_attachments(char *in, struct session_data *sdata, struct __data *data
in[strlen(in)-1] = '\0';
snprintf(a, len-1, "%s%s", SQL_STMT_SELECT_NON_REFERENCED_ATTACHMENTS, in);
if(prepare_sql_statement(sdata, &(data->stmt_select_non_referenced_attachments), a, cfg) == ERR){ free(a); return n; }
if(prepare_sql_statement(sdata, &(data->stmt_select_non_referenced_attachments), a) == ERR){ free(a); return n; }
if(dryrun == 1) printf("attachment select sql: *%s*\n\n", a);
@ -147,7 +148,7 @@ int remove_attachments(char *in, struct session_data *sdata, struct __data *data
data->sql[data->pos] = (char *)&attachment_id; data->type[data->pos] = TYPE_LONG; data->len[data->pos] = sizeof(int); data->pos++;
data->sql[data->pos] = &i[0]; data->type[data->pos] = TYPE_STRING; data->len[data->pos] = sizeof(i)-2; data->pos++;
p_store_results(sdata, data->stmt_select_non_referenced_attachments, data);
p_store_results(data->stmt_select_non_referenced_attachments, data);
while(p_fetch_results(data->stmt_select_non_referenced_attachments) == OK){
@ -254,7 +255,8 @@ ENDE:
int purge_messages_round1(struct session_data *sdata, struct __data *data, char *attachment_condition, struct __config *cfg){
int purged=0, size, blen=0, ulen=0;
int purged=0, size;
unsigned int blen=0, ulen=0;
char id[BUFLEN], s[SMALLBUFSIZE], buf[MAXBUFSIZE], update_meta_sql[MAXBUFSIZE];
memset(buf, 0, sizeof(buf));
@ -267,7 +269,7 @@ int purge_messages_round1(struct session_data *sdata, struct __data *data, char
if(dryrun == 1) printf("purge sql: *%s*\n", s);
if(prepare_sql_statement(sdata, &(data->stmt_select_from_meta_table), s, cfg) == ERR) return purged;
if(prepare_sql_statement(sdata, &(data->stmt_select_from_meta_table), s) == ERR) return purged;
p_bind_init(data);
@ -279,7 +281,7 @@ int purge_messages_round1(struct session_data *sdata, struct __data *data, char
data->sql[data->pos] = &s[0]; data->type[data->pos] = TYPE_STRING; data->len[data->pos] = sizeof(s)-2; data->pos++;
data->sql[data->pos] = (char *)&size; data->type[data->pos] = TYPE_LONG; data->len[data->pos] = sizeof(int); data->pos++;
p_store_results(sdata, data->stmt_select_from_meta_table, data);
p_store_results(data->stmt_select_from_meta_table, data);
while(p_fetch_results(data->stmt_select_from_meta_table) == OK){
@ -321,7 +323,8 @@ int purge_messages_round1(struct session_data *sdata, struct __data *data, char
int purge_messages_with_attachments(struct session_data *sdata, struct __data *data, struct __config *cfg){
int purged=0, size, idlist_len=0;
int purged=0, size;
unsigned int idlist_len=0;
char s[SMALLBUFSIZE], idlist[MAXBUFSIZE];
memset(idlist, 0, sizeof(idlist));
@ -330,7 +333,7 @@ int purge_messages_with_attachments(struct session_data *sdata, struct __data *d
if(dryrun == 1) printf("purge sql: *%s*\n", s);
if(prepare_sql_statement(sdata, &(data->stmt_select_from_meta_table), s, cfg) == ERR) return purged;
if(prepare_sql_statement(sdata, &(data->stmt_select_from_meta_table), s) == ERR) return purged;
p_bind_init(data);
if(p_exec_query(sdata, data->stmt_select_from_meta_table, data) == OK){
@ -340,7 +343,7 @@ int purge_messages_with_attachments(struct session_data *sdata, struct __data *d
data->sql[data->pos] = &s[0]; data->type[data->pos] = TYPE_STRING; data->len[data->pos] = sizeof(s)-2; data->pos++;
data->sql[data->pos] = (char *)&size; data->type[data->pos] = TYPE_LONG; data->len[data->pos] = sizeof(int); data->pos++;
p_store_results(sdata, data->stmt_select_from_meta_table, data);
p_store_results(data->stmt_select_from_meta_table, data);
while(p_fetch_results(data->stmt_select_from_meta_table) == OK){
memcpy(&idlist[idlist_len], s, strlen(s)); idlist_len += strlen(s);
@ -410,7 +413,7 @@ int main(int argc, char **argv){
init_session_data(&sdata, &cfg);
i = is_purge_allowed(&sdata, &data, &cfg);
i = is_purge_allowed(&sdata, &data);
if(i == 1){
purged += purge_messages_round1(&sdata, &data, "attachments=0", &cfg);
purged += purge_messages_with_attachments(&sdata, &data, &cfg);

View File

@ -36,7 +36,7 @@ int is_last_complete_pop3_packet(char *s, int len){
}
int connect_to_pop3_server(int sd, char *username, char *password, int port, struct __data *data, int use_ssl){
int connect_to_pop3_server(int sd, char *username, char *password, struct __data *data, int use_ssl){
int n;
char buf[MAXBUFSIZE];
X509* server_cert;

View File

@ -42,14 +42,14 @@ void p_clean_exit(char *msg, int rc){
}
uint64 get_max_meta_id(struct session_data *sdata, struct __data *data, struct __config *cfg){
uint64 get_max_meta_id(struct session_data *sdata, struct __data *data){
char s[SMALLBUFSIZE];
uint64 id=0;
snprintf(s, sizeof(s)-1, "SELECT MAX(`id`) FROM %s", SQL_METADATA_TABLE);
if(prepare_sql_statement(sdata, &(data->stmt_generic), s, cfg) == ERR) return id;
if(prepare_sql_statement(sdata, &(data->stmt_generic), s) == ERR) return id;
p_bind_init(data);
@ -60,7 +60,7 @@ uint64 get_max_meta_id(struct session_data *sdata, struct __data *data, struct _
data->sql[data->pos] = (char *)&id; data->type[data->pos] = TYPE_LONGLONG; data->len[data->pos] = sizeof(uint64); data->pos++;
p_store_results(sdata, data->stmt_generic, data);
p_store_results(data->stmt_generic, data);
p_fetch_results(data->stmt_generic);
p_free_results(data->stmt_generic);
}
@ -88,7 +88,7 @@ uint64 retrieve_email_by_metadata_id(struct session_data *sdata, struct __data *
snprintf(s, sizeof(s)-1, "SELECT `id`, `piler_id`, `arrived`, `sent` FROM %s WHERE (id BETWEEN %llu AND %llu) AND `deleted`=0", SQL_METADATA_TABLE, from_id, to_id);
if(prepare_sql_statement(sdata, &(data->stmt_generic), s, cfg) == ERR) return reindexed;
if(prepare_sql_statement(sdata, &(data->stmt_generic), s) == ERR) return reindexed;
p_bind_init(data);
@ -104,7 +104,7 @@ uint64 retrieve_email_by_metadata_id(struct session_data *sdata, struct __data *
data->sql[data->pos] = (char *)&(data->folder); data->type[data->pos] = TYPE_LONG; data->len[data->pos] = sizeof(unsigned long); data->pos++;
}
p_store_results(sdata, data->stmt_generic, data);
p_store_results(data->stmt_generic, data);
while(p_fetch_results(data->stmt_generic) == OK){
@ -239,10 +239,10 @@ int main(int argc, char **argv){
p_clean_exit("cannot connect to mysql server", 1);
}
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE, &cfg);
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE);
if(folder){
data.folder = get_folder_id(&sdata, &data, folder, 0, &cfg);
data.folder = get_folder_id(&sdata, &data, folder, 0);
if(data.folder == 0){
printf("error: could not get folder id for '%s'\n", folder);
return 0;
@ -254,7 +254,7 @@ int main(int argc, char **argv){
if(all == 1){
from_id = 1;
to_id = get_max_meta_id(&sdata, &data, &cfg);
to_id = get_max_meta_id(&sdata, &data);
}
n = retrieve_email_by_metadata_id(&sdata, &data, from_id, to_id, &cfg);

View File

@ -10,7 +10,7 @@
#include "rules.h"
void load_rules(struct session_data *sdata, struct __data *data, struct node *xhash[], char *table, struct __config *cfg){
void load_rules(struct session_data *sdata, struct __data *data, struct node *xhash[], char *table){
char s[SMALLBUFSIZE];
struct rule_cond rule_cond;
@ -28,7 +28,7 @@ void load_rules(struct session_data *sdata, struct __data *data, struct node *xh
snprintf(s, sizeof(s)-1, "SELECT `domain`, `from`, `to`, `subject`, `body`, `_size`, `size`, `attachment_name`, `attachment_type`, `_attachment_size`, `attachment_size`, `spam`, `days`, `folder_id` FROM `%s`", table);
if(prepare_sql_statement(sdata, &(data->stmt_generic), s, cfg) == ERR) return;
if(prepare_sql_statement(sdata, &(data->stmt_generic), s) == ERR) return;
p_bind_init(data);
@ -52,7 +52,7 @@ void load_rules(struct session_data *sdata, struct __data *data, struct node *xh
data->sql[data->pos] = (char *)&rule_cond.days; data->type[data->pos] = TYPE_LONG; data->len[data->pos] = sizeof(int); data->pos++;
data->sql[data->pos] = (char *)&rule_cond.folder_id; data->type[data->pos] = TYPE_LONG; data->len[data->pos] = sizeof(int); data->pos++;
p_store_results(sdata, data->stmt_generic, data);
p_store_results(data->stmt_generic, data);
while(p_fetch_results(data->stmt_generic) == OK){
append_rule(xhash, &rule_cond, data);

View File

@ -7,7 +7,7 @@
#include "defs.h"
void load_rules(struct session_data *sdata, struct __data *data, struct node *xhash[], char *table, struct __config *cfg);
void load_rules(struct session_data *sdata, struct __data *data, struct node *xhash[], char *table);
int append_rule(struct node *xhash[], struct rule_cond *rule_cond, struct __data *data);
struct rule *create_rule_item(struct rule_cond *rule_cond, struct __data *data);
char *check_againt_ruleset(struct node *xhash[], struct parser_state *state, int size, int spam);

View File

@ -351,7 +351,7 @@ AFTER_PERIOD:
if(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: got: %s", sdata.ttmpfile, buf);
if(strncasecmp(buf, SMTP_CMD_EHLO, strlen(SMTP_CMD_EHLO)) == 0 || strncasecmp(buf, LMTP_CMD_LHLO, strlen(LMTP_CMD_LHLO)) == 0){
process_command_ehlo_lhlo(&sdata, data, &protocol_state, buf, &resp[0], sizeof(resp)-1, cfg);
process_command_ehlo_lhlo(&sdata, data, &protocol_state, &resp[0], sizeof(resp)-1, cfg);
continue;
/* FIXME: implement the ENHANCEDSTATUSCODE extensions */
@ -367,7 +367,7 @@ AFTER_PERIOD:
#ifdef HAVE_STARTTLS
if(cfg->tls_enable > 0 && strncasecmp(buf, SMTP_CMD_STARTTLS, strlen(SMTP_CMD_STARTTLS)) == 0 && strlen(data->starttls) > 4 && sdata.tls == 0){
process_command_starttls(&sdata, data, &protocol_state, &starttls, buf, new_sd, &resp[0], sizeof(resp)-1, cfg);
process_command_starttls(&sdata, data, &protocol_state, &starttls, new_sd, &resp[0], sizeof(resp)-1, cfg);
continue;
}
#endif
@ -380,7 +380,7 @@ AFTER_PERIOD:
if(strncasecmp(buf, SMTP_CMD_RCPT_TO, strlen(SMTP_CMD_RCPT_TO)) == 0){
process_command_rcpt_to(&sdata, &protocol_state, buf, &resp[0], sizeof(resp)-1, cfg);
process_command_rcpt_to(&sdata, &protocol_state, buf, &resp[0], sizeof(resp)-1);
continue;
}
@ -391,13 +391,13 @@ AFTER_PERIOD:
inj = ERR;
prevlen = 0;
process_command_data(&sdata, &protocol_state, buf, &resp[0], sizeof(resp)-1, cfg);
process_command_data(&sdata, &protocol_state, &resp[0], sizeof(resp)-1);
continue;
}
if(strncasecmp(buf, SMTP_CMD_QUIT, strlen(SMTP_CMD_QUIT)) == 0){
process_command_quit(&sdata, &protocol_state, buf, &resp[0], sizeof(resp)-1, cfg);
process_command_quit(&sdata, &protocol_state, &resp[0], sizeof(resp)-1, cfg);
continue;
}
@ -409,7 +409,7 @@ AFTER_PERIOD:
if(strncasecmp(buf, SMTP_CMD_RESET, strlen(SMTP_CMD_RESET)) == 0){
process_command_reset(&sdata, &protocol_state, buf, &resp[0], sizeof(resp)-1, cfg);
process_command_reset(&sdata, &protocol_state, &resp[0], sizeof(resp)-1, cfg);
continue;
}
@ -422,7 +422,7 @@ AFTER_PERIOD:
if(strlen(resp) > 0){
send_buffered_response(&sdata, data, &protocol_state, starttls, buf, new_sd, &resp[0], sizeof(resp)-1, cfg);
send_buffered_response(&sdata, data, starttls, new_sd, &resp[0], cfg);
memset(resp, 0, sizeof(resp));
}

View File

@ -17,9 +17,10 @@
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <piler.h>
#include <smtp.h>
void process_command_ehlo_lhlo(struct session_data *sdata, struct __data *data, int *protocol_state, char *buf, char *resp, int resplen, struct __config *cfg){
void process_command_ehlo_lhlo(struct session_data *sdata, struct __data *data, int *protocol_state, char *resp, int resplen, struct __config *cfg){
char tmpbuf[MAXBUFSIZE];
if(*protocol_state == SMTP_STATE_INIT) *protocol_state = SMTP_STATE_HELO;
@ -32,7 +33,7 @@ void process_command_ehlo_lhlo(struct session_data *sdata, struct __data *data,
#ifdef HAVE_STARTTLS
void process_command_starttls(struct session_data *sdata, struct __data *data, int *protocol_state, int *starttls, char *buf, int new_sd, char *resp, int resplen, struct __config *cfg){
void process_command_starttls(struct session_data *sdata, struct __data *data, int *protocol_state, int *starttls, int new_sd, char *resp, int resplen, struct __config *cfg){
if(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: starttls request from client", sdata->ttmpfile);
@ -85,7 +86,7 @@ void process_command_mail_from(struct session_data *sdata, int *protocol_state,
}
void process_command_rcpt_to(struct session_data *sdata, int *protocol_state, char *buf, char *resp, int resplen, struct __config *cfg){
void process_command_rcpt_to(struct session_data *sdata, int *protocol_state, char *buf, char *resp, int resplen){
if(*protocol_state == SMTP_STATE_MAIL_FROM || *protocol_state == SMTP_STATE_RCPT_TO){
@ -110,7 +111,7 @@ void process_command_rcpt_to(struct session_data *sdata, int *protocol_state, ch
}
void process_command_data(struct session_data *sdata, int *protocol_state, char *buf, char *resp, int resplen, struct __config *cfg){
void process_command_data(struct session_data *sdata, int *protocol_state, char *resp, int resplen){
if(*protocol_state != SMTP_STATE_RCPT_TO){
strncat(resp, SMTP_RESP_503_ERR, resplen);
@ -130,7 +131,7 @@ void process_command_data(struct session_data *sdata, int *protocol_state, char
}
void process_command_quit(struct session_data *sdata, int *protocol_state, char *buf, char *resp, int resplen, struct __config *cfg){
void process_command_quit(struct session_data *sdata, int *protocol_state, char *resp, int resplen, struct __config *cfg){
char tmpbuf[MAXBUFSIZE];
*protocol_state = SMTP_STATE_FINISHED;
@ -145,7 +146,7 @@ void process_command_quit(struct session_data *sdata, int *protocol_state, char
}
void process_command_reset(struct session_data *sdata, int *protocol_state, char *buf, char *resp, int resplen, struct __config *cfg){
void process_command_reset(struct session_data *sdata, int *protocol_state, char *resp, int resplen, struct __config *cfg){
strncat(resp, SMTP_RESP_250_OK, resplen);
@ -160,7 +161,7 @@ void process_command_reset(struct session_data *sdata, int *protocol_state, char
}
void send_buffered_response(struct session_data *sdata, struct __data *data, int *protocol_state, int starttls, char *buf, int new_sd, char *resp, int resplen, struct __config *cfg){
void send_buffered_response(struct session_data *sdata, struct __data *data, int starttls, int new_sd, char *resp, struct __config *cfg){
int rc;
#ifdef HAVE_STARTTLS
char ssl_error[SMALLBUFSIZE];

View File

@ -5,14 +5,14 @@
#ifndef _SMTP_H
#define _SMTP_H
void process_command_ehlo_lhlo(struct session_data *sdata, struct __data *data, int *protocol_state, char *buf, char *resp, int resplen, struct __config *cfg);
void process_command_starttls(struct session_data *sdata, struct __data *data, int *protocol_state, int *starttls, char *buf, int new_sd, char *resp, int resplen, struct __config *cfg);
void process_command_ehlo_lhlo(struct session_data *sdata, struct __data *data, int *protocol_state, char *resp, int resplen, struct __config *cfg);
void process_command_starttls(struct session_data *sdata, struct __data *data, int *protocol_state, int *starttls, int new_sd, char *resp, int resplen, struct __config *cfg);
void process_command_mail_from(struct session_data *sdata, int *protocol_state, char *buf, char *resp, int resplen, struct __config *cfg);
void process_command_rcpt_to(struct session_data *sdata, int *protocol_state, char *buf, char *resp, int resplen, struct __config *cfg);
void process_command_data(struct session_data *sdata, int *protocol_state, char *buf, char *resp, int resplen, struct __config *cfg);
void process_command_quit(struct session_data *sdata, int *protocol_state, char *buf, char *resp, int resplen, struct __config *cfg);
void process_command_reset(struct session_data *sdata, int *protocol_state, char *buf, char *resp, int resplen, struct __config *cfg);
void process_command_rcpt_to(struct session_data *sdata, int *protocol_state, char *buf, char *resp, int resplen);
void process_command_data(struct session_data *sdata, int *protocol_state, char *resp, int resplen);
void process_command_quit(struct session_data *sdata, int *protocol_state, char *resp, int resplen, struct __config *cfg);
void process_command_reset(struct session_data *sdata, int *protocol_state, char *resp, int resplen, struct __config *cfg);
void send_buffered_response(struct session_data *sdata, struct __data *data, int *protocol_state, int starttls, char *buf, int new_sd, char *resp, int resplen, struct __config *cfg);
void send_buffered_response(struct session_data *sdata, struct __data *data, int starttls, int new_sd, char *resp, struct __config *cfg);
#endif /* _SMTP_H */

View File

@ -8,10 +8,10 @@
int open_database(struct session_data *sdata, struct __config *cfg);
void close_database(struct session_data *sdata);
int prepare_sql_statement(struct session_data *sdata, MYSQL_STMT **stmt, char *s, struct __config *cfg);
int prepare_sql_statement(struct session_data *sdata, MYSQL_STMT **stmt, char *s);
void p_query(struct session_data *sdata, char *s);
int p_exec_query(struct session_data *sdata, MYSQL_STMT *stmt, struct __data *data);
int p_store_results(struct session_data *sdata, MYSQL_STMT *stmt, struct __data *data);
int p_store_results(MYSQL_STMT *stmt, struct __data *data);
int p_fetch_results(MYSQL_STMT *stmt);
void p_free_results(MYSQL_STMT *stmt);
void p_bind_init(struct __data *data);

View File

@ -39,7 +39,7 @@ int read_key(struct __config *cfg){
}
int store_file(struct session_data *sdata, char *filename, int startpos, int len, struct __config *cfg){
int store_file(struct session_data *sdata, char *filename, int len, struct __config *cfg){
int ret=0, rc, fd, n;
char *addr, *p, *p0, *p1, *p2, s[SMALLBUFSIZE];
struct stat st;
@ -147,6 +147,8 @@ int store_file(struct session_data *sdata, char *filename, int startpos, int len
*p0 = '/';
unlink(s);
fd = open(s, O_CREAT|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP);
if(fd == -1){
syslog(LOG_PRIORITY, "%s: cannot open: %s", sdata->ttmpfile, s);

View File

@ -67,9 +67,9 @@ int main(int argc, char **argv){
load_mydomains(&sdata, &data, &cfg);
load_rules(&sdata, &data, data.archiving_rules, SQL_ARCHIVING_RULE_TABLE, &cfg);
load_rules(&sdata, &data, data.retention_rules, SQL_RETENTION_RULE_TABLE, &cfg);
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE, &cfg);
load_rules(&sdata, &data, data.archiving_rules, SQL_ARCHIVING_RULE_TABLE);
load_rules(&sdata, &data, data.retention_rules, SQL_RETENTION_RULE_TABLE);
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE);
init_session_data(&sdata, &cfg);

View File

@ -30,8 +30,8 @@ struct digest_test tests[] = {
};
void static test_digest_string(){
int i;
static void test_digest_string(){
unsigned int i;
char digest[2*DIGEST_LENGTH+1];
struct digest_test tests[] = {
{"Piler archives every email it receives.", "68bcdb6f15eeabdcedce3e4fc8faf7eb620272ebd55f365d08aca40adf18fe83", ""},
@ -51,7 +51,7 @@ void static test_digest_string(){
static void test_digest_file(){
int i;
unsigned int i;
char digest[2*DIGEST_LENGTH+1];
for(i=0; i<sizeof(tests)/sizeof(struct digest_test); i++){
@ -64,7 +64,8 @@ static void test_digest_file(){
static void test_make_digests(struct __config *cfg){
int i, j;
unsigned int i;
int j;
struct session_data sdata;
struct parser_state state;
struct __data data;

View File

@ -29,7 +29,7 @@ struct emails {
static void fill_domain_table(struct __config *cfg){
int i;
unsigned int i;
char buf[SMALLBUFSIZE];
struct session_data sdata;
@ -50,7 +50,7 @@ static void fill_domain_table(struct __config *cfg){
static void restore_domain_table(struct __config *cfg){
int i;
unsigned int i;
char buf[SMALLBUFSIZE];
struct session_data sdata;
@ -71,7 +71,7 @@ static void restore_domain_table(struct __config *cfg){
static void test_mydomains(struct __config *cfg){
int i;
unsigned int i;
struct session_data sdata;
struct __data data;
struct emails emails[] = {

View File

@ -25,7 +25,8 @@ struct parser_test {
static void test_parser(struct __config *cfg){
int i, j;
unsigned int i;
int j;
struct stat st;
struct session_data sdata;
struct parser_state state;

View File

@ -27,7 +27,10 @@ struct str_pair {
static void test_parse_date_header(){
int i;
unsigned int i;
int dst_fix = 0;
time_t t = time(NULL);
struct tm lt = {0};
struct __config cfg;
struct date_test date_test[] = {
{"Date: Mon, 02 Nov 2015 09:39:31 -0000", 1446457171},
@ -49,8 +52,11 @@ static void test_parse_date_header(){
setlocale(LC_MESSAGES, cfg.locale);
setlocale(LC_CTYPE, cfg.locale);
localtime_r(&t, &lt);
if(lt.tm_isdst == 1) dst_fix = 3600;
for(i=0; i<sizeof(date_test)/sizeof(struct date_test); i++){
assert(parse_date_header(date_test[i].date_str, &cfg) == date_test[i].timestamp && "test_parse_date_header()");
assert(parse_date_header(date_test[i].date_str)-dst_fix == date_test[i].timestamp && "test_parse_date_header()");
}
printf("test_parse_date_header() OK\n");
@ -58,7 +64,7 @@ static void test_parse_date_header(){
static void test_extractNameFromHeaderLine(){
int i;
unsigned int i;
char resultbuf[SMALLBUFSIZE];
struct name_from_header_test name_from_header_test[] = {
{"Content-Type: text/plain; charset=UTF-8", "charset", "UTF-8"},
@ -104,7 +110,7 @@ static void test_extractNameFromHeaderLine(){
static void test_fixupEncodedHeaderLine(){
int i;
unsigned int i;
char buf[SMALLBUFSIZE];
struct str_pair pair[] = {
@ -160,7 +166,7 @@ static void test_fixupEncodedHeaderLine(){
static void test_translateLine(){
int i;
unsigned int i;
char buf[SMALLBUFSIZE];
struct parser_state state;
struct str_pair pair[] = {
@ -197,7 +203,7 @@ static void test_translateLine(){
static void test_fixURL(){
int i;
unsigned int i;
char buf[SMALLBUFSIZE];
struct str_pair pair[] = {
{"http://www.aaa.fu", "__URL__wwwXaaaXfu "},
@ -227,7 +233,7 @@ static void test_fixURL(){
static void test_degenerateToken(){
int i;
unsigned int i;
char buf[SMALLBUFSIZE];
struct str_pair pair[] = {
{"Hello", "Hello"},

View File

@ -35,7 +35,7 @@ struct rule_query rules[] = {
static void fill_rule_table(struct __config *cfg){
int i;
unsigned int i;
struct session_data sdata;
if(open_database(&sdata, cfg) == ERR){
@ -55,7 +55,7 @@ static void fill_rule_table(struct __config *cfg){
static void restore_rule_table(struct __config *cfg){
int i;
unsigned int i;
char buf[SMALLBUFSIZE];
struct session_data sdata;
@ -77,7 +77,8 @@ static void restore_rule_table(struct __config *cfg){
static void test_archiving_rule(struct __config *cfg){
int i, j;
unsigned int i;
int j;
char *rule;
struct session_data sdata;
struct parser_state state;
@ -102,7 +103,7 @@ static void test_archiving_rule(struct __config *cfg){
initrules(data.archiving_rules);
load_rules(&sdata, &data, data.archiving_rules, SQL_ARCHIVING_RULE_TABLE, cfg);
load_rules(&sdata, &data, data.archiving_rules, SQL_ARCHIVING_RULE_TABLE);
for(i=0; i<sizeof(rule_test)/sizeof(struct rule_test); i++){