diff --git a/mbuni/ChangeLog b/mbuni/ChangeLog index 1a33b76..69bca34 100644 --- a/mbuni/ChangeLog +++ b/mbuni/ChangeLog @@ -1,3 +1,5 @@ +2007-09-25 P. A. Bagyenda + * Added flag to conditionally remove mm7: XML namespace prefix 2007-09-18 P. A. Bagyenda * Support for custom MM7 MMC types using a loadable module. 2007-09-17 P. A. Bagyenda diff --git a/mbuni/doc/userguide.shtml b/mbuni/doc/userguide.shtml index 9b62112..1e23521 100644 --- a/mbuni/doc/userguide.shtml +++ b/mbuni/doc/userguide.shtml @@ -1767,6 +1767,21 @@ vasp-url + + + use-mm7-soap-namespace-prefix + + + Boolean + + + Optional. Set to true if the MM7/SOAP tags should have the + mm7: prefix. Some MMC/VAS GW implementations do not seem to + like this, so you can set this to false to see what mileage you get. + + + + @@ -2136,6 +2151,20 @@ Supported configuration parameters are: + + + use-mm7-soap-namespace-prefix + + + Boolean + + + Optional. Set to true if the MM7/SOAP tags should have the + mm7: prefix. Some MMC/VAS GW implementations do not seem to + like this, so you can set this to false to see what mileage you get. + + + mmsc-url diff --git a/mbuni/mmlib/mms_cfg.def b/mbuni/mmlib/mms_cfg.def index c68693e..6cc514b 100644 --- a/mbuni/mmlib/mms_cfg.def +++ b/mbuni/mmlib/mms_cfg.def @@ -104,6 +104,7 @@ MULTI_GROUP(mms-vasp, OCTSTR(type) OCTSTR(mm7-version) OCTSTR(mm7-soap-xmlns) + OCTSTR(use-mm7-soap-namespace-prefix) OCTSTR(short-code) OCTSTR(vasp-username) OCTSTR(vasp-password) @@ -137,6 +138,7 @@ MULTI_GROUP(mmsc, OCTSTR(type) OCTSTR(mm7-version) OCTSTR(mm7-soap-xmlns) + OCTSTR(use-mm7-soap-namespace-prefix) OCTSTR(mm7-mt-filter-params) OCTSTR(reroute) OCTSTR(reroute-mmsc-id) diff --git a/mbuni/mmlib/mms_mm7soap.c b/mbuni/mmlib/mms_mm7soap.c index d3f8eb5..8bbcfe1 100644 --- a/mbuni/mmlib/mms_mm7soap.c +++ b/mbuni/mmlib/mms_mm7soap.c @@ -367,7 +367,7 @@ MSoapMsg_t *mm7_parse_soap(List *headers, Octstr *body) return smsg; } -static int append_address(Octstr *p, Octstr *addr_spec) +static int append_address(Octstr *p, Octstr *addr_spec, char *prefix) { Octstr *v = addr_spec; char *y; @@ -379,15 +379,15 @@ static int append_address(Octstr *p, Octstr *addr_spec) j = octstr_case_search(v, octstr_imm("/TYPE=PLMN"),0); if (j >= 0) { Octstr *z = octstr_copy(v, 2, j-2); /* skip the initial char that is only for info purposes. */ - octstr_format_append(p, "%S\n", y, z); + octstr_format_append(p, "<%sNumber%s>%S\n", prefix, y, z, prefix); octstr_destroy(z); } else - octstr_format_append(p, "%s\n", - y, octstr_get_cstr(v) + 2); /* as above... */ + octstr_format_append(p, "<%sRFC2822Address%s>%s\n", + prefix, y, octstr_get_cstr(v) + 2, prefix); /* as above... */ return 0; } -static void output_rcpt(char *hdr, List *hdrs, Octstr *p) +static void output_rcpt(char *hdr, List *hdrs, Octstr *p, char *prefix) { List *l = http_header_find_all(hdrs, hdr); char x[32]; @@ -399,16 +399,16 @@ static void output_rcpt(char *hdr, List *hdrs, Octstr *p) if (octstr_str_compare(h, x) != 0) { if (x[0]) - octstr_format_append(p, "\n", x); + octstr_format_append(p, "\n", prefix, x); strncpy(x, octstr_get_cstr(h), sizeof x); - octstr_format_append(p, "\n", h); + octstr_format_append(p, "<%s%S>\n", prefix, h); } octstr_destroy(h); - append_address(p, v); /* put the address in */ + append_address(p, v, prefix); /* put the address in */ octstr_destroy(v); } if (x[0]) /* close it off. */ - octstr_format_append(p, "\n", x); + octstr_format_append(p, "\n", prefix, x); http_destroy_headers(l); } @@ -431,7 +431,8 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver) Octstr *p, *q, *r, *fault, *mtype; int i, n, mtag; time_t t; - + char *prefix = ver->use_mm7_namespace ? "mm7:" : ""; + char *xml_nsp = ver->use_mm7_namespace ? ":mm7" : ""; MM7Version_t min_ver = {5,1,0}; /* minimum version we deal with. */ octstr_append_cstr(s, @@ -439,8 +440,11 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver) "<" SOAP_ENV ":Header>\n"); p = http_header_value(hdrs, octstr_imm("TransactionID")); - octstr_format_append(s, "%S\n", - octstr_get_cstr(xmlns), p ? p : octstr_imm("none")); + octstr_format_append(s, "<%sTransactionID xmlns%s=\"%s\" " SOAP_ENV + ":mustUnderstand=\"1\">%S\n", + prefix, xml_nsp, + octstr_get_cstr(xmlns), p ? p : octstr_imm("none"), + prefix); if (p) octstr_destroy(p); @@ -468,41 +472,41 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver) mtype = http_header_value(hdrs, octstr_imm("MessageType")); mtag = mms_string_to_mm7tag(mtype); - octstr_format_append(s, "\n", mtype, octstr_get_cstr(xmlns)); + octstr_format_append(s, "<%s%S xmlns%s=\"%s\">\n", prefix, mtype, xml_nsp, octstr_get_cstr(xmlns)); /* Output the details. */ if ((p = http_header_value(hdrs, octstr_imm("MM7Version"))) != NULL) { - octstr_format_append(s, "%S\n", p); + octstr_format_append(s, "<%sMM7Version>%S\n", prefix, p, prefix); octstr_destroy(p); } else - octstr_format_append(s, "%d.%d.%d\n", - ver->major, ver->minor1, ver->minor2); + octstr_format_append(s, "<%sMM7Version>%d.%d.%d\n", + prefix, ver->major, ver->minor1, ver->minor2, prefix); p = http_header_value(hdrs, octstr_imm("VASPID")); q = http_header_value(hdrs, octstr_imm("VASID")); r = http_header_value(hdrs, octstr_imm("SenderAddress")); if (p || q || r) { - octstr_append_cstr(s, "\n"); + octstr_format_append(s, "<%sSenderIdentification>\n", prefix); if (p) - octstr_format_append(s, "%S\n", p); + octstr_format_append(s, "<%sVASPID>%S\n", prefix, p, prefix); if (q) - octstr_format_append(s, "%S\n", q); + octstr_format_append(s, "<%sVASID>%S\n", prefix, q, prefix); if (r) { Octstr *xx = octstr_create(""); if (ver_compare(ver,&min_ver) > 0) - append_address(xx, r); + append_address(xx, r, prefix); else if (octstr_get_char(r, 0) != '-') /* not display only. */ octstr_format_append(xx, "%s", octstr_get_cstr(r) + 1); if (octstr_len(xx) > 0) - octstr_format_append(s, "%S\n", xx); + octstr_format_append(s, "<%sSenderAddress>%S\n", prefix, xx, prefix); octstr_destroy(xx); } - octstr_append_cstr(s, "\n"); + octstr_format_append(s, "\n", prefix); octstr_destroy(p); octstr_destroy(q); octstr_destroy(r); @@ -511,15 +515,15 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver) p = octstr_create(""); if (mtag == MM7_TAG_SubmitReq || mtag == MM7_TAG_DeliverReq) { /* Multiple recipients,... */ - output_rcpt("To", hdrs, p); - output_rcpt("Cc", hdrs, p); - output_rcpt("Bcc", hdrs, p); + output_rcpt("To", hdrs, p, prefix); + output_rcpt("Cc", hdrs, p, prefix); + output_rcpt("Bcc", hdrs, p, prefix); if (octstr_len(p) > 0) - octstr_format_append(s, "\n%S\n", p); + octstr_format_append(s, "<%sRecipients>\n%S\n", prefix, p, prefix); } else if ((q = http_header_value(hdrs, octstr_imm("To"))) != NULL) { - append_address(p, q); - octstr_format_append(s, "\n%S\n", p); + append_address(p, q, prefix); + octstr_format_append(s, "<%sRecipient>\n%S\n", prefix, p, prefix); octstr_destroy(q); } octstr_destroy(p); @@ -561,12 +565,12 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver) case MM7_TAG_Sender: p = octstr_create(""); if (ver_compare(ver,&min_ver) > 0) - append_address(p, v); + append_address(p, v, prefix); else if (octstr_get_char(v, 0) != '-') /* not display only. */ octstr_format_append(p, "%s", octstr_get_cstr(v) + 1); if (octstr_len(p) > 0) - octstr_format_append(s, "%S\n", p); + octstr_format_append(s, "<%sSender>%S\n", prefix, p, prefix); octstr_destroy(p); skip = 1; break; @@ -575,7 +579,7 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver) p = octstr_format(" allowAdaptations=\"%S\"", p); else p = octstr_imm(""); - octstr_format_append(s, "\n", v,p); + octstr_format_append(s, "<%sContent href=\"%S\"%S/>\n", prefix, v,p); octstr_destroy(p); skip = 1; break; @@ -583,7 +587,7 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver) p = http_header_value(hdrs, octstr_imm("replyChargingSize")); q = http_header_value(hdrs, octstr_imm("replyDeadline")); - octstr_append_cstr(s, "\n"); + octstr_format_append(s, "<%sStatus>\n", prefix); if (p) { - octstr_format_append(s, "%S\n", p); + octstr_format_append(s, "<%sStatusCode>%S\n", prefix, p, prefix); octstr_destroy(p); } if (q) { - octstr_format_append(s, "%S\n", q); + octstr_format_append(s, "<%sStatusText>%S\n", prefix, q, prefix); octstr_destroy(q); } q = http_header_value(hdrs, octstr_imm("Details")); if (q) { - octstr_format_append(s, "%S\n", q); + octstr_format_append(s, "<%sDetails>%S\n", prefix, q, prefix); octstr_destroy(q); } - octstr_append_cstr(s, "\n"); + octstr_format_append(s, "\n", prefix); skip = 1; break; case MM7_TAG_UACapabilities: @@ -634,8 +638,8 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver) } else t = time(NULL); p = date_create_iso(t); - octstr_format_append(s, "\n", - h, p, v); + octstr_format_append(s, "<%s%S TimeStamp=\"%S\" UAProf=\"%S\"/>\n", + prefix, h, p, v); octstr_destroy(p); skip = 1; break; @@ -644,12 +648,12 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver) } if (!skip && h && v) - octstr_format_append(s, "%S\n", h, v, h); + octstr_format_append(s, "<%s%S>%S\n", prefix, h, v, prefix, h); octstr_destroy(h); octstr_destroy(v); } - octstr_format_append(s, "\n", mtype); + octstr_format_append(s, "\n", prefix, mtype); octstr_destroy(mtype); if (fault) { octstr_append_cstr(s, "\n"); diff --git a/mbuni/mmlib/mms_mm7soap.h b/mbuni/mmlib/mms_mm7soap.h index 92b7ec1..f063a08 100644 --- a/mbuni/mmlib/mms_mm7soap.h +++ b/mbuni/mmlib/mms_mm7soap.h @@ -32,7 +32,8 @@ typedef struct MSoapMsg_t MSoapMsg_t; typedef struct MM7Version_t { int major, minor1, minor2; /* e.g. 5.1.0. */ - char xmlns[128]; + int use_mm7_namespace; /* whether to put in the namespace prefix. */ + char xmlns[128]; } MM7Version_t; /* Parse SOAP message given http headers and body. */ diff --git a/mbuni/mmlib/mms_msg.c b/mbuni/mmlib/mms_msg.c index 6eadd42..e734c29 100644 --- a/mbuni/mmlib/mms_msg.c +++ b/mbuni/mmlib/mms_msg.c @@ -1728,6 +1728,33 @@ MmsMsg *mms_sendconf(char *errstr, char *msgid, char *transid, int isforward, in return m; } +MmsMsg *mms_notifyresp_ind(char *transid, int menc, char *status, int report_allowed) +{ + MmsMsg *m = gw_malloc(sizeof *m); + + + m->ismultipart = 0; + m->msgId = NULL; + m->body.s = NULL; + + m->headers = http_create_empty_headers(); + + m->message_type = MMS_MSGTYPE_NOTIFYRESP; + http_header_add(m->headers, "X-Mms-Message-Type", "m-notifyresp-ind"); + http_header_add(m->headers, "X-Mms-Transaction-ID", transid); + + if (menc >= MS_1_2) + http_header_add(m->headers, "X-Mms-MMS-Version", "1.2"); + else + http_header_add(m->headers, "X-Mms-MMS-Version", MMS_DEFAULT_VERSION); + + + http_header_add(m->headers, "X-Mms-Status", status); + http_header_add(m->headers, "X-Mms-Report-Allowed", report_allowed ? "Yes" : "No"); + + return m; +} + int mms_make_sendreq(MmsMsg *retrieveconf) { diff --git a/mbuni/mmlib/mms_msg.h b/mbuni/mmlib/mms_msg.h index afb2463..89c7235 100644 --- a/mbuni/mmlib/mms_msg.h +++ b/mbuni/mmlib/mms_msg.h @@ -69,10 +69,12 @@ extern MmsMsg *mms_notification(MmsMsg *msg, unsigned int msize, Octstr *url, Octstr *transactionid, time_t expiryt, int optimizesize); +MmsMsg *mms_notifyresp_ind(char *transid, int menc, char *status, int report_allowed); MmsMsg *mms_retrieveconf(MmsMsg *msg, Octstr *transactionid, char *err, char *errtxt, Octstr *opt_from, int menc); int mms_remove_headers(MmsMsg *m, char *name); MmsMsg *mms_sendconf(char *errstr, char *msgid, char *transid, int isforward, int menc); + Octstr *mms_get_header_value(MmsMsg *msg, Octstr *header); /* Returns a list of values for the header given. */ diff --git a/mbuni/mmsbox/mmsbox.c b/mbuni/mmsbox/mmsbox.c index 9526efd..21e48bd 100644 --- a/mbuni/mmsbox/mmsbox.c +++ b/mbuni/mmsbox/mmsbox.c @@ -29,6 +29,7 @@ static void quit_now(int notused) MmscGrp *mmc; rstop = 1; + info(0, "shutdown in progress..."); /* Close all MMSC http ports, kill all MMSC threads, kill sendmms port... */ if (sendmms_port.port > 0) http_close_port(sendmms_port.port); diff --git a/mbuni/mmsbox/mmsbox_cfg.c b/mbuni/mmsbox/mmsbox_cfg.c index e6055a4..eb0a026 100644 --- a/mbuni/mmsbox/mmsbox_cfg.c +++ b/mbuni/mmsbox/mmsbox_cfg.c @@ -247,6 +247,9 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func) } else m->ver.xmlns[0] = 0; + m->ver.use_mm7_namespace = 1; + mms_cfg_get_bool(x, octstr_imm("use-mm7-soap-namespace-prefix"), &m->ver.use_mm7_namespace); + octstr_destroy(xver); octstr_destroy(type); diff --git a/mbuni/mmsc/mmsc_cfg.c b/mbuni/mmsc/mmsc_cfg.c index fd511ea..fc0127e 100644 --- a/mbuni/mmsc/mmsc_cfg.c +++ b/mbuni/mmsc/mmsc_cfg.c @@ -307,6 +307,9 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays) } else mv->ver.xmlns[0] = 0; + mv->ver.use_mm7_namespace = 1; + mms_cfg_get_bool(grp, octstr_imm("use-mm7-soap-namespace-prefix"), &mv->ver.use_mm7_namespace); + /* Set the handler vasp accounts. */ if (mms_cfg_get_bool(grp, octstr_imm("mms-to-email-handler"), &ibool) == 0 && ibool) {