1
0
Fork 0
mbuni/mbuni/mmsbox/mmsbox_cfg.c

256 lines
8.6 KiB
C

/*
* Mbuni - Open Source MMS Gateway
*
* MMSC CFG: MMC configuration and misc. functions
*
* Copyright (C) 2003 - 2005, Digital Solutions Ltd. - http://www.dsmagic.com
*
* Paul Bagyenda <bagyenda@dsmagic.com>
*
* This program is free software, distributed under the terms of
* the GNU General Public License, with a few exceptions granted (see LICENSE)
*/
#include <sys/file.h>
#include <ctype.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <errno.h>
#include <dlfcn.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "mmsbox_cfg.h"
#include "mms_queue.h"
List *sendmms_users = NULL; /* list of SendMmsUser structs */
List *mms_services = NULL; /* list of MMS Services */
List *mmscs = NULL;
Octstr *incoming_qdir, *outgoing_qdir;
struct SendMmsPortInfo sendmms_port;
int mms_load_mmsbox_settings(Cfg *cfg, gwthread_func_t *mmsc_handler_func)
{
CfgGroup *grp = cfg_get_single_group(cfg, octstr_imm("mmsbox"));
CfgGroup *cgrp = cfg_get_single_group(cfg, octstr_imm("core"));
Octstr *gdir;
int send_port_ssl = 0;
List *l;
int i, n;
mms_load_core_settings(cgrp);
sendmms_users = list_create();
mms_services = list_create();
mmscs = list_create();
gdir = cfg_get(grp, octstr_imm("storage-directory"));
if (gdir == NULL)
gdir = octstr_imm(".");
if (mkdir(octstr_get_cstr(gdir),
S_IRWXU|S_IRWXG) < 0 &&
errno != EEXIST)
panic(0, "Failed to create queue directory: %s - %s!",
octstr_get_cstr(gdir), strerror(errno));
incoming_qdir = octstr_format("%S/mmsbox_incoming", gdir);
outgoing_qdir = octstr_format("%S/mmsbox_outgoing", gdir);
if (mms_init_queuedir(incoming_qdir) < 0)
panic(0, "Failed to initialise incoming queue directory: %s - %s!",
octstr_get_cstr(incoming_qdir), strerror(errno));
if (mms_init_queuedir(outgoing_qdir) < 0)
panic(0, "Failed to initialise outgoing queue directory: %s - %s!",
octstr_get_cstr(outgoing_qdir), strerror(errno));
cfg_get_integer(&sendmms_port.port, grp, octstr_imm("sendmms-port"));
#ifdef HAVE_LIBSSL
cfg_get_bool(&send_port_ssl, grp, octstr_imm("sendmms-port-ssl"));
#endif
if (http_open_port(sendmms_port.port, send_port_ssl) < 0)
error(0, "MMSBox: Failed to start sendmms HTTP server on %ld: %s!",
sendmms_port.port,
strerror(errno));
sendmms_port.allow_ip = cfg_get(grp, octstr_imm("allow-ip"));
sendmms_port.deny_ip = cfg_get(grp, octstr_imm("deny-ip"));
/* Now get sendmms users. */
l = cfg_get_multi_group(cfg, octstr_imm("send-mms-user"));
for (i = 0, n = list_len(l); i < n; i++) {
CfgGroup *x = list_get(l, i);
SendMmsUser *u = gw_malloc(sizeof *u);
memset(u, 0, sizeof *u);
u->user = _mms_cfg_getx(x, octstr_imm("username"));
u->pass = _mms_cfg_getx(x, octstr_imm("password"));
u->faked_sender = _mms_cfg_getx(x, octstr_imm("faked-sender"));
list_append(sendmms_users, u);
}
list_destroy(l, NULL);
/* Get mmsc list. */
l = cfg_get_multi_group(cfg, octstr_imm("mmsc"));
for (i = 0, n = list_len(l); i < n; i++) {
CfgGroup *x = list_get(l, i);
MmscGrp *m = gw_malloc(sizeof *m);
int ssl = 0;
Octstr *type;
memset(m, 0, sizeof *m);
m->id = _mms_cfg_getx(x, octstr_imm("id"));
m->mmsc_url = _mms_cfg_getx(x, octstr_imm("mmsc-url"));
m->incoming.user = _mms_cfg_getx(x, octstr_imm("incoming-username"));
m->incoming.pass = _mms_cfg_getx(x, octstr_imm("incoming-password"));
cfg_get_integer(&m->incoming.port, x, octstr_imm("incoming-port"));
#ifdef HAVE_LIBSSL
cfg_get_bool(&ssl, x, octstr_imm("incoming-port-ssl"));
#endif
cfg_get_integer(&m->throughput, x, octstr_imm("max-throughput"));
type = _mms_cfg_getx(x, octstr_imm("type"));
if (octstr_case_compare(type, octstr_imm("eaif")) == 0)
m->type = EAIF_MMSC;
else if (octstr_case_compare(type, octstr_imm("soap")) == 0)
m->type = SOAP_MMSC;
else
warning(0, "MMSBox: Unknown MMSC type [%s]!",
octstr_get_cstr(type));
octstr_destroy(type);
if (m->incoming.port > 0 &&
http_open_port(m->incoming.port, ssl) < 0) {
warning(0, "MMSBox: Failed to start HTTP server on receive port for "
" MMSC %s, port %ld: %s!",
octstr_get_cstr(m->id), m->incoming.port,
strerror(errno));
m->incoming.port = 0; /* so we don't listen on it. */
}
if (mmsc_handler_func) { /* Only start threads if func passed. */
if ((m->threadid = gwthread_create(mmsc_handler_func, m)) < 0)
error(0, "MMSBox: Failed to start MMSC handler thread for MMSC[%s]: %s!",
octstr_get_cstr(m->id), strerror(errno));
} else
m->threadid = -1;
list_append(mmscs, m);
}
list_destroy(l, NULL);
l = cfg_get_multi_group(cfg, octstr_imm("mms-service"));
for (i = 0, n = list_len(l); i < n; i++) {
CfgGroup *x = list_get(l, i);
MmsService *m = gw_malloc(sizeof *m);
Octstr *s;
m->name = _mms_cfg_getx(x, octstr_imm("name"));
if ((m->url = cfg_get(x, octstr_imm("get-url"))) != NULL)
m->type = TRANS_TYPE_GET_URL;
else if ((m->url = cfg_get(x, octstr_imm("post-url"))) != NULL)
m->type = TRANS_TYPE_POST_URL;
else if ((m->url = cfg_get(x, octstr_imm("file"))) != NULL)
m->type = TRANS_TYPE_FILE;
else if ((m->url = cfg_get(x, octstr_imm("exec"))) != NULL)
m->type = TRANS_TYPE_EXEC;
else if ((m->url = cfg_get(x, octstr_imm("text"))) != NULL)
m->type = TRANS_TYPE_TEXT;
else
panic(0, "MMSBox: Service [%s] has no url!", octstr_get_cstr(m->name));
m->faked_sender = _mms_cfg_getx(x, octstr_imm("faked-sender"));
cfg_get_bool(&m->isdefault, x, octstr_imm("catch-all"));
cfg_get_bool(&m->omitempty, x, octstr_imm("omit-empty"));
cfg_get_bool(&m->accept_x_headers, x, octstr_imm("accept-x-mbuni-headers"));
cfg_get_bool(&m->assume_plain_text, x, octstr_imm("assume-plain-text"));
if ((s = cfg_get(x, octstr_imm("accepted-mmscs"))) != NULL) {
m->allowed_mmscs = octstr_split(s, octstr_imm(";"));
octstr_destroy(s);
} else
m->allowed_mmscs = NULL; /* means allow all. */
/* Get key words. Start with aliases to make life easier. */
if ((s = cfg_get(x, octstr_imm("aliases"))) != NULL) {
m->keywords = octstr_split(s, octstr_imm(";"));
octstr_destroy(s);
} else
m->keywords = list_create();
s = cfg_get(x, octstr_imm("keyword"));
if (!s)
panic(0, "MMSBox: Service [%s] has no keyword!", octstr_get_cstr(m->name));
else
list_append(m->keywords, s);
if ((s = cfg_get(x, octstr_imm("http-post-parameters"))) != NULL) {
List *r = octstr_split(s, octstr_imm("&"));
int i, n;
m->params = list_create();
if (m->type != TRANS_TYPE_POST_URL)
warning(0, "MMSBox: Service [%s] specifies HTTP Post parameters "
"without specifying post-url type/url!", octstr_get_cstr(m->name));
for (i = 0, n = list_len(r); i < n; i++) {
Octstr *y = list_get(r, i);
int ii = octstr_search_char(y, '=', 0);
if (ii < 0)
ii = octstr_len(y);
if (ii > 0) {
MmsServiceUrlParam *p = gw_malloc(sizeof *p);
int ch;
p->name = octstr_copy(y, 0, ii);
p->value = NULL;
if (octstr_get_char(y, ii+1) == '%') {
switch(ch = octstr_get_char(y, ii+2)) {
case 'I':
p->type = IMAGE_PART; break;
case 'V':
p->type = VIDEO_PART; break;
case 'T':
p->type = TEXT_PART; break;
case 'S':
p->type = SMIL_PART; break;
case 'O':
p->type = OTHER_PART; break;
case 'A':
p->type = ANY_PART; break;
case '%':
p->type = NO_PART; break;
default:
warning(0, "MMSBox: Unknown conversion character %c "
"in http-post-parameters. Service [%s]!",
ch, octstr_get_cstr(m->name));
p->type = NO_PART;
break;
}
p->value = octstr_copy(y, ii+2, octstr_len(y));
} else /* No conversion spec. */
p->value = octstr_copy(y, ii+1, octstr_len(y));
list_append(m->params, p);
} else
warning(0, "MMSBox: Missing http-post-parameter name? Service [%s]!",
octstr_get_cstr(m->name));
}
list_destroy(r, (list_item_destructor_t *)octstr_destroy);
octstr_destroy(s);
} else
m->params = NULL;
list_append(mms_services, m);
}
list_destroy(l, NULL);
return 0;
}