1
0
Fork 0

Improved MM7/SOAP schema handling

This commit is contained in:
bagyenda 2007-04-12 08:40:24 +00:00
parent c49a4bbe57
commit 65c185e3eb
5 changed files with 78 additions and 74 deletions

View File

@ -1,3 +1,5 @@
2007-04-12 P. A. Bagyenda <bagyenda@dsmagic.com>
* Improved MM7/SOAP message composition: better handling of different schema versions
2007-04-10 P. A. Bagyenda <bagyenda@dsmagic.com> 2007-04-10 P. A. Bagyenda <bagyenda@dsmagic.com>
* Added outgoing Digest/MD5 HTTP authentication support (thanks to Gert Horne <gert@bluetin.co.za> for funding) * Added outgoing Digest/MD5 HTTP authentication support (thanks to Gert Horne <gert@bluetin.co.za> for funding)
2007-04-10 P. A. Bagyenda <bagyenda@dsmagic.com> 2007-04-10 P. A. Bagyenda <bagyenda@dsmagic.com>

View File

@ -360,6 +360,13 @@ static void output_rcpt(char *hdr, List *hdrs, Octstr *p)
http_destroy_headers(l); http_destroy_headers(l);
} }
/* compare two mm7 version xmlns strings. Crude, but should generally work. */
static int ver_compare(MM7Version_t *v1, MM7Version_t *v2)
{
return (v1->major-v2->major)*1000 + (v1->minor1-v2->minor1)*100 + (v1->minor2-v2->minor2);
}
#define XMLNSMM7 "http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-%d-MM7-%d-%d" #define XMLNSMM7 "http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-%d-MM7-%d-%d"
#define SOAP_ENV "SOAP-ENV" #define SOAP_ENV "SOAP-ENV"
@ -367,12 +374,12 @@ static void output_rcpt(char *hdr, List *hdrs, Octstr *p)
static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver) static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver)
{ {
Octstr *s = octstr_create("<?xml version='1.0' encoding='UTF-8'?>\n"); Octstr *s = octstr_create("<?xml version='1.0' encoding='UTF-8'?>\n");
Octstr *xmlns = octstr_format(XMLNSMM7, ver->major, ver->minor1, ver->minor2); Octstr *xmlns = octstr_format(XMLNSMM7, ver->major, ver->minor1, ver->minor2);
Octstr *p, *q, *r, *fault, *mtype; Octstr *p, *q, *r, *fault, *mtype;
int i, n; int i, n, mtag;
time_t t; time_t t;
int mtag;
MM7Version_t min_ver = {5,1,0}; /* minimum version we deal with. */
octstr_append_cstr(s, octstr_append_cstr(s,
"<" SOAP_ENV ":Envelope xmlns:" SOAP_ENV "=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" "<" SOAP_ENV ":Envelope xmlns:" SOAP_ENV "=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
@ -431,8 +438,13 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver)
if (r) { if (r) {
Octstr *xx = octstr_create(""); Octstr *xx = octstr_create("");
append_address(xx, r); if (ver_compare(ver,&min_ver) > 0)
octstr_format_append(s, "<mm7:SenderAddress>%S</mm7:SenderAddress>\n", xx); append_address(xx, r);
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_destroy(xx); octstr_destroy(xx);
} }
@ -494,8 +506,13 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver)
break; break;
case MM7_TAG_Sender: case MM7_TAG_Sender:
p = octstr_create(""); p = octstr_create("");
append_address(p, v); if (ver_compare(ver,&min_ver) > 0)
octstr_format_append(s, "<mm7:Sender>%S</mm7:Sender>\n", p); append_address(p, v);
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_destroy(p); octstr_destroy(p);
skip = 1; skip = 1;
break; break;
@ -900,18 +917,14 @@ static MSoapMsg_t *mm7_soap_create(int msgtype, Octstr *otransid)
MSoapMsg_t *mm7_mmsmsg_to_soap(MmsMsg *msg, Octstr *from, List *xto, MSoapMsg_t *mm7_mmsmsg_to_soap(MmsMsg *msg, Octstr *from, List *xto,
Octstr *transid, Octstr *srvcode, Octstr *transid, Octstr *srvcode,
Octstr *linkedid, Octstr *linkedid, int isclientside,
int isclientside,
char *vaspid, char *vasid) char *vaspid, char *vasid)
{ {
int mtype = mms_messagetype(msg); int i, n, mtype = mms_messagetype(msg);
MSoapMsg_t *m = NULL; MSoapMsg_t *m = NULL;
Octstr *s;
int i, n;
Octstr *xfrom;
List *headers; List *headers;
Octstr *xfrom = (from != NULL) ? octstr_format("+ %S", from) : NULL, *s;
xfrom = octstr_format("+ %S", from ? from : octstr_imm("anon@anon"));
switch(mtype) { switch(mtype) {
case MMS_MSGTYPE_SEND_REQ: case MMS_MSGTYPE_SEND_REQ:
case MMS_MSGTYPE_RETRIEVE_CONF: case MMS_MSGTYPE_RETRIEVE_CONF:
@ -933,9 +946,10 @@ MSoapMsg_t *mm7_mmsmsg_to_soap(MmsMsg *msg, Octstr *from, List *xto,
if (linkedid) if (linkedid)
http_header_add(m->envelope, "LinkedID", octstr_get_cstr(linkedid)); http_header_add(m->envelope, "LinkedID", octstr_get_cstr(linkedid));
http_header_add(m->envelope, if (xfrom)
isclientside ? "SenderAddress" : "Sender", http_header_add(m->envelope,
octstr_get_cstr(xfrom)); isclientside ? "SenderAddress" : "Sender",
octstr_get_cstr(xfrom));
if ((s = mms_get_header_value(msg, octstr_imm("Date"))) != NULL) { if ((s = mms_get_header_value(msg, octstr_imm("Date"))) != NULL) {
http_header_add(m->envelope, "TimeStamp", octstr_get_cstr(s)); http_header_add(m->envelope, "TimeStamp", octstr_get_cstr(s));
@ -1011,7 +1025,8 @@ MSoapMsg_t *mm7_mmsmsg_to_soap(MmsMsg *msg, Octstr *from, List *xto,
MM7_TAG_ReadReplyReq : MM7_TAG_DeliveryReportReq, MM7_TAG_ReadReplyReq : MM7_TAG_DeliveryReportReq,
transid); transid);
http_header_add(m->envelope, "Sender", octstr_get_cstr(xfrom)); if (xfrom)
http_header_add(m->envelope, "Sender", octstr_get_cstr(xfrom));
if (xto && gwlist_len(xto) > 0) { if (xto && gwlist_len(xto) > 0) {
Octstr *xx = octstr_format("+ %S", gwlist_get(xto, 0)); Octstr *xx = octstr_format("+ %S", gwlist_get(xto, 0));
@ -1045,7 +1060,8 @@ MSoapMsg_t *mm7_mmsmsg_to_soap(MmsMsg *msg, Octstr *from, List *xto,
default: default:
break; break;
} }
octstr_destroy(xfrom); if (xfrom)
octstr_destroy(xfrom);
return m; return m;
} }

View File

@ -368,8 +368,8 @@ void unpack_mimeheaders(MIMEEntity *mm)
if (l) gwlist_destroy(l, (gwlist_item_destructor_t *)octstr_destroy); if (l) gwlist_destroy(l, (gwlist_item_destructor_t *)octstr_destroy);
loop: loop:
if (header) octstr_destroy(header); octstr_destroy(header);
if (value) octstr_destroy(value); octstr_destroy(value);
} }
mime_replace_headers(mm, h); mime_replace_headers(mm, h);
@ -408,10 +408,8 @@ void unbase64_mimeparts(MIMEEntity *m)
/* XXX may be we should deal with other transfer encodings here as well... */ /* XXX may be we should deal with other transfer encodings here as well... */
if (ctype) octstr_destroy(ctype);
octstr_destroy(ctype); octstr_destroy(te);
if (te)
octstr_destroy(te);
http_destroy_headers(headers); http_destroy_headers(headers);
} }
} }
@ -447,10 +445,8 @@ void base64_mimeparts(MIMEEntity *m)
mime_entity_set_body(m, body); mime_entity_set_body(m, body);
mime_replace_headers(m, headers); mime_replace_headers(m, headers);
} }
if (ctype) octstr_destroy(ctype);
octstr_destroy(ctype); octstr_destroy(te);
if (te)
octstr_destroy(te);
octstr_destroy(body); octstr_destroy(body);
http_destroy_headers(headers); http_destroy_headers(headers);
} }
@ -507,8 +503,8 @@ static int send2email(Octstr *to, Octstr *from, Octstr *subject,
addmmscname(value, myhostname); addmmscname(value, myhostname);
http_header_add(l, "To", octstr_get_cstr(value)); http_header_add(l, "To", octstr_get_cstr(value));
loop: loop:
if (value) octstr_destroy(value); octstr_destroy(value);
if (name) octstr_destroy(name); octstr_destroy(name);
} }
http_destroy_headers(lto); http_destroy_headers(lto);
@ -526,8 +522,8 @@ static int send2email(Octstr *to, Octstr *from, Octstr *subject,
addmmscname(value, myhostname); addmmscname(value, myhostname);
http_header_add(l, "Cc", octstr_get_cstr(value)); http_header_add(l, "Cc", octstr_get_cstr(value));
loop2: loop2:
if (value) octstr_destroy(value); octstr_destroy(value);
if (name) octstr_destroy(name); octstr_destroy(name);
} }
http_destroy_headers(lcc); http_destroy_headers(lcc);
@ -1104,11 +1100,9 @@ int parse_cgivars(List *request_headers, Octstr *request_body,
} }
octstr_destroy(name); octstr_destroy(name);
} }
if (ct)
octstr_destroy(ct); octstr_destroy(ct);
octstr_destroy(cd);
if (cd)
octstr_destroy(cd);
octstr_destroy(body); octstr_destroy(body);
http_destroy_headers(headers); http_destroy_headers(headers);
mime_entity_destroy(mp); mime_entity_destroy(mp);
@ -1118,10 +1112,8 @@ int parse_cgivars(List *request_headers, Octstr *request_body,
} else /* else it is nothing that we know about, so simply go away... */ } else /* else it is nothing that we know about, so simply go away... */
ret = -1; ret = -1;
done: done:
if (ctype) octstr_destroy(ctype);
octstr_destroy(ctype); octstr_destroy(charset);
if (charset)
octstr_destroy(charset);
return ret; return ret;
} }
@ -1149,14 +1141,12 @@ void strip_boundary_element(List *headers, char *s)
gw_assert(headers); gw_assert(headers);
if ((n = get_content_type(headers, &ctype, &params)) < 0) { if ((n = get_content_type(headers, &ctype, &params)) < 0) {
if (ctype) octstr_destroy(ctype);
octstr_destroy(ctype);
ctype = NULL; /* no ctype found, so do not replace it! */ ctype = NULL; /* no ctype found, so do not replace it! */
} }
if (s) {/* we are replacing the content type as well as stripping */ if (s) {/* we are replacing the content type as well as stripping */
if (ctype) octstr_destroy(ctype);
octstr_destroy(ctype);
ctype = octstr_create(s); ctype = octstr_create(s);
} }
@ -1177,10 +1167,9 @@ void strip_boundary_element(List *headers, char *s)
http_header_remove_all(headers, "Content-Type"); http_header_remove_all(headers, "Content-Type");
http_header_add(headers, "Content-Type", octstr_get_cstr(value)); http_header_add(headers, "Content-Type", octstr_get_cstr(value));
} }
if (ctype != value && ctype != NULL) if (ctype != value)
octstr_destroy(ctype); octstr_destroy(ctype);
if (value) octstr_destroy(value);
octstr_destroy(value);
} }
static int fetch_url_with_auth(HTTPCaller *c, int method, Octstr *url, List *request_headers, static int fetch_url_with_auth(HTTPCaller *c, int method, Octstr *url, List *request_headers,
@ -1233,8 +1222,7 @@ int mms_url_fetch_content(int method, Octstr *url, List *request_headers,
octstr_destroy(h); octstr_destroy(h);
} }
if (n) octstr_destroy(n);
octstr_destroy(n);
*reply_body = data; *reply_body = data;
*reply_headers = http_create_empty_headers(); *reply_headers = http_create_empty_headers();
@ -1257,8 +1245,8 @@ int mms_url_fetch_content(int method, Octstr *url, List *request_headers,
} }
http_caller_destroy(c); http_caller_destroy(c);
} }
if (furl)
octstr_destroy(furl); octstr_destroy(furl);
return status; return status;
} }
@ -1453,25 +1441,17 @@ static int fetch_url_with_auth(HTTPCaller *c, int method, Octstr *url, List *req
#endif #endif
done: done:
octstr_destroy(xauth_value); octstr_destroy(xauth_value);
if (realm) octstr_destroy(realm);
octstr_destroy(realm); octstr_destroy(domain);
if (domain) octstr_destroy(nonce);
octstr_destroy(domain); octstr_destroy(opaque);
if (nonce) octstr_destroy(algo);
octstr_destroy(nonce); octstr_destroy(xurl);
if (opaque) octstr_destroy(cnonce);
octstr_destroy(opaque); gwlist_destroy(qop, (gwlist_item_destructor_t *)octstr_destroy);
if (algo)
octstr_destroy(algo);
if (xurl)
octstr_destroy(xurl);
if (qop)
gwlist_destroy(qop, (gwlist_item_destructor_t *)octstr_destroy);
if (h) if (h)
http_urlparse_destroy(h); http_urlparse_destroy(h);
if (cnonce)
octstr_destroy(cnonce);
return status; return status;
} }

