/* * Mbuni - Open Source MMS Gateway * * MMSBox CFG: MMBox configuration and misc. functions * * Copyright (C) 2003 - 2005, Digital Solutions Ltd. - http://www.dsmagic.com * * Paul Bagyenda * * This program is free software, distributed under the terms of * the GNU General Public License, with a few exceptions granted (see LICENSE) */ #include #include #include #include #include #include #include #include #include #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, *dlr_dir; long mmsbox_maxsendattempts, mmsbox_send_back_off; long queue_interval, maxthreads; Octstr *unified_prefix; 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, *s; 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 MMSBox storage 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); dlr_dir = octstr_format("%S/mmsbox_dlr", 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)); if (mms_init_queuedir(dlr_dir) < 0) panic(0, "Failed to initialise dlr storage directory: %s - %s!", octstr_get_cstr(dlr_dir), strerror(errno)); if (cfg_get_integer(&mmsbox_maxsendattempts, grp, octstr_imm("maximum-send-attempts")) < 0) mmsbox_maxsendattempts = MAXQTRIES; if (cfg_get_integer(&mmsbox_send_back_off, grp, octstr_imm("send-attempt-back-off")) == -1) mmsbox_send_back_off = BACKOFF_FACTOR; if (cfg_get_integer(&maxthreads, grp, octstr_imm("max-send-threads")) == -1) maxthreads = 10; s = _mms_cfg_getx(grp, octstr_imm("queue-run-interval")); if (!s || (queue_interval = atof(octstr_get_cstr(s))) <= 0) queue_interval = QUEUERUN_INTERVAL; if (s) octstr_destroy(s); unified_prefix = _mms_cfg_getx(grp, octstr_imm("unified-prefix")); 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")); u->dlr_url = _mms_cfg_getx(x, octstr_imm("delivery-report-url")); u->rr_url = _mms_cfg_getx(x, octstr_imm("read-report-url")); 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->allowed_prefix = _mms_cfg_getx(x, octstr_imm("allowed-prefix")); m->denied_prefix = _mms_cfg_getx(x, octstr_imm("denied-prefix")); m->incoming.allow_ip = cfg_get(x, octstr_imm("allow-ip")); m->incoming.deny_ip = cfg_get(x, octstr_imm("deny-ip")); 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 && m->incoming.port > 0) { /* Only start threads if func passed and ... */ 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; m->mutex = mutex_create(); 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. */ if ((s = cfg_get(x, octstr_imm("denied-mmscs"))) != NULL) { m->denied_mmscs = octstr_split(s, octstr_imm(";")); octstr_destroy(s); } else m->denied_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; }