added customer initial support

This commit is contained in:
SJ
2013-05-15 11:46:08 +02:00
parent 63899aa025
commit 4853694fcd
11 changed files with 506 additions and 27 deletions

View File

@ -187,6 +187,7 @@ struct session_data {
char acceptbuf[SMALLBUFSIZE];
char attachments[SMALLBUFSIZE];
char internal_sender, internal_recipient, external_recipient;
short int customer_id;
int direction;
int tls;
int spam_message;
@ -286,6 +287,11 @@ struct __data {
SSL_CTX *ctx;
SSL *ssl;
#ifdef HAVE_MULTITENANCY
struct list *customers;
#endif
};

View File

@ -50,7 +50,9 @@ int store_index_data(struct session_data *sdata, struct _state *state, struct __
data->sql[data->pos] = (char *)&data->folder; 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->attachments; data->type[data->pos] = TYPE_STRING; data->pos++;
#ifdef HAVE_MULTITENANCY
data->sql[data->pos] = (char *)&sdata->customer_id; data->type[data->pos] = TYPE_SHORT; data->pos++;
#endif
if(p_exec_query(sdata, data->stmt_insert_into_sphinx_table, data) == OK) rc = OK;
@ -196,6 +198,9 @@ int store_meta_data(struct session_data *sdata, struct _state *state, struct __d
data->sql[data->pos] = sdata->digest; data->type[data->pos] = TYPE_STRING; data->pos++;
data->sql[data->pos] = sdata->bodydigest; data->type[data->pos] = TYPE_STRING; data->pos++;
data->sql[data->pos] = &vcode[0]; data->type[data->pos] = TYPE_STRING; data->pos++;
#ifdef HAVE_MULTITENANCY
data->sql[data->pos] = (char *)&sdata->customer_id; data->type[data->pos] = TYPE_SHORT; data->pos++;
#endif
if(p_exec_query(sdata, data->stmt_insert_into_meta_table, data) == ERR){
ret = ERR_EXISTS;

View File

@ -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
View 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;
}

View File

@ -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,9 @@ 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;

View File

@ -65,6 +65,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);
#endif /* _PILER_H */

View File

@ -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,7 +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++;