diff --git a/mbuni/doc/examples/mmsc.conf b/mbuni/doc/examples/mmsc.conf index 0f44a08..e28c8ad 100644 --- a/mbuni/doc/examples/mmsc.conf +++ b/mbuni/doc/examples/mmsc.conf @@ -28,7 +28,7 @@ billing-module-parameters = "/tmp/log/cdr.log" # billing-library = billdemo.so #prov-server-notify-script = ~/src/mmprov/provnotify.sh #prov-server-sub-status-script = ~/src/mmprov/rcptstatus.sh -content-adaptation = yes +content-adaptation = true notify-unprovisioned = yes mms-notify-text = "You have received a multimedia message from %S, go to XXX to view it" mm-box-host = local.ds.co.ug @@ -43,6 +43,11 @@ username = tester password = foobar # faked-sender = 100 +group = send-mms-user +username = binary +password = "user" +faked-sender = 111 + group = mmsc id = testone mmsc-url = http://mbuni:test@192.168.129.52:8080/eaif diff --git a/mbuni/misc-patches/mbuni-kannel-patch-full b/mbuni/misc-patches/mbuni-kannel-patch-full index 34adcf7..5732498 100644 --- a/mbuni/misc-patches/mbuni-kannel-patch-full +++ b/mbuni/misc-patches/mbuni-kannel-patch-full @@ -715,125 +715,89 @@ diff -Naur gateway-1.4.0/gw/xml_shared.h gateway-1.4.0-patched/gw/xml_shared.h }; /* -diff -Naur gateway-1.4.0/gwlib/cfg.def gateway-1.4.0-patched/gwlib/cfg.def ---- gateway-1.4.0/gwlib/cfg.def 2004-06-28 18:18:35.000000000 +0300 -+++ gateway-1.4.0-patched/gwlib/cfg.def 2005-10-25 13:10:00.000000000 +0300 -@@ -544,6 +544,115 @@ - OCTSTR(unified-prefix) - ) +diff -Naur gateway-1.4.0/gwlib/conn.c gateway-1.4.0-patched/gwlib/conn.c +--- gateway-1.4.0/gwlib/conn.c 2004-02-18 19:52:33.000000000 +0300 ++++ gateway-1.4.0-patched/gwlib/conn.c 2006-02-17 08:39:38.000000000 +0300 +@@ -1315,6 +1315,7 @@ + info(0, "Using global server SSL key from file `%s'", octstr_get_cstr(keyfile)); + } -+SINGLE_GROUP(mbuni, -+ OCTSTR(name) -+ OCTSTR(hostname) -+ OCTSTR(host-alias) -+ OCTSTR(local-mmsc-domains) -+ OCTSTR(local-prefixes) -+ OCTSTR(storage-directory) -+ OCTSTR(max-send-threads) -+ OCTSTR(send-mail-prog) -+ OCTSTR(unified-prefix) -+ OCTSTR(maximum-send-attempts) -+ OCTSTR(default-message-expiry) -+ OCTSTR(queue-run-interval) -+ OCTSTR(send-attempt-back-off) -+ OCTSTR(sendsms-url) -+ OCTSTR(sendsms-username) -+ OCTSTR(sendsms-password) -+ OCTSTR(sendsms-global-sender) -+ OCTSTR(mms-port) -+ OCTSTR(mm7-port) -+ OCTSTR(allow-ip) -+ OCTSTR(deny-ip) -+ OCTSTR(email2mms-relay-prefixes) -+ OCTSTR(billing-module-parameters) -+ OCTSTR(billing-library) -+ OCTSTR(resolver-module-parameters) -+ OCTSTR(resolver-library) -+ OCTSTR(detokenizer-module-parameters) -+ OCTSTR(detokenizer-library) -+ OCTSTR(prov-server-notify-script) -+ OCTSTR(prov-server-sub-status-script) -+ OCTSTR(notify-unprovisioned) -+ OCTSTR(mms-notify-text) -+ OCTSTR(mms-notify-unprovisioned-text) -+ OCTSTR(mm-box-host) -+ OCTSTR(mms-to-email-txt) -+ OCTSTR(mms-to-email-html) -+ OCTSTR(mms-message-too-large-txt) -+ OCTSTR(mms-client-msisdn-header) -+ OCTSTR(mms-client-ip-header) -+ OCTSTR(allow-ip-type) -+ OCTSTR(optimize-notification-size) -+ OCTSTR(content-adaptation) + -+ OCTSTR(sendmms-port) -+ OCTSTR(sendmms-port-ssl) -+) + static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) + { + char subject[256]; +@@ -1331,6 +1332,28 @@ + return preverify_ok; + } + ++void use_global_trusted_ca_file(Octstr *ssl_trusted_ca_file) ++{ ++ if (ssl_trusted_ca_file != NULL) { ++ if (!SSL_CTX_load_verify_locations(global_ssl_context, ++ octstr_get_cstr(ssl_trusted_ca_file), ++ NULL)) { ++ panic(0, "Failed to load SSL CA file: %s", octstr_get_cstr(ssl_trusted_ca_file)); ++ } else { ++ info(0, "Using CA root certificates from file %s", ++ octstr_get_cstr(ssl_trusted_ca_file)); ++ SSL_CTX_set_verify(global_ssl_context, ++ SSL_VERIFY_PEER, ++ verify_callback); ++ } ++ ++ } else { ++ SSL_CTX_set_verify(global_ssl_context, ++ SSL_VERIFY_NONE, ++ NULL); ++ } ++} + -+MULTI_GROUP(mmsproxy, -+ OCTSTR(name) -+ OCTSTR(host) -+ OCTSTR(allowed-prefix) -+ OCTSTR(denied-prefix) -+) + void conn_config_ssl (CfgGroup *grp) + { + Octstr *ssl_client_certkey_file = NULL; +@@ -1357,25 +1380,8 @@ + + ssl_trusted_ca_file = cfg_get(grp, octstr_imm("ssl-trusted-ca-file")); + +- if (ssl_trusted_ca_file != NULL) { +- if (!SSL_CTX_load_verify_locations(global_ssl_context, +- octstr_get_cstr(ssl_trusted_ca_file), +- NULL)) { +- panic(0, "Failed to load SSL CA file: %s", octstr_get_cstr(ssl_trusted_ca_file)); +- } else { +- info(0, "Using CA root certificates from file %s", +- octstr_get_cstr(ssl_trusted_ca_file)); +- SSL_CTX_set_verify(global_ssl_context, +- SSL_VERIFY_PEER, +- verify_callback); +- } +- +- } else { +- SSL_CTX_set_verify(global_ssl_context, +- SSL_VERIFY_NONE, +- NULL); +- } +- ++ use_global_trusted_ca_file(ssl_trusted_ca_file); + -+MULTI_GROUP(mms-vasp, -+ OCTSTR(vasp-id) -+ OCTSTR(type) -+ OCTSTR(short-code) -+ OCTSTR(vasp-username) -+ OCTSTR(vasp-password) -+ OCTSTR(vasp-url) -+ OCTSTR(mms-to-email-handler) -+ OCTSTR(mms-to-local-copy-handler) -+ OCTSTR(mmsc-username) -+ OCTSTR(mmsc-password) -+) + octstr_destroy(ssl_client_certkey_file); + octstr_destroy(ssl_server_cert_file); + octstr_destroy(ssl_server_key_file); +diff -Naur gateway-1.4.0/gwlib/conn.h gateway-1.4.0-patched/gwlib/conn.h +--- gateway-1.4.0/gwlib/conn.h 2004-02-16 22:41:26.000000000 +0300 ++++ gateway-1.4.0-patched/gwlib/conn.h 2006-02-17 08:42:32.000000000 +0300 +@@ -307,6 +307,11 @@ + */ + void use_global_server_certkey_file(Octstr *certfile, Octstr *keyfile); + ++/* Specifies files containing certificates Kannel is willing to trusted when ++ * actins as https clients ++ */ ++void use_global_trusted_ca_file(Octstr *ssl_trusted_ca_file); + -+MULTI_GROUP(send-mms-user, -+ OCTSTR(username) -+ OCTSTR(password) -+ OCTSTR(faked-sender) -+ OCTSTR(delivery-report-url) -+ OCTSTR(read-report-url) -+) -+ -+MULTI_GROUP(mmsc, -+ OCTSTR(id) -+ OCTSTR(mmsc-url) -+ OCTSTR(incoming-username) -+ OCTSTR(incoming-password) -+ OCTSTR(incoming-port) -+ OCTSTR(allow-ip) -+ OCTSTR(deny-ip) -+ OCTSTR(allowed-prefix) -+ OCTSTR(denied-prefix) -+ OCTSTR(incoming-port-ssl) -+ OCTSTR(max-throughput) -+ OCTSTR(type) -+) -+ -+MULTI_GROUP(mms-service, -+ OCTSTR(name) -+ OCTSTR(get-url) -+ OCTSTR(post-url) -+ OCTSTR(exec) -+ OCTSTR(file) -+ OCTSTR(text) -+ OCTSTR(faked-sender) -+ OCTSTR(catch-all) -+ OCTSTR(omit-empty) -+ OCTSTR(accept-x-mbuni-headers) -+ OCTSTR(assume-plain-text) -+ OCTSTR(accepted-mmscs) -+ OCTSTR(denied-mmscs) -+ OCTSTR(keyword) -+ OCTSTR(aliases) -+ OCTSTR(http-post-parameters) -+) - #undef OCTSTR - #undef SINGLE_GROUP - #undef MULTI_GROUP + /* Configures all global variables for client and server SSL mode + * from the values specified within the configuration file. + */ diff -Naur gateway-1.4.0/gwlib/mime.c gateway-1.4.0-patched/gwlib/mime.c --- gateway-1.4.0/gwlib/mime.c 2004-08-11 19:41:29.000000000 +0300 +++ gateway-1.4.0-patched/gwlib/mime.c 2005-09-09 15:31:17.000000000 +0300 diff --git a/mbuni/mmlib/Makefile.am b/mbuni/mmlib/Makefile.am index 831d368..9d7a942 100644 --- a/mbuni/mmlib/Makefile.am +++ b/mbuni/mmlib/Makefile.am @@ -1,4 +1,4 @@ noinst_LTLIBRARIES = libmms.la -libmms_la_SOURCES = mms_mmbox.c mms_msg.c mms_queue.c mms_strings.c mms_uaprof.c mms_util.c mms_mm7soap.c +libmms_la_SOURCES = mms_mmbox.c mms_msg.c mms_queue.c mms_strings.c mms_uaprof.c mms_util.c mms_mm7soap.c mms_cfg.c -EXTRA_DIST=mms_strings.def mms_mm7soap.h mms_mmbox.h mms_msg.h mms_queue.h mms_strings.h mms_uaprof.h mms_util.h +EXTRA_DIST=mms_strings.def mms_mm7soap.h mms_mmbox.h mms_msg.h mms_queue.h mms_strings.h mms_uaprof.h mms_util.h mms_cfg.h mms_cfg.def diff --git a/mbuni/mmlib/mms_cfg.c b/mbuni/mmlib/mms_cfg.c new file mode 100644 index 0000000..8b6c6ca --- /dev/null +++ b/mbuni/mmlib/mms_cfg.c @@ -0,0 +1,337 @@ +/* + * Mbuni - Open Source MMS Gateway + * + * MMS Config file reader 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 "mms_cfg.h" + + +/* config file representation. + * 'grps' var is indexed by group name. + * for multi the value is a list of groups, + * for single it is a struct + */ +struct mCfg { + Octstr *file; + Dict *grps; +}; + +struct mCfgGrp { + Octstr *name; + Dict *fields; +}; + +static void fixup_value(Octstr *value, int lineno) +{ + Octstr *tmp; + int i,n; + + octstr_strip_blanks(value); + + if (octstr_get_char(value, 0) != '"') + return; + if (octstr_get_char(value, octstr_len(value) - 1) != '"') + error(0, "Missing enclosing '\"' at line %d in conf file", lineno); + + octstr_delete(value, 0,1); /* strip quotes. */ + octstr_delete(value, octstr_len(value) - 1, 1); + + tmp = octstr_duplicate(value); + octstr_delete(value, 0, octstr_len(value)); + + for (i = 0, n = octstr_len(tmp); i < n; i++) { + int ch = octstr_get_char(tmp, i); + + if (ch != '\\') { + octstr_append_char(value, ch); + continue; + } + + i++; /* skip forward. */ + ch = octstr_get_char(tmp,i); + switch(ch) { + case '"': + case '\\': + default: + octstr_append_char(value, ch); + break; + case 'n': + octstr_append_char(value, '\n'); + break; + case 't': + octstr_append_char(value, '\t'); + break; + + } + } + octstr_destroy(tmp); +} + +static int is_multigroup(Octstr *grpname) +{ +#define OCTSTR(x) +#define SINGLE_GROUP(name, fields) \ + if (octstr_case_compare(grpname, octstr_imm(#name)) == 0) return 0; +#define MULTI_GROUP(name, fields) \ + if (octstr_case_compare(grpname, octstr_imm(#name)) == 0) return 1; +#include "mms_cfg.def" + + return -1; +} + +static int valid_in_group(Octstr *grp, Octstr *field) +{ + /* first validate whether field is permitted in the group. */ +#define OCTSTR(parm) else if (octstr_case_compare(field,octstr_imm(#parm)) == 0) return 1; +#define SINGLE_GROUP(grpname, fields) \ + else if (octstr_case_compare(grp, octstr_imm(#grpname)) == 0) { \ + if (0) (void)0; \ + fields \ + } +#define MULTI_GROUP(name, fields) SINGLE_GROUP(name, fields) + + if (0) + (void)0; +#include "mms_cfg.def" + + return 0; +} + +static void check_and_add_field(mCfgGrp *grp, Octstr *field, Octstr *value, int lineno) +{ + if (!valid_in_group(grp->name, field)) + info(0, "field `%s' is not expected within group `%s' at line %d in conf file - skipped", + octstr_get_cstr(field), octstr_get_cstr(grp->name), lineno); + else if (dict_put_once(grp->fields, field, octstr_duplicate(value)) == 0) + panic(0, "Duplicate field `%s' at line %d in conf file", + octstr_get_cstr(field), lineno); +} + +mCfg *mms_cfg_read(Octstr *file) +{ + Octstr *sf; + List *lines; + int i, n; + mCfg *cfg; + mCfgGrp *grp = NULL; + int skip = 0; + + gw_assert(file); + + if ((sf = octstr_read_file(octstr_get_cstr(file))) == NULL) { + error(errno, "failed to read config from `%s'", octstr_get_cstr(file)); + return NULL; + } + + cfg = gw_malloc(sizeof *cfg); + cfg->file = octstr_duplicate(file); + cfg->grps = dict_create(7, NULL); + + lines = octstr_split(sf, octstr_imm("\n")); + for (i = 0, n = list_len(lines); i < n; i++) { + Octstr *current = list_get(lines,i); + int pos; + + octstr_strip_blanks(current); + + if (octstr_len(current) == 0) { /* end of group. */ + grp = NULL; + skip = 0; + continue; + } else if (skip || octstr_get_char(current, 0) == '#') + continue; + + if ((pos = octstr_search_char(current, '=',0)) > 0) { + /* a field name. first see if start of grp */ + Octstr *field = octstr_copy(current,0,pos); + Octstr *value = octstr_copy(current,pos+1,octstr_len(current)); + + octstr_strip_blanks(field); + fixup_value(value, i+1); +#if 0 + info(0, "field/value: [%s - %s]", octstr_get_cstr(field), + octstr_get_cstr(value)); +#endif + + if (octstr_case_compare(field, octstr_imm("group")) == 0) + if (grp == NULL) { /* grp name. */ + int ismulti = is_multigroup(value); + + if (ismulti < 0) { + info(0, "Skipping unknown group `%s' at line %d of conf file", + octstr_get_cstr(value), i+1); + skip = 1; + } else { + grp = gw_malloc(sizeof *grp); + grp->name = octstr_duplicate(value); + grp->fields = dict_create(23, (void (*)(void *))octstr_destroy); + + if (ismulti) { + List *l = dict_get(cfg->grps, value); + + if (l == NULL) { + l = list_create(); + dict_put(cfg->grps, value, l); + } + list_append(l, grp); + } else if (dict_put_once(cfg->grps, value, grp) == 0) + panic(0, "Group `%s' [at line %d] cannot appear more " + "than once in config!", + octstr_get_cstr(value), i+1); + } + } else + panic(0,"`group' is an illegal field name " + "within a group at line %d in config file!", + i+1); + else if (grp) /* an ordinary field name. */ + check_and_add_field(grp, field, value,i+1); + else + panic(0, "A group must begin with a `group = group_name' " + "clause [at line %d in config file]", i+1); + + octstr_destroy(field); + octstr_destroy(value); + } else + panic(0, "mal-formed entry in conf file at line %d!", i+1); + } + + list_destroy(lines, (list_item_destructor_t *)octstr_destroy); + octstr_destroy(sf); + return cfg; +} + +static void mGrp_destroy(mCfgGrp *grp) +{ + octstr_destroy(grp->name); + dict_destroy(grp->fields); + gw_free(grp); +} + +void mms_cfg_destroy(mCfg *cfg) +{ + List *l; + int i, n; + + gw_assert(cfg); + + for (i = 0, l = dict_keys(cfg->grps), n = list_len(l); i < n; i++) { + Octstr *grpname = list_get(l, i); + void *val = dict_get(cfg->grps, grpname); + if (is_multigroup(grpname)) { + List *gl = val; + int j, m = list_len(gl); + for (j = 0; j < m; j++) + mGrp_destroy(list_get(gl, j)); + } else + mGrp_destroy(val); + } + list_destroy(l, (list_item_destructor_t *)octstr_destroy); + dict_destroy(cfg->grps); + octstr_destroy(cfg->file); + gw_free(cfg); +} + +mCfgGrp *mms_cfg_get_single(mCfg *cfg, Octstr *name) +{ + gw_assert(name); + + if (is_multigroup(name)) + gw_assert("Can't call this function with a multi-group name!" && 0); + + return dict_get(cfg->grps, name); +} + +List *mms_cfg_get_multi(mCfg *cfg, Octstr *name) +{ + List *l = NULL, *r; + int i; + + gw_assert(name); + if (!is_multigroup(name)) + gw_assert("Can't call this function with a single-group name!" && 0); + + r = dict_get(cfg->grps, name); + + if (r) + for (i = 0, l = list_create(); i < list_len(r); i++) + list_append(l, list_get(r,i)); + return l; +} + +Octstr *mms_cfg_get(mCfgGrp *grp, Octstr *name) +{ + Octstr *val; + + gw_assert(grp); + + if (!valid_in_group(grp->name, name)) + panic(0, "Request for invalid field/variable `%s' in group `%s', unexpected!", + octstr_get_cstr(name), octstr_get_cstr(grp->name)); + + val = dict_get(grp->fields, name); + + if (!val) + return NULL; + else + return octstr_duplicate(val); +} + +int mms_cfg_get_int(mCfgGrp *grp, Octstr *name, long *n) +{ + Octstr *val = mms_cfg_get(grp, name); + int ret; + if (!val) + return -1; + ret = octstr_parse_long(n, val, 0, 0); + octstr_destroy(val); + return (ret == -1) ? -1 : 0; +} + + +int mms_cfg_get_bool(mCfgGrp *grp, Octstr *name, int *bool) +{ + Octstr *val = mms_cfg_get(grp, name); + int ret = 0; + if (!val) + return -1; + + if (octstr_case_compare(val, octstr_imm("yes")) == 0 || + octstr_case_compare(val, octstr_imm("true")) == 0 || + octstr_case_compare(val, octstr_imm("1")) == 0) + *bool = 1; + else if (octstr_case_compare(val, octstr_imm("no")) == 0 || + octstr_case_compare(val, octstr_imm("false")) == 0 || + octstr_case_compare(val, octstr_imm("0")) == 0) + *bool = 0; + else { + error(0, "Unable to convert value `%s' to boolean for field `%s' in group `%s'", + octstr_get_cstr(val), octstr_get_cstr(name), octstr_get_cstr(grp->name)); + ret = -1; + } + + octstr_destroy(val); + return ret; +} + +List *mms_cfg_get_list(mCfgGrp *grp, Octstr *name) +{ + Octstr *val = mms_cfg_get(grp, name); + List *l; + + if (val == NULL) + return NULL; + l = octstr_split_words(val); + octstr_destroy(val); + return l; +} diff --git a/mbuni/mmlib/mms_cfg.def b/mbuni/mmlib/mms_cfg.def new file mode 100644 index 0000000..1ab45b0 --- /dev/null +++ b/mbuni/mmlib/mms_cfg.def @@ -0,0 +1,154 @@ +/* + * Mbuni - Open Source MMS Gateway + * + * MMS Config structure definitions + * + * 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) + */ + +#ifndef OCTSTR +#error OCTSTR not defined. +#endif + +#ifndef SINGLE_GROUP +#error SINGLE_GROUP not defined. +#endif + +#ifndef MULTI_GROUP +#error MULTI_GROUP not defined. +#endif + +SINGLE_GROUP(core, + OCTSTR(log-file) + OCTSTR(log-level) + OCTSTR(access-log) + OCTSTR(http-proxy-host) + OCTSTR(http-proxy-port) + OCTSTR(http-proxy-exceptions) + OCTSTR(http-proxy-username) + OCTSTR(http-proxy-password) + OCTSTR(ssl-client-certkey-file) + OCTSTR(ssl-server-cert-file) + OCTSTR(ssl-server-key-file) + OCTSTR(ssl-trusted-ca-file) + +) + +SINGLE_GROUP(mbuni, + OCTSTR(name) + OCTSTR(hostname) + OCTSTR(host-alias) + OCTSTR(local-mmsc-domains) + OCTSTR(local-prefixes) + OCTSTR(storage-directory) + OCTSTR(max-send-threads) + OCTSTR(send-mail-prog) + OCTSTR(unified-prefix) + OCTSTR(maximum-send-attempts) + OCTSTR(default-message-expiry) + OCTSTR(queue-run-interval) + OCTSTR(send-attempt-back-off) + OCTSTR(sendsms-url) + OCTSTR(sendsms-username) + OCTSTR(sendsms-password) + OCTSTR(sendsms-global-sender) + OCTSTR(mms-port) + OCTSTR(mm7-port) + OCTSTR(allow-ip) + OCTSTR(deny-ip) + OCTSTR(email2mms-relay-prefixes) + OCTSTR(billing-module-parameters) + OCTSTR(billing-library) + OCTSTR(resolver-module-parameters) + OCTSTR(resolver-library) + OCTSTR(detokenizer-module-parameters) + OCTSTR(detokenizer-library) + OCTSTR(prov-server-notify-script) + OCTSTR(prov-server-sub-status-script) + OCTSTR(notify-unprovisioned) + OCTSTR(mms-notify-text) + OCTSTR(mms-notify-unprovisioned-text) + OCTSTR(mm-box-host) + OCTSTR(mms-to-email-txt) + OCTSTR(mms-to-email-html) + OCTSTR(mms-message-too-large-txt) + OCTSTR(mms-client-msisdn-header) + OCTSTR(mms-client-ip-header) + OCTSTR(allow-ip-type) + OCTSTR(optimize-notification-size) + OCTSTR(content-adaptation) + + OCTSTR(sendmms-port) + OCTSTR(sendmms-port-ssl) +) + +MULTI_GROUP(mmsproxy, + OCTSTR(name) + OCTSTR(host) + OCTSTR(allowed-prefix) + OCTSTR(denied-prefix) +) + +MULTI_GROUP(mms-vasp, + OCTSTR(vasp-id) + OCTSTR(type) + OCTSTR(short-code) + OCTSTR(vasp-username) + OCTSTR(vasp-password) + OCTSTR(vasp-url) + OCTSTR(mms-to-email-handler) + OCTSTR(mms-to-local-copy-handler) + OCTSTR(mmsc-username) + OCTSTR(mmsc-password) +) + +MULTI_GROUP(send-mms-user, + OCTSTR(username) + OCTSTR(password) + OCTSTR(faked-sender) + OCTSTR(delivery-report-url) + OCTSTR(read-report-url) +) + +MULTI_GROUP(mmsc, + OCTSTR(id) + OCTSTR(mmsc-url) + OCTSTR(incoming-username) + OCTSTR(incoming-password) + OCTSTR(incoming-port) + OCTSTR(allow-ip) + OCTSTR(deny-ip) + OCTSTR(allowed-prefix) + OCTSTR(denied-prefix) + OCTSTR(incoming-port-ssl) + OCTSTR(max-throughput) + OCTSTR(type) +) + +MULTI_GROUP(mms-service, + OCTSTR(name) + OCTSTR(get-url) + OCTSTR(post-url) + OCTSTR(exec) + OCTSTR(file) + OCTSTR(text) + OCTSTR(faked-sender) + OCTSTR(catch-all) + OCTSTR(omit-empty) + OCTSTR(accept-x-mbuni-headers) + OCTSTR(assume-plain-text) + OCTSTR(accepted-mmscs) + OCTSTR(denied-mmscs) + OCTSTR(keyword) + OCTSTR(aliases) + OCTSTR(http-post-parameters) +) +#undef OCTSTR +#undef SINGLE_GROUP +#undef MULTI_GROUP + diff --git a/mbuni/mmlib/mms_cfg.h b/mbuni/mmlib/mms_cfg.h new file mode 100644 index 0000000..8654e8c --- /dev/null +++ b/mbuni/mmlib/mms_cfg.h @@ -0,0 +1,56 @@ +/* + * Mbuni - Open Source MMS Gateway + * + * config file functions + * + * Copyright (C) 2003 - 2006, 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) + */ +#ifndef __MMS_CFG__INCLUDED__ +#define __MMS_CFG__INCLUDED__ + +#include "gwlib/gwlib.h" +#include "gwlib/mime.h" + +#include "config.h" + +typedef struct mCfg mCfg; /* config file structure. */ +typedef struct mCfgGrp mCfgGrp; /* A config group. */ + + +/* Read a config file, return the structure. */ +mCfg *mms_cfg_read(Octstr *file); + +/* Destroy it all . */ +void mms_cfg_destroy(mCfg *cfg); + +/* Get a single group object by name. */ +mCfgGrp *mms_cfg_get_single(mCfg *cfg, Octstr *name); + +/* Get a multiple groups all of same name. */ +List *mms_cfg_get_multi(mCfg *cfg,Octstr *name); + +/* Get a string field value from a group. */ +Octstr *mms_cfg_get(mCfgGrp *grp, Octstr *name); + + +/* Get an integer field value from a group. + * returns 0 on success, -1 on error. + */ +int mms_cfg_get_int(mCfgGrp *grp, Octstr *name, long *n); + +/* Get a boolean field value from a group. + * returns 0 on success, -1 on error + */ +int mms_cfg_get_bool(mCfgGrp *grp, Octstr *name, int *bool); + +/* Get a field value from a group. */ +List *mms_cfg_get_list(mCfgGrp *grp, Octstr *name); + + +#endif + diff --git a/mbuni/mmlib/mms_util.c b/mbuni/mmlib/mms_util.c index 2c75c49..83f282c 100644 --- a/mbuni/mmlib/mms_util.c +++ b/mbuni/mmlib/mms_util.c @@ -27,48 +27,48 @@ #include "mms_uaprof.h" -Octstr *_mms_cfg_getx(CfgGroup *grp, Octstr *item) +Octstr *_mms_cfg_getx(mCfgGrp *grp, Octstr *item) { - Octstr *v = cfg_get(grp, item); + Octstr *v = mms_cfg_get(grp, item); return v ? v : octstr_create(""); } -int mms_load_core_settings(CfgGroup *cgrp) +int mms_load_core_settings(mCfgGrp *cgrp) { Octstr *log, *alog; Octstr *http_proxy_host; long loglevel; /* Set the log file. */ - log = cfg_get(cgrp, octstr_imm("log-file")); + log = mms_cfg_get(cgrp, octstr_imm("log-file")); if (log != NULL) { - if (cfg_get_integer(&loglevel, cgrp, octstr_imm("log-level")) == -1) + if (mms_cfg_get_int(cgrp, octstr_imm("log-level"), &loglevel) == -1) loglevel = 0; log_open(octstr_get_cstr(log), loglevel, GW_NON_EXCL); octstr_destroy(log); } /* Get access log and open it. */ - alog = cfg_get(cgrp, octstr_imm("access-log")); + alog = mms_cfg_get(cgrp, octstr_imm("access-log")); if (alog) { alog_open(octstr_get_cstr(alog), 1, 1); octstr_destroy(alog); } /* look for http proxy. If set, use it. */ - if ((http_proxy_host = cfg_get(cgrp, octstr_imm("http-proxy-host"))) != NULL) { + if ((http_proxy_host = mms_cfg_get(cgrp, octstr_imm("http-proxy-host"))) != NULL) { - Octstr *username = cfg_get(cgrp, + Octstr *username = mms_cfg_get(cgrp, octstr_imm("http-proxy-username")); - Octstr *password = cfg_get(cgrp, + Octstr *password = mms_cfg_get(cgrp, octstr_imm("http-proxy-password")); - List *exceptions = cfg_get_list(cgrp, + List *exceptions = mms_cfg_get_list(cgrp, octstr_imm("http-proxy-exceptions")); long http_proxy_port = -1; - cfg_get_integer(&http_proxy_port, cgrp, octstr_imm("http-proxy-port")); + mms_cfg_get_int(cgrp, octstr_imm("http-proxy-port"), &http_proxy_port); if (http_proxy_port > 0) http_use_proxy(http_proxy_host, http_proxy_port, @@ -80,7 +80,41 @@ int mms_load_core_settings(CfgGroup *cgrp) } #ifdef HAVE_LIBSSL - conn_config_ssl(cgrp); + /* We expect that gwlib_init() has been called already, so only need + * to setup cert files. + * -- adapted from gwlib/conn.c + */ + { + Octstr *ssl_client_certkey_file = NULL; + Octstr *ssl_server_cert_file = NULL; + Octstr *ssl_server_key_file = NULL; + Octstr *ssl_trusted_ca_file = NULL; + + /* + * check if SSL is desired for HTTP servers and then + * load SSL client and SSL server public certificates + * and private keys + */ + ssl_client_certkey_file = mms_cfg_get(cgrp, octstr_imm("ssl-client-certkey-file")); + if (ssl_client_certkey_file != NULL) + use_global_client_certkey_file(ssl_client_certkey_file); + + ssl_server_cert_file = mms_cfg_get(cgrp, octstr_imm("ssl-server-cert-file")); + ssl_server_key_file = mms_cfg_get(cgrp, octstr_imm("ssl-server-key-file")); + + if (ssl_server_cert_file != NULL && ssl_server_key_file != NULL) + use_global_server_certkey_file(ssl_server_cert_file, + ssl_server_key_file); + + ssl_trusted_ca_file = mms_cfg_get(cgrp, octstr_imm("ssl-trusted-ca-file")); + + use_global_trusted_ca_file(ssl_trusted_ca_file); + + octstr_destroy(ssl_client_certkey_file); + octstr_destroy(ssl_server_cert_file); + octstr_destroy(ssl_server_key_file); + octstr_destroy(ssl_trusted_ca_file); + } #endif return 0; diff --git a/mbuni/mmlib/mms_util.h b/mbuni/mmlib/mms_util.h index 638284f..96d5541 100644 --- a/mbuni/mmlib/mms_util.h +++ b/mbuni/mmlib/mms_util.h @@ -20,7 +20,7 @@ #include "mms_strings.h" #include "mms_msg.h" #include "mms_mm7soap.h" - +#include "mms_cfg.h" #include "mms_mmbox.h" /* Send errors */ @@ -50,7 +50,7 @@ enum mms_loc_t {MMS_LOC_MMBOX = 1, MMS_LOC_MQUEUE=2}; -extern int mms_load_core_settings(CfgGroup *cgrp); +extern int mms_load_core_settings(mCfgGrp *cgrp); extern Octstr *mms_maketransid(char *qf, Octstr *mmscname); @@ -125,7 +125,7 @@ extern MIMEEntity *mime_entity_duplicate(MIMEEntity *m); int _mms_gw_isprint(int c); /* Special form of cfg_get which returns zero-length string when there is nothing. */ -Octstr *_mms_cfg_getx(CfgGroup *grp, Octstr *item); +Octstr *_mms_cfg_getx(mCfgGrp *grp, Octstr *item); /* Get envelope data from message headers. */ void mms_collect_envdata_from_msgheaders(List *mh, List **xto, diff --git a/mbuni/mmsbox/mmsbox.c b/mbuni/mmsbox/mmsbox.c index 45dade9..ca71aa5 100644 --- a/mbuni/mmsbox/mmsbox.c +++ b/mbuni/mmsbox/mmsbox.c @@ -456,7 +456,7 @@ int main(int argc, char *argv[]) { Octstr *fname; int cfidx; - Cfg *cfg; + mCfg *cfg; long qthread = 0, sthread = 0; @@ -471,9 +471,9 @@ int main(int argc, char *argv[]) else fname = octstr_create(argv[cfidx]); - cfg = cfg_create(fname); + cfg = mms_cfg_read(fname); - if (cfg_read(cfg) == -1) + if (cfg == NULL) panic(0, "Couldn't read configuration from '%s'.", octstr_get_cstr(fname)); octstr_destroy(fname); @@ -484,7 +484,7 @@ int main(int argc, char *argv[]) mms_load_mmsbox_settings(cfg,(gwthread_func_t *)mmsc_receive_func); - cfg_destroy(cfg); + mms_cfg_destroy(cfg); signal(SIGHUP, quit_now); signal(SIGTERM, quit_now); diff --git a/mbuni/mmsbox/mmsbox_cfg.c b/mbuni/mmsbox/mmsbox_cfg.c index a4330e6..36a0849 100644 --- a/mbuni/mmsbox/mmsbox_cfg.c +++ b/mbuni/mmsbox/mmsbox_cfg.c @@ -34,10 +34,10 @@ Octstr *unified_prefix; struct SendMmsPortInfo sendmms_port; -int mms_load_mmsbox_settings(Cfg *cfg, gwthread_func_t *mmsc_handler_func) +int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func) { - CfgGroup *grp = cfg_get_single_group(cfg, octstr_imm("mbuni")); - CfgGroup *cgrp = cfg_get_single_group(cfg, octstr_imm("core")); + mCfgGrp *grp = mms_cfg_get_single(cfg, octstr_imm("mbuni")); + mCfgGrp *cgrp = mms_cfg_get_single(cfg, octstr_imm("core")); Octstr *gdir, *s; int send_port_ssl = 0; List *l; @@ -50,7 +50,7 @@ int mms_load_mmsbox_settings(Cfg *cfg, gwthread_func_t *mmsc_handler_func) mms_services = list_create(); mmscs = list_create(); - gdir = cfg_get(grp, octstr_imm("storage-directory")); + gdir = mms_cfg_get(grp, octstr_imm("storage-directory")); if (gdir == NULL) gdir = octstr_imm("."); @@ -77,19 +77,19 @@ int mms_load_mmsbox_settings(Cfg *cfg, gwthread_func_t *mmsc_handler_func) 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) + if (mms_cfg_get_int(grp, + octstr_imm("maximum-send-attempts"), &mmsbox_maxsendattempts) < 0) mmsbox_maxsendattempts = MAXQTRIES; - if (cfg_get_integer(&mmsbox_send_back_off, grp, - octstr_imm("send-attempt-back-off")) == -1) + if (mms_cfg_get_int(grp, + octstr_imm("send-attempt-back-off"), &mmsbox_send_back_off) == -1) mmsbox_send_back_off = BACKOFF_FACTOR; - if (cfg_get_integer(&maxthreads, grp, octstr_imm("max-send-threads")) == -1) + if (mms_cfg_get_int(grp, octstr_imm("max-send-threads"), &maxthreads) == -1) maxthreads = 10; - s = cfg_get(grp, octstr_imm("queue-run-interval")); + s = mms_cfg_get(grp, octstr_imm("queue-run-interval")); if (s) { queue_interval = atof(octstr_get_cstr(s)); octstr_destroy(s); @@ -101,30 +101,30 @@ int mms_load_mmsbox_settings(Cfg *cfg, gwthread_func_t *mmsc_handler_func) unified_prefix = _mms_cfg_getx(grp, octstr_imm("unified-prefix")); - cfg_get_integer(&sendmms_port.port, grp, octstr_imm("sendmms-port")); + mms_cfg_get_int(grp, octstr_imm("sendmms-port"), &sendmms_port.port); #ifdef HAVE_LIBSSL - cfg_get_bool(&send_port_ssl, grp, octstr_imm("sendmms-port-ssl")); + mms_cfg_get_bool(grp, octstr_imm("sendmms-port-ssl"), &send_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")); + sendmms_port.allow_ip = mms_cfg_get(grp, octstr_imm("allow-ip")); + sendmms_port.deny_ip = mms_cfg_get(grp, octstr_imm("deny-ip")); /* Now get sendmms users. */ - l = cfg_get_multi_group(cfg, octstr_imm("send-mms-user")); + l = mms_cfg_get_multi(cfg, octstr_imm("send-mms-user")); for (i = 0, n = list_len(l); i < n; i++) { - CfgGroup *x = list_get(l, i); + mCfgGrp *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 = cfg_get(x, octstr_imm("faked-sender")); + u->faked_sender = mms_cfg_get(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); @@ -132,9 +132,9 @@ int mms_load_mmsbox_settings(Cfg *cfg, gwthread_func_t *mmsc_handler_func) list_destroy(l, NULL); /* Get mmsc list. */ - l = cfg_get_multi_group(cfg, octstr_imm("mmsc")); + l = mms_cfg_get_multi(cfg, octstr_imm("mmsc")); for (i = 0, n = list_len(l); i < n; i++) { - CfgGroup *x = list_get(l, i); + mCfgGrp *x = list_get(l, i); MmscGrp *m = gw_malloc(sizeof *m); int ssl = 0; Octstr *type; @@ -144,19 +144,19 @@ int mms_load_mmsbox_settings(Cfg *cfg, gwthread_func_t *mmsc_handler_func) m->id = _mms_cfg_getx(x, octstr_imm("id")); m->mmsc_url = _mms_cfg_getx(x, octstr_imm("mmsc-url")); - m->allowed_prefix = cfg_get(x, octstr_imm("allowed-prefix")); - m->denied_prefix = cfg_get(x, octstr_imm("denied-prefix")); + m->allowed_prefix = mms_cfg_get(x, octstr_imm("allowed-prefix")); + m->denied_prefix = mms_cfg_get(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.allow_ip = mms_cfg_get(x, octstr_imm("allow-ip")); + m->incoming.deny_ip = mms_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")); + mms_cfg_get_int(x, octstr_imm("incoming-port"), &m->incoming.port); #ifdef HAVE_LIBSSL - cfg_get_bool(&ssl, x, octstr_imm("incoming-port-ssl")); + mms_cfg_get_bool(x, octstr_imm("incoming-port-ssl"), &ssl); #endif - cfg_get_integer(&m->throughput, x, octstr_imm("max-throughput")); + mms_cfg_get_int(x, octstr_imm("max-throughput"), &m->throughput); type = _mms_cfg_getx(x, octstr_imm("type")); if (octstr_case_compare(type, octstr_imm("eaif")) == 0) @@ -191,28 +191,28 @@ int mms_load_mmsbox_settings(Cfg *cfg, gwthread_func_t *mmsc_handler_func) list_destroy(l, NULL); - l = cfg_get_multi_group(cfg, octstr_imm("mms-service")); + l = mms_cfg_get_multi(cfg, octstr_imm("mms-service")); for (i = 0, n = list_len(l); i < n; i++) { - CfgGroup *x = list_get(l, i); + mCfgGrp *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) + if ((m->url = mms_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) + else if ((m->url = mms_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) + else if ((m->url = mms_cfg_get(x, octstr_imm("file"))) != NULL) m->type = TRANS_TYPE_FILE; - else if ((m->url = cfg_get(x, octstr_imm("exec"))) != NULL) + else if ((m->url = mms_cfg_get(x, octstr_imm("exec"))) != NULL) m->type = TRANS_TYPE_EXEC; - else if ((m->url = cfg_get(x, octstr_imm("text"))) != NULL) + else if ((m->url = mms_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 = cfg_get(x, octstr_imm("faked-sender")); - cfg_get_bool(&m->isdefault, x, octstr_imm("catch-all")); + m->faked_sender = mms_cfg_get(x, octstr_imm("faked-sender")); + mms_cfg_get_bool(x, octstr_imm("catch-all"), &m->isdefault); if (m->isdefault) { if (catchall) @@ -220,36 +220,36 @@ int mms_load_mmsbox_settings(Cfg *cfg, gwthread_func_t *mmsc_handler_func) catchall = m; } - 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")); + mms_cfg_get_bool(x, octstr_imm("omit-empty"), &m->omitempty); + mms_cfg_get_bool(x, octstr_imm("accept-x-mbuni-headers"), &m->accept_x_headers); + mms_cfg_get_bool(x, octstr_imm("assume-plain-text"), &m->assume_plain_text); - if ((s = cfg_get(x, octstr_imm("accepted-mmscs"))) != NULL) { + if ((s = mms_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) { + if ((s = mms_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) { + if ((s = mms_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")); + s = mms_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) { + if ((s = mms_cfg_get(x, octstr_imm("http-post-parameters"))) != NULL) { List *r = octstr_split(s, octstr_imm("&")); int i, n; m->params = list_create(); diff --git a/mbuni/mmsbox/mmsbox_cfg.h b/mbuni/mmsbox/mmsbox_cfg.h index fcc28ac..00d8aa3 100644 --- a/mbuni/mmsbox/mmsbox_cfg.h +++ b/mbuni/mmsbox/mmsbox_cfg.h @@ -79,5 +79,5 @@ extern struct SendMmsPortInfo { } sendmms_port; -extern int mms_load_mmsbox_settings(Cfg *cfg, gwthread_func_t *mmsc_handler_func); +extern int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func); #endif diff --git a/mbuni/mmsc/mmsc_cfg.c b/mbuni/mmsc/mmsc_cfg.c index 132712d..e4d0ed9 100644 --- a/mbuni/mmsc/mmsc_cfg.c +++ b/mbuni/mmsc/mmsc_cfg.c @@ -27,12 +27,12 @@ -static void *load_module(CfgGroup *grp, char *config_key, char *symbolname) +static void *load_module(mCfgGrp *grp, char *config_key, char *symbolname) { Octstr *s; void *retval = NULL; - s = cfg_get(grp, octstr_imm(config_key)); + s = mms_cfg_get(grp, octstr_imm(config_key)); if (s) { void *x = dlopen(octstr_get_cstr(s), RTLD_LAZY); void *y = NULL; @@ -60,13 +60,13 @@ static void *load_module(CfgGroup *grp, char *config_key, char *symbolname) return retval; } -MmscSettings *mms_load_mmsc_settings(Cfg *cfg, List **proxyrelays) +MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays) { Octstr *s; List *l; - CfgGroup *grp = cfg_get_single_group(cfg, octstr_imm("mbuni")); - CfgGroup *cgrp = cfg_get_single_group(cfg, octstr_imm("core")); + mCfgGrp *grp = mms_cfg_get_single(cfg, octstr_imm("mbuni")); + mCfgGrp *cgrp = mms_cfg_get_single(cfg, octstr_imm("core")); MmscSettings *m = gw_malloc(sizeof *m); long port = -1; Octstr *from, *user, *pass; @@ -89,7 +89,7 @@ MmscSettings *mms_load_mmsc_settings(Cfg *cfg, List **proxyrelays) l = list_create(); m->local_domains = l; - if (cfg_get_integer(&m->maxthreads, grp, octstr_imm("max-send-threads")) == -1) + if (mms_cfg_get_int(grp, octstr_imm("max-send-threads"), &m->maxthreads) == -1) m->maxthreads = 10; m->unified_prefix = _mms_cfg_getx(grp, octstr_imm("unified-prefix")); @@ -143,10 +143,10 @@ MmscSettings *mms_load_mmsc_settings(Cfg *cfg, List **proxyrelays) panic(0, "Failed to initialise UA Profile directory, error: %s!", strerror(errno)); - if (cfg_get_integer(&m->maxsendattempts, grp, octstr_imm("maximum-send-attempts")) == -1) + if (mms_cfg_get_int(grp, octstr_imm("maximum-send-attempts"), &m->maxsendattempts) == -1) m->maxsendattempts = MAXQTRIES; - if (cfg_get_integer(&m->default_msgexpiry, grp, octstr_imm("default-message-expiry")) == -1) + if (mms_cfg_get_int(grp, octstr_imm("default-message-expiry"), &m->default_msgexpiry) == -1) m->default_msgexpiry = DEFAULT_EXPIRE; s = _mms_cfg_getx(grp, octstr_imm("queue-run-interval")); @@ -156,7 +156,7 @@ MmscSettings *mms_load_mmsc_settings(Cfg *cfg, List **proxyrelays) if (s) octstr_destroy(s); - if (cfg_get_integer(&m->send_back_off, grp, octstr_imm("send-attempt-back-off")) == -1) + if (mms_cfg_get_int(grp, octstr_imm("send-attempt-back-off"), &m->send_back_off) == -1) m->send_back_off = BACKOFF_FACTOR; /* Make send sms url. */ @@ -164,7 +164,7 @@ MmscSettings *mms_load_mmsc_settings(Cfg *cfg, List **proxyrelays) user = _mms_cfg_getx(grp, octstr_imm("sendsms-username")); pass = _mms_cfg_getx(grp, octstr_imm("sendsms-password")); - from = cfg_get(grp, octstr_imm("sendsms-global-sender")); + from = mms_cfg_get(grp, octstr_imm("sendsms-global-sender")); if (user && octstr_len(user) > 1) octstr_url_encode(user); @@ -187,12 +187,12 @@ MmscSettings *mms_load_mmsc_settings(Cfg *cfg, List **proxyrelays) octstr_destroy(pass); if (from) octstr_destroy(from); - cfg_get_integer(&port, grp, octstr_imm("mms-port")); + mms_cfg_get_int(grp, octstr_imm("mms-port"), &port); m->port = (port > 0) ? port : MMS_PORT; m->mm7port = -1; - cfg_get_integer(&m->mm7port, grp, octstr_imm("mm7-port")); + mms_cfg_get_int(grp, octstr_imm("mm7-port"), &m->mm7port); m->allow_ip = _mms_cfg_getx(grp, octstr_imm("allow-ip")); m->deny_ip = _mms_cfg_getx(grp, octstr_imm("deny-ip")); @@ -212,13 +212,13 @@ MmscSettings *mms_load_mmsc_settings(Cfg *cfg, List **proxyrelays) m->mms_toolarge = _mms_cfg_getx(grp, octstr_imm("mms-message-too-large-txt")); - m->wap_gw_msisdn_header = cfg_get(grp, octstr_imm("mms-client-msisdn-header")); + m->wap_gw_msisdn_header = mms_cfg_get(grp, octstr_imm("mms-client-msisdn-header")); if (!m->wap_gw_msisdn_header) m->wap_gw_msisdn_header = octstr_imm(XMSISDN_HEADER); - m->wap_gw_ip_header = cfg_get(grp, octstr_imm("mms-client-ip-header")); + m->wap_gw_ip_header = mms_cfg_get(grp, octstr_imm("mms-client-ip-header")); if (!m->wap_gw_ip_header) m->wap_gw_ip_header = octstr_imm(XIP_HEADER); - cfg_get_bool(&m->notify_unprovisioned, grp, octstr_imm("notify-unprovisioned")); + mms_cfg_get_bool(grp, octstr_imm("notify-unprovisioned"), &m->notify_unprovisioned); m->billing_params = _mms_cfg_getx(grp, octstr_imm("billing-module-parameters")); @@ -263,29 +263,30 @@ MmscSettings *mms_load_mmsc_settings(Cfg *cfg, List **proxyrelays) } else m->mms_detokenizefuncs = NULL; - if (cfg_get_bool(&m->allow_ip_type, grp, octstr_imm("allow-ip-type")) < 0) + if (mms_cfg_get_bool(grp, octstr_imm("allow-ip-type"), &m->allow_ip_type) < 0) m->allow_ip_type = 1; - cfg_get_bool(&m->optimize_notification_size, grp, octstr_imm("optimize-notification-size")); + mms_cfg_get_bool(grp, octstr_imm("optimize-notification-size"), + &m->optimize_notification_size); - if (cfg_get_bool(&m->content_adaptation, grp, octstr_imm("content-adaptation")) < 0) + if (mms_cfg_get_bool(grp, octstr_imm("content-adaptation"), &m->content_adaptation) < 0) m->content_adaptation = 1; if (qdir) octstr_destroy(qdir); /* Now load the VASP list. */ - l = cfg_get_multi_group(cfg, octstr_imm("mms-vasp")); + l = mms_cfg_get_multi(cfg, octstr_imm("mms-vasp")); m->vasp_list = list_create(); for (i=0, n=list_len(l); iid = _mms_cfg_getx(grp, octstr_imm("vasp-id")); mv->short_code = -1; - cfg_get_integer(&mv->short_code, grp, octstr_imm("short-code")); + mms_cfg_get_int(grp, octstr_imm("short-code"), &mv->short_code); mv->vasp_username = _mms_cfg_getx(grp, octstr_imm("vasp-username")); mv->vasp_password = _mms_cfg_getx(grp, octstr_imm("vasp-password")); @@ -306,13 +307,13 @@ MmscSettings *mms_load_mmsc_settings(Cfg *cfg, List **proxyrelays) octstr_destroy(s); /* Set the handler vasp accounts. */ - if (cfg_get_bool(&ibool, grp, octstr_imm("mms-to-email-handler")) == 0 && + if (mms_cfg_get_bool(grp, octstr_imm("mms-to-email-handler"), &ibool) == 0 && ibool) { if (m->mms2email) warning(0, "mms-to-email handler VASP specified more than once! Only last config taken."); m->mms2email = mv; } - if (cfg_get_bool(&ibool, grp, octstr_imm("mms-to-local-copy-handler")) == 0 && + if (mms_cfg_get_bool(grp, octstr_imm("mms-to-local-copy-handler"), &ibool) == 0 && ibool) { if (m->mms2mobile) warning(0, "mms-to-mobile copy handler VASP specified more than once! Only last config taken."); @@ -324,14 +325,14 @@ MmscSettings *mms_load_mmsc_settings(Cfg *cfg, List **proxyrelays) return m; } -List *mms_proxy_relays(Cfg *cfg) +List *mms_proxy_relays(mCfg *cfg) { - List *gl = cfg_get_multi_group(cfg, octstr_imm("mmsproxy")); + List *gl = mms_cfg_get_multi(cfg, octstr_imm("mmsproxy")); int i, n; List *l = list_create(); for (i = 0, n = list_len(gl); i < n; i++) { - CfgGroup *grp = list_get(gl, i); + mCfgGrp *grp = list_get(gl, i); MmsProxyRelay *m = gw_malloc(sizeof *m); m->host = _mms_cfg_getx(grp, octstr_imm("host")); diff --git a/mbuni/mmsc/mmsc_cfg.h b/mbuni/mmsc/mmsc_cfg.h index 7c1b812..9bd8f6d 100644 --- a/mbuni/mmsc/mmsc_cfg.h +++ b/mbuni/mmsc/mmsc_cfg.h @@ -98,10 +98,10 @@ typedef struct MmscSettings { } MmscSettings; /* Returns mmsc settings. */ -MmscSettings *mms_load_mmsc_settings(Cfg *cfg, List **proxyrelays); +MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays); /* Returns list of MmsProxyRelay */ -extern List *mms_proxy_relays(Cfg *cfg); +extern List *mms_proxy_relays(mCfg *cfg); extern Octstr *mms_makefetchurl(char *qf, Octstr *token, int loc, Octstr *to, diff --git a/mbuni/mmsc/mmsfromemail.c b/mbuni/mmsc/mmsfromemail.c index 45a9a0d..5c3df9a 100644 --- a/mbuni/mmsc/mmsfromemail.c +++ b/mbuni/mmsc/mmsfromemail.c @@ -28,7 +28,7 @@ static int find_own(int i, int argc, char *argv[]); static void fixup_recipient(void); static void fixup_sender(void); -static Cfg *cfg; +static mCfg *cfg; static List *proxyrelays; int main(int argc, char *argv[]) { @@ -51,9 +51,9 @@ int main(int argc, char *argv[]) else fname = octstr_create(argv[cfidx]); - cfg = cfg_create(fname); + cfg = mms_cfg_read(fname); - if (cfg_read(cfg) == -1) + if (cfg == NULL) panic(0, "Couldn't read configuration from '%s'.", octstr_get_cstr(fname)); octstr_destroy(fname); @@ -64,7 +64,7 @@ int main(int argc, char *argv[]) /* Load settings. */ settings = mms_load_mmsc_settings(cfg, &proxyrelays); - cfg_destroy(cfg); + mms_cfg_destroy(cfg); if (!settings) panic(0, "No global MMSC configuration!"); diff --git a/mbuni/mmsc/mmsproxy.c b/mbuni/mmsc/mmsproxy.c index 53838bc..a63c458 100644 --- a/mbuni/mmsc/mmsproxy.c +++ b/mbuni/mmsc/mmsproxy.c @@ -37,7 +37,7 @@ typedef struct MmsHTTPClientInfo { MmsVasp *vasp; } MmsHTTPClientInfo; -static Cfg *cfg; +static mCfg *cfg; static List *proxyrelays; static MmscSettings *settings; @@ -76,9 +76,9 @@ int main(int argc, char *argv[]) else fname = octstr_create(argv[cfidx]); - cfg = cfg_create(fname); + cfg = mms_cfg_read(fname); - if (cfg_read(cfg) == -1) + if (cfg == NULL) panic(0, "Couldn't read configuration from '%s'.", octstr_get_cstr(fname)); octstr_destroy(fname); @@ -90,7 +90,7 @@ int main(int argc, char *argv[]) /* Load settings. */ settings = mms_load_mmsc_settings(cfg, &proxyrelays); - cfg_destroy(cfg); + mms_cfg_destroy(cfg); if (!settings) panic(0, "No global MMSC configuration!"); @@ -1696,7 +1696,7 @@ static void mm7soap_dispatch(MmsHTTPClientInfo *h) octstr_compare(e->vaspid, h->vasp->id) != 0) { status = 2001; error(0, "MMS Proxy(MM7): CancelReq: Found message[id=%s]" - " bxut vaspid id=%s does not match!", + " but vaspid id=%s does not match!", octstr_get_cstr(msgid), octstr_get_cstr(h->vasp->id)); } else { /* Kill it. */ int i, n; diff --git a/mbuni/mmsc/mmsrelay.c b/mbuni/mmsc/mmsrelay.c index 73315c3..4478382 100644 --- a/mbuni/mmsc/mmsrelay.c +++ b/mbuni/mmsc/mmsrelay.c @@ -12,7 +12,7 @@ */ #include "mmsrelay.h" -static Cfg *cfg; +static mCfg *cfg; MmscSettings *settings; List *proxyrelays; @@ -41,9 +41,9 @@ int main(int argc, char *argv[]) else fname = octstr_create(argv[cfidx]); - cfg = cfg_create(fname); + cfg = mms_cfg_read(fname); - if (cfg_read(cfg) == -1) + if (cfg == NULL) panic(0, "Couldn't read configuration from '%s'.", octstr_get_cstr(fname)); octstr_destroy(fname); @@ -54,7 +54,7 @@ int main(int argc, char *argv[]) settings = mms_load_mmsc_settings(cfg,&proxyrelays); - cfg_destroy(cfg); + mms_cfg_destroy(cfg); if (!settings) panic(0, "No global MMSC configuration!"); diff --git a/mbuni/mmsc/mmssend.c b/mbuni/mmsc/mmssend.c index e7f5b83..02959a2 100644 --- a/mbuni/mmsc/mmssend.c +++ b/mbuni/mmsc/mmssend.c @@ -66,7 +66,7 @@ static int find_own(int i, int argc, char *argv[]) return -1; } -static Cfg *cfg; +static mCfg *cfg; static List *proxyrelays; @@ -91,9 +91,9 @@ int main(int argc, char *argv[]) else fname = octstr_create(argv[cfidx]); - cfg = cfg_create(fname); + cfg = mms_cfg_read(fname); - if (cfg_read(cfg) == -1) + if (cfg == NULL) panic(0, "Couldn't read configuration from '%s'.", octstr_get_cstr(fname)); octstr_destroy(fname); @@ -105,7 +105,7 @@ int main(int argc, char *argv[]) /* Load settings. */ settings = mms_load_mmsc_settings(cfg, &proxyrelays); - cfg_destroy(cfg); + mms_cfg_destroy(cfg); if (!settings) panic(0, "No global MMSC configuration!");