mirror of
https://bitbucket.org/jsuto/piler.git
synced 2024-12-24 19:00:11 +01:00
added reimport option for pilerimport
This commit is contained in:
parent
67891084e4
commit
65fc0b377e
@ -33,7 +33,7 @@ MAKE = `which make`
|
|||||||
|
|
||||||
INSTALL = @INSTALL@
|
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
|
install: install-piler
|
||||||
|
|
||||||
|
|
||||||
|
@ -222,7 +222,7 @@ int retrieve_email_from_archive(struct session_data *sdata, struct __data *data,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
attachments = query_attachments(sdata, data, &ptr_arr[0], cfg);
|
attachments = query_attachments(sdata, data, &ptr_arr[0]);
|
||||||
|
|
||||||
if(attachments == -1){
|
if(attachments == -1){
|
||||||
printf("problem querying the attachment of %s\n", sdata->ttmpfile);
|
printf("problem querying the attachment of %s\n", sdata->ttmpfile);
|
||||||
|
@ -21,8 +21,8 @@ int store_attachments(struct session_data *sdata, struct parser_state *state, st
|
|||||||
int i, rc=1, found, affected_rows;
|
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_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, cfg) == 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++){
|
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++;
|
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;
|
if(p_fetch_results(data->stmt_get_attachment_id_by_signature) == OK) found = 1;
|
||||||
p_free_results(data->stmt_get_attachment_id_by_signature);
|
p_free_results(data->stmt_get_attachment_id_by_signature);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(found == 0){
|
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);
|
syslog(LOG_PRIORITY, "%s: error storing attachment: %s", sdata->ttmpfile, state->attachments[i].internalname);
|
||||||
goto CLOSE;
|
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;
|
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);
|
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] = 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++;
|
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;
|
if(p_fetch_results(data->stmt_get_attachment_pointer) == OK) rc = 1;
|
||||||
p_free_results(data->stmt_get_attachment_pointer);
|
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;
|
int i, rc, id, attachments=0;
|
||||||
uint64 ptr;
|
uint64 ptr;
|
||||||
|
|
||||||
for(i=0; i<MAX_ATTACHMENTS; i++) memset((char*)&ptr_arr[i], 0, sizeof(struct ptr_array));
|
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);
|
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 *)&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++;
|
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){
|
while(p_fetch_results(data->stmt_query_attachment) == OK){
|
||||||
|
|
||||||
if(id > 0 && id < MAX_ATTACHMENTS){
|
if(id > 0 && id < MAX_ATTACHMENTS){
|
||||||
if(ptr > 0){
|
if(ptr > 0){
|
||||||
ptr_arr[id].ptr = ptr;
|
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){
|
if(!rc){
|
||||||
attachments = -1;
|
attachments = -1;
|
||||||
goto CLOSE;
|
goto CLOSE;
|
||||||
|
@ -17,7 +17,7 @@ int string_parser(char *src, char *target, int limit){
|
|||||||
return 0;
|
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){
|
if(strlen(src) > 0 && strlen(target) + strlen(src) + 3 < limit){
|
||||||
strncat(target, src, limit-strlen(target));
|
strncat(target, src, limit-strlen(target));
|
||||||
strncat(target, "\r\n", 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;
|
return 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
int int_parser(char *src, int *target, int limit){
|
int int_parser(char *src, int *target){
|
||||||
*target = strtol(src, (char **) NULL, 10);
|
*target = strtol(src, (char **) NULL, 10);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int float_parser(char *src, float *target, int limit){
|
int float_parser(char *src, float *target){
|
||||||
*target = strtof(src, (char **) NULL);
|
*target = strtof(src, (char **) NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -110,7 +110,7 @@ struct _parse_rule config_parse_rules[] =
|
|||||||
{ "verbosity", "integer", (void*) int_parser, offsetof(struct __config, verbosity), "1", sizeof(int)},
|
{ "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},
|
{ "workdir", "string", (void*) string_parser, offsetof(struct __config, workdir), WORK_DIR, MAXVAL-1},
|
||||||
|
|
||||||
{NULL, NULL, NULL, 0, 0}
|
{NULL, NULL, NULL, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
#define VERSION "1.2.0-master"
|
#define VERSION "1.2.0-master"
|
||||||
|
|
||||||
#define BUILD 941
|
#define BUILD 942
|
||||||
|
|
||||||
#define HOSTID "mailarchiver"
|
#define HOSTID "mailarchiver"
|
||||||
|
|
||||||
@ -94,10 +94,11 @@
|
|||||||
#define SQL_ATTACHMENTS_VIEW "v_attachment"
|
#define SQL_ATTACHMENTS_VIEW "v_attachment"
|
||||||
|
|
||||||
#define SQL_PREPARED_STMT_GET_DOMAINS "SELECT `domain` FROM `" SQL_DOMAIN_TABLE "`"
|
#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_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_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_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_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_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=?"
|
#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_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_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_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_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(?,?)"
|
#define SQL_PREPARED_STMT_INSERT_FOLDER_MESSAGE "INSERT INTO " SQL_FOLDER_MESSAGE_TABLE " (`folder_id`, `id`) VALUES(?,?)"
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include <piler.h>
|
#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];
|
char buf[SMALLBUFSIZE];
|
||||||
struct __counters counters;
|
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);
|
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);
|
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_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++;
|
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_fetch_results(data->stmt_generic);
|
||||||
p_free_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 {
|
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);
|
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);
|
||||||
|
|
||||||
|
@ -158,7 +158,8 @@ int decode_base64_to_buffer(char *p, int plen, unsigned char *b, int blen){
|
|||||||
|
|
||||||
|
|
||||||
void decodeQP(char *p){
|
void decodeQP(char *p){
|
||||||
int i, k=0, a, b;
|
unsigned int i;
|
||||||
|
int k=0, a, b;
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
if(p == NULL) return;
|
if(p == NULL) return;
|
||||||
@ -247,7 +248,8 @@ void decodeHTML(char *p, int utf8){
|
|||||||
|
|
||||||
|
|
||||||
void decodeURL(char *p){
|
void decodeURL(char *p){
|
||||||
int i, c, k=0, a, b;
|
unsigned int i;
|
||||||
|
int c, k=0, a, b;
|
||||||
|
|
||||||
if(p == NULL) return;
|
if(p == NULL) return;
|
||||||
|
|
||||||
@ -303,30 +305,21 @@ inline void utf8_encode_char(unsigned char c, unsigned char *buf, int buflen, in
|
|||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(c <= 0x7FF){
|
else {
|
||||||
*(buf+count) = ( 0xC0 | (c >> 6) );
|
*(buf+count) = ( 0xC0 | (c >> 6) );
|
||||||
count++;
|
count++;
|
||||||
*(buf+count) = ( 0x80 | (c & 0x3F) );
|
*(buf+count) = ( 0x80 | (c & 0x3F) );
|
||||||
count++;
|
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;
|
*len = count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int utf8_encode(char *inbuf, int inbuflen, char *outbuf, int outbuflen, char *encoding){
|
int utf8_encode(char *inbuf, int inbuflen, char *outbuf, int outbuflen, char *encoding){
|
||||||
iconv_t cd;
|
iconv_t cd;
|
||||||
size_t size, inbytesleft, outbytesleft;
|
size_t inbytesleft, outbytesleft;
|
||||||
|
int ret = ERR;
|
||||||
|
|
||||||
memset(outbuf, 0, outbuflen);
|
memset(outbuf, 0, outbuflen);
|
||||||
|
|
||||||
@ -336,13 +329,14 @@ int utf8_encode(char *inbuf, int inbuflen, char *outbuf, int outbuflen, char *en
|
|||||||
inbytesleft = inbuflen;
|
inbytesleft = inbuflen;
|
||||||
outbytesleft = outbuflen-1;
|
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);
|
iconv_close(cd);
|
||||||
|
|
||||||
if(size >= 0) return OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ERR;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,6 +294,7 @@ struct import {
|
|||||||
int download_only;
|
int download_only;
|
||||||
int keep_eml;
|
int keep_eml;
|
||||||
int timeout;
|
int timeout;
|
||||||
|
int reimport;
|
||||||
int cap_uidplus;
|
int cap_uidplus;
|
||||||
long total_size;
|
long total_size;
|
||||||
time_t started, updated, finished;
|
time_t started, updated, finished;
|
||||||
|
@ -30,7 +30,7 @@ int update_meta_data(struct session_data *sdata, struct parser_state *state, str
|
|||||||
subj = state->b_subject;
|
subj = state->b_subject;
|
||||||
if(*subj == ' ') subj++;
|
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);
|
p_bind_init(data);
|
||||||
|
|
||||||
@ -81,17 +81,8 @@ int main(int argc, char **argv){
|
|||||||
|
|
||||||
inithash(data.mydomains);
|
inithash(data.mydomains);
|
||||||
|
|
||||||
//initrules(data.archiving_rules);
|
|
||||||
//initrules(data.retention_rules);
|
|
||||||
//initrules(data.folder_rules);
|
|
||||||
|
|
||||||
load_mydomains(&sdata, &data, &cfg);
|
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);
|
init_session_data(&sdata, &cfg);
|
||||||
|
|
||||||
sdata.delivered = 0;
|
sdata.delivered = 0;
|
||||||
|
@ -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;
|
struct node *h;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ int addnode(struct node *xhash[], char *s){
|
|||||||
key = DJBHash(s, len);
|
key = DJBHash(s, len);
|
||||||
|
|
||||||
if(xhash[hash(key)] == NULL){
|
if(xhash[hash(key)] == NULL){
|
||||||
xhash[hash(key)] = makenewnode(xhash, s);
|
xhash[hash(key)] = makenewnode(s);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
q = xhash[hash(key)];
|
q = xhash[hash(key)];
|
||||||
@ -95,7 +95,7 @@ int addnode(struct node *xhash[], char *s){
|
|||||||
q = q->r;
|
q = q->r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(p) p->r = makenewnode(xhash, s);
|
if(p) p->r = makenewnode(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
void inithash(struct node *xhash[]);
|
void inithash(struct node *xhash[]);
|
||||||
void clearhash(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);
|
int addnode(struct node *xhash[], char *s);
|
||||||
struct node *findnode(struct node *xhash[], char *s);
|
struct node *findnode(struct node *xhash[], char *s);
|
||||||
int is_substr_in_hash(struct node *xhash[], char *s);
|
int is_substr_in_hash(struct node *xhash[], char *s);
|
||||||
|
@ -124,8 +124,8 @@ int process_imap_folder(int sd, int *seq, char *folder, struct session_data *sda
|
|||||||
|
|
||||||
|
|
||||||
if(data->recursive_folder_names == 1){
|
if(data->recursive_folder_names == 1){
|
||||||
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);
|
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;
|
int n;
|
||||||
char buf[MAXBUFSIZE];
|
char buf[MAXBUFSIZE];
|
||||||
X509* server_cert;
|
X509* server_cert;
|
||||||
|
27
src/import.c
27
src/import.c
@ -92,7 +92,10 @@ int import_message(char *filename, struct session_data *sdata, struct __data *da
|
|||||||
return ERR;
|
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);
|
unlink(state.message_id_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,11 +106,13 @@ int import_message(char *filename, struct session_data *sdata, struct __data *da
|
|||||||
|
|
||||||
switch(rc) {
|
switch(rc) {
|
||||||
case OK:
|
case OK:
|
||||||
bzero(&counters, sizeof(counters));
|
if(data->import->reimport == 0){
|
||||||
counters.c_rcvd = 1;
|
bzero(&counters, sizeof(counters));
|
||||||
counters.c_size += sdata->tot_len;
|
counters.c_rcvd = 1;
|
||||||
counters.c_stored_size = sdata->stored_len;
|
counters.c_size += sdata->tot_len;
|
||||||
update_counters(sdata, data, &counters, cfg);
|
counters.c_stored_size = sdata->stored_len;
|
||||||
|
update_counters(sdata, data, &counters, cfg);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
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;
|
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);
|
p_bind_init(data);
|
||||||
data->sql[data->pos] = foldername; data->type[data->pos] = TYPE_STRING; data->pos++;
|
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);
|
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++;
|
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_fetch_results(data->stmt_get_folder_id);
|
||||||
p_free_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;
|
int id=ERR_FOLDER;
|
||||||
|
|
||||||
if(foldername == NULL) return id;
|
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);
|
p_bind_init(data);
|
||||||
data->sql[data->pos] = foldername; data->type[data->pos] = TYPE_STRING; data->pos++;
|
data->sql[data->pos] = foldername; data->type[data->pos] = TYPE_STRING; data->pos++;
|
||||||
|
@ -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_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 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 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 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);
|
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);
|
void send_imap_close(int sd, int *seq, struct __data *data, int use_ssl);
|
||||||
|
@ -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_password, 0, sizeof(s_password));
|
||||||
memset(s_server, 0, sizeof(s_server));
|
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);
|
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_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++;
|
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;
|
if(p_fetch_results(data->stmt_generic) == OK) rc = OK;
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ int import_from_imap_server(char *server, char *username, char *password, int po
|
|||||||
goto ENDE_IMAP;
|
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);
|
close(sd);
|
||||||
ret = ERR;
|
ret = ERR;
|
||||||
goto ENDE_IMAP;
|
goto ENDE_IMAP;
|
||||||
|
@ -111,9 +111,9 @@ int import_mbox_from_dir(char *directory, struct session_data *sdata, struct __d
|
|||||||
|
|
||||||
if(S_ISREG(st.st_mode)){
|
if(S_ISREG(st.st_mode)){
|
||||||
if(i == 0 && data->recursive_folder_names == 1){
|
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){
|
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){
|
if(folder == ERR_FOLDER){
|
||||||
printf("error: cannot get/add folder '%s' to parent id: %d\n", fname, data->folder);
|
printf("error: cannot get/add folder '%s' to parent id: %d\n", fname, data->folder);
|
||||||
|
@ -60,9 +60,9 @@ int import_from_maildir(char *directory, struct session_data *sdata, struct __da
|
|||||||
return ERR;
|
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){
|
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){
|
if(folder == ERR_FOLDER){
|
||||||
printf("error: cannot get/add folder '%s' to parent id: %d\n", p, data->folder);
|
printf("error: cannot get/add folder '%s' to parent id: %d\n", p, data->folder);
|
||||||
|
@ -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);
|
close(sd);
|
||||||
ret = ERR;
|
ret = ERR;
|
||||||
goto ENDE_POP3;
|
goto ENDE_POP3;
|
||||||
|
126
src/message.c
126
src/message.c
@ -29,7 +29,7 @@ int store_index_data(struct session_data *sdata, struct parser_state *state, str
|
|||||||
if(*subj == ' ') subj++;
|
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);
|
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;
|
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);
|
p_bind_init(data);
|
||||||
data->sql[data->pos] = message_id; data->type[data->pos] = TYPE_STRING; data->pos++;
|
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);
|
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] = (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);
|
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;
|
int ret=OK, n=0;
|
||||||
char *p, *q, puf[SMALLBUFSIZE];
|
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;
|
p = to;
|
||||||
do {
|
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;
|
int rc = ERR;
|
||||||
|
|
||||||
if(data->folder == ERR_FOLDER) return rc;
|
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);
|
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 update_metadata_reference(struct session_data *sdata, struct parser_state *state, struct __data *data, char *ref, struct __config *cfg){
|
||||||
int ret = ERR;
|
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);
|
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;
|
int rc, ret=ERR, result;
|
||||||
char *subj, *p, s[MAXBUFSIZE], s2[SMALLBUFSIZE], vcode[2*DIGEST_LENGTH+1], ref[2*DIGEST_LENGTH+1];
|
char *subj, *p, s[MAXBUFSIZE], s2[SMALLBUFSIZE], vcode[2*DIGEST_LENGTH+1], ref[2*DIGEST_LENGTH+1];
|
||||||
uint64 id=0;
|
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));
|
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->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 *)&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] = (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] = &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->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] = sdata->bodydigest; data->type[data->pos] = TYPE_STRING; data->pos++;
|
||||||
data->sql[data->pos] = &vcode[0]; 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){
|
if(p_exec_query(sdata, data->stmt_insert_into_meta_table, data) == ERR){
|
||||||
ret = ERR_EXISTS;
|
ret = ERR_EXISTS;
|
||||||
}
|
}
|
||||||
else {
|
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);
|
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->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: stored indexdata, rc=%d", sdata->ttmpfile, rc);
|
||||||
|
|
||||||
if(cfg->enable_folders == 1){
|
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);
|
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 process_message(struct session_data *sdata, struct parser_state *state, struct __data *data, struct __config *cfg){
|
||||||
int rc, fd;
|
int rc, fd;
|
||||||
|
char piler_id[SMALLBUFSIZE];
|
||||||
|
|
||||||
/* discard if existing message_id */
|
/* 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){
|
if(sdata->duplicate_id > 0){
|
||||||
remove_stripped_attachments(state);
|
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){
|
if(rc == 0){
|
||||||
syslog(LOG_PRIORITY, "%s: error storing message: %s", sdata->ttmpfile, sdata->tmpframe);
|
syslog(LOG_PRIORITY, "%s: error storing message: %s", sdata->ttmpfile, sdata->tmpframe);
|
||||||
return ERR;
|
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);
|
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(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: stored metadata, rc=%d", sdata->ttmpfile, rc);
|
||||||
if(rc == ERR_EXISTS){
|
if(rc == ERR_EXISTS){
|
||||||
|
|
||||||
@ -340,3 +380,55 @@ int process_message(struct session_data *sdata, struct parser_state *state, stru
|
|||||||
return OK;
|
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;
|
||||||
|
}
|
||||||
|
@ -345,7 +345,7 @@ int get_random_bytes(unsigned char *buf, int len, unsigned char server_id){
|
|||||||
* read random data from entropy pool
|
* 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;
|
char *s = _s;
|
||||||
ssize_t res, pos = 0;
|
ssize_t res, pos = 0;
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ int extractEmail(char *rawmail, char *email);
|
|||||||
void make_random_string(char *buf, int buflen);
|
void make_random_string(char *buf, int buflen);
|
||||||
void create_id(char *id, unsigned char server_id);
|
void create_id(char *id, unsigned char server_id);
|
||||||
int get_random_bytes(unsigned char *buf, int len, 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 recvtimeout(int s, char *buf, int len, int timeout);
|
||||||
int write1(int sd, void *buf, int buflen, int use_ssl, SSL *ssl);
|
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);
|
int recvtimeoutssl(int s, char *buf, int len, int timeout, int use_ssl, SSL *ssl);
|
||||||
|
@ -17,7 +17,7 @@ void load_mydomains(struct session_data *sdata, struct __data *data, struct __co
|
|||||||
memset(s, 0, sizeof(s));
|
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);
|
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++;
|
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){
|
while(p_fetch_results(data->stmt_generic) == OK){
|
||||||
rc = addnode(data->mydomains, s);
|
rc = addnode(data->mydomains, s);
|
||||||
|
@ -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];
|
MYSQL_BIND bind[MAX_SQL_VARS];
|
||||||
int i, ret=ERR;
|
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));
|
*stmt = mysql_stmt_init(&(sdata->mysql));
|
||||||
if(!*stmt){
|
if(!*stmt){
|
||||||
|
17
src/parser.c
17
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){
|
struct parser_state parse_message(struct session_data *sdata, int take_into_pieces, struct __data *data, struct __config *cfg){
|
||||||
FILE *f;
|
FILE *f;
|
||||||
int i, len;
|
int i;
|
||||||
|
unsigned int len;
|
||||||
char *p, buf[MAXBUFSIZE], puf[SMALLBUFSIZE];
|
char *p, buf[MAXBUFSIZE], puf[SMALLBUFSIZE];
|
||||||
char writebuffer[MAXBUFSIZE], abuffer[MAXBUFSIZE];
|
char writebuffer[MAXBUFSIZE], abuffer[MAXBUFSIZE];
|
||||||
struct parser_state state;
|
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){
|
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;
|
char *p;
|
||||||
|
|
||||||
clearhash(state->boundaries);
|
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];
|
char *p, *q, puf[SMALLBUFSIZE];
|
||||||
unsigned char b64buffer[MAXBUFSIZE];
|
unsigned char b64buffer[MAXBUFSIZE];
|
||||||
char tmpbuf[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);
|
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){
|
if(state->b64fd != -1){
|
||||||
abuffer[state->abufpos] = '\0';
|
abuffer[state->abufpos] = '\0';
|
||||||
if(state->base64 == 1){
|
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);
|
write(state->b64fd, b64buffer, n64);
|
||||||
}
|
}
|
||||||
else {
|
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);
|
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 */
|
/* allow +2 days drift in the parsed Date: value */
|
||||||
|
|
||||||
if(sdata->sent - sdata->now > 2*86400) sdata->sent = sdata->now;
|
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(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;
|
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){
|
if(state->b64fd != -1){
|
||||||
abuffer[state->abufpos] = '\0';
|
abuffer[state->abufpos] = '\0';
|
||||||
if(state->base64 == 1){
|
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);
|
write(state->b64fd, b64buffer, n64);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -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);
|
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);
|
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 isHexNumber(char *p);
|
||||||
int extract_boundary(char *p, struct parser_state *state);
|
int extract_boundary(char *p, struct parser_state *state);
|
||||||
void fixupEncodedHeaderLine(char *buf, int buflen);
|
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 *determine_attachment_type(char *filename, char *type);
|
||||||
char *get_attachment_extractor_by_filename(char *filename);
|
char *get_attachment_extractor_by_filename(char *filename);
|
||||||
void parse_reference(struct parser_state *state, char *s);
|
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 */
|
#endif /* _PARSER_H */
|
||||||
|
@ -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;
|
int n=0, len;
|
||||||
long offset=0;
|
long offset=0;
|
||||||
time_t ts=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;
|
ts += get_local_timezone_offset() - offset;
|
||||||
|
|
||||||
#ifdef HAVE_TWEAK_SENT_TIME
|
|
||||||
if(ts > 631148400) ts += cfg->tweak_sent_time_offset;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return ts;
|
return ts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -674,7 +670,8 @@ int does_it_seem_like_an_email_address(char *email){
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void reassembleToken(char *p){
|
void reassembleToken(char *p){
|
||||||
int i, k=0;
|
unsigned int i;
|
||||||
|
int k=0;
|
||||||
|
|
||||||
for(i=0; i<strlen(p); i++){
|
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;
|
int b64len=0;
|
||||||
char puf[2*SMALLBUFSIZE];
|
char puf[2*SMALLBUFSIZE];
|
||||||
|
|
||||||
|
@ -334,9 +334,9 @@ void initialise_configuration(){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
load_rules(&sdata, &data, data.archiving_rules, SQL_ARCHIVING_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, &cfg);
|
load_rules(&sdata, &data, data.retention_rules, SQL_RETENTION_RULE_TABLE);
|
||||||
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE, &cfg);
|
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE);
|
||||||
|
|
||||||
load_mydomains(&sdata, &data, &cfg);
|
load_mydomains(&sdata, &data, &cfg);
|
||||||
|
|
||||||
|
@ -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);
|
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 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 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 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);
|
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 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 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 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, struct __config *cfg);
|
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);
|
int store_index_data(struct session_data *sdata, struct parser_state *state, struct __data *data, uint64 id, struct __config *cfg);
|
||||||
|
|
||||||
|
@ -343,7 +343,7 @@ int export_emails_matching_to_query(struct session_data *sdata, struct __data *d
|
|||||||
int rc=0;
|
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);
|
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] = &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++;
|
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){
|
while(p_fetch_results(data->stmt_generic) == OK){
|
||||||
|
|
||||||
|
@ -53,9 +53,11 @@ void usage(){
|
|||||||
printf(" -R Assign IMAP folder names as Piler folder names\n");
|
printf(" -R Assign IMAP folder names as Piler folder names\n");
|
||||||
printf(" -b <batch limit> Import only this many emails\n");
|
printf(" -b <batch limit> Import only this many emails\n");
|
||||||
printf(" -s <start position> Start importing POP3 emails from this position\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(" -D Dry-run, do not import anything\n");
|
||||||
printf(" -o Only download emails for POP3/IMAP import\n");
|
printf(" -o Only download emails for POP3/IMAP import\n");
|
||||||
printf(" -r Remove imported emails\n");
|
printf(" -r Remove imported emails\n");
|
||||||
|
printf(" -z Reimport emails\n");
|
||||||
printf(" -q Quiet mode\n");
|
printf(" -q Quiet mode\n");
|
||||||
|
|
||||||
exit(0);
|
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.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.extra_recipient = import.move_folder = NULL;
|
||||||
import.start_position = 1;
|
import.start_position = 1;
|
||||||
import.download_only = 0;
|
import.download_only = 0;
|
||||||
@ -121,6 +123,7 @@ int main(int argc, char **argv){
|
|||||||
{"remove-after-import",no_argument, 0, 'r' },
|
{"remove-after-import",no_argument, 0, 'r' },
|
||||||
{"move-folder", required_argument, 0, 'g' },
|
{"move-folder", required_argument, 0, 'g' },
|
||||||
{"only-download",no_argument, 0, 'o' },
|
{"only-download",no_argument, 0, 'o' },
|
||||||
|
{"reimport", no_argument, 0, 'z' },
|
||||||
{"gui-import", no_argument, 0, 'G' },
|
{"gui-import", no_argument, 0, 'G' },
|
||||||
{"dry-run", no_argument, 0, 'D' },
|
{"dry-run", no_argument, 0, 'D' },
|
||||||
{"help", no_argument, 0, 'h' },
|
{"help", no_argument, 0, 'h' },
|
||||||
@ -129,9 +132,9 @@ int main(int argc, char **argv){
|
|||||||
|
|
||||||
int option_index = 0;
|
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
|
#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
|
#endif
|
||||||
|
|
||||||
if(c == -1) break;
|
if(c == -1) break;
|
||||||
@ -230,6 +233,10 @@ int main(int argc, char **argv){
|
|||||||
data.import->start_position = atoi(optarg);
|
data.import->start_position = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'z' :
|
||||||
|
data.import->reimport = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'a' :
|
case 'a' :
|
||||||
data.import->extra_recipient = optarg;
|
data.import->extra_recipient = optarg;
|
||||||
break;
|
break;
|
||||||
@ -291,10 +298,10 @@ int main(int argc, char **argv){
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(folder){
|
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){
|
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){
|
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.archiving_rules, SQL_ARCHIVING_RULE_TABLE);
|
||||||
load_rules(&sdata, &data, data.retention_rules, SQL_RETENTION_RULE_TABLE, &cfg);
|
load_rules(&sdata, &data, data.retention_rules, SQL_RETENTION_RULE_TABLE);
|
||||||
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE, &cfg);
|
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE);
|
||||||
|
|
||||||
load_mydomains(&sdata, &data, &cfg);
|
load_mydomains(&sdata, &data, &cfg);
|
||||||
|
|
||||||
|
@ -31,10 +31,10 @@ unsigned long purged_size=0;
|
|||||||
#define SQL_STMT_DELETE_FROM_ATTACHMENT_TABLE "DELETE FROM `" SQL_ATTACHMENT_TABLE "` WHERE `id` IN ("
|
#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;
|
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);
|
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++;
|
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_fetch_results(data->stmt_generic);
|
||||||
p_free_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 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 *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];
|
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
|
#ifdef HAVE_SUPPORT_FOR_COMPAT_STORAGE_LAYOUT
|
||||||
struct stat st;
|
struct stat st;
|
||||||
#endif
|
#endif
|
||||||
@ -123,7 +124,7 @@ int remove_attachments(char *in, struct session_data *sdata, struct __data *data
|
|||||||
in[strlen(in)-1] = '\0';
|
in[strlen(in)-1] = '\0';
|
||||||
snprintf(a, len-1, "%s%s", SQL_STMT_SELECT_NON_REFERENCED_ATTACHMENTS, in);
|
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);
|
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] = (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++;
|
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){
|
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 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];
|
char id[BUFLEN], s[SMALLBUFSIZE], buf[MAXBUFSIZE], update_meta_sql[MAXBUFSIZE];
|
||||||
|
|
||||||
memset(buf, 0, sizeof(buf));
|
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(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);
|
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] = &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++;
|
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){
|
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 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];
|
char s[SMALLBUFSIZE], idlist[MAXBUFSIZE];
|
||||||
|
|
||||||
memset(idlist, 0, sizeof(idlist));
|
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(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);
|
p_bind_init(data);
|
||||||
if(p_exec_query(sdata, data->stmt_select_from_meta_table, data) == OK){
|
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] = &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++;
|
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){
|
while(p_fetch_results(data->stmt_select_from_meta_table) == OK){
|
||||||
memcpy(&idlist[idlist_len], s, strlen(s)); idlist_len += strlen(s);
|
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);
|
init_session_data(&sdata, &cfg);
|
||||||
|
|
||||||
i = is_purge_allowed(&sdata, &data, &cfg);
|
i = is_purge_allowed(&sdata, &data);
|
||||||
if(i == 1){
|
if(i == 1){
|
||||||
purged += purge_messages_round1(&sdata, &data, "attachments=0", &cfg);
|
purged += purge_messages_round1(&sdata, &data, "attachments=0", &cfg);
|
||||||
purged += purge_messages_with_attachments(&sdata, &data, &cfg);
|
purged += purge_messages_with_attachments(&sdata, &data, &cfg);
|
||||||
|
@ -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;
|
int n;
|
||||||
char buf[MAXBUFSIZE];
|
char buf[MAXBUFSIZE];
|
||||||
X509* server_cert;
|
X509* server_cert;
|
||||||
|
@ -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];
|
char s[SMALLBUFSIZE];
|
||||||
uint64 id=0;
|
uint64 id=0;
|
||||||
|
|
||||||
snprintf(s, sizeof(s)-1, "SELECT MAX(`id`) FROM %s", SQL_METADATA_TABLE);
|
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);
|
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++;
|
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_fetch_results(data->stmt_generic);
|
||||||
p_free_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);
|
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);
|
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++;
|
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){
|
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);
|
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){
|
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){
|
if(data.folder == 0){
|
||||||
printf("error: could not get folder id for '%s'\n", folder);
|
printf("error: could not get folder id for '%s'\n", folder);
|
||||||
return 0;
|
return 0;
|
||||||
@ -254,7 +254,7 @@ int main(int argc, char **argv){
|
|||||||
|
|
||||||
if(all == 1){
|
if(all == 1){
|
||||||
from_id = 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);
|
n = retrieve_email_by_metadata_id(&sdata, &data, from_id, to_id, &cfg);
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#include "rules.h"
|
#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];
|
char s[SMALLBUFSIZE];
|
||||||
struct rule_cond rule_cond;
|
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);
|
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);
|
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.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++;
|
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){
|
while(p_fetch_results(data->stmt_generic) == OK){
|
||||||
append_rule(xhash, &rule_cond, data);
|
append_rule(xhash, &rule_cond, data);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include "defs.h"
|
#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);
|
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);
|
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);
|
char *check_againt_ruleset(struct node *xhash[], struct parser_state *state, int size, int spam);
|
||||||
|
@ -351,7 +351,7 @@ AFTER_PERIOD:
|
|||||||
if(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: got: %s", sdata.ttmpfile, buf);
|
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){
|
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;
|
continue;
|
||||||
|
|
||||||
/* FIXME: implement the ENHANCEDSTATUSCODE extensions */
|
/* FIXME: implement the ENHANCEDSTATUSCODE extensions */
|
||||||
@ -367,7 +367,7 @@ AFTER_PERIOD:
|
|||||||
|
|
||||||
#ifdef HAVE_STARTTLS
|
#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){
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -380,7 +380,7 @@ AFTER_PERIOD:
|
|||||||
|
|
||||||
|
|
||||||
if(strncasecmp(buf, SMTP_CMD_RCPT_TO, strlen(SMTP_CMD_RCPT_TO)) == 0){
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,13 +391,13 @@ AFTER_PERIOD:
|
|||||||
inj = ERR;
|
inj = ERR;
|
||||||
prevlen = 0;
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(strncasecmp(buf, SMTP_CMD_QUIT, strlen(SMTP_CMD_QUIT)) == 0){
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -409,7 +409,7 @@ AFTER_PERIOD:
|
|||||||
|
|
||||||
|
|
||||||
if(strncasecmp(buf, SMTP_CMD_RESET, strlen(SMTP_CMD_RESET)) == 0){
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -422,7 +422,7 @@ AFTER_PERIOD:
|
|||||||
|
|
||||||
|
|
||||||
if(strlen(resp) > 0){
|
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));
|
memset(resp, 0, sizeof(resp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
15
src/smtp.c
15
src/smtp.c
@ -17,9 +17,10 @@
|
|||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <piler.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];
|
char tmpbuf[MAXBUFSIZE];
|
||||||
|
|
||||||
if(*protocol_state == SMTP_STATE_INIT) *protocol_state = SMTP_STATE_HELO;
|
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
|
#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);
|
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){
|
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){
|
if(*protocol_state != SMTP_STATE_RCPT_TO){
|
||||||
strncat(resp, SMTP_RESP_503_ERR, resplen);
|
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];
|
char tmpbuf[MAXBUFSIZE];
|
||||||
|
|
||||||
*protocol_state = SMTP_STATE_FINISHED;
|
*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);
|
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;
|
int rc;
|
||||||
#ifdef HAVE_STARTTLS
|
#ifdef HAVE_STARTTLS
|
||||||
char ssl_error[SMALLBUFSIZE];
|
char ssl_error[SMALLBUFSIZE];
|
||||||
|
14
src/smtp.h
14
src/smtp.h
@ -5,14 +5,14 @@
|
|||||||
#ifndef _SMTP_H
|
#ifndef _SMTP_H
|
||||||
#define _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_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, 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);
|
||||||
void process_command_mail_from(struct session_data *sdata, int *protocol_state, char *buf, 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_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 *buf, char *resp, int resplen, struct __config *cfg);
|
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 *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);
|
||||||
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);
|
||||||
|
|
||||||
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 */
|
#endif /* _SMTP_H */
|
||||||
|
@ -8,10 +8,10 @@
|
|||||||
|
|
||||||
int open_database(struct session_data *sdata, struct __config *cfg);
|
int open_database(struct session_data *sdata, struct __config *cfg);
|
||||||
void close_database(struct session_data *sdata);
|
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);
|
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_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);
|
int p_fetch_results(MYSQL_STMT *stmt);
|
||||||
void p_free_results(MYSQL_STMT *stmt);
|
void p_free_results(MYSQL_STMT *stmt);
|
||||||
void p_bind_init(struct __data *data);
|
void p_bind_init(struct __data *data);
|
||||||
|
@ -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;
|
int ret=0, rc, fd, n;
|
||||||
char *addr, *p, *p0, *p1, *p2, s[SMALLBUFSIZE];
|
char *addr, *p, *p0, *p1, *p2, s[SMALLBUFSIZE];
|
||||||
struct stat st;
|
struct stat st;
|
||||||
@ -147,6 +147,8 @@ int store_file(struct session_data *sdata, char *filename, int startpos, int len
|
|||||||
|
|
||||||
*p0 = '/';
|
*p0 = '/';
|
||||||
|
|
||||||
|
unlink(s);
|
||||||
|
|
||||||
fd = open(s, O_CREAT|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP);
|
fd = open(s, O_CREAT|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP);
|
||||||
if(fd == -1){
|
if(fd == -1){
|
||||||
syslog(LOG_PRIORITY, "%s: cannot open: %s", sdata->ttmpfile, s);
|
syslog(LOG_PRIORITY, "%s: cannot open: %s", sdata->ttmpfile, s);
|
||||||
|
@ -67,9 +67,9 @@ int main(int argc, char **argv){
|
|||||||
|
|
||||||
load_mydomains(&sdata, &data, &cfg);
|
load_mydomains(&sdata, &data, &cfg);
|
||||||
|
|
||||||
load_rules(&sdata, &data, data.archiving_rules, SQL_ARCHIVING_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, &cfg);
|
load_rules(&sdata, &data, data.retention_rules, SQL_RETENTION_RULE_TABLE);
|
||||||
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE, &cfg);
|
load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE);
|
||||||
|
|
||||||
|
|
||||||
init_session_data(&sdata, &cfg);
|
init_session_data(&sdata, &cfg);
|
||||||
|
@ -30,8 +30,8 @@ struct digest_test tests[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void static test_digest_string(){
|
static void test_digest_string(){
|
||||||
int i;
|
unsigned int i;
|
||||||
char digest[2*DIGEST_LENGTH+1];
|
char digest[2*DIGEST_LENGTH+1];
|
||||||
struct digest_test tests[] = {
|
struct digest_test tests[] = {
|
||||||
{"Piler archives every email it receives.", "68bcdb6f15eeabdcedce3e4fc8faf7eb620272ebd55f365d08aca40adf18fe83", ""},
|
{"Piler archives every email it receives.", "68bcdb6f15eeabdcedce3e4fc8faf7eb620272ebd55f365d08aca40adf18fe83", ""},
|
||||||
@ -51,7 +51,7 @@ void static test_digest_string(){
|
|||||||
|
|
||||||
|
|
||||||
static void test_digest_file(){
|
static void test_digest_file(){
|
||||||
int i;
|
unsigned int i;
|
||||||
char digest[2*DIGEST_LENGTH+1];
|
char digest[2*DIGEST_LENGTH+1];
|
||||||
|
|
||||||
for(i=0; i<sizeof(tests)/sizeof(struct digest_test); i++){
|
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){
|
static void test_make_digests(struct __config *cfg){
|
||||||
int i, j;
|
unsigned int i;
|
||||||
|
int j;
|
||||||
struct session_data sdata;
|
struct session_data sdata;
|
||||||
struct parser_state state;
|
struct parser_state state;
|
||||||
struct __data data;
|
struct __data data;
|
||||||
|
@ -29,7 +29,7 @@ struct emails {
|
|||||||
|
|
||||||
|
|
||||||
static void fill_domain_table(struct __config *cfg){
|
static void fill_domain_table(struct __config *cfg){
|
||||||
int i;
|
unsigned int i;
|
||||||
char buf[SMALLBUFSIZE];
|
char buf[SMALLBUFSIZE];
|
||||||
struct session_data sdata;
|
struct session_data sdata;
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ static void fill_domain_table(struct __config *cfg){
|
|||||||
|
|
||||||
|
|
||||||
static void restore_domain_table(struct __config *cfg){
|
static void restore_domain_table(struct __config *cfg){
|
||||||
int i;
|
unsigned int i;
|
||||||
char buf[SMALLBUFSIZE];
|
char buf[SMALLBUFSIZE];
|
||||||
struct session_data sdata;
|
struct session_data sdata;
|
||||||
|
|
||||||
@ -71,7 +71,7 @@ static void restore_domain_table(struct __config *cfg){
|
|||||||
|
|
||||||
|
|
||||||
static void test_mydomains(struct __config *cfg){
|
static void test_mydomains(struct __config *cfg){
|
||||||
int i;
|
unsigned int i;
|
||||||
struct session_data sdata;
|
struct session_data sdata;
|
||||||
struct __data data;
|
struct __data data;
|
||||||
struct emails emails[] = {
|
struct emails emails[] = {
|
||||||
|
@ -25,7 +25,8 @@ struct parser_test {
|
|||||||
|
|
||||||
|
|
||||||
static void test_parser(struct __config *cfg){
|
static void test_parser(struct __config *cfg){
|
||||||
int i, j;
|
unsigned int i;
|
||||||
|
int j;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
struct session_data sdata;
|
struct session_data sdata;
|
||||||
struct parser_state state;
|
struct parser_state state;
|
||||||
|
@ -27,7 +27,10 @@ struct str_pair {
|
|||||||
|
|
||||||
|
|
||||||
static void test_parse_date_header(){
|
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 __config cfg;
|
||||||
struct date_test date_test[] = {
|
struct date_test date_test[] = {
|
||||||
{"Date: Mon, 02 Nov 2015 09:39:31 -0000", 1446457171},
|
{"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_MESSAGES, cfg.locale);
|
||||||
setlocale(LC_CTYPE, cfg.locale);
|
setlocale(LC_CTYPE, cfg.locale);
|
||||||
|
|
||||||
|
localtime_r(&t, <);
|
||||||
|
if(lt.tm_isdst == 1) dst_fix = 3600;
|
||||||
|
|
||||||
for(i=0; i<sizeof(date_test)/sizeof(struct date_test); i++){
|
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");
|
printf("test_parse_date_header() OK\n");
|
||||||
@ -58,7 +64,7 @@ static void test_parse_date_header(){
|
|||||||
|
|
||||||
|
|
||||||
static void test_extractNameFromHeaderLine(){
|
static void test_extractNameFromHeaderLine(){
|
||||||
int i;
|
unsigned int i;
|
||||||
char resultbuf[SMALLBUFSIZE];
|
char resultbuf[SMALLBUFSIZE];
|
||||||
struct name_from_header_test name_from_header_test[] = {
|
struct name_from_header_test name_from_header_test[] = {
|
||||||
{"Content-Type: text/plain; charset=UTF-8", "charset", "UTF-8"},
|
{"Content-Type: text/plain; charset=UTF-8", "charset", "UTF-8"},
|
||||||
@ -104,7 +110,7 @@ static void test_extractNameFromHeaderLine(){
|
|||||||
|
|
||||||
|
|
||||||
static void test_fixupEncodedHeaderLine(){
|
static void test_fixupEncodedHeaderLine(){
|
||||||
int i;
|
unsigned int i;
|
||||||
char buf[SMALLBUFSIZE];
|
char buf[SMALLBUFSIZE];
|
||||||
struct str_pair pair[] = {
|
struct str_pair pair[] = {
|
||||||
|
|
||||||
@ -160,7 +166,7 @@ static void test_fixupEncodedHeaderLine(){
|
|||||||
|
|
||||||
|
|
||||||
static void test_translateLine(){
|
static void test_translateLine(){
|
||||||
int i;
|
unsigned int i;
|
||||||
char buf[SMALLBUFSIZE];
|
char buf[SMALLBUFSIZE];
|
||||||
struct parser_state state;
|
struct parser_state state;
|
||||||
struct str_pair pair[] = {
|
struct str_pair pair[] = {
|
||||||
@ -197,7 +203,7 @@ static void test_translateLine(){
|
|||||||
|
|
||||||
|
|
||||||
static void test_fixURL(){
|
static void test_fixURL(){
|
||||||
int i;
|
unsigned int i;
|
||||||
char buf[SMALLBUFSIZE];
|
char buf[SMALLBUFSIZE];
|
||||||
struct str_pair pair[] = {
|
struct str_pair pair[] = {
|
||||||
{"http://www.aaa.fu", "__URL__wwwXaaaXfu "},
|
{"http://www.aaa.fu", "__URL__wwwXaaaXfu "},
|
||||||
@ -227,7 +233,7 @@ static void test_fixURL(){
|
|||||||
|
|
||||||
|
|
||||||
static void test_degenerateToken(){
|
static void test_degenerateToken(){
|
||||||
int i;
|
unsigned int i;
|
||||||
char buf[SMALLBUFSIZE];
|
char buf[SMALLBUFSIZE];
|
||||||
struct str_pair pair[] = {
|
struct str_pair pair[] = {
|
||||||
{"Hello", "Hello"},
|
{"Hello", "Hello"},
|
||||||
|
@ -35,7 +35,7 @@ struct rule_query rules[] = {
|
|||||||
|
|
||||||
|
|
||||||
static void fill_rule_table(struct __config *cfg){
|
static void fill_rule_table(struct __config *cfg){
|
||||||
int i;
|
unsigned int i;
|
||||||
struct session_data sdata;
|
struct session_data sdata;
|
||||||
|
|
||||||
if(open_database(&sdata, cfg) == ERR){
|
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){
|
static void restore_rule_table(struct __config *cfg){
|
||||||
int i;
|
unsigned int i;
|
||||||
char buf[SMALLBUFSIZE];
|
char buf[SMALLBUFSIZE];
|
||||||
struct session_data sdata;
|
struct session_data sdata;
|
||||||
|
|
||||||
@ -77,7 +77,8 @@ static void restore_rule_table(struct __config *cfg){
|
|||||||
|
|
||||||
|
|
||||||
static void test_archiving_rule(struct __config *cfg){
|
static void test_archiving_rule(struct __config *cfg){
|
||||||
int i, j;
|
unsigned int i;
|
||||||
|
int j;
|
||||||
char *rule;
|
char *rule;
|
||||||
struct session_data sdata;
|
struct session_data sdata;
|
||||||
struct parser_state state;
|
struct parser_state state;
|
||||||
@ -102,7 +103,7 @@ static void test_archiving_rule(struct __config *cfg){
|
|||||||
|
|
||||||
initrules(data.archiving_rules);
|
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++){
|
for(i=0; i<sizeof(rule_test)/sizeof(struct rule_test); i++){
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user