diff --git a/src/Makefile.in b/src/Makefile.in index 5058078..4a35c2c 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -33,7 +33,7 @@ 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 diff --git a/src/archive.c b/src/archive.c index d8d02aa..3160b6a 100644 --- a/src/archive.c +++ b/src/archive.c @@ -222,7 +222,7 @@ 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); diff --git a/src/attachment.c b/src/attachment.c index 47be0fd..08d1ac8 100644 --- a/src/attachment.c +++ b/src/attachment.c @@ -21,8 +21,8 @@ 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 @@ 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 @@ } -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 @@ 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_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; istmt_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 @@ 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; diff --git a/src/cfg.c b/src/cfg.c index a738013..d3fa5e1 100644 --- a/src/cfg.c +++ b/src/cfg.c @@ -17,7 +17,7 @@ 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 @@ 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 @@ { "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} }; diff --git a/src/config.h b/src/config.h index c273b2d..ca25a1c 100644 --- a/src/config.h +++ b/src/config.h @@ -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(?,?)" diff --git a/src/counters.c b/src/counters.c index 5589672..76402e2 100644 --- a/src/counters.c +++ b/src/counters.c @@ -11,7 +11,7 @@ #include -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 @@ 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 @@ 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 @@ } 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); diff --git a/src/decoder.c b/src/decoder.c index 5436ad1..8f1a428 100644 --- a/src/decoder.c +++ b/src/decoder.c @@ -158,7 +158,8 @@ 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 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 @@ 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 @@ 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; } diff --git a/src/defs.h b/src/defs.h index 96fc817..33ea813 100644 --- a/src/defs.h +++ b/src/defs.h @@ -294,6 +294,7 @@ int download_only; int keep_eml; int timeout; + int reimport; int cap_uidplus; long total_size; time_t started, updated, finished; diff --git a/src/fixmetadata.c b/src/fixmetadata.c index 8327273..515ce77 100644 --- a/src/fixmetadata.c +++ b/src/fixmetadata.c @@ -30,7 +30,7 @@ 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 @@ 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; diff --git a/src/hash.c b/src/hash.c index 4820d43..fbc6515 100644 --- a/src/hash.c +++ b/src/hash.c @@ -40,7 +40,7 @@ } -struct node *makenewnode(struct node *xhash[], char *s){ +struct node *makenewnode(char *s){ struct node *h; int len; @@ -82,7 +82,7 @@ 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 @@ q = q->r; } } - if(p) p->r = makenewnode(xhash, s); + if(p) p->r = makenewnode(s); } return 1; diff --git a/src/hash.h b/src/hash.h index 549eef9..040c5d6 100644 --- a/src/hash.h +++ b/src/hash.h @@ -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); diff --git a/src/imap.c b/src/imap.c index e31898c..6668ae2 100644 --- a/src/imap.c +++ b/src/imap.c @@ -124,8 +124,8 @@ 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 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; diff --git a/src/import.c b/src/import.c index fdfd633..409d1c3 100644 --- a/src/import.c +++ b/src/import.c @@ -92,7 +92,10 @@ 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 @@ 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 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 @@ 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 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++; diff --git a/src/import.h b/src/import.h index 0b482a5..9db5ba1 100644 --- a/src/import.h +++ b/src/import.h @@ -17,10 +17,10 @@ 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); diff --git a/src/import_gui.c b/src/import_gui.c index 39c6882..749a9e9 100644 --- a/src/import_gui.c +++ b/src/import_gui.c @@ -31,7 +31,7 @@ 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 @@ 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; diff --git a/src/import_imap.c b/src/import_imap.c index dd1362d..3929f73 100644 --- a/src/import_imap.c +++ b/src/import_imap.c @@ -57,7 +57,7 @@ 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; diff --git a/src/import_mailbox.c b/src/import_mailbox.c index 7cdadff..3de0e40 100644 --- a/src/import_mailbox.c +++ b/src/import_mailbox.c @@ -111,9 +111,9 @@ 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); diff --git a/src/import_maildir.c b/src/import_maildir.c index 975ed6a..cb4c5a2 100644 --- a/src/import_maildir.c +++ b/src/import_maildir.c @@ -60,9 +60,9 @@ 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); diff --git a/src/import_pop3.c b/src/import_pop3.c index 69942e2..0209035 100644 --- a/src/import_pop3.c +++ b/src/import_pop3.c @@ -53,7 +53,7 @@ } - 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; diff --git a/src/message.c b/src/message.c index 60649bd..c120cd2 100644 --- a/src/message.c +++ b/src/message.c @@ -29,7 +29,7 @@ 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 @@ } -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 @@ 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 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_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 @@ } +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 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 @@ } - 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 @@ 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 @@ 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 @@ 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 @@ } - 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 @@ 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 @@ 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; +} diff --git a/src/misc.c b/src/misc.c index 70534ea..c006a8c 100644 --- a/src/misc.c +++ b/src/misc.c @@ -345,7 +345,7 @@ * 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; diff --git a/src/misc.h b/src/misc.h index 197a9fa..89a4050 100644 --- a/src/misc.h +++ b/src/misc.h @@ -29,7 +29,7 @@ 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); diff --git a/src/mydomains.c b/src/mydomains.c index 7299221..3e7e3d9 100644 --- a/src/mydomains.c +++ b/src/mydomains.c @@ -17,7 +17,7 @@ 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 @@ 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); diff --git a/src/mysql.c b/src/mysql.c index 480fbec..d849b50 100644 --- a/src/mysql.c +++ b/src/mysql.c @@ -123,7 +123,7 @@ } -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 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){ diff --git a/src/parser.c b/src/parser.c index f0b8047..7e38b0f 100644 --- a/src/parser.c +++ b/src/parser.c @@ -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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 { diff --git a/src/parser.h b/src/parser.h index cce3eb6..fd361ee 100644 --- a/src/parser.h +++ b/src/parser.h @@ -14,7 +14,7 @@ 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 @@ 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 */ diff --git a/src/parser_utils.c b/src/parser_utils.c index f5720cb..acc8c62 100644 --- a/src/parser_utils.c +++ b/src/parser_utils.c @@ -112,7 +112,7 @@ } -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 @@ 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 @@ */ void reassembleToken(char *p){ - int i, k=0; + unsigned int i; + int k=0; for(i=0; istmt_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 @@ 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){ diff --git a/src/pilerimport.c b/src/pilerimport.c index 396d584..de61a4a 100644 --- a/src/pilerimport.c +++ b/src/pilerimport.c @@ -53,9 +53,11 @@ printf(" -R Assign IMAP folder names as Piler folder names\n"); printf(" -b Import only this many emails\n"); printf(" -s Start importing POP3 emails from this position\n"); + printf(" -a 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 @@ 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 @@ {"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 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 @@ 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 @@ #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 @@ } - 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); diff --git a/src/pilerpurge.c b/src/pilerpurge.c index dcbb8b1..656491a 100644 --- a/src/pilerpurge.c +++ b/src/pilerpurge.c @@ -31,10 +31,10 @@ #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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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_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 @@ 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 @@ 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 @@ 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); diff --git a/src/pop3.c b/src/pop3.c index cbe7f65..3e7eb37 100644 --- a/src/pop3.c +++ b/src/pop3.c @@ -36,7 +36,7 @@ } -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; diff --git a/src/reindex.c b/src/reindex.c index 4c72080..dbf1cc6 100644 --- a/src/reindex.c +++ b/src/reindex.c @@ -42,14 +42,14 @@ } -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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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); diff --git a/src/rules.c b/src/rules.c index d77ffd4..f212d2c 100644 --- a/src/rules.c +++ b/src/rules.c @@ -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 @@ 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 @@ 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); diff --git a/src/rules.h b/src/rules.h index e7f0fd5..48019ad 100644 --- a/src/rules.h +++ b/src/rules.h @@ -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); diff --git a/src/session.c b/src/session.c index 4e27f74..259d1d5 100644 --- a/src/session.c +++ b/src/session.c @@ -351,7 +351,7 @@ 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 @@ #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 @@ 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 @@ 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 @@ 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 @@ 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)); } diff --git a/src/smtp.c b/src/smtp.c index 1f63dd4..8e1c121 100644 --- a/src/smtp.c +++ b/src/smtp.c @@ -17,9 +17,10 @@ #include #include #include +#include -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 @@ #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_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_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_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_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 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]; diff --git a/src/smtp.h b/src/smtp.h index 708f384..06d3491 100644 --- a/src/smtp.h +++ b/src/smtp.h @@ -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 */ diff --git a/src/sql.h b/src/sql.h index 07c214c..692cfa1 100644 --- a/src/sql.h +++ b/src/sql.h @@ -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); diff --git a/src/store.c b/src/store.c index 2a2781c..1230a45 100644 --- a/src/store.c +++ b/src/store.c @@ -39,7 +39,7 @@ } -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 @@ *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); diff --git a/src/test.c b/src/test.c index 20d5912..3c2cf1a 100644 --- a/src/test.c +++ b/src/test.c @@ -67,9 +67,9 @@ 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); diff --git a/unit_tests/check_digest.c b/unit_tests/check_digest.c index 4945a69..006d330 100644 --- a/unit_tests/check_digest.c +++ b/unit_tests/check_digest.c @@ -30,8 +30,8 @@ }; -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 @@ static void test_digest_file(){ - int i; + unsigned int i; char digest[2*DIGEST_LENGTH+1]; for(i=0; i