From 7dd3546ab3e5705a54025f21fe27318b2ae5f62b Mon Sep 17 00:00:00 2001 From: bagyenda <> Date: Thu, 1 Sep 2005 10:26:36 +0000 Subject: [PATCH] Re-organisation of functions and files in preparation for adding MMSBox functionality --- mbuni/mmlib/Makefile.am | 7 +- mbuni/mmlib/Makefile.in | 108 +---- mbuni/mmlib/mms_mm7soap.c | 2 +- mbuni/mmlib/mms_util.c | 419 ----------------- mbuni/mmlib/mms_util.h | 92 +--- mbuni/mmsc/Makefile.am | 12 +- mbuni/mmsc/Makefile.in | 131 +++++- mbuni/{mmlib => mmsc}/mms_billing.c | 0 mbuni/{mmlib => mmsc}/mms_billing.h | 0 mbuni/{mmlib => mmsc}/mms_billing_shell.c | 0 mbuni/{mmlib => mmsc}/mms_detokenize.c | 4 +- mbuni/{mmlib => mmsc}/mms_detokenize.h | 0 mbuni/{mmlib => mmsc}/mms_detokenize_shell.c | 0 mbuni/{mmlib => mmsc}/mms_resolve.c | 4 +- mbuni/{mmlib => mmsc}/mms_resolve.h | 2 +- mbuni/{mmlib => mmsc}/mms_resolve_shell.c | 0 mbuni/mmsc/mmsc_cfg.c | 444 +++++++++++++++++++ mbuni/mmsc/mmsc_cfg.h | 98 ++++ mbuni/mmsc/mmsfromemail.c | 6 +- mbuni/mmsc/mmsproxy.c | 6 +- mbuni/mmsc/mmsrelay.c | 4 +- mbuni/mmsc/mmsrelay.h | 4 +- mbuni/mmsc/mmssend.c | 6 +- 23 files changed, 707 insertions(+), 642 deletions(-) rename mbuni/{mmlib => mmsc}/mms_billing.c (100%) rename mbuni/{mmlib => mmsc}/mms_billing.h (100%) rename mbuni/{mmlib => mmsc}/mms_billing_shell.c (100%) rename mbuni/{mmlib => mmsc}/mms_detokenize.c (92%) rename mbuni/{mmlib => mmsc}/mms_detokenize.h (100%) rename mbuni/{mmlib => mmsc}/mms_detokenize_shell.c (100%) rename mbuni/{mmlib => mmsc}/mms_resolve.c (94%) rename mbuni/{mmlib => mmsc}/mms_resolve.h (97%) rename mbuni/{mmlib => mmsc}/mms_resolve_shell.c (100%) create mode 100644 mbuni/mmsc/mmsc_cfg.c create mode 100644 mbuni/mmsc/mmsc_cfg.h diff --git a/mbuni/mmlib/Makefile.am b/mbuni/mmlib/Makefile.am index 36dd7f1..04a3818 100644 --- a/mbuni/mmlib/Makefile.am +++ b/mbuni/mmlib/Makefile.am @@ -1,10 +1,5 @@ noinst_LIBRARIES = libmms.a -libmms_a_SOURCES = mms_mmbox.h mms_mmbox.c mms_billing.c mms_billing.h mms_msg.c mms_msg.h mms_queue.c mms_queue.h mms_strings.c mms_strings.h mms_uaprof.c mms_uaprof.h mms_util.c mms_util.h mms_resolve.h mms_resolve.c mms_mm7soap.c mms_detokenize.h mms_mm7soap.h +libmms_a_SOURCES = mms_mmbox.h mms_mmbox.c mms_msg.c mms_msg.h mms_queue.c mms_queue.h mms_strings.c mms_strings.h mms_uaprof.c mms_uaprof.h mms_util.c mms_util.h mms_mm7soap.c mms_mm7soap.h -plugindir = $(libdir)/mbuni -plugin_LTLIBRARIES = libmms_billing_shell.la libmms_resolve_shell.la libmms_detokenize_shell.la -libmms_billing_shell_la_SOURCES = mms_billing_shell.c -libmms_resolve_shell_la_SOURCES = mms_resolve_shell.c -libmms_detokenize_shell_la_SOURCES = mms_detokenize_shell.c EXTRA_DIST=mms_strings.def diff --git a/mbuni/mmlib/Makefile.in b/mbuni/mmlib/Makefile.in index 4949b7c..a9b4e7e 100644 --- a/mbuni/mmlib/Makefile.in +++ b/mbuni/mmlib/Makefile.in @@ -14,8 +14,7 @@ @SET_MAKE@ - -SOURCES = $(libmms_a_SOURCES) $(libmms_billing_shell_la_SOURCES) $(libmms_detokenize_shell_la_SOURCES) $(libmms_resolve_shell_la_SOURCES) +SOURCES = $(libmms_a_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -52,32 +51,10 @@ LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru libmms_a_AR = $(AR) $(ARFLAGS) libmms_a_LIBADD = -am_libmms_a_OBJECTS = mms_mmbox.$(OBJEXT) mms_billing.$(OBJEXT) \ - mms_msg.$(OBJEXT) mms_queue.$(OBJEXT) mms_strings.$(OBJEXT) \ - mms_uaprof.$(OBJEXT) mms_util.$(OBJEXT) mms_resolve.$(OBJEXT) \ - mms_mm7soap.$(OBJEXT) +am_libmms_a_OBJECTS = mms_mmbox.$(OBJEXT) mms_msg.$(OBJEXT) \ + mms_queue.$(OBJEXT) mms_strings.$(OBJEXT) mms_uaprof.$(OBJEXT) \ + mms_util.$(OBJEXT) mms_mm7soap.$(OBJEXT) libmms_a_OBJECTS = $(am_libmms_a_OBJECTS) -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -am__installdirs = "$(DESTDIR)$(plugindir)" -pluginLTLIBRARIES_INSTALL = $(INSTALL) -LTLIBRARIES = $(plugin_LTLIBRARIES) -libmms_billing_shell_la_LIBADD = -am_libmms_billing_shell_la_OBJECTS = mms_billing_shell.lo -libmms_billing_shell_la_OBJECTS = \ - $(am_libmms_billing_shell_la_OBJECTS) -libmms_detokenize_shell_la_LIBADD = -am_libmms_detokenize_shell_la_OBJECTS = mms_detokenize_shell.lo -libmms_detokenize_shell_la_OBJECTS = \ - $(am_libmms_detokenize_shell_la_OBJECTS) -libmms_resolve_shell_la_LIBADD = -am_libmms_resolve_shell_la_OBJECTS = mms_resolve_shell.lo -libmms_resolve_shell_la_OBJECTS = \ - $(am_libmms_resolve_shell_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -89,12 +66,8 @@ LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(libmms_a_SOURCES) $(libmms_billing_shell_la_SOURCES) \ - $(libmms_detokenize_shell_la_SOURCES) \ - $(libmms_resolve_shell_la_SOURCES) -DIST_SOURCES = $(libmms_a_SOURCES) $(libmms_billing_shell_la_SOURCES) \ - $(libmms_detokenize_shell_la_SOURCES) \ - $(libmms_resolve_shell_la_SOURCES) +SOURCES = $(libmms_a_SOURCES) +DIST_SOURCES = $(libmms_a_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -197,12 +170,7 @@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ noinst_LIBRARIES = libmms.a -libmms_a_SOURCES = mms_mmbox.h mms_mmbox.c mms_billing.c mms_billing.h mms_msg.c mms_msg.h mms_queue.c mms_queue.h mms_strings.c mms_strings.h mms_uaprof.c mms_uaprof.h mms_util.c mms_util.h mms_resolve.h mms_resolve.c mms_mm7soap.c mms_detokenize.h mms_mm7soap.h -plugindir = $(libdir)/mbuni -plugin_LTLIBRARIES = libmms_billing_shell.la libmms_resolve_shell.la libmms_detokenize_shell.la -libmms_billing_shell_la_SOURCES = mms_billing_shell.c -libmms_resolve_shell_la_SOURCES = mms_resolve_shell.c -libmms_detokenize_shell_la_SOURCES = mms_detokenize_shell.c +libmms_a_SOURCES = mms_mmbox.h mms_mmbox.c mms_msg.c mms_msg.h mms_queue.c mms_queue.h mms_strings.c mms_strings.h mms_uaprof.c mms_uaprof.h mms_util.c mms_util.h mms_mm7soap.c mms_mm7soap.h EXTRA_DIST = mms_strings.def all: all-am @@ -244,39 +212,6 @@ libmms.a: $(libmms_a_OBJECTS) $(libmms_a_DEPENDENCIES) -rm -f libmms.a $(libmms_a_AR) libmms.a $(libmms_a_OBJECTS) $(libmms_a_LIBADD) $(RANLIB) libmms.a -install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(plugindir)" || $(mkdir_p) "$(DESTDIR)$(plugindir)" - @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ - if test -f $$p; then \ - f=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=install $(pluginLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(plugindir)/$$f'"; \ - $(LIBTOOL) --mode=install $(pluginLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(plugindir)/$$f"; \ - else :; fi; \ - done - -uninstall-pluginLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @set -x; list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ - p=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$p'"; \ - $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$p"; \ - done - -clean-pluginLTLIBRARIES: - -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) - @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libmms_billing_shell.la: $(libmms_billing_shell_la_OBJECTS) $(libmms_billing_shell_la_DEPENDENCIES) - $(LINK) -rpath $(plugindir) $(libmms_billing_shell_la_LDFLAGS) $(libmms_billing_shell_la_OBJECTS) $(libmms_billing_shell_la_LIBADD) $(LIBS) -libmms_detokenize_shell.la: $(libmms_detokenize_shell_la_OBJECTS) $(libmms_detokenize_shell_la_DEPENDENCIES) - $(LINK) -rpath $(plugindir) $(libmms_detokenize_shell_la_LDFLAGS) $(libmms_detokenize_shell_la_OBJECTS) $(libmms_detokenize_shell_la_LIBADD) $(LIBS) -libmms_resolve_shell.la: $(libmms_resolve_shell_la_OBJECTS) $(libmms_resolve_shell_la_DEPENDENCIES) - $(LINK) -rpath $(plugindir) $(libmms_resolve_shell_la_LDFLAGS) $(libmms_resolve_shell_la_OBJECTS) $(libmms_resolve_shell_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -284,15 +219,10 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_billing.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_billing_shell.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_detokenize_shell.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_mm7soap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_mmbox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_msg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_queue.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_resolve.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_resolve_shell.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_strings.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_uaprof.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_util.Po@am__quote@ @@ -405,11 +335,8 @@ distdir: $(DISTFILES) done check-am: all-am check: check-am -all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) +all-am: Makefile $(LIBRARIES) installdirs: - for dir in "$(DESTDIR)$(plugindir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done install: install-am install-exec: install-exec-am install-data: install-data-am @@ -437,7 +364,7 @@ maintainer-clean-generic: clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ - clean-pluginLTLIBRARIES mostlyclean-am + mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) @@ -455,7 +382,7 @@ info: info-am info-am: -install-data-am: install-pluginLTLIBRARIES +install-data-am: install-exec-am: @@ -483,20 +410,19 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am uninstall-pluginLTLIBRARIES +uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLIBRARIES clean-pluginLTLIBRARIES \ - ctags distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-pluginLTLIBRARIES \ + clean-libtool clean-noinstLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am uninstall-pluginLTLIBRARIES + uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/mbuni/mmlib/mms_mm7soap.c b/mbuni/mmlib/mms_mm7soap.c index 4298199..8f51c1d 100644 --- a/mbuni/mmlib/mms_mm7soap.c +++ b/mbuni/mmlib/mms_mm7soap.c @@ -340,7 +340,7 @@ static void output_rcpt(char *hdr, List *hdrs, Octstr *p) http_destroy_headers(l); } -#define XMLNSMM7 "http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-0" +#define XMLNSMM7 "http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2" /* Construct by hand. */ Octstr *headers_to_soapxml(List *hdrs) { diff --git a/mbuni/mmlib/mms_util.c b/mbuni/mmlib/mms_util.c index 0e93d96..e3ed7f8 100644 --- a/mbuni/mmlib/mms_util.c +++ b/mbuni/mmlib/mms_util.c @@ -26,425 +26,6 @@ #include "mms_queue.h" #include "mms_uaprof.h" -#define MAXQTRIES 100 -#define BACKOFF_FACTOR 5*60 /* In seconds */ -#define QUEUERUN_INTERVAL 15*60 /* 15 minutes. */ -#define DEFAULT_EXPIRE 3600*24*7 /* One week */ -#define MMS_PORT 8191 /* Default content fetch port. */ - -static Octstr *cfg_getx(CfgGroup *grp, Octstr *item) -{ - Octstr *v = cfg_get(grp, item); - - return v ? v : octstr_create(""); -} - - -static void *load_module(CfgGroup *grp, char *config_key, char *symbolname) -{ - Octstr *s; - void *retval = NULL; - - s = cfg_get(grp, octstr_imm(config_key)); - if (s) { - void *x = dlopen(octstr_get_cstr(s), RTLD_LAZY); - void *y = NULL; -#ifdef __APPLE__ - char sbuf[512]; - - sprintf(sbuf, "_%s", symbolname); -#endif - if (x == NULL || ((y = dlsym(x, symbolname)) == NULL -#ifdef __APPLE__ /* fink version of dlsym has issues it seems. */ - && (y = dlsym(x, sbuf)) == NULL -#endif - )) - - panic(0, - "Error, unable to load dynamic libary (%s): " - "libhandle is %s, funcs is %s, err=%s", - octstr_get_cstr(s), - x ? "OK" : "Not OK", y ? "OK" : "Not OK", dlerror()); - else - retval = y; - - octstr_destroy(s); - } - return retval; -} - -MmsBoxSettings *mms_load_mmsbox_settings(Cfg *cfg, List **proxyrelays) -{ - long loglevel; - Octstr *s; - Octstr *log, *alog; - List *l; - CfgGroup *grp = cfg_get_single_group(cfg, octstr_imm("mmsbox")); - CfgGroup *cgrp = cfg_get_single_group(cfg, octstr_imm("core")); - MmsBoxSettings *m = gw_malloc(sizeof *m); - long port = -1; - Octstr *http_proxy_host, *user, *pass, *from; - Octstr *qdir = NULL; - int i, n; - - memset(m, 0, sizeof *m); - - /* Set the log file. */ - log = cfg_get(cgrp, octstr_imm("log-file")); - if (log != NULL) { - if (cfg_get_integer(&loglevel, cgrp, octstr_imm("log-level")) == -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")); - 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) { - - Octstr *username = cfg_get(cgrp, - octstr_imm("http-proxy-username")); - Octstr *password = cfg_get(cgrp, - octstr_imm("http-proxy-password")); - List *exceptions = 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")); - - if (http_proxy_port > 0) - http_use_proxy(http_proxy_host, http_proxy_port, - exceptions, username, password); - octstr_destroy(http_proxy_host); - octstr_destroy(username); - octstr_destroy(password); - list_destroy(exceptions, octstr_destroy_item); - } - - if (proxyrelays) - *proxyrelays = mms_proxy_relays(cfg); - - - s = cfg_getx(grp, octstr_imm("local-mmsc-domains")); - - if (s) { - l = octstr_split(s, octstr_imm(",")); - octstr_destroy(s); - } else - l = list_create(); - m->local_domains = l; - - if (cfg_get_integer(&m->maxthreads, grp, octstr_imm("max-send-threads")) == -1) - m->maxthreads = 10; - - m->unified_prefix = cfg_getx(grp, octstr_imm("unified-prefix")); - m->local_prefix = cfg_getx(grp, octstr_imm("local-prefixes")); - m->hostname = cfg_getx(grp, octstr_imm("hostname")); - - if (m->hostname == NULL || octstr_len(m->hostname) == 0) - m->hostname = octstr_create("localhost"); - - m->name = cfg_getx(grp, octstr_imm("name")); - m->host_alias = cfg_getx(grp, octstr_imm("host-alias")); - - m->sendmail = cfg_getx(grp, octstr_imm("send-mail-prog")); - - qdir = cfg_getx(grp, octstr_imm("storage-directory")); - - if (mkdir(octstr_get_cstr(qdir), - S_IRWXU|S_IRWXG) < 0 && - errno != EEXIST) - panic(0, "Failed to create queue directory: %s - %s!", - octstr_get_cstr(qdir), strerror(errno)); - - m->global_queuedir = octstr_format("%S/global", qdir); - m->mm1_queuedir = octstr_format("%S/mm1", qdir); - m->mm4_queuedir = octstr_format("%S/mm4", qdir); - - - if (mms_init_queuedir(m->mm1_queuedir) < 0) - panic(0, "Failed to initialise local queue directory: %s - %s!", - octstr_get_cstr(m->mm1_queuedir), strerror(errno)); - else if (mms_init_queuedir(m->global_queuedir) < 0) - panic(0, "Failed to initialise global queue directory: %s - %s!", - octstr_get_cstr(m->global_queuedir), strerror(errno)); - else if (mms_init_queuedir(m->mm4_queuedir) < 0) - panic(0, "Failed to initialise global queue directory: %s - %s!", - octstr_get_cstr(m->mm4_queuedir), strerror(errno)); - - m->mmbox_rootdir = octstr_format("%S/mmbox", qdir); - - if (mmbox_root_init(octstr_get_cstr(m->mmbox_rootdir)) != 0) - panic(0, "Failed to initialise mmbox root directory, error: %s!", - strerror(errno)); - - m->ua_profile_cache_dir = octstr_format("%S/UserAgent_Profiles", qdir); - - if (mkdir(octstr_get_cstr(m->ua_profile_cache_dir), - S_IRWXU|S_IRWXG) < 0 && - errno != EEXIST) - 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) - m->maxsendattempts = MAXQTRIES; - - if (cfg_get_integer(&m->default_msgexpiry, grp, octstr_imm("default-message-expiry")) == -1) - m->default_msgexpiry = DEFAULT_EXPIRE; - - s = cfg_getx(grp, octstr_imm("queue-run-interval")); - if (!s || (m->queue_interval = atof(octstr_get_cstr(s))) <= 0) - m->queue_interval = QUEUERUN_INTERVAL; - - if (cfg_get_integer(&m->send_back_off, grp, octstr_imm("send-attempt-back-off")) == -1) - m->send_back_off = BACKOFF_FACTOR; - - /* Make send sms url. */ - m->sendsms_url = cfg_getx(grp, octstr_imm("sendsms-url")); - - user = cfg_getx(grp, octstr_imm("sendsms-username")); - pass = cfg_getx(grp, octstr_imm("sendsms-password")); - from = cfg_get(grp, octstr_imm("sendsms-global-sender")); - - if (user && octstr_len(user) > 1) - octstr_url_encode(user); - if (pass && octstr_len(pass) > 1) - octstr_url_encode(pass); - if (from && octstr_len(from) > 1) - octstr_url_encode(from); - - - octstr_format_append(m->sendsms_url, - (from && octstr_len(from) > 1) ? - "?username=%S&password=%S&from=%S" : - "?username=%S&password=%S", - user, - pass,from); - - m->system_user = octstr_format("system-user@%S", - m->hostname); - octstr_destroy(user); - octstr_destroy(pass); - if (from) octstr_destroy(from); - - cfg_get_integer(&port, grp, octstr_imm("mms-port")); - - m->port = (port > 0) ? port : MMS_PORT; - - m->mm7port = -1; - cfg_get_integer(&m->mm7port, grp, octstr_imm("mm7-port")); - - m->allow_ip = cfg_getx(grp, octstr_imm("allow-ip")); - m->deny_ip = cfg_getx(grp, octstr_imm("deny-ip")); - - m->email2mmsrelay_prefixes = cfg_getx(grp, - octstr_imm("email2mms-relay-prefixes")); - - m->prov_notify = cfg_getx(grp,octstr_imm("prov-server-notify-script")); - - m->prov_getstatus = cfg_getx(grp,octstr_imm("prov-server-sub-status-script")); - m->mms_notify_txt = cfg_getx(grp, octstr_imm("mms-notify-text")); - m->mms_notify_unprov_txt = cfg_getx(grp, octstr_imm("mms-notify-unprovisioned-text")); - - - m->mms_email_txt = cfg_getx(grp, octstr_imm("mms-to-email-txt")); - m->mms_email_html = cfg_getx(grp, octstr_imm("mms-to-email-html")); - - m->mms_toolarge = cfg_getx(grp, octstr_imm("mms-message-too-large-txt")); - - m->wap_gw_msisdn_header = 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")); - 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")); - - m->billing_params = cfg_getx(grp, - octstr_imm("billing-module-parameters")); - /* Get and load the billing lib if any. */ - - if ((m->mms_billfuncs = load_module(grp, "billing-library", "mms_billfuncs"))) { - if (m->mms_billfuncs->mms_billingmodule_init == NULL || - m->mms_billfuncs->mms_billmsg == NULL || - m->mms_billfuncs->mms_billingmodule_fini == NULL || - m->mms_billfuncs->mms_logcdr == NULL) - panic(0, "Missing or NULL functions in billing module!"); - } else - m->mms_billfuncs = &mms_billfuncs; /* The default one. */ - - m->mms_bill_module_data = m->mms_billfuncs->mms_billingmodule_init(octstr_get_cstr(m->billing_params)); - - m->resolver_params = cfg_getx(grp, - octstr_imm("resolver-module-parameters")); - - /* Get and load the resolver lib if any. */ - if ((m->mms_resolvefuncs = load_module(grp, "resolver-library", "mms_resolvefuncs"))) { - if (m->mms_resolvefuncs->mms_resolvermodule_init == NULL || - m->mms_resolvefuncs->mms_resolve == NULL || - m->mms_resolvefuncs->mms_resolvermodule_fini == NULL) - panic(0, "Missing or NULL functions in resolver module!"); - } else - m->mms_resolvefuncs = &mms_resolvefuncs; /* The default one. */ - - m->mms_resolver_module_data = m->mms_resolvefuncs->mms_resolvermodule_init(octstr_get_cstr(m->resolver_params)); - - m->detokenizer_params = cfg_getx(grp, octstr_imm("detokenizer-module-parameters")); - - /* Get and load the detokenizer lib if any. */ - if ((m->mms_detokenizefuncs = load_module(grp, "detokenizer-library", "mms_detokenizefuncs"))) { - if (m->mms_detokenizefuncs->mms_detokenizer_init == NULL || - m->mms_detokenizefuncs->mms_detokenize == NULL || - m->mms_detokenizefuncs->mms_gettoken == NULL || - m->mms_detokenizefuncs->mms_detokenizer_fini == NULL) - panic(0, "Missing or NULL functions in detokenizer module!"); - if (m->mms_detokenizefuncs->mms_detokenizer_init(octstr_get_cstr(m->detokenizer_params))) - panic(0, "Detokenizer module failed to initialize"); - } else - m->mms_detokenizefuncs = NULL; - - if (cfg_get_bool(&m->allow_ip_type, grp, octstr_imm("allow-ip-type")) < 0) - m->allow_ip_type = 1; - - cfg_get_bool(&m->optimize_notification_size, grp, octstr_imm("optimize-notification-size")); - - if (cfg_get_bool(&m->content_adaptation, grp, octstr_imm("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")); - m->vasp_list = list_create(); - for (i=0, n=list_len(l); iid = cfg_getx(grp, octstr_imm("vasp-id")); - mv->short_code = -1; - cfg_get_integer(&mv->short_code, grp, octstr_imm("short-code")); - - mv->vasp_username = cfg_getx(grp, octstr_imm("vasp-username")); - mv->vasp_password = cfg_getx(grp, octstr_imm("vasp-password")); - - mv->vasp_url = cfg_getx(grp, octstr_imm("vasp-url")); - - mv->mmsc_username = cfg_getx(grp, octstr_imm("mmsc-username")); - mv->mmsc_password = cfg_getx(grp, octstr_imm("mmsc-password")); - - s = cfg_getx(grp, octstr_imm("type")); - - if (octstr_case_compare(s, octstr_imm("soap")) == 0) - mv->type = SOAP_VASP; - else if (octstr_case_compare(s, octstr_imm("eaif")) == 0) - mv->type = EAIF_VASP; - else - mv->type = NONE_VASP; - octstr_destroy(s); - - list_append(m->vasp_list, mv); - } - list_destroy(l, NULL); - return m; -} - -List *mms_proxy_relays(Cfg *cfg) -{ - List *gl = cfg_get_multi_group(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); - MmsProxyRelay *m = gw_malloc(sizeof *m); - - m->host = cfg_getx(grp, octstr_imm("host")); - m->name = cfg_getx(grp, octstr_imm("name")); - m->allowed_prefix = cfg_getx(grp, octstr_imm("allowed-prefix")); - m->denied_prefix = cfg_getx(grp, octstr_imm("denied-prefix")); - - list_append(l, m); - } - - list_destroy(gl, NULL); - - return l; -} - - -Octstr *mms_makefetchurl(char *qf, Octstr *token, int loc, - Octstr *to, - MmsBoxSettings *settings) -{ - Octstr *url = octstr_create(""); - Octstr *host_alias = settings->host_alias; - Octstr *hstr; - Octstr *endtoken, *x; - - MmsDetokenizerFuncStruct *tfs = settings->mms_detokenizefuncs; - - if (host_alias && octstr_len(host_alias) > 0) - hstr = octstr_duplicate(host_alias); - else - hstr = octstr_format("%S:%d", - settings->hostname, settings->port); - - octstr_format_append(url, "http://%S/%s@%d", - hstr, - qf, loc); - - if (tfs && tfs->mms_gettoken) { /* we append the recipient token or we append the message token. */ - endtoken = tfs->mms_gettoken(to); - if (!endtoken) - endtoken = octstr_imm("x"); - } else { - if (!token) - endtoken = octstr_imm("x"); - else - endtoken = octstr_duplicate(token); - } - - x = octstr_duplicate(endtoken); /* might be immutable, so we duplicate it. */ - octstr_url_encode(x); - octstr_format_append(url, "/%S", x); - - octstr_destroy(endtoken); - octstr_destroy(x); - octstr_destroy(hstr); - return url; -} - - -Octstr *mms_find_sender_msisdn(Octstr *send_url, List *request_hdrs, Octstr *msisdn_header, - MmsDetokenizerFuncStruct* detokenizerfuncs) -{ - /* Either we have a WAP gateway header as defined, or we look for - * last part of url, pass it to detokenizer lib if defined, and back comes our number. - */ - - Octstr *phonenum = http_header_value(request_hdrs, - msisdn_header); - - if (!phonenum || octstr_len(phonenum) == 0) { - List *l = octstr_split(send_url, octstr_imm("/")); - - if (l && list_len(l) > 1) { - if (detokenizerfuncs) - phonenum = detokenizerfuncs->mms_detokenize(list_get(l, list_len(l) - 1)); - } - if (l) - list_destroy(l, (list_item_destructor_t *)octstr_destroy); - } - - return phonenum; -} Octstr *mms_find_sender_ip(List *request_hdrs, Octstr *ip_header, Octstr *ip, int *isv6) { diff --git a/mbuni/mmlib/mms_util.h b/mbuni/mmlib/mms_util.h index fb00752..7223dfb 100644 --- a/mbuni/mmlib/mms_util.h +++ b/mbuni/mmlib/mms_util.h @@ -19,9 +19,8 @@ #include "config.h" #include "mms_strings.h" #include "mms_msg.h" -#include "mms_billing.h" -#include "mms_resolve.h" -#include "mms_detokenize.h" + + #include "mms_mmbox.h" /* Send errors */ @@ -41,82 +40,6 @@ #define _TT "0123456789abcdefghijklmnopqrstuvwxyz" #define _TTSIZE (-1 + sizeof _TT) -typedef struct MmsProxyRelay { - Octstr *host; - Octstr *name; - Octstr *allowed_prefix; - Octstr *denied_prefix; -} MmsProxyRelay; - -typedef struct MmsVasp { - Octstr *id; - long short_code; - enum {SOAP_VASP, EAIF_VASP, NONE_VASP} type; - Octstr *vasp_username, *vasp_password; - Octstr *vasp_url; - Octstr *mmsc_username, *mmsc_password; -} MmsVasp; - -typedef struct MmsBoxSettings { - Octstr *system_user; - Octstr *name, *hostname, *host_alias; - List *local_domains; - Octstr *unified_prefix, *local_prefix; - Octstr *sendmail; - Octstr *global_queuedir, *mm1_queuedir, *mm4_queuedir; - Octstr *mmbox_rootdir; - - Octstr *ua_profile_cache_dir; - - long maxthreads; - long maxsendattempts; - long default_msgexpiry; - double queue_interval; - long send_back_off; - - long port, mm7port; - - Octstr *allow_ip; - Octstr *deny_ip; - - Octstr *email2mmsrelay_prefixes; - Octstr *sendsms_url; -#if 0 - Octstr *sendsms_user, *sendsms_pass, *sendsms_globalsender; -#endif - Octstr *billing_params; - - MmsBillingFuncStruct *mms_billfuncs; /* Link to billing funcs. */ - void *mms_bill_module_data; - - Octstr *resolver_params; - MmsResolverFuncStruct *mms_resolvefuncs; /* Link to resolver funcs. */ - void *mms_resolver_module_data; - - Octstr *detokenizer_params; - MmsDetokenizerFuncStruct *mms_detokenizefuncs; /* Link to detokenizer funcs. */ - void *mms_detokenizer_module_data; - - int allow_ip_type; - - int optimize_notification_size; - int content_adaptation; - - Octstr *prov_notify; - - Octstr *prov_getstatus; - int notify_unprovisioned; - Octstr *mms_notify_txt; - Octstr *mms_notify_unprov_txt; - Octstr *mms_toolarge; - - Octstr *mms_email_txt; - Octstr *mms_email_html; - Octstr *wap_gw_msisdn_header; - Octstr *wap_gw_ip_header; - - List *vasp_list; /* of MmsVasp * */ -} MmsBoxSettings; /* Global variables and shared code used by all modules. */ @@ -128,16 +51,6 @@ extern char *mms_hostname; /* Our hostname. */ /* Message location flags: Used to distinguish fetch-urls */ enum mms_loc_t {MMS_LOC_MMBOX = 1, MMS_LOC_MQUEUE=2}; -/* Returns mmsbox settings. */ -MmsBoxSettings *mms_load_mmsbox_settings(Cfg *cfg, List **proxyrelays); - - -/* Returns list of MmsProxyRelay */ -extern List *mms_proxy_relays(Cfg *cfg); - -extern Octstr *mms_makefetchurl(char *qf, Octstr *token, int loc, - Octstr *to, - MmsBoxSettings *settings); extern Octstr *mms_maketransid(char *qf, Octstr *mmscname); @@ -146,7 +59,6 @@ extern Octstr *mms_getqf_fromtransid(Octstr *transid); extern int mms_decodefetchurl(Octstr *fetch_url, Octstr **qf, Octstr **token, int *loc); -Octstr *mms_find_sender_msisdn(Octstr *send_url, List *request_hdrs, Octstr *msisdn_header, MmsDetokenizerFuncStruct *detokenizerfuncs); Octstr *mms_find_sender_ip(List *request_hdrs, Octstr *ip_header, Octstr *ip, int *isv6); extern Octstr *mms_isodate(time_t t); diff --git a/mbuni/mmsc/Makefile.am b/mbuni/mmsc/Makefile.am index ed40ef3..ac620e1 100644 --- a/mbuni/mmsc/Makefile.am +++ b/mbuni/mmsc/Makefile.am @@ -1,2 +1,12 @@ +noinst_LIBRARIES = libmmsc.a +libmmsc_a_SOURCES = mmsc_cfg.h mmsc_cfg.c mms_detokenize.c mms_detokenize.h mms_resolve.h mms_resolve.c mms_billing.c mms_billing.h + bin_PROGRAMS = mmsrelay mmsproxy mmsfromemail mmssend -mmsrelay_SOURCES = mmsglobalsender.c mmsmobilesender.c mmsrelay.h mmsrelay.c +mmsrelay_SOURCES = mmsglobalsender.c mmsmobilesender.c mmsrelay.c +LDADD = libmmsc.a $(INITLIBS) + +plugindir = $(libdir)/mbuni +plugin_LTLIBRARIES = libmmsc_billing_shell.la libmmsc_resolve_shell.la libmmsc_detokenize_shell.la +libmmsc_billing_shell_la_SOURCES = mms_billing_shell.c +libmmsc_resolve_shell_la_SOURCES = mms_resolve_shell.c +libmmsc_detokenize_shell_la_SOURCES = mms_detokenize_shell.c diff --git a/mbuni/mmsc/Makefile.in b/mbuni/mmsc/Makefile.in index 3191e3f..c52eee8 100644 --- a/mbuni/mmsc/Makefile.in +++ b/mbuni/mmsc/Makefile.in @@ -14,7 +14,9 @@ @SET_MAKE@ -SOURCES = mmsfromemail.c mmsproxy.c $(mmsrelay_SOURCES) mmssend.c + + +SOURCES = $(libmmsc_a_SOURCES) $(libmmsc_billing_shell_la_SOURCES) $(libmmsc_detokenize_shell_la_SOURCES) $(libmmsc_resolve_shell_la_SOURCES) mmsfromemail.c mmsproxy.c $(mmsrelay_SOURCES) mmssend.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -49,22 +51,53 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +libmmsc_a_AR = $(AR) $(ARFLAGS) +libmmsc_a_LIBADD = +am_libmmsc_a_OBJECTS = mmsc_cfg.$(OBJEXT) mms_detokenize.$(OBJEXT) \ + mms_resolve.$(OBJEXT) mms_billing.$(OBJEXT) +libmmsc_a_OBJECTS = $(am_libmmsc_a_OBJECTS) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(bindir)" +pluginLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(plugin_LTLIBRARIES) +libmmsc_billing_shell_la_LIBADD = +am_libmmsc_billing_shell_la_OBJECTS = mms_billing_shell.lo +libmmsc_billing_shell_la_OBJECTS = \ + $(am_libmmsc_billing_shell_la_OBJECTS) +libmmsc_detokenize_shell_la_LIBADD = +am_libmmsc_detokenize_shell_la_OBJECTS = mms_detokenize_shell.lo +libmmsc_detokenize_shell_la_OBJECTS = \ + $(am_libmmsc_detokenize_shell_la_OBJECTS) +libmmsc_resolve_shell_la_LIBADD = +am_libmmsc_resolve_shell_la_OBJECTS = mms_resolve_shell.lo +libmmsc_resolve_shell_la_OBJECTS = \ + $(am_libmmsc_resolve_shell_la_OBJECTS) binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) mmsfromemail_SOURCES = mmsfromemail.c mmsfromemail_OBJECTS = mmsfromemail.$(OBJEXT) mmsfromemail_LDADD = $(LDADD) +mmsfromemail_DEPENDENCIES = libmmsc.a mmsproxy_SOURCES = mmsproxy.c mmsproxy_OBJECTS = mmsproxy.$(OBJEXT) mmsproxy_LDADD = $(LDADD) +mmsproxy_DEPENDENCIES = libmmsc.a am_mmsrelay_OBJECTS = mmsglobalsender.$(OBJEXT) \ mmsmobilesender.$(OBJEXT) mmsrelay.$(OBJEXT) mmsrelay_OBJECTS = $(am_mmsrelay_OBJECTS) mmsrelay_LDADD = $(LDADD) +mmsrelay_DEPENDENCIES = libmmsc.a mmssend_SOURCES = mmssend.c mmssend_OBJECTS = mmssend.$(OBJEXT) mmssend_LDADD = $(LDADD) +mmssend_DEPENDENCIES = libmmsc.a DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -76,8 +109,15 @@ LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = mmsfromemail.c mmsproxy.c $(mmsrelay_SOURCES) mmssend.c -DIST_SOURCES = mmsfromemail.c mmsproxy.c $(mmsrelay_SOURCES) mmssend.c +SOURCES = $(libmmsc_a_SOURCES) $(libmmsc_billing_shell_la_SOURCES) \ + $(libmmsc_detokenize_shell_la_SOURCES) \ + $(libmmsc_resolve_shell_la_SOURCES) mmsfromemail.c mmsproxy.c \ + $(mmsrelay_SOURCES) mmssend.c +DIST_SOURCES = $(libmmsc_a_SOURCES) \ + $(libmmsc_billing_shell_la_SOURCES) \ + $(libmmsc_detokenize_shell_la_SOURCES) \ + $(libmmsc_resolve_shell_la_SOURCES) mmsfromemail.c mmsproxy.c \ + $(mmsrelay_SOURCES) mmssend.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -179,7 +219,15 @@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ -mmsrelay_SOURCES = mmsglobalsender.c mmsmobilesender.c mmsrelay.h mmsrelay.c +noinst_LIBRARIES = libmmsc.a +libmmsc_a_SOURCES = mmsc_cfg.h mmsc_cfg.c mms_detokenize.c mms_detokenize.h mms_resolve.h mms_resolve.c mms_billing.c mms_billing.h +mmsrelay_SOURCES = mmsglobalsender.c mmsmobilesender.c mmsrelay.c +LDADD = libmmsc.a $(INITLIBS) +plugindir = $(libdir)/mbuni +plugin_LTLIBRARIES = libmmsc_billing_shell.la libmmsc_resolve_shell.la libmmsc_detokenize_shell.la +libmmsc_billing_shell_la_SOURCES = mms_billing_shell.c +libmmsc_resolve_shell_la_SOURCES = mms_resolve_shell.c +libmmsc_detokenize_shell_la_SOURCES = mms_detokenize_shell.c all: all-am .SUFFIXES: @@ -213,6 +261,46 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libmmsc.a: $(libmmsc_a_OBJECTS) $(libmmsc_a_DEPENDENCIES) + -rm -f libmmsc.a + $(libmmsc_a_AR) libmmsc.a $(libmmsc_a_OBJECTS) $(libmmsc_a_LIBADD) + $(RANLIB) libmmsc.a +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(mkdir_p) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(pluginLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) --mode=install $(pluginLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(plugindir)/$$f"; \ + else :; fi; \ + done + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$p"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libmmsc_billing_shell.la: $(libmmsc_billing_shell_la_OBJECTS) $(libmmsc_billing_shell_la_DEPENDENCIES) + $(LINK) -rpath $(plugindir) $(libmmsc_billing_shell_la_LDFLAGS) $(libmmsc_billing_shell_la_OBJECTS) $(libmmsc_billing_shell_la_LIBADD) $(LIBS) +libmmsc_detokenize_shell.la: $(libmmsc_detokenize_shell_la_OBJECTS) $(libmmsc_detokenize_shell_la_DEPENDENCIES) + $(LINK) -rpath $(plugindir) $(libmmsc_detokenize_shell_la_LDFLAGS) $(libmmsc_detokenize_shell_la_OBJECTS) $(libmmsc_detokenize_shell_la_LIBADD) $(LIBS) +libmmsc_resolve_shell.la: $(libmmsc_resolve_shell_la_OBJECTS) $(libmmsc_resolve_shell_la_DEPENDENCIES) + $(LINK) -rpath $(plugindir) $(libmmsc_resolve_shell_la_LDFLAGS) $(libmmsc_resolve_shell_la_OBJECTS) $(libmmsc_resolve_shell_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" @@ -260,6 +348,13 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_billing.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_billing_shell.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_detokenize.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_detokenize_shell.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_resolve.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mms_resolve_shell.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmsc_cfg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmsfromemail.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmsglobalsender.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmsmobilesender.Po@am__quote@ @@ -375,9 +470,9 @@ distdir: $(DISTFILES) done check-am: all-am check: check-am -all-am: Makefile $(PROGRAMS) +all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) $(PROGRAMS) installdirs: - for dir in "$(DESTDIR)$(bindir)"; do \ + for dir in "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am @@ -406,7 +501,8 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am +clean-am: clean-binPROGRAMS clean-generic clean-libtool \ + clean-noinstLIBRARIES clean-pluginLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) @@ -424,7 +520,7 @@ info: info-am info-am: -install-data-am: +install-data-am: install-pluginLTLIBRARIES install-exec-am: install-binPROGRAMS @@ -452,19 +548,22 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-info-am +uninstall-am: uninstall-binPROGRAMS uninstall-info-am \ + uninstall-pluginLTLIBRARIES .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-generic clean-libtool ctags distclean distclean-compile \ + clean-generic clean-libtool clean-noinstLIBRARIES \ + clean-pluginLTLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-binPROGRAMS uninstall-info-am + install-pluginLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-info-am uninstall-pluginLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/mbuni/mmlib/mms_billing.c b/mbuni/mmsc/mms_billing.c similarity index 100% rename from mbuni/mmlib/mms_billing.c rename to mbuni/mmsc/mms_billing.c diff --git a/mbuni/mmlib/mms_billing.h b/mbuni/mmsc/mms_billing.h similarity index 100% rename from mbuni/mmlib/mms_billing.h rename to mbuni/mmsc/mms_billing.h diff --git a/mbuni/mmlib/mms_billing_shell.c b/mbuni/mmsc/mms_billing_shell.c similarity index 100% rename from mbuni/mmlib/mms_billing_shell.c rename to mbuni/mmsc/mms_billing_shell.c diff --git a/mbuni/mmlib/mms_detokenize.c b/mbuni/mmsc/mms_detokenize.c similarity index 92% rename from mbuni/mmlib/mms_detokenize.c rename to mbuni/mmsc/mms_detokenize.c index 54b1f3d..f0a5793 100644 --- a/mbuni/mmlib/mms_detokenize.c +++ b/mbuni/mmsc/mms_detokenize.c @@ -38,9 +38,9 @@ static Octstr *mms_gettoken(Octstr *msisdn) } /* The function itself. */ -MmsTokenize mms_detokenizefuncs = { +MmsDetokenizerFuncStruct mms_detokenizefuncs = { mms_detokenizer_init, mms_detokenize, mms_gettoken, - mms_detokenize_fini + mms_detokenizer_fini }; diff --git a/mbuni/mmlib/mms_detokenize.h b/mbuni/mmsc/mms_detokenize.h similarity index 100% rename from mbuni/mmlib/mms_detokenize.h rename to mbuni/mmsc/mms_detokenize.h diff --git a/mbuni/mmlib/mms_detokenize_shell.c b/mbuni/mmsc/mms_detokenize_shell.c similarity index 100% rename from mbuni/mmlib/mms_detokenize_shell.c rename to mbuni/mmsc/mms_detokenize_shell.c diff --git a/mbuni/mmlib/mms_resolve.c b/mbuni/mmsc/mms_resolve.c similarity index 94% rename from mbuni/mmlib/mms_resolve.c rename to mbuni/mmsc/mms_resolve.c index 603afb1..e3abe97 100644 --- a/mbuni/mmlib/mms_resolve.c +++ b/mbuni/mmsc/mms_resolve.c @@ -13,7 +13,7 @@ #include #include #include "mms_resolve.h" -#include "mms_util.h" +#include "mmsc_cfg.h" static void *mms_resolvermodule_init(char *settings) { @@ -31,7 +31,7 @@ static Octstr *mms_resolve(Octstr * phonenum, void *module_data, void *settings_ * but this one needs them */ - MmsBoxSettings *settings = (MmsBoxSettings *) settings_p; + MmscSettings *settings = (MmscSettings *) settings_p; List *proxyrelays = (List *) proxyrelays_p; int j, m; diff --git a/mbuni/mmlib/mms_resolve.h b/mbuni/mmsc/mms_resolve.h similarity index 97% rename from mbuni/mmlib/mms_resolve.h rename to mbuni/mmsc/mms_resolve.h index bb321e2..404e46c 100644 --- a/mbuni/mmlib/mms_resolve.h +++ b/mbuni/mmsc/mms_resolve.h @@ -22,7 +22,7 @@ * hostname, the msisdn is considered local. */ -typedef struct MmsRevolverFuncStruct { +typedef struct MmsResolverFuncStruct { /* This function is called once to initialise the resolver module. Return a generic object, * which is passed with each resolution request.. */ diff --git a/mbuni/mmlib/mms_resolve_shell.c b/mbuni/mmsc/mms_resolve_shell.c similarity index 100% rename from mbuni/mmlib/mms_resolve_shell.c rename to mbuni/mmsc/mms_resolve_shell.c diff --git a/mbuni/mmsc/mmsc_cfg.c b/mbuni/mmsc/mmsc_cfg.c new file mode 100644 index 0000000..f8cd18f --- /dev/null +++ b/mbuni/mmsc/mmsc_cfg.c @@ -0,0 +1,444 @@ +/* + * Mbuni - Open Source MMS Gateway + * + * MMS send: Inject message into queue for delivery. + * + * 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 +#include "mmsc_cfg.h" + + +#define MAXQTRIES 100 +#define BACKOFF_FACTOR 5*60 /* In seconds */ +#define QUEUERUN_INTERVAL 15*60 /* 15 minutes. */ +#define DEFAULT_EXPIRE 3600*24*7 /* One week */ +#define MMS_PORT 8191 /* Default content fetch port. */ + +static Octstr *cfg_getx(CfgGroup *grp, Octstr *item) +{ + Octstr *v = cfg_get(grp, item); + + return v ? v : octstr_create(""); +} + + +static void *load_module(CfgGroup *grp, char *config_key, char *symbolname) +{ + Octstr *s; + void *retval = NULL; + + s = cfg_get(grp, octstr_imm(config_key)); + if (s) { + void *x = dlopen(octstr_get_cstr(s), RTLD_LAZY); + void *y = NULL; +#ifdef __APPLE__ + char sbuf[512]; + + sprintf(sbuf, "_%s", symbolname); +#endif + if (x == NULL || ((y = dlsym(x, symbolname)) == NULL +#ifdef __APPLE__ /* fink version of dlsym has issues it seems. */ + && (y = dlsym(x, sbuf)) == NULL +#endif + )) + + panic(0, + "Error, unable to load dynamic libary (%s): " + "libhandle is %s, funcs is %s, err=%s", + octstr_get_cstr(s), + x ? "OK" : "Not OK", y ? "OK" : "Not OK", dlerror()); + else + retval = y; + + octstr_destroy(s); + } + return retval; +} + +MmscSettings *mms_load_mmsc_settings(Cfg *cfg, List **proxyrelays) +{ + long loglevel; + Octstr *s; + Octstr *log, *alog; + List *l; + CfgGroup *grp = cfg_get_single_group(cfg, octstr_imm("mmsbox")); + CfgGroup *cgrp = cfg_get_single_group(cfg, octstr_imm("core")); + MmscSettings *m = gw_malloc(sizeof *m); + long port = -1; + Octstr *http_proxy_host, *user, *pass, *from; + Octstr *qdir = NULL; + int i, n; + + memset(m, 0, sizeof *m); + + /* Set the log file. */ + log = cfg_get(cgrp, octstr_imm("log-file")); + if (log != NULL) { + if (cfg_get_integer(&loglevel, cgrp, octstr_imm("log-level")) == -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")); + 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) { + + Octstr *username = cfg_get(cgrp, + octstr_imm("http-proxy-username")); + Octstr *password = cfg_get(cgrp, + octstr_imm("http-proxy-password")); + List *exceptions = 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")); + + if (http_proxy_port > 0) + http_use_proxy(http_proxy_host, http_proxy_port, + exceptions, username, password); + octstr_destroy(http_proxy_host); + octstr_destroy(username); + octstr_destroy(password); + list_destroy(exceptions, octstr_destroy_item); + } + + if (proxyrelays) + *proxyrelays = mms_proxy_relays(cfg); + + + s = cfg_getx(grp, octstr_imm("local-mmsc-domains")); + + if (s) { + l = octstr_split(s, octstr_imm(",")); + octstr_destroy(s); + } else + l = list_create(); + m->local_domains = l; + + if (cfg_get_integer(&m->maxthreads, grp, octstr_imm("max-send-threads")) == -1) + m->maxthreads = 10; + + m->unified_prefix = cfg_getx(grp, octstr_imm("unified-prefix")); + m->local_prefix = cfg_getx(grp, octstr_imm("local-prefixes")); + m->hostname = cfg_getx(grp, octstr_imm("hostname")); + + if (m->hostname == NULL || octstr_len(m->hostname) == 0) + m->hostname = octstr_create("localhost"); + + m->name = cfg_getx(grp, octstr_imm("name")); + m->host_alias = cfg_getx(grp, octstr_imm("host-alias")); + + m->sendmail = cfg_getx(grp, octstr_imm("send-mail-prog")); + + qdir = cfg_getx(grp, octstr_imm("storage-directory")); + + if (mkdir(octstr_get_cstr(qdir), + S_IRWXU|S_IRWXG) < 0 && + errno != EEXIST) + panic(0, "Failed to create queue directory: %s - %s!", + octstr_get_cstr(qdir), strerror(errno)); + + m->global_queuedir = octstr_format("%S/global", qdir); + m->mm1_queuedir = octstr_format("%S/mm1", qdir); + m->mm4_queuedir = octstr_format("%S/mm4", qdir); + + + if (mms_init_queuedir(m->mm1_queuedir) < 0) + panic(0, "Failed to initialise local queue directory: %s - %s!", + octstr_get_cstr(m->mm1_queuedir), strerror(errno)); + else if (mms_init_queuedir(m->global_queuedir) < 0) + panic(0, "Failed to initialise global queue directory: %s - %s!", + octstr_get_cstr(m->global_queuedir), strerror(errno)); + else if (mms_init_queuedir(m->mm4_queuedir) < 0) + panic(0, "Failed to initialise global queue directory: %s - %s!", + octstr_get_cstr(m->mm4_queuedir), strerror(errno)); + + m->mmbox_rootdir = octstr_format("%S/mmbox", qdir); + + if (mmbox_root_init(octstr_get_cstr(m->mmbox_rootdir)) != 0) + panic(0, "Failed to initialise mmbox root directory, error: %s!", + strerror(errno)); + + m->ua_profile_cache_dir = octstr_format("%S/UserAgent_Profiles", qdir); + + if (mkdir(octstr_get_cstr(m->ua_profile_cache_dir), + S_IRWXU|S_IRWXG) < 0 && + errno != EEXIST) + 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) + m->maxsendattempts = MAXQTRIES; + + if (cfg_get_integer(&m->default_msgexpiry, grp, octstr_imm("default-message-expiry")) == -1) + m->default_msgexpiry = DEFAULT_EXPIRE; + + s = cfg_getx(grp, octstr_imm("queue-run-interval")); + if (!s || (m->queue_interval = atof(octstr_get_cstr(s))) <= 0) + m->queue_interval = QUEUERUN_INTERVAL; + + if (cfg_get_integer(&m->send_back_off, grp, octstr_imm("send-attempt-back-off")) == -1) + m->send_back_off = BACKOFF_FACTOR; + + /* Make send sms url. */ + m->sendsms_url = cfg_getx(grp, octstr_imm("sendsms-url")); + + user = cfg_getx(grp, octstr_imm("sendsms-username")); + pass = cfg_getx(grp, octstr_imm("sendsms-password")); + from = cfg_get(grp, octstr_imm("sendsms-global-sender")); + + if (user && octstr_len(user) > 1) + octstr_url_encode(user); + if (pass && octstr_len(pass) > 1) + octstr_url_encode(pass); + if (from && octstr_len(from) > 1) + octstr_url_encode(from); + + + octstr_format_append(m->sendsms_url, + (from && octstr_len(from) > 1) ? + "?username=%S&password=%S&from=%S" : + "?username=%S&password=%S", + user, + pass,from); + + m->system_user = octstr_format("system-user@%S", + m->hostname); + octstr_destroy(user); + octstr_destroy(pass); + if (from) octstr_destroy(from); + + cfg_get_integer(&port, grp, octstr_imm("mms-port")); + + m->port = (port > 0) ? port : MMS_PORT; + + m->mm7port = -1; + cfg_get_integer(&m->mm7port, grp, octstr_imm("mm7-port")); + + m->allow_ip = cfg_getx(grp, octstr_imm("allow-ip")); + m->deny_ip = cfg_getx(grp, octstr_imm("deny-ip")); + + m->email2mmsrelay_prefixes = cfg_getx(grp, + octstr_imm("email2mms-relay-prefixes")); + + m->prov_notify = cfg_getx(grp,octstr_imm("prov-server-notify-script")); + + m->prov_getstatus = cfg_getx(grp,octstr_imm("prov-server-sub-status-script")); + m->mms_notify_txt = cfg_getx(grp, octstr_imm("mms-notify-text")); + m->mms_notify_unprov_txt = cfg_getx(grp, octstr_imm("mms-notify-unprovisioned-text")); + + + m->mms_email_txt = cfg_getx(grp, octstr_imm("mms-to-email-txt")); + m->mms_email_html = cfg_getx(grp, octstr_imm("mms-to-email-html")); + + m->mms_toolarge = cfg_getx(grp, octstr_imm("mms-message-too-large-txt")); + + m->wap_gw_msisdn_header = 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")); + 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")); + + m->billing_params = cfg_getx(grp, + octstr_imm("billing-module-parameters")); + /* Get and load the billing lib if any. */ + + if ((m->mms_billfuncs = load_module(grp, "billing-library", "mms_billfuncs"))) { + if (m->mms_billfuncs->mms_billingmodule_init == NULL || + m->mms_billfuncs->mms_billmsg == NULL || + m->mms_billfuncs->mms_billingmodule_fini == NULL || + m->mms_billfuncs->mms_logcdr == NULL) + panic(0, "Missing or NULL functions in billing module!"); + } else + m->mms_billfuncs = &mms_billfuncs; /* The default one. */ + + m->mms_bill_module_data = m->mms_billfuncs->mms_billingmodule_init(octstr_get_cstr(m->billing_params)); + + m->resolver_params = cfg_getx(grp, + octstr_imm("resolver-module-parameters")); + + /* Get and load the resolver lib if any. */ + if ((m->mms_resolvefuncs = load_module(grp, "resolver-library", "mms_resolvefuncs"))) { + if (m->mms_resolvefuncs->mms_resolvermodule_init == NULL || + m->mms_resolvefuncs->mms_resolve == NULL || + m->mms_resolvefuncs->mms_resolvermodule_fini == NULL) + panic(0, "Missing or NULL functions in resolver module!"); + } else + m->mms_resolvefuncs = &mms_resolvefuncs; /* The default one. */ + + m->mms_resolver_module_data = m->mms_resolvefuncs->mms_resolvermodule_init(octstr_get_cstr(m->resolver_params)); + + m->detokenizer_params = cfg_getx(grp, octstr_imm("detokenizer-module-parameters")); + + /* Get and load the detokenizer lib if any. */ + if ((m->mms_detokenizefuncs = load_module(grp, "detokenizer-library", "mms_detokenizefuncs"))) { + if (m->mms_detokenizefuncs->mms_detokenizer_init == NULL || + m->mms_detokenizefuncs->mms_detokenize == NULL || + m->mms_detokenizefuncs->mms_gettoken == NULL || + m->mms_detokenizefuncs->mms_detokenizer_fini == NULL) + panic(0, "Missing or NULL functions in detokenizer module!"); + if (m->mms_detokenizefuncs->mms_detokenizer_init(octstr_get_cstr(m->detokenizer_params))) + panic(0, "Detokenizer module failed to initialize"); + } else + m->mms_detokenizefuncs = NULL; + + if (cfg_get_bool(&m->allow_ip_type, grp, octstr_imm("allow-ip-type")) < 0) + m->allow_ip_type = 1; + + cfg_get_bool(&m->optimize_notification_size, grp, octstr_imm("optimize-notification-size")); + + if (cfg_get_bool(&m->content_adaptation, grp, octstr_imm("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")); + m->vasp_list = list_create(); + for (i=0, n=list_len(l); iid = cfg_getx(grp, octstr_imm("vasp-id")); + mv->short_code = -1; + cfg_get_integer(&mv->short_code, grp, octstr_imm("short-code")); + + mv->vasp_username = cfg_getx(grp, octstr_imm("vasp-username")); + mv->vasp_password = cfg_getx(grp, octstr_imm("vasp-password")); + + mv->vasp_url = cfg_getx(grp, octstr_imm("vasp-url")); + + mv->mmsc_username = cfg_getx(grp, octstr_imm("mmsc-username")); + mv->mmsc_password = cfg_getx(grp, octstr_imm("mmsc-password")); + + s = cfg_getx(grp, octstr_imm("type")); + + if (octstr_case_compare(s, octstr_imm("soap")) == 0) + mv->type = SOAP_VASP; + else if (octstr_case_compare(s, octstr_imm("eaif")) == 0) + mv->type = EAIF_VASP; + else + mv->type = NONE_VASP; + octstr_destroy(s); + + list_append(m->vasp_list, mv); + } + list_destroy(l, NULL); + return m; +} + +List *mms_proxy_relays(Cfg *cfg) +{ + List *gl = cfg_get_multi_group(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); + MmsProxyRelay *m = gw_malloc(sizeof *m); + + m->host = cfg_getx(grp, octstr_imm("host")); + m->name = cfg_getx(grp, octstr_imm("name")); + m->allowed_prefix = cfg_getx(grp, octstr_imm("allowed-prefix")); + m->denied_prefix = cfg_getx(grp, octstr_imm("denied-prefix")); + + list_append(l, m); + } + + list_destroy(gl, NULL); + + return l; +} + +Octstr *mms_makefetchurl(char *qf, Octstr *token, int loc, + Octstr *to, + MmscSettings *settings) +{ + Octstr *url = octstr_create(""); + Octstr *host_alias = settings->host_alias; + Octstr *hstr; + Octstr *endtoken, *x; + + MmsDetokenizerFuncStruct *tfs = settings->mms_detokenizefuncs; + + if (host_alias && octstr_len(host_alias) > 0) + hstr = octstr_duplicate(host_alias); + else + hstr = octstr_format("%S:%d", + settings->hostname, settings->port); + + octstr_format_append(url, "http://%S/%s@%d", + hstr, + qf, loc); + + if (tfs && tfs->mms_gettoken) { /* we append the recipient token or we append the message token. */ + endtoken = tfs->mms_gettoken(to); + if (!endtoken) + endtoken = octstr_imm("x"); + } else { + if (!token) + endtoken = octstr_imm("x"); + else + endtoken = octstr_duplicate(token); + } + + x = octstr_duplicate(endtoken); /* might be immutable, so we duplicate it. */ + octstr_url_encode(x); + octstr_format_append(url, "/%S", x); + + octstr_destroy(endtoken); + octstr_destroy(x); + octstr_destroy(hstr); + return url; +} + + +Octstr *mms_find_sender_msisdn(Octstr *send_url, List *request_hdrs, Octstr *msisdn_header, + MmsDetokenizerFuncStruct* detokenizerfuncs) +{ + /* Either we have a WAP gateway header as defined, or we look for + * last part of url, pass it to detokenizer lib if defined, and back comes our number. + */ + + Octstr *phonenum = http_header_value(request_hdrs, + msisdn_header); + + if (!phonenum || octstr_len(phonenum) == 0) { + List *l = octstr_split(send_url, octstr_imm("/")); + + if (l && list_len(l) > 1) { + if (detokenizerfuncs) + phonenum = detokenizerfuncs->mms_detokenize(list_get(l, list_len(l) - 1)); + } + if (l) + list_destroy(l, (list_item_destructor_t *)octstr_destroy); + } + + return phonenum; +} diff --git a/mbuni/mmsc/mmsc_cfg.h b/mbuni/mmsc/mmsc_cfg.h new file mode 100644 index 0000000..29a5550 --- /dev/null +++ b/mbuni/mmsc/mmsc_cfg.h @@ -0,0 +1,98 @@ +#ifndef __MMSC_CFG__ +#define __MMSC_CFG__ +#include "mms_util.h" +#include "mms_resolve.h" +#include "mms_billing.h" +#include "mms_detokenize.h" + +typedef struct MmsProxyRelay { + Octstr *host; + Octstr *name; + Octstr *allowed_prefix; + Octstr *denied_prefix; +} MmsProxyRelay; + +typedef struct MmsVasp { + Octstr *id; + long short_code; + enum {SOAP_VASP, EAIF_VASP, NONE_VASP} type; + Octstr *vasp_username, *vasp_password; + Octstr *vasp_url; + Octstr *mmsc_username, *mmsc_password; +} MmsVasp; + +typedef struct MmscSettings { + Octstr *system_user; + Octstr *name, *hostname, *host_alias; + List *local_domains; + Octstr *unified_prefix, *local_prefix; + Octstr *sendmail; + Octstr *global_queuedir, *mm1_queuedir, *mm4_queuedir; + Octstr *mmbox_rootdir; + + Octstr *ua_profile_cache_dir; + + long maxthreads; + long maxsendattempts; + long default_msgexpiry; + double queue_interval; + long send_back_off; + + long port, mm7port; + + Octstr *allow_ip; + Octstr *deny_ip; + + Octstr *email2mmsrelay_prefixes; + Octstr *sendsms_url; +#if 0 + Octstr *sendsms_user, *sendsms_pass, *sendsms_globalsender; +#endif + Octstr *billing_params; + + MmsBillingFuncStruct *mms_billfuncs; /* Link to billing funcs. */ + void *mms_bill_module_data; + + Octstr *resolver_params; + MmsResolverFuncStruct *mms_resolvefuncs; /* Link to resolver funcs. */ + void *mms_resolver_module_data; + + Octstr *detokenizer_params; + MmsDetokenizerFuncStruct *mms_detokenizefuncs; /* Link to detokenizer funcs. */ + void *mms_detokenizer_module_data; + + int allow_ip_type; + + int optimize_notification_size; + int content_adaptation; + + Octstr *prov_notify; + + Octstr *prov_getstatus; + int notify_unprovisioned; + Octstr *mms_notify_txt; + Octstr *mms_notify_unprov_txt; + Octstr *mms_toolarge; + + Octstr *mms_email_txt; + Octstr *mms_email_html; + Octstr *wap_gw_msisdn_header; + Octstr *wap_gw_ip_header; + + List *vasp_list; /* of MmsVasp * */ +} MmscSettings; + +/* Returns mmsc settings. */ +MmscSettings *mms_load_mmsc_settings(Cfg *cfg, List **proxyrelays); + +/* Returns list of MmsProxyRelay */ +extern List *mms_proxy_relays(Cfg *cfg); + +extern Octstr *mms_makefetchurl(char *qf, Octstr *token, int loc, + Octstr *to, + MmscSettings *settings); + +Octstr *mms_find_sender_msisdn(Octstr *send_url, List *request_hdrs, + Octstr *msisdn_header, + MmsDetokenizerFuncStruct *detokenizerfuncs); +#endif diff --git a/mbuni/mmsc/mmsfromemail.c b/mbuni/mmsc/mmsfromemail.c index 3fc4810..3cb124a 100644 --- a/mbuni/mmsc/mmsfromemail.c +++ b/mbuni/mmsc/mmsfromemail.c @@ -13,9 +13,9 @@ #include #include "mms_queue.h" -#include "mms_util.h" +#include "mmsc_cfg.h" -static MmsBoxSettings *settings; +static MmscSettings *settings; static Octstr *xfrom; static Octstr *xto; @@ -62,7 +62,7 @@ int main(int argc, char *argv[]) info(0, " MMSC Email2MMS Tool version %s starting", MMSC_VERSION); /* Load settings. */ - settings = mms_load_mmsbox_settings(cfg, &proxyrelays); + settings = mms_load_mmsc_settings(cfg, &proxyrelays); if (!settings) panic(0, "No global MMSC configuration!"); diff --git a/mbuni/mmsc/mmsproxy.c b/mbuni/mmsc/mmsproxy.c index 90f79aa..dc267cf 100644 --- a/mbuni/mmsc/mmsproxy.c +++ b/mbuni/mmsc/mmsproxy.c @@ -19,13 +19,13 @@ #include "mms_queue.h" #include "mms_uaprof.h" -#include "mms_util.h" +#include "mmsc_cfg.h" #include "mms_mm7soap.h" static Cfg *cfg; static List *proxyrelays; -static MmsBoxSettings *settings; +static MmscSettings *settings; static int rstop = 0; static void quit_now(int notused) @@ -86,7 +86,7 @@ int main(int argc, char *argv[]) /* Load settings. */ - settings = mms_load_mmsbox_settings(cfg, &proxyrelays); + settings = mms_load_mmsc_settings(cfg, &proxyrelays); cfg_destroy(cfg); diff --git a/mbuni/mmsc/mmsrelay.c b/mbuni/mmsc/mmsrelay.c index 9885121..5efc543 100644 --- a/mbuni/mmsc/mmsrelay.c +++ b/mbuni/mmsc/mmsrelay.c @@ -13,7 +13,7 @@ #include "mmsrelay.h" static Cfg *cfg; -MmsBoxSettings *settings; +MmscSettings *settings; List *proxyrelays; @@ -52,7 +52,7 @@ int main(int argc, char *argv[]) info(0, " " MM_NAME " MMSC Relay version %s starting", MMSC_VERSION); - settings = mms_load_mmsbox_settings(cfg,&proxyrelays); + settings = mms_load_mmsc_settings(cfg,&proxyrelays); cfg_destroy(cfg); diff --git a/mbuni/mmsc/mmsrelay.h b/mbuni/mmsc/mmsrelay.h index da27fbc..3ecb695 100644 --- a/mbuni/mmsc/mmsrelay.h +++ b/mbuni/mmsc/mmsrelay.h @@ -18,11 +18,11 @@ #include #include "mms_queue.h" #include "mms_uaprof.h" -#include "mms_util.h" +#include "mmsc_cfg.h" #include "mms_mm7soap.h" extern void mbuni_global_queue_runner(int *stopflag); extern void mbuni_mm1_queue_runner(int *stopflag); -extern MmsBoxSettings *settings; +extern MmscSettings *settings; extern List *proxyrelays; #endif diff --git a/mbuni/mmsc/mmssend.c b/mbuni/mmsc/mmssend.c index 3f4814d..a9040f8 100644 --- a/mbuni/mmsc/mmssend.c +++ b/mbuni/mmsc/mmssend.c @@ -15,7 +15,7 @@ #include #include "mms_queue.h" #include "mms_uaprof.h" -#include "mms_util.h" +#include "mmsc_cfg.h" #include "mms_mmbox.h" @@ -26,7 +26,7 @@ static MmsMsg *m; static int savetommbox; Octstr *mmbox; -static MmsBoxSettings *settings; +static MmscSettings *settings; static int find_own(int i, int argc, char *argv[]) { @@ -99,7 +99,7 @@ int main(int argc, char *argv[]) /* Load settings. */ - settings = mms_load_mmsbox_settings(cfg, &proxyrelays); + settings = mms_load_mmsc_settings(cfg, &proxyrelays); if (!settings) panic(0, "No global MMSC configuration!");