mirror of
https://bitbucket.org/jsuto/piler.git
synced 2025-06-13 12:17:02 +02:00
added customer support for the piler daemon
This commit is contained in:
12
src/config.h
12
src/config.h
@ -86,13 +86,21 @@
|
||||
#define SQL_COUNTER_TABLE "counter"
|
||||
#define SQL_OPTION_TABLE "option"
|
||||
#define SQL_DOMAIN_TABLE "domain"
|
||||
#define SQL_CUSTOMER_TABLE "customer"
|
||||
#define SQL_MESSAGES_VIEW "v_messages"
|
||||
#define SQL_ATTACHMENTS_VIEW "v_attachment"
|
||||
|
||||
#define SQL_PREPARED_STMT_GET_META_ID_BY_MESSAGE_ID "SELECT id FROM " SQL_METADATA_TABLE " WHERE message_id=?"
|
||||
#define SQL_PREPARED_STMT_INSERT_INTO_RCPT_TABLE "INSERT INTO " SQL_RECIPIENT_TABLE " (`id`,`to`,`todomain`) VALUES(?,?,?)"
|
||||
#define SQL_PREPARED_STMT_INSERT_INTO_SPHINX_TABLE "INSERT INTO " SQL_SPHINX_TABLE " (`id`, `from`, `to`, `fromdomain`, `todomain`, `subject`, `body`, `arrived`, `sent`, `size`, `direction`, `folder`, `attachments`, `attachment_types`) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
||||
#define SQL_PREPARED_STMT_INSERT_INTO_META_TABLE "INSERT INTO " SQL_METADATA_TABLE " (`from`,`fromdomain`,`subject`,`spam`,`arrived`,`sent`,`retained`,`size`,`hlen`,`direction`,`attachments`,`piler_id`,`message_id`,`reference`,`digest`,`bodydigest`,`vcode`) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
||||
|
||||
#ifdef HAVE_MULTITENANCY
|
||||
#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(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
||||
#else
|
||||
#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`, `customer`) 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`,`customer`) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
||||
#endif
|
||||
|
||||
#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`=?"
|
||||
#define SQL_PREPARED_STMT_GET_ATTACHMENT_POINTER "SELECT `piler_id`, `attachment_id` FROM " SQL_ATTACHMENT_TABLE " WHERE id=?"
|
||||
|
@ -181,6 +181,7 @@ struct session_data {
|
||||
char attachments[SMALLBUFSIZE];
|
||||
char internal_sender, internal_recipient, external_recipient;
|
||||
int direction;
|
||||
short int customer_id;
|
||||
int tls;
|
||||
int spam_message;
|
||||
int fd, hdr_len, tot_len, num_of_rcpt_to, rav;
|
||||
@ -271,6 +272,11 @@ struct __data {
|
||||
|
||||
SSL_CTX *ctx;
|
||||
SSL *ssl;
|
||||
|
||||
#ifdef HAVE_MULTITENANCY
|
||||
struct list *customers;
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@ -21,8 +21,8 @@ int store_index_data(struct session_data *sdata, struct _state *state, struct __
|
||||
int rc=ERR;
|
||||
char *subj;
|
||||
|
||||
MYSQL_BIND bind[14];
|
||||
unsigned long len[14];
|
||||
MYSQL_BIND bind[15];
|
||||
unsigned long len[15];
|
||||
|
||||
subj = state->b_subject;
|
||||
if(*subj == ' ') subj++;
|
||||
@ -110,6 +110,14 @@ int store_index_data(struct session_data *sdata, struct _state *state, struct __
|
||||
len[13] = strlen(sdata->attachments); bind[13].length = &len[13];
|
||||
|
||||
|
||||
#ifdef HAVE_MULTITENANCY
|
||||
bind[14].buffer_type = MYSQL_TYPE_SHORT;
|
||||
bind[14].buffer = (char *)&sdata->customer_id;
|
||||
bind[14].is_null = 0;
|
||||
bind[14].length = 0;
|
||||
#endif
|
||||
|
||||
|
||||
if(mysql_stmt_bind_param(data->stmt_insert_into_sphinx_table, bind)){
|
||||
syslog(LOG_PRIORITY, "%s: %s.mysql_stmt_bind_param() error: %s", sdata->ttmpfile, SQL_SPHINX_TABLE, mysql_stmt_error(data->stmt_insert_into_sphinx_table));
|
||||
goto CLOSE;
|
||||
@ -270,8 +278,8 @@ int store_meta_data(struct session_data *sdata, struct _state *state, struct __d
|
||||
int rc, ret=ERR;
|
||||
char *subj, *p, s[MAXBUFSIZE], s2[SMALLBUFSIZE], vcode[2*DIGEST_LENGTH+1], ref[2*DIGEST_LENGTH+1];
|
||||
|
||||
MYSQL_BIND bind[17];
|
||||
unsigned long len[17];
|
||||
MYSQL_BIND bind[18];
|
||||
unsigned long len[18];
|
||||
|
||||
my_ulonglong id=0;
|
||||
|
||||
@ -396,6 +404,12 @@ int store_meta_data(struct session_data *sdata, struct _state *state, struct __d
|
||||
bind[16].is_null = 0;
|
||||
len[16] = strlen(vcode); bind[16].length = &len[16];
|
||||
|
||||
#ifdef HAVE_MULTITENANCY
|
||||
bind[17].buffer_type = MYSQL_TYPE_SHORT;
|
||||
bind[17].buffer = (char *)&sdata->customer_id;
|
||||
bind[17].is_null = 0;
|
||||
bind[17].length = 0;
|
||||
#endif
|
||||
|
||||
|
||||
if(mysql_stmt_bind_param(data->stmt_insert_into_meta_table, bind)){
|
||||
|
@ -476,6 +476,8 @@ void init_session_data(struct session_data *sdata, struct __config *cfg){
|
||||
|
||||
sdata->spam_message = 0;
|
||||
|
||||
sdata->customer_id = 0;
|
||||
|
||||
sdata->__acquire = sdata->__parsed = sdata->__av = sdata->__store = sdata->__compress = sdata->__encrypt = 0;
|
||||
|
||||
|
||||
|
69
src/multitenancy.c
Normal file
69
src/multitenancy.c
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* multitenancy.c, SJ
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <syslog.h>
|
||||
#include <piler.h>
|
||||
|
||||
|
||||
void load_customers(struct session_data *sdata, struct __data *data, struct __config *cfg){
|
||||
int rc;
|
||||
char s[SMALLBUFSIZE];
|
||||
MYSQL_RES *res;
|
||||
MYSQL_ROW row;
|
||||
|
||||
data->customers = NULL;
|
||||
|
||||
snprintf(s, sizeof(s)-1, "SELECT `id`, `guid` FROM `%s`", SQL_CUSTOMER_TABLE);
|
||||
|
||||
if(mysql_real_query(&(sdata->mysql), s, strlen(s)) == 0){
|
||||
res = mysql_store_result(&(sdata->mysql));
|
||||
if(res != NULL){
|
||||
while((row = mysql_fetch_row(res))){
|
||||
snprintf(s, sizeof(s)-1, "%s@%d", (char*)row[1], atoi(row[0]));
|
||||
rc = append_list(&(data->customers), s);
|
||||
if(cfg->verbosity >= _LOG_DEBUG && rc == 1) syslog(LOG_PRIORITY, "adding customer: id: %d, guid: '%s'", atoi(row[0]), row[1]);
|
||||
if(rc == -1) syslog(LOG_PRIORITY, "error: failed to add customer: id: %d, guid: '%s'", atoi(row[0]), row[1]);
|
||||
}
|
||||
|
||||
mysql_free_result(res);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
unsigned char get_customer_id_by_rcpt_to_email(char *rcpttoemail, struct __data *data){
|
||||
int len;
|
||||
char *q;
|
||||
struct list *p;
|
||||
|
||||
q = strchr(rcpttoemail, '@');
|
||||
if(!q || strlen(q) < 3) return 0;
|
||||
|
||||
len = strlen(rcpttoemail) - strlen(q) + 1;
|
||||
if(len < 5) return 0;
|
||||
|
||||
p = data->customers;
|
||||
|
||||
while(p != NULL){
|
||||
if(strncasecmp(p->s, rcpttoemail, len) == 0){
|
||||
q = strchr(p->s, '@');
|
||||
|
||||
if(!q || strlen(q) < 2) return 0;
|
||||
|
||||
return atoi(q+1);
|
||||
}
|
||||
|
||||
p = p->r;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
19
src/piler.c
19
src/piler.c
@ -231,6 +231,10 @@ void p_clean_exit(){
|
||||
free_rule(data.archiving_rules);
|
||||
free_rule(data.retention_rules);
|
||||
|
||||
#ifdef HAVE_MULTITENANCY
|
||||
free_list(data.customers);
|
||||
#endif
|
||||
|
||||
syslog(LOG_PRIORITY, "%s has been terminated", PROGNAME);
|
||||
|
||||
unlink(cfg.pidfile);
|
||||
@ -304,10 +308,17 @@ void initialise_configuration(){
|
||||
free_rule(data.archiving_rules);
|
||||
free_rule(data.retention_rules);
|
||||
|
||||
#ifdef HAVE_MULTITENANCY
|
||||
free_list(data.customers);
|
||||
#endif
|
||||
|
||||
data.folder = 0;
|
||||
data.recursive_folder_names = 0;
|
||||
data.archiving_rules = NULL;
|
||||
data.retention_rules = NULL;
|
||||
#ifdef HAVE_MULTITENANCY
|
||||
data.customers = NULL;
|
||||
#endif
|
||||
|
||||
memset(data.starttls, 0, sizeof(data.starttls));
|
||||
|
||||
@ -327,6 +338,10 @@ void initialise_configuration(){
|
||||
|
||||
load_mydomains(&sdata, &data, &cfg);
|
||||
|
||||
#ifdef HAVE_MULTITENANCY
|
||||
load_customers(&sdata, &data, &cfg);
|
||||
#endif
|
||||
|
||||
if(cfg.server_id > 0) insert_offset(&sdata, cfg.server_id);
|
||||
|
||||
close_database(&sdata);
|
||||
@ -374,6 +389,10 @@ int main(int argc, char **argv){
|
||||
data.recursive_folder_names = 0;
|
||||
data.archiving_rules = NULL;
|
||||
data.retention_rules = NULL;
|
||||
#ifdef HAVE_MULTITENANCY
|
||||
data.customers = NULL;
|
||||
#endif
|
||||
|
||||
data.ctx = NULL;
|
||||
data.ssl = NULL;
|
||||
|
||||
|
@ -68,6 +68,8 @@ void extract_attachment_content(struct session_data *sdata, struct _state *state
|
||||
int retrieve_file_from_archive(char *filename, int mode, char **buffer, FILE *dest, struct __config *cfg);
|
||||
|
||||
void load_mydomains(struct session_data *sdata, struct __data *data, struct __config *cfg);
|
||||
void load_customers(struct session_data *sdata, struct __data *data, struct __config *cfg);
|
||||
unsigned char get_customer_id_by_rcpt_to_email(char *rcpttoemail, struct __data *data);
|
||||
|
||||
int create_prepared_statements(struct session_data *sdata, struct __data *data);
|
||||
void close_prepared_statements(struct __data *data);
|
||||
|
@ -22,7 +22,7 @@
|
||||
int handle_smtp_session(int new_sd, struct __data *data, struct __config *cfg){
|
||||
int i, ret, pos, n, inj=ERR, state, prevlen=0;
|
||||
char *p, buf[MAXBUFSIZE], puf[MAXBUFSIZE], resp[MAXBUFSIZE], prevbuf[MAXBUFSIZE], last2buf[2*MAXBUFSIZE+1];
|
||||
char rctptoemail[SMALLBUFSIZE], virusinfo[SMALLBUFSIZE], delay[SMALLBUFSIZE];
|
||||
char rcpttoemail[SMALLBUFSIZE], virusinfo[SMALLBUFSIZE], delay[SMALLBUFSIZE];
|
||||
char *arule = NULL;
|
||||
struct session_data sdata;
|
||||
struct _state sstate;
|
||||
@ -175,7 +175,7 @@ int handle_smtp_session(int new_sd, struct __data *data, struct __config *cfg){
|
||||
#ifdef HAVE_ANTIVIRUS
|
||||
if(cfg->use_antivirus == 1){
|
||||
gettimeofday(&tv1, &tz);
|
||||
sdata.rav = do_av_check(&sdata, rctptoemail, &virusinfo[0], data, cfg);
|
||||
sdata.rav = do_av_check(&sdata, rcpttoemail, &virusinfo[0], data, cfg);
|
||||
gettimeofday(&tv2, &tz);
|
||||
sdata.__av = tvdiff(tv2, tv1);
|
||||
}
|
||||
@ -190,7 +190,7 @@ int handle_smtp_session(int new_sd, struct __data *data, struct __config *cfg){
|
||||
#endif
|
||||
if(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: round %d in injection", sdata.ttmpfile, i);
|
||||
|
||||
extractEmail(sdata.rcptto[i], rctptoemail);
|
||||
extractEmail(sdata.rcptto[i], rcpttoemail);
|
||||
|
||||
/* copy default config to enable policy support */
|
||||
//memcpy(&my_cfg, cfg, sizeof(struct __config));
|
||||
@ -238,9 +238,9 @@ int handle_smtp_session(int new_sd, struct __data *data, struct __config *cfg){
|
||||
|
||||
/* set the accept buffer */
|
||||
|
||||
snprintf(sdata.acceptbuf, SMALLBUFSIZE-1, "250 Ok %s <%s>\r\n", sdata.ttmpfile, rctptoemail);
|
||||
snprintf(sdata.acceptbuf, SMALLBUFSIZE-1, "250 Ok %s <%s>\r\n", sdata.ttmpfile, rcpttoemail);
|
||||
|
||||
if(inj == ERR) snprintf(sdata.acceptbuf, SMALLBUFSIZE-1, "451 %s <%s>\r\n", sdata.ttmpfile, rctptoemail);
|
||||
if(inj == ERR) snprintf(sdata.acceptbuf, SMALLBUFSIZE-1, "451 %s <%s>\r\n", sdata.ttmpfile, rcpttoemail);
|
||||
|
||||
write1(new_sd, sdata.acceptbuf, strlen(sdata.acceptbuf), sdata.tls, data->ssl);
|
||||
|
||||
@ -408,8 +408,11 @@ AFTER_PERIOD:
|
||||
|
||||
/* check against blackhole addresses */
|
||||
|
||||
extractEmail(buf, rctptoemail);
|
||||
extractEmail(buf, rcpttoemail);
|
||||
|
||||
#ifdef HAVE_MULTITENANCY
|
||||
if(sdata.customer_id == 0) sdata.customer_id = get_customer_id_by_rcpt_to_email(rcpttoemail, data);
|
||||
#endif
|
||||
|
||||
if(sdata.num_of_rcpt_to < MAX_RCPT_TO-1) sdata.num_of_rcpt_to++;
|
||||
|
||||
|
Reference in New Issue
Block a user