From a22898306a427d5c288e5992e2cade1b2c175e5f Mon Sep 17 00:00:00 2001 From: bagyenda <> Date: Tue, 10 Apr 2007 09:56:46 +0000 Subject: [PATCH] Allowed setting of MM7/SOAP interface version --- mbuni/ChangeLog | 2 ++ mbuni/doc/userguide.shtml | 32 ++++++++++++++++++++++++++++++++ mbuni/mmlib/mms_cfg.def | 2 ++ mbuni/mmlib/mms_mm7soap.c | 32 ++++++++++++++++++-------------- mbuni/mmlib/mms_mm7soap.h | 6 +++++- mbuni/mmlib/mms_util.h | 2 +- mbuni/mmsbox/bearerbox.c | 18 ++++++++++++------ mbuni/mmsbox/mmsbox_cfg.c | 19 ++++++++++++++++++- mbuni/mmsbox/mmsbox_cfg.h | 2 ++ mbuni/mmsc/mmsc_cfg.c | 16 ++++++++++++++++ mbuni/mmsc/mmsc_cfg.h | 1 + mbuni/mmsc/mmsglobalsender.c | 11 +++++++---- mbuni/mmsc/mmsproxy.c | 11 +++++++---- 13 files changed, 123 insertions(+), 31 deletions(-) diff --git a/mbuni/ChangeLog b/mbuni/ChangeLog index 178d02b..d013899 100644 --- a/mbuni/ChangeLog +++ b/mbuni/ChangeLog @@ -1,3 +1,5 @@ +2007-04-10 P. A. Bagyenda + * MM7/SOAP XMLNS string now configurable via setting per-MMC (or per-VASP) interface version 2007-04-02 Vincent Chavanis * Added group-id field to VAS GW MMC config 2007-03-20 P. A. Bagyenda diff --git a/mbuni/doc/userguide.shtml b/mbuni/doc/userguide.shtml index 8ba6b54..0b5f71d 100644 --- a/mbuni/doc/userguide.shtml +++ b/mbuni/doc/userguide.shtml @@ -1688,6 +1688,23 @@ vasp-url This should be one of: soap, eaif + + + + mm7-version + + + String + + + Optional. The MM7 version to use on this interface. (defaults are "5.1.0" for + XML/SOAP, "3.0" for EAIF.) For SOAP, this is + used primarily to build the XML Namespace URL. For EAIF it is + reported in the HTTP headers. + + + + short-code @@ -2005,6 +2022,21 @@ Supported configuration parameters are: + + + mm7-version + + + String + + + Optional. The MM7 version to use on this interface. (defaults are "5.1.0" for + XML/SOAP, "3.0" for EAIF.) For SOAP, this is + used primarily to build the XML Namespace URL. For EAIF it is + reported in the HTTP headers. + + + mmsc-url diff --git a/mbuni/mmlib/mms_cfg.def b/mbuni/mmlib/mms_cfg.def index 51ca4f5..fe678d4 100644 --- a/mbuni/mmlib/mms_cfg.def +++ b/mbuni/mmlib/mms_cfg.def @@ -97,6 +97,7 @@ MULTI_GROUP(mmsproxy, MULTI_GROUP(mms-vasp, OCTSTR(vasp-id) OCTSTR(type) + OCTSTR(mm7-version) OCTSTR(short-code) OCTSTR(vasp-username) OCTSTR(vasp-password) @@ -127,6 +128,7 @@ MULTI_GROUP(mmsc, OCTSTR(incoming-port-ssl) OCTSTR(max-throughput) OCTSTR(type) + OCTSTR(mm7-version) ) MULTI_GROUP(mms-service, diff --git a/mbuni/mmlib/mms_mm7soap.c b/mbuni/mmlib/mms_mm7soap.c index 71a8b56..412b0f5 100644 --- a/mbuni/mmlib/mms_mm7soap.c +++ b/mbuni/mmlib/mms_mm7soap.c @@ -360,13 +360,15 @@ 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-2" +#define XMLNSMM7 "http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-%d-MM7-%d-%d" #define SOAP_ENV "SOAP-ENV" /* Construct by hand. */ -Octstr *headers_to_soapxml(List *hdrs) +static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver) { Octstr *s = octstr_create("\n"); + Octstr *xmlns = octstr_format(XMLNSMM7, ver->major, ver->minor1, ver->minor2); + Octstr *p, *q, *r, *fault, *mtype; int i, n; time_t t; @@ -378,7 +380,7 @@ Octstr *headers_to_soapxml(List *hdrs) p = http_header_value(hdrs, octstr_imm("TransactionID")); octstr_format_append(s, "%S\n", - XMLNSMM7, p ? p : octstr_imm("none")); + octstr_get_cstr(xmlns), p ? p : octstr_imm("none")); if (p) octstr_destroy(p); @@ -406,13 +408,15 @@ Octstr *headers_to_soapxml(List *hdrs) mtype = http_header_value(hdrs, octstr_imm("MessageType")); mtag = mms_string_to_mm7tag(mtype); - octstr_format_append(s, "\n", mtype, XMLNSMM7); + octstr_format_append(s, "\n", mtype, octstr_get_cstr(xmlns)); /* Output the details. */ - p = http_header_value(hdrs, octstr_imm("MM7Version")); - octstr_format_append(s, "%S\n", p); - octstr_destroy(p); - + if ((p = http_header_value(hdrs, octstr_imm("MM7Version"))) != NULL) { + octstr_format_append(s, "%S\n", p); + octstr_destroy(p); + } else + octstr_format_append(s, "%d.%d.%d\n", ver->major, ver->minor1, ver->minor2); + p = http_header_value(hdrs, octstr_imm("VASPID")); q = http_header_value(hdrs, octstr_imm("VASID")); r = http_header_value(hdrs, octstr_imm("SenderAddress")); @@ -452,8 +456,8 @@ Octstr *headers_to_soapxml(List *hdrs) octstr_format_append(s, "\n%S\n", p); octstr_destroy(q); } - octstr_destroy(p); - + octstr_destroy(p); + octstr_destroy(xmlns); /* cycle through rest of headers. */ @@ -573,7 +577,7 @@ Octstr *headers_to_soapxml(List *hdrs) return s; } -int mm7_soapmsg_to_httpmsg(MSoapMsg_t *m, List **hdrs, Octstr **body) +int mm7_soapmsg_to_httpmsg(MSoapMsg_t *m, MM7Version_t *ver, List **hdrs, Octstr **body) { MIMEEntity *mime; Octstr *ctype, *s; @@ -613,7 +617,7 @@ int mm7_soapmsg_to_httpmsg(MSoapMsg_t *m, List **hdrs, Octstr **body) mime_replace_headers(xml, hx); http_destroy_headers(hx); - s = headers_to_soapxml(hh); + s = headers_to_soapxml(hh,ver); mime_entity_set_body(xml, s); octstr_destroy(s); @@ -633,7 +637,7 @@ int mm7_soapmsg_to_httpmsg(MSoapMsg_t *m, List **hdrs, Octstr **body) mime_entity_destroy(c); } else { ctype = octstr_imm("text/xml"); - s = headers_to_soapxml(m->envelope); + s = headers_to_soapxml(m->envelope, ver); mime_entity_set_body(mime,s); octstr_destroy(s); } @@ -888,7 +892,7 @@ static MSoapMsg_t *mm7_soap_create(int msgtype, Octstr *otransid) m->msg = NULL; http_header_add(m->envelope, "MessageType", (char *)mms_mm7tag_to_cstr(msgtype)); - http_header_add(m->envelope, "MM7Version", MM7_DEFAULT_VERSION); + /* http_header_add(m->envelope, "MM7Version", MM7_DEFAULT_VERSION); */ http_header_add(m->envelope, "TransactionID", otransid ? octstr_get_cstr(otransid) : "0000"); return m; diff --git a/mbuni/mmlib/mms_mm7soap.h b/mbuni/mmlib/mms_mm7soap.h index 1de765b..f436f75 100644 --- a/mbuni/mmlib/mms_mm7soap.h +++ b/mbuni/mmlib/mms_mm7soap.h @@ -23,11 +23,15 @@ typedef struct MSoapMsg_t MSoapMsg_t; +typedef struct MM7Version_t { + int major, minor1, minor2; /* e.g. 5.1.0. */ +} MM7Version_t; + /* Parse SOAP message given http headers and body. */ extern MSoapMsg_t *mm7_parse_soap(List *headers, Octstr *body); /* Convert SOAP message to http headers and body. */ -extern int mm7_soapmsg_to_httpmsg(MSoapMsg_t *m, List **hdrs, Octstr **body); +extern int mm7_soapmsg_to_httpmsg(MSoapMsg_t *m, MM7Version_t *ver, List **hdrs, Octstr **body); /* Convert SOAP message to an MMS message. */ extern MmsMsg *mm7_soap_to_mmsmsg(MSoapMsg_t *m, Octstr *from); diff --git a/mbuni/mmlib/mms_util.h b/mbuni/mmlib/mms_util.h index 38f9db3..5604485 100644 --- a/mbuni/mmlib/mms_util.h +++ b/mbuni/mmlib/mms_util.h @@ -40,7 +40,7 @@ #define XIP_HEADER "X-WAP-Network-Client-IP" #define MM_NAME "Mbuni" -#define EAIF_VERSION "3.0" +#define EAIF_VERSION "%d.%d" /* used by mmbox and queue code -- directory stuff. */ #define _TT "0123456789abcdefghijklmnopqrstuvwxyz" diff --git a/mbuni/mmsbox/bearerbox.c b/mbuni/mmsbox/bearerbox.c index 381894c..cfe52dd 100644 --- a/mbuni/mmsbox/bearerbox.c +++ b/mbuni/mmsbox/bearerbox.c @@ -240,7 +240,7 @@ static void mm7soap_receive(MmsHTTPClientInfo *h) done: - if (mresp && mm7_soapmsg_to_httpmsg(mresp, &rh, &reply_body) == 0) + if (mresp && mm7_soapmsg_to_httpmsg(mresp, &h->m->ver, &rh, &reply_body) == 0) http_send_reply(h->client, hstatus, rh, reply_body); else http_close_client(h->client); @@ -292,7 +292,7 @@ static void mm7eaif_receive(MmsHTTPClientInfo *h) Octstr *subject = NULL, *otransid = NULL, *msgid = NULL; Octstr *hfrom = NULL; time_t expiryt = -1, deliveryt = -1; - Octstr *qf = NULL; + Octstr *qf = NULL, *xver; int msize = h->body ? octstr_len(h->body) : 0; int dlr; int mtype; @@ -423,7 +423,10 @@ static void mm7eaif_receive(MmsHTTPClientInfo *h) } done: - http_header_add(rh, "X-NOKIA-MMSC-Version", EAIF_VERSION); + + xver = octstr_format(EAIF_VERSION, h->m->ver.major, h->m->ver.minor1); + http_header_add(rh, "X-NOKIA-MMSC-Version", octstr_get_cstr(xver)); + octstr_destroy(xver); http_send_reply(h->client, hstatus, rh, octstr_imm("")); @@ -577,7 +580,7 @@ static Octstr *mm7soap_send(MmscGrp *mmc, Octstr *from, Octstr *to, goto done1; } - if (mm7_soapmsg_to_httpmsg(mreq, &rh, &body) < 0) { + if (mm7_soapmsg_to_httpmsg(mreq, &mmc->ver, &rh, &body) < 0) { *error = octstr_format("Failed to convert SOAP message to HTTP Msg!"); goto done1; } @@ -667,7 +670,7 @@ static Octstr *mm7eaif_send(MmscGrp *mmc, Octstr *from, Octstr *to, int mtype = mms_messagetype(m); int hstatus = HTTP_OK; List *rh = http_create_empty_headers(), *ph = NULL; - Octstr *body = NULL, *rbody = NULL, *url = NULL; + Octstr *body = NULL, *rbody = NULL, *url = NULL, *xver; char *msgtype; @@ -679,7 +682,10 @@ static Octstr *mm7eaif_send(MmscGrp *mmc, Octstr *from, Octstr *to, http_header_remove_all(rh, "X-Mms-Allow-Adaptations"); http_header_add(rh, "X-NOKIA-MMSC-To", octstr_get_cstr(to)); http_header_add(rh, "X-NOKIA-MMSC-From", octstr_get_cstr(from)); - http_header_add(rh, "X-NOKIA-MMSC-Version", EAIF_VERSION); + + xver = octstr_format(EAIF_VERSION, mmc->ver.major, mmc->ver.minor1); + http_header_add(rh, "X-NOKIA-MMSC-Version", octstr_get_cstr(xver)); + octstr_destroy(xver); if (mtype == MMS_MSGTYPE_SEND_REQ || mtype == MMS_MSGTYPE_RETRIEVE_CONF) { diff --git a/mbuni/mmsbox/mmsbox_cfg.c b/mbuni/mmsbox/mmsbox_cfg.c index 456fae2..59fd2df 100644 --- a/mbuni/mmsbox/mmsbox_cfg.c +++ b/mbuni/mmsbox/mmsbox_cfg.c @@ -141,7 +141,8 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func) MmscGrp *m = gw_malloc(sizeof *m); int ssl = 0; Octstr *type; - + Octstr *xver; + memset(m, 0, sizeof *m); m->id = _mms_cfg_getx(x, octstr_imm("id")); @@ -181,7 +182,23 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func) else warning(0, "MMSBox: Unknown MMSC type [%s]!", octstr_get_cstr(type)); + if ((xver = _mms_cfg_getx(x, octstr_imm("mm7-version"))) != NULL && + octstr_len(xver) > 0) + sscanf(octstr_get_cstr(xver), + "%d.%d.%d", + &m->ver.major, &m->ver.minor1, &m->ver.minor2); + else { /* Put in some defaults. */ + if (m->type == SOAP_MMSC) { + m->ver.major = 5; + m->ver.minor1 = 1; + m->ver.minor2 = 2; + } else if (m->type == EAIF_MMSC) { + m->ver.major = 3; + m->ver.minor1 = 0; + } + } + octstr_destroy(xver); octstr_destroy(type); if (m->incoming.port > 0 && diff --git a/mbuni/mmsbox/mmsbox_cfg.h b/mbuni/mmsbox/mmsbox_cfg.h index f4d1e38..d52d6cd 100644 --- a/mbuni/mmsbox/mmsbox_cfg.h +++ b/mbuni/mmsbox/mmsbox_cfg.h @@ -29,6 +29,8 @@ typedef struct MmscGrp { long throughput; /* Max send rate. */ long threadid; /* handler thread. */ + MM7Version_t ver; /* supported MM7/SOAP version. */ + Mutex *mutex; } MmscGrp; diff --git a/mbuni/mmsc/mmsc_cfg.c b/mbuni/mmsc/mmsc_cfg.c index d53f256..9880b98 100644 --- a/mbuni/mmsc/mmsc_cfg.c +++ b/mbuni/mmsc/mmsc_cfg.c @@ -313,6 +313,22 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays) else mv->type = NONE_VASP; octstr_destroy(s); + + mv->ver.major = mv->ver.minor1 = mv->ver.minor2 = 0; + if ((s = _mms_cfg_getx(grp, octstr_imm("mm7-version"))) != NULL && + octstr_len(s) > 0) + sscanf(octstr_get_cstr(s), "%d.%d.%d", &mv->ver.major, &mv->ver.minor1, &mv->ver.minor2); + else { + if (mv->type == SOAP_VASP) { + mv->ver.major = 5; + mv->ver.minor1 = 1; + mv->ver.minor2 = 2; + } else if (mv->type == EAIF_VASP) { + mv->ver.major = 3; + mv->ver.minor1 = 0; + } + } + octstr_destroy(s); /* Set the handler vasp accounts. */ if (mms_cfg_get_bool(grp, octstr_imm("mms-to-email-handler"), &ibool) == 0 && diff --git a/mbuni/mmsc/mmsc_cfg.h b/mbuni/mmsc/mmsc_cfg.h index 9830602..3a53b70 100644 --- a/mbuni/mmsc/mmsc_cfg.h +++ b/mbuni/mmsc/mmsc_cfg.h @@ -31,6 +31,7 @@ typedef struct MmsVasp { enum {SOAP_VASP, EAIF_VASP, NONE_VASP} type; Octstr *vasp_username, *vasp_password; Octstr *vasp_url; + MM7Version_t ver; } MmsVasp; typedef struct MmscSettings { diff --git a/mbuni/mmsc/mmsglobalsender.c b/mbuni/mmsc/mmsglobalsender.c index cc93d23..f00baa6 100644 --- a/mbuni/mmsc/mmsglobalsender.c +++ b/mbuni/mmsc/mmsglobalsender.c @@ -554,7 +554,7 @@ static int mm7soap_send(MmsVasp *vasp, Octstr *from, Octstr *to, Octstr *msgId, goto done1; } - if (mm7_soapmsg_to_httpmsg(mreq, &rh, &body) < 0) { + if (mm7_soapmsg_to_httpmsg(mreq, &vasp->ver, &rh, &body) < 0) { *error = octstr_format("Failed to convert SOAP message 2 HTTP Msg!"); goto done1; } @@ -631,7 +631,7 @@ static int mm7eaif_send(MmsVasp *vasp, Octstr *from, Octstr *to, Octstr *msgid, int mtype = mms_messagetype(m); int hstatus = HTTP_OK; List *rh = http_create_empty_headers(), *ph = NULL; - Octstr *body = NULL, *rbody = NULL, *url = NULL; + Octstr *body = NULL, *rbody = NULL, *url = NULL, *xver; HTTPCaller *caller = http_caller_create(); void *xx; char *msgtype; @@ -645,8 +645,11 @@ static int mm7eaif_send(MmsVasp *vasp, Octstr *from, Octstr *to, Octstr *msgid, http_header_add(rh, "X-NOKIA-MMSC-From", octstr_get_cstr(from)); if (msgid) http_header_add(rh, "X-NOKIA-MMSC-Message-Id", octstr_get_cstr(msgid)); - http_header_add(rh, "X-NOKIA-MMSC-Version", EAIF_VERSION); - + + xver = octstr_format(EAIF_VERSION, vasp->ver.major, vasp->ver.minor1); + http_header_add(rh, "X-NOKIA-MMSC-Version", octstr_get_cstr(xver)); + octstr_destroy(xver); + if (mtype == MMS_MSGTYPE_SEND_REQ || mtype == MMS_MSGTYPE_RETRIEVE_CONF) { msgtype = "MultiMediaMessage"; diff --git a/mbuni/mmsc/mmsproxy.c b/mbuni/mmsc/mmsproxy.c index 2006914..8fd74cb 100644 --- a/mbuni/mmsc/mmsproxy.c +++ b/mbuni/mmsc/mmsproxy.c @@ -1613,7 +1613,7 @@ static void mm7soap_dispatch(MmsHTTPClientInfo *h) switch (mm7_msgtype(mreq)) { case MM7_TAG_SubmitReq: mm7_get_envelope(mreq, &from, &to, &subject, &vasid, &expiryt, &delivert); - m = mm7_soap_to_mmsmsg(mreq, from ? from : sender); + m = mm7_soap_to_mmsmsg(mreq, from ? from : sender); if (m) { Octstr *value = NULL; int dlr; @@ -1750,7 +1750,7 @@ static void mm7soap_dispatch(MmsHTTPClientInfo *h) done: - if (mresp && mm7_soapmsg_to_httpmsg(mresp, &rh, &reply_body) == 0) + if (mresp && mm7_soapmsg_to_httpmsg(mresp, &h->vasp->ver, &rh, &reply_body) == 0) http_send_reply(h->client, hstatus, rh, reply_body); else http_close_client(h->client); @@ -1803,7 +1803,7 @@ static void mm7eaif_dispatch(MmsHTTPClientInfo *h) List *mh = NULL; int hstatus = HTTP_NO_CONTENT; List *rh = http_create_empty_headers(); - Octstr *reply_body = NULL, *value; + Octstr *reply_body = NULL, *value, *xver; List *to = gwlist_create(), *hto = NULL; Octstr *subject = NULL, *otransid = NULL, *msgid = NULL; @@ -1906,7 +1906,10 @@ static void mm7eaif_dispatch(MmsHTTPClientInfo *h) hstatus = HTTP_INTERNAL_SERVER_ERROR; done: - http_header_add(rh, "X-NOKIA-MMSC-Version", EAIF_VERSION); + xver = octstr_format(EAIF_VERSION, h->vasp->ver.major, h->vasp->ver.minor1); + http_header_add(rh, "X-NOKIA-MMSC-Version", octstr_get_cstr(xver)); + octstr_destroy(xver); + if (msgid) http_header_add(rh, "X-NOKIA-MMSC-Message-Id", octstr_get_cstr(msgid));