1
0
Fork 0

mm7 fix -- conditionally remove prefix

This commit is contained in:
bagyenda 2007-09-25 06:03:48 +00:00
parent 7137d5bd5d
commit fc552034da
10 changed files with 116 additions and 42 deletions

View File

@ -1,3 +1,5 @@
2007-09-25 P. A. Bagyenda <bagyenda@dsmagic.com>
* Added flag to conditionally remove mm7: XML namespace prefix
2007-09-18 P. A. Bagyenda <bagyenda@dsmagic.com>
* Support for custom MM7 MMC types using a loadable module.
2007-09-17 P. A. Bagyenda <bagyenda@dsmagic.com>

View File

@ -1767,6 +1767,21 @@ vasp-url
</td>
</tr>
<tr>
<td valign=top >
<tt>use-mm7-soap-namespace-prefix</tt>
</td>
<td valign=top >
Boolean
</td>
<td valign=top >
Optional. Set to <tt>true</tt> if the MM7/SOAP tags should have the
<tt>mm7:</tt> 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.
</td>
</tr>
<tr>
<td valign=top >
@ -2136,6 +2151,20 @@ Supported configuration parameters are:
</td>
</tr>
<tr>
<td valign=top >
<tt>use-mm7-soap-namespace-prefix</tt>
</td>
<td valign=top >
Boolean
</td>
<td valign=top >
Optional. Set to <tt>true</tt> if the MM7/SOAP tags should have the
<tt>mm7:</tt> 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.
</td>
</tr>
<tr>
<td valign=top >
<tt>mmsc-url</tt>

View File

@ -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)

View File

@ -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, "<mm7:Number%s>%S</mm7:Number>\n", y, z);
octstr_format_append(p, "<%sNumber%s>%S</%sNumber>\n", prefix, y, z, prefix);
octstr_destroy(z);
} else
octstr_format_append(p, "<mm7:RFC2822Address%s>%s</mm7:RFC2822Address>\n",
y, octstr_get_cstr(v) + 2); /* as above... */
octstr_format_append(p, "<%sRFC2822Address%s>%s</%sRFC2822Address>\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, "</mm7:%s>\n", x);
octstr_format_append(p, "</%s%s>\n", prefix, x);
strncpy(x, octstr_get_cstr(h), sizeof x);
octstr_format_append(p, "<mm7:%S>\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, "</mm7:%s>\n", x);
octstr_format_append(p, "</%s%s>\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, "<mm7:TransactionID xmlns:mm7=\"%s\" " SOAP_ENV ":mustUnderstand=\"1\">%S</mm7:TransactionID>\n",
octstr_get_cstr(xmlns), p ? p : octstr_imm("none"));
octstr_format_append(s, "<%sTransactionID xmlns%s=\"%s\" " SOAP_ENV
":mustUnderstand=\"1\">%S</%sTransactionID>\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, "<mm7:%S xmlns:mm7=\"%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, "<mm7:MM7Version>%S</mm7:MM7Version>\n", p);
octstr_format_append(s, "<%sMM7Version>%S</%sMM7Version>\n", prefix, p, prefix);
octstr_destroy(p);
} else
octstr_format_append(s, "<mm7:MM7Version>%d.%d.%d</mm7:MM7Version>\n",
ver->major, ver->minor1, ver->minor2);
octstr_format_append(s, "<%sMM7Version>%d.%d.%d</%sMM7Version>\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, "<mm7:SenderIdentification>\n");
octstr_format_append(s, "<%sSenderIdentification>\n", prefix);
if (p)
octstr_format_append(s, "<mm7:VASPID>%S</mm7:VASPID>\n", p);
octstr_format_append(s, "<%sVASPID>%S</%sVASPID>\n", prefix, p, prefix);
if (q)
octstr_format_append(s, "<mm7:VASID>%S</mm7:VASID>\n", q);
octstr_format_append(s, "<%sVASID>%S</%sVASID>\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, "<mm7:SenderAddress>%S</mm7:SenderAddress>\n", xx);
octstr_format_append(s, "<%sSenderAddress>%S</%sSenderAddress>\n", prefix, xx, prefix);
octstr_destroy(xx);
}
octstr_append_cstr(s, "</mm7:SenderIdentification>\n");
octstr_format_append(s, "</%sSenderIdentification>\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, "<mm7:Recipients>\n%S</mm7:Recipients>\n", p);
octstr_format_append(s, "<%sRecipients>\n%S</%sRecipients>\n", prefix, p, prefix);
} else if ((q = http_header_value(hdrs, octstr_imm("To"))) != NULL) {
append_address(p, q);
octstr_format_append(s, "<mm7:Recipient>\n%S</mm7:Recipient>\n", p);
append_address(p, q, prefix);
octstr_format_append(s, "<%sRecipient>\n%S</%sRecipient>\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, "<mm7:Sender>%S</mm7:Sender>\n", p);
octstr_format_append(s, "<%sSender>%S</%sSender>\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, "<mm7:Content href=\"%S\"%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, "<mm7:ReplyCharging");
octstr_format_append(s, "<%sReplyCharging", prefix);
if (p) {
octstr_format_append(s, " replyChargingSize=\"%S\"", p);
octstr_destroy(p);
@ -608,22 +612,22 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver)
q = http_header_value(hdrs, octstr_imm("StatusText"));
octstr_append_cstr(s, "<mm7:Status>\n");
octstr_format_append(s, "<%sStatus>\n", prefix);
if (p) {
octstr_format_append(s, "<mm7:StatusCode>%S</mm7:StatusCode>\n", p);
octstr_format_append(s, "<%sStatusCode>%S</%sStatusCode>\n", prefix, p, prefix);
octstr_destroy(p);
}
if (q) {
octstr_format_append(s, "<mm7:StatusText>%S</mm7:StatusText>\n", q);
octstr_format_append(s, "<%sStatusText>%S</%sStatusText>\n", prefix, q, prefix);
octstr_destroy(q);
}
q = http_header_value(hdrs, octstr_imm("Details"));
if (q) {
octstr_format_append(s, "<mm7:Details>%S</mm7:Details>\n", q);
octstr_format_append(s, "<%sDetails>%S</%sDetails>\n", prefix, q, prefix);
octstr_destroy(q);
}
octstr_append_cstr(s, "</mm7:Status>\n");
octstr_format_append(s, "</%sStatus>\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, "<mm7:%S TimeStamp=\"%S\" UAProf=\"%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, "<mm7:%S>%S</mm7:%S>\n", h, v, h);
octstr_format_append(s, "<%s%S>%S</%s%S>\n", prefix, h, v, prefix, h);
octstr_destroy(h);
octstr_destroy(v);
}
octstr_format_append(s, "</mm7:%S>\n", mtype);
octstr_format_append(s, "</%s%S>\n", prefix, mtype);
octstr_destroy(mtype);
if (fault) {
octstr_append_cstr(s, "</detail>\n");

View File

@ -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. */

View File

@ -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)
{

View File

@ -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. */

View File

@ -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);

View File

@ -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);

View File

@ -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) {