View File

@ -145,7 +145,7 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
mreq ? (char *)msgtype : "Null"); mreq ? (char *)msgtype : "Null");
if (!mreq) { if (!mreq) {
mresp = mm7_make_resp(NULL, MM7_SOAP_FORMAT_CORRUPT, NULL,1); mresp = mm7_make_resp(NULL, MM7_SOAP_FORMAT_CORRUPT, NULL,1);
goto done; goto done;
} }
@ -191,8 +191,11 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
if (linkedid) if (linkedid)
octstr_destroy(linkedid); octstr_destroy(linkedid);
octstr_destroy(value); octstr_destroy(value);
} else } else {
error(0, "Failed to convert received MM7/SOAP DeliverReq message from mmc=%s to MMS Message!",
octstr_get_cstr(h->m->id));
status = 4000; status = 4000;
}
mresp = mm7_make_resp(mreq, status, NULL,1); mresp = mm7_make_resp(mreq, status, NULL,1);
break; break;

View File

@ -1645,8 +1645,11 @@ static void mm7soap_dispatch(MmsHTTPClientInfo *h)
h->ua, NULL); h->ua, NULL);
if (value) if (value)
octstr_destroy(value); octstr_destroy(value);
} else } else {
error(0, "Failed to convert received MM7/SOAP SubmitReq message from vasp=%s to MMS Message!",
octstr_get_cstr(h->vasp->id));
status = 4004; status = 4004;
}
mresp = mm7_make_resp(mreq, status, msgid,0); mresp = mm7_make_resp(mreq, status, msgid,0);
break; break;