1
0
Fork 0

misc. fixes: DLR, UAProf on mmsbox side

This commit is contained in:
bagyenda 2007-08-06 11:57:15 +00:00
parent 67cdf0f387
commit 96811a10b7
17 changed files with 447 additions and 221 deletions

View File

@ -1,3 +1,6 @@
2007-08-06 P. A. Bagyenda <bagyenda@dsmagic.com>
* Fix for DLR reporting in mmsbox (thanks to Skycore team)
* UACapabilities support for MM7/SOAP v6.x (thanks again to Skycore Team)
2007-08-03 P. A. Bagyenda <bagyenda@dsmagic.com>
* added mms-direction CGI param to send-mms interface (see doc for additional info)
2007-07-27 P. A. Bagyenda <bagyenda@dsmagic.com>

View File

@ -1828,6 +1828,26 @@ Boolean
</td>
</tr>
<tr>
<td valign=top >
<tt>send-uaprof</tt>
</td>
<td valign=top >
String
</td>
<td valign=top >
Optional. This parameter determines whether the User Agent string is
sent to the VASP (for MM7/SOAP only, as part of
<tt>UACapabilities</tt> entity). Set to <tt>ua</tt> to send the
full client User Agent string (i.e. the value of the HTTP request
header <tt>User-Agent</tt>). Set to <tt>url</tt> to send the client
Profile URL (i.e. the value of the <tt>X-WAP-Profile</tt> HTTP
request header). Leave empty not to send any info. Note that this
field is only sent in MO transactions (e.g. message delivery,
delivery reports).
</td>
</tr>
</table>
@ -2600,6 +2620,16 @@ faked-sender = 100<br>
</td>
</tr>
<tr>
<td valign=top >
<tt>distribution</tt>
</td>
<td valign=top>
Optional. Should be <tt>true</tt> or <tt>false</tt>. This is set as the
MM7/SOAP <tt>DistributionIndicator</tt> parameter.
</td>
</tr>
</table>
</p>
@ -3176,6 +3206,44 @@ A detailed list of configuration parameters for MMS Services is given below.
MMS message priority
</td>
</tr>
<tr>
<td valign=top >
<tt>X-Mbuni-TransactionID</tt>
</td>
<td valign=top >
This special header is used for transaction tracking. It is included
in the MMS service request and uniquely identifies the service
request transaction. The transaction ID will be included in the delivery or
read report when the DLR URL is called, so that the service side can
match the DLR to the service request transaction.
</td>
</tr>
<tr>
<td valign=top >
<tt>X-Mbuni-UAProf</tt>
</td>
<td valign=top >
This special header is included in the service request (and DLR URL
request) and contains the client User-Agent Profile string as
received from the MMC side. (Requires MM7/SOAP v6.x support on the
MMC side.)
</td>
</tr>
<tr>
<td valign=top >
<tt>X-Mbuni-Timestamp</tt>
</td>
<td valign=top >
This special header is included in the service request (and DLR URL
request) and contains the client submission time stamp (HTTP
date format). This header is only included if the User-Agent Profile
string is included. (Requires MM7/SOAP v6.x support on the
MMC side.)
</td>
</tr>
</table>
</p>
@ -3590,7 +3658,9 @@ maximum, and the queue entry ID is printed to standard output.
queue. If the
sender requested a read or delivery report (by specifying the
requisite URL), the relevant URL is
stored to the DLR URL store for future use. </li>
stored to the DLR URL store for future use. On success, the
interface returns the message submission transaction ID (which is
also reported with an DLR). </li>
<li><b>MMSC handler module:</b> Receives messages coming from MMSCs,
and saves them to the incoming queue. Also watches the outgoing
message queue for new messages, which it dispatches to the relevant

View File

@ -107,7 +107,8 @@ MULTI_GROUP(mms-vasp,
OCTSTR(vasp-password)
OCTSTR(vasp-url)
OCTSTR(mms-to-email-handler)
OCTSTR(mms-to-local-copy-handler)
OCTSTR(mms-to-local-copy-handler)
OCTSTR(send-uaprof)
)
MULTI_GROUP(send-mms-user,

View File

@ -3,7 +3,7 @@
*
* MM7/SOAP message encoder/decoder and helper functions
*
* Copyright (C) 2003 - 2005, Digital Solutions Ltd. - http://www.dsmagic.com
* Copyright (C) 2003 - 2007, Digital Solutions Ltd. - http://www.dsmagic.com
*
* Paul Bagyenda <bagyenda@dsmagic.com>
*
@ -26,7 +26,7 @@ struct MSoapMsg_t {
/* We expect ISO formatted time, or interval. */
static Octstr *parse_time(char *s)
static time_t parse_time(char *s)
{
time_t t = time(NULL);
Octstr *p = octstr_create(s);
@ -83,7 +83,7 @@ static Octstr *parse_time(char *s)
done:
octstr_destroy(p);
return date_format_http(t);
return t;
}
static int parse_header(xmlNodePtr node, List *headers, int *sigparent)
@ -137,7 +137,6 @@ static int parse_header(xmlNodePtr node, List *headers, int *sigparent)
case MM7_TAG_Recipient:
*sigparent = MM7_TAG_To; /* make it a To field. */
break;
case MM7_TAG_To:
case MM7_TAG_Cc:
@ -159,11 +158,15 @@ static int parse_header(xmlNodePtr node, List *headers, int *sigparent)
}
break;
case MM7_TAG_Content:
if ((s = xmlGetProp(node, (unsigned char *)"href")) != NULL) {
value = octstr_create((char *)s);
if ((s = xmlGetProp(node, (unsigned char *)"href")) != NULL) {
value = octstr_create((char *)s);
xmlFree(s);
}
if ((s = xmlGetProp(node, (unsigned char *)"allowAdaptations")) != NULL) {
http_header_add(headers, "allowAdaptations", (char *)s);
xmlFree(s);
}
/* we keep 'cid:' bit. ignore the bit about adaptation. */
break;
case MM7_TAG_ShortCode:
case MM7_TAG_Number: /* we will not normalise number here, that's for upper level. */
@ -188,7 +191,7 @@ static int parse_header(xmlNodePtr node, List *headers, int *sigparent)
case MM7_TAG_ExpiryDate:
case MM7_TAG_TimeStamp:
case MM7_TAG_Date:
value = parse_time(nvalue);
value = date_format_http(parse_time(nvalue));
break;
case MM7_TAG_ReplyCharging:
@ -199,12 +202,25 @@ static int parse_header(xmlNodePtr node, List *headers, int *sigparent)
xmlFree(s);
}
if ((s = xmlGetProp(node, (unsigned char *)"replyDeadline")) != NULL) {
Octstr *t = parse_time((char *)s);
Octstr *t = date_format_http(parse_time((char *)s));
http_header_add(headers, "replyDeadline", octstr_get_cstr(t));
xmlFree(s);
octstr_destroy(t);
}
break;
case MM7_TAG_UACapabilities:
if ((s = xmlGetProp(node, (unsigned char *)"UAProf")) != NULL) {
value = octstr_create((void *)s);
xmlFree(s);
} else
value = octstr_create("none");
if ((s = xmlGetProp(node, (unsigned char *)"TimeStamp")) != NULL) {
time_t lt = parse_time((char *)s);
octstr_format_append(value, ",%ld", lt);
xmlFree(s);
}
break;
default:
break;
}
@ -487,9 +503,9 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver)
}
octstr_append_cstr(s, "</mm7:SenderIdentification>\n");
if (p) octstr_destroy(p);
if (q) octstr_destroy(q);
if (r) octstr_destroy(r);
octstr_destroy(p);
octstr_destroy(q);
octstr_destroy(r);
}
p = octstr_create("");
@ -513,7 +529,7 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver)
for (i = 0, n = gwlist_len(hdrs); i < n; i++) {
Octstr *h = NULL, *v = NULL;
char *zz;
char *zz, *s1, *s2;
int tag;
int skip = 0;
@ -610,7 +626,19 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver)
octstr_append_cstr(s, "</mm7:Status>\n");
skip = 1;
break;
case MM7_TAG_UACapabilities:
s1 = octstr_get_cstr(v);
if ((s2 = strrchr(s1, ',')) != NULL) {
t = strtoul(s2 + 1, NULL, 10);
octstr_delete(v, s2-s1, octstr_len(v));
} else
t = time(NULL);
p = date_create_iso(t);
octstr_format_append(s, "<mm7:%S TimeStamp=\"%S\" UAProf=\"%S\"/>\n",
h, p, v);
octstr_destroy(p);
skip = 1;
break;
default:
break;
}
@ -618,14 +646,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);
if (h) octstr_destroy(h);
if (v) octstr_destroy(v);
octstr_destroy(h);
octstr_destroy(v);
}
octstr_format_append(s, "</mm7:%S>\n", mtype);
octstr_destroy(mtype);
if (fault) {
octstr_destroy(mtype);
if (fault) {
octstr_append_cstr(s, "</detail>\n");
octstr_append_cstr(s, "</" SOAP_ENV ":Fault>\n");
octstr_destroy(fault);
@ -757,7 +783,9 @@ int mm7_get_envelope(MSoapMsg_t *m,
List **to, Octstr **subject,
Octstr **vasid,
time_t *expiry_t,
time_t *delivery_t)
time_t *delivery_t,
Octstr **uaprof,
time_t *uaprof_tstamp)
{
Octstr *s;
@ -801,6 +829,20 @@ int mm7_get_envelope(MSoapMsg_t *m,
octstr_destroy(s);
}
}
if (uaprof) {
Octstr *s = http_header_value(m->envelope, octstr_imm("UACapabilities"));
if (uaprof_tstamp) *uaprof_tstamp = -1;
if (s) {
char *s1 = octstr_get_cstr(s);
char *s2 = strrchr(s1, ',');
if (s2) {
*uaprof_tstamp = strtoul(s2+1, NULL, 10);
octstr_delete(s, s2-s1, octstr_len(s));
}
*uaprof = s;
}
}
return 0;
}
@ -850,7 +892,7 @@ MmsMsg *mm7_soap_to_mmsmsg(MSoapMsg_t *m, Octstr *from)
if ((s = http_header_value(m->envelope, octstr_imm("ReadReply"))) != NULL) {
long x = mms_string_to_boolean_flag(s);
if (x >= 0)
mms_replace_header_value(msg, "X-Mms-Read-Report",
mms_replace_header_value(msg, "X-Mms-Read-Reply",
(char *)mms_reports_to_cstr(x));
octstr_destroy(s);
}
@ -963,12 +1005,16 @@ static MSoapMsg_t *mm7_soap_create(int msgtype, Octstr *otransid)
MSoapMsg_t *mm7_mmsmsg_to_soap(MmsMsg *msg, Octstr *from, List *xto,
Octstr *transid, Octstr *srvcode,
Octstr *linkedid, int isclientside,
char *vaspid, char *vasid)
char *vaspid, char *vasid,
Octstr *uaprof,
time_t uaprof_tstamp,
Octstr *distrib_indicator)
{
int i, n, mtype = mms_messagetype(msg);
MSoapMsg_t *m = NULL;
List *headers;
Octstr *xfrom = (from != NULL) ? octstr_format("+ %S", from) : NULL, *s;
Octstr *xuaprof_val = (uaprof) ? octstr_format("%S,%ld", uaprof, uaprof_tstamp) : NULL;
switch(mtype) {
case MMS_MSGTYPE_SEND_REQ:
@ -1024,7 +1070,7 @@ MSoapMsg_t *mm7_mmsmsg_to_soap(MmsMsg *msg, Octstr *from, List *xto,
octstr_destroy(s);
}
if ((s = mms_get_header_value(msg, octstr_imm("X-Mms-Read-Report"))) != NULL) {
if ((s = mms_get_header_value(msg, octstr_imm("X-Mms-Read-Reply"))) != NULL) {
char *val = (octstr_case_compare(s, octstr_imm("Yes")) == 0) ?
"true" : "false";
http_header_add(m->envelope, "ReadReply", val);
@ -1037,7 +1083,13 @@ MSoapMsg_t *mm7_mmsmsg_to_soap(MmsMsg *msg, Octstr *from, List *xto,
http_header_add(m->envelope, "allowAdaptations", val);
octstr_destroy(s);
}
if (distrib_indicator)
http_header_add(m->envelope, "DistributionIndicator",
octstr_str_case_compare(distrib_indicator, "true") == 0 ? "true" : "false");
} else { /* not clientside. */
if (xuaprof_val) /* only on DeliverReq. */
http_header_add(m->envelope, "UACapabilities", octstr_get_cstr(xuaprof_val));
}
if ((s = mms_get_header_value(msg, octstr_imm("X-Mms-Priority"))) != NULL) {
@ -1100,14 +1152,19 @@ MSoapMsg_t *mm7_mmsmsg_to_soap(MmsMsg *msg, Octstr *from, List *xto,
http_header_add(m->envelope, "MMStatus", octstr_get_cstr(s));
octstr_destroy(s);
}
if (mtype == MMS_MSGTYPE_DELIVERY_IND &&
xuaprof_val) /* and for DeliveryReport. */
http_header_add(m->envelope, "UACapabilities", octstr_get_cstr(xuaprof_val));
break;
default:
break;
}
if (xfrom)
octstr_destroy(xfrom);
octstr_destroy(xfrom);
octstr_destroy(xuaprof_val);
return m;
}

View File

@ -57,7 +57,9 @@ extern int mm7_get_envelope(MSoapMsg_t *m, Octstr **sender,
List **to, Octstr **subject,
Octstr **vasid,
time_t *expiry_t,
time_t *delivery_t);
time_t *delivery_t,
Octstr **uaprof,
time_t *uaprof_tstamp);
/* Delete the thingie... */
extern void mm7_soap_destroy(MSoapMsg_t *m);
@ -67,7 +69,10 @@ MSoapMsg_t *mm7_mmsmsg_to_soap(MmsMsg *msg, Octstr *from, List *xto,
Octstr *transid, Octstr *srvcode,
Octstr *linkedid,
int isclientside,
char *vaspid, char *vasid);
char *vaspid, char *vasid,
Octstr *uaprof,
time_t uaprof_tstamp,
Octstr *distrib_indicator);
MSoapMsg_t *mm7_make_resp(MSoapMsg_t *mreq, int status, Octstr *msgid, int isclientside);
/* Return the header value for some header. */
Octstr *mm7_soap_header_value(MSoapMsg_t *m, Octstr *header);

View File

@ -779,6 +779,7 @@ static int free_envelope(MmsEnvelope *e, int removefromqueue)
{
int i, n;
if (e == NULL) return 0;
octstr_destroy(e->msgId);
for (i = 0, n = gwlist_len(e->to); i < n; i++) {
@ -819,7 +820,7 @@ static int free_envelope(MmsEnvelope *e, int removefromqueue)
int mms_queue_free_env(MmsEnvelope *e)
{
return free_envelope(e, 0);
}
int mms_queue_update(MmsEnvelope *e)

View File

@ -88,7 +88,8 @@ int mms_init_queuedir(Octstr *qdir);
extern Octstr *mms_queue_add(Octstr *from, List *to,
Octstr *subject,
Octstr *fromproxy, Octstr *viaproxy,
time_t senddate, time_t expirydate, MmsMsg *m, Octstr *token,
time_t senddate, time_t expirydate, MmsMsg *m,
Octstr *token,
Octstr *vaspid, Octstr *vasid,
Octstr *url1, Octstr *url2,
List *hdrs,

View File

@ -308,6 +308,8 @@ VNSTRING(MM7_5, "replyChargingSize", MM7_TAG_replyChargingSize)
VNSTRING(MM7_5, "replyDeadline", MM7_TAG_replyDeadline)
VNSTRING(MM7_5, "DeliveryReport", MM7_TAG_DeliveryReport)
VNSTRING(MM7_5, "allowAdaptations", MM7_TAG_allowAdaptations)
VNSTRING(MM7_5, "DistributionIndicator",MM7_TAG_distributionIndicator)
VNSTRING(MM7_5, "UACapabilities",MM7_TAG_UACapabilities)
)
NUMBERED(soap_status,

View File

@ -3,7 +3,7 @@
*
* User-Agent profiles handling, content adaptation.
*
* Copyright (C) 2003 - 2005, Digital Solutions Ltd. - http://www.dsmagic.com
* Copyright (C) 2003 - 2007, Digital Solutions Ltd. - http://www.dsmagic.com
*
* Paul Bagyenda <bagyenda@dsmagic.com>
*

View File

@ -68,26 +68,31 @@ static int auth_check(Octstr *user, Octstr *pass, List *headers)
else
res = 0;
done:
if (v)
octstr_destroy(v);
if (p)
octstr_destroy(p);
if (q)
octstr_destroy(q);
octstr_destroy(v);
octstr_destroy(p);
octstr_destroy(q);
return res;
}
static int send_report(Octstr *from, char *report_type,
Octstr *dlr_url, Octstr *status,
Octstr *msgid, Octstr *mmc_id, Octstr *mmc_gid)
Octstr *msgid, Octstr *mmc_id, Octstr *mmc_gid,
Octstr *orig_transid, Octstr *uaprof,
time_t uaprof_tstamp)
{
Octstr *url = dlr_url ? octstr_duplicate(dlr_url) : mms_dlr_url_get(msgid, report_type, mmc_gid);
Octstr *url = NULL;
List *rh, *rph = NULL;
Octstr *rb = NULL;
Octstr *xtransid = NULL;
if (!url) {
info(0, "Sending delivery-report Failed: `url' is NULL, `group_id'=[%s], `msgid'=[%s]",
if (dlr_url)
url = octstr_duplicate(dlr_url);
else
mms_dlr_url_get(msgid, report_type, mmc_gid, &url, &xtransid);
if (!url || octstr_len(url) == 0) {
info(0, "Sending delivery-report skipped: `url' is empty, `group_id'=[%s], `msgid'=[%s]",
octstr_get_cstr(mmc_gid), octstr_get_cstr(msgid));
return 0;
}
@ -96,16 +101,26 @@ static int send_report(Octstr *from, char *report_type,
http_header_add(rh, "X-Mbuni-Report-Type", report_type);
http_header_add(rh, "X-Mbuni-MM-Status", octstr_get_cstr(status));
http_header_add(rh, "X-Mbuni-Message-ID", octstr_get_cstr(msgid));
http_header_add(rh, "X-Mbuni-MMSC-ID", octstr_get_cstr(mmc_id));
http_header_add(rh, "X-Mbuni-MMSC-GID", octstr_get_cstr(mmc_gid));
http_header_add(rh, "X-Mbuni-From", octstr_get_cstr(from));
if (xtransid || orig_transid)
http_header_add(rh, "X-Mbuni-TransactionID",
octstr_get_cstr(xtransid ? xtransid : orig_transid));
if (msgid)
http_header_add(rh, "X-Mbuni-Message-ID", octstr_get_cstr(msgid));
if (uaprof) {
Octstr *sx = date_format_http(uaprof_tstamp);
http_header_add(rh, "X-Mbuni-UAProf", octstr_get_cstr(uaprof));
http_header_add(rh, "X-Mbuni-Timestamp", octstr_get_cstr(sx));
octstr_destroy(sx);
}
mms_url_fetch_content(HTTP_METHOD_GET, url, rh, octstr_imm(""), &rph, &rb);
octstr_destroy(rb);
octstr_destroy(url);
octstr_destroy(xtransid);
http_destroy_headers(rph);
http_destroy_headers(rh);
@ -130,8 +145,8 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
Octstr *reply_body = NULL, *value, *desc;
List *to = NULL;
Octstr *from = NULL, *subject = NULL, *vasid = NULL, *msgid = NULL;
time_t expiryt = -1, delivert = -1;
Octstr *from = NULL, *subject = NULL, *vasid = NULL, *msgid = NULL, *uaprof = NULL;
time_t expiryt = -1, delivert = -1, uaprof_tstamp = -1;
MmsMsg *m = NULL;
int status = 1000;
unsigned char *msgtype = (unsigned char *)"";
@ -152,7 +167,7 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
goto done;
}
mm7_get_envelope(mreq, &from, &to, &subject, &vasid, &expiryt, &delivert);
mm7_get_envelope(mreq, &from, &to, &subject, &vasid, &expiryt, &delivert, &uaprof, &uaprof_tstamp);
if (!from)
from = octstr_imm("anon@anon");
@ -164,27 +179,34 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
Octstr *value = NULL;
/* Store linked id so we use it in response. */
Octstr *linkedid = mm7_soap_header_value(mreq, octstr_imm("LinkedID"));
List *qh = http_create_empty_headers();
int dlr;
value = mms_get_header_value(m, octstr_imm("X-Mms-Delivery-Report"));
if (value &&
octstr_case_compare(value, octstr_imm("Yes")) == 0)
dlr = 1;
else
dlr = 0;
value = mms_get_header_value(m, octstr_imm("X-Mms-Delivery-Report"));
if (value &&
octstr_case_compare(value, octstr_imm("Yes")) == 0)
dlr = 1;
else
dlr = 0;
if (delivert < 0)
delivert = time(NULL);
if (expiryt < 0)
expiryt = time(NULL) + DEFAULT_EXPIRE;
if (uaprof) {
Octstr *sx = date_format_http(uaprof_tstamp);
http_header_add(qh, "X-Mbuni-UAProf", octstr_get_cstr(uaprof));
http_header_add(qh, "X-Mbuni-Timestamp", octstr_get_cstr(sx));
octstr_destroy(sx);
}
qf = mms_queue_add(from, to, subject,
h->m->id, NULL,
delivert, expiryt, m, linkedid,
NULL, NULL,
NULL, NULL,
NULL,
qh,
dlr,
octstr_get_cstr(incoming_qdir),
octstr_imm(MM_NAME));
@ -193,12 +215,15 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
octstr_destroy(linkedid);
octstr_destroy(value);
http_destroy_headers(qh);
} else {
error(0, "Failed to convert received MM7/SOAP DeliverReq message from mmc=%s to MMS Message!",
error(0,
"Failed to convert received MM7/SOAP DeliverReq message from mmc=%s to MMS Message!",
octstr_get_cstr(h->m->id));
status = 4000;
}
mresp = mm7_make_resp(mreq, status, NULL,1);
break;
case MM7_TAG_DeliveryReportReq:
@ -210,7 +235,7 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
octstr_get_cstr(from), octstr_get_cstr(value), octstr_get_cstr(desc),
octstr_get_cstr(h->m->id));
send_report(from, "delivery-report", NULL,
value, msgid, h->m->id, h->m->group_id);
value, msgid, h->m->id, h->m->group_id, NULL, uaprof, uaprof_tstamp);
octstr_destroy(desc);
octstr_destroy(value);
@ -225,7 +250,7 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
send_report(from,
"read-report", NULL, value, msgid,
h->m->id, h->m->group_id);
h->m->id, h->m->group_id, NULL, uaprof, uaprof_tstamp);
octstr_destroy(value);
mms_log("ReadReport",
@ -255,6 +280,7 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
octstr_destroy(vasid);
octstr_destroy(msgid);
octstr_destroy(qf);
octstr_destroy(uaprof);
mms_destroy(m);
http_destroy_headers(rh);
octstr_destroy(reply_body);
@ -383,7 +409,7 @@ static void mm7eaif_receive(MmsHTTPClientInfo *h)
case MMS_MSGTYPE_DELIVERY_IND:
value = http_header_value(mh, octstr_imm("X-Mms-Status"));
value2 = http_header_value(mh, octstr_imm("Message-ID"));
send_report(hfrom, "delivery-report", NULL, value, value2, h->m->id, h->m->group_id);
send_report(hfrom, "delivery-report", NULL, value, value2, h->m->id, h->m->group_id, NULL, NULL, -1);
octstr_destroy(value);
octstr_destroy(value2);
@ -392,7 +418,7 @@ static void mm7eaif_receive(MmsHTTPClientInfo *h)
case MMS_MSGTYPE_READ_ORIG_IND:
value = http_header_value(mh, octstr_imm("X-Mms-Read-Status"));
value2 = http_header_value(mh, octstr_imm("Message-ID"));
send_report(hfrom, "read-report", NULL, value, value2, h->m->id, h->m->group_id);
send_report(hfrom, "read-report", NULL, value, value2, h->m->id, h->m->group_id, NULL, NULL, -1);
octstr_destroy(value);
@ -521,7 +547,7 @@ static Octstr *mm7soap_send(MmscGrp *mmc, Octstr *from, Octstr *to,
MSoapMsg_t *mreq = NULL, *mresp = NULL;
List *rh = NULL, *ph = NULL;
Octstr *body = NULL, *rbody = NULL, *url = NULL;
Octstr *s;
Octstr *s, *distrib = NULL;
info(0, "MMSBox: Send[soap] to MMSC[%s], msg type [%s], from %s, to %s",
mmc->id ? octstr_get_cstr(mmc->id) : "",
@ -529,11 +555,14 @@ static Octstr *mm7soap_send(MmscGrp *mmc, Octstr *from, Octstr *to,
octstr_get_cstr(from), octstr_get_cstr(to));
gwlist_append(xto, to);
if (hdrs)
distrib = http_header_value(hdrs, octstr_imm("X-Mbuni-DistributionIndicator"));
if ((mreq = mm7_mmsmsg_to_soap(m, from, xto, transid,
service_code,
linkedid,
1, octstr_get_cstr(mmc->id), vasid)) == NULL) {
1, octstr_get_cstr(mmc->id), vasid, NULL, 0,/* UA N/A on this side. */
distrib)) == NULL) {
*error = octstr_format("Failed to convert Msg[%S] 2 SOAP message!",
mms_message_type_to_string(mtype));
goto done1;
@ -606,7 +635,7 @@ done1:
http_destroy_headers(ph);
octstr_destroy(rbody);
octstr_destroy(url);
octstr_destroy(distrib);
gwlist_destroy(xto, NULL);
return ret;
@ -696,10 +725,11 @@ static Octstr *mm7eaif_send(MmscGrp *mmc, Octstr *from, Octstr *to,
if (ret)
mms_log2("Sent", from, to, -1, ret, NULL, mmc->id, "MMSBox", NULL, NULL);
#if 0
info(0, "Sent to MMC[%s], code=[%d], resp=[%s] msgid [%s]",
octstr_get_cstr(mmc->id),
hstatus, resp ? octstr_get_cstr(resp) : "(none)", ret ? octstr_get_cstr(ret) : "(none)");
#endif
http_destroy_headers(rh);
octstr_destroy(body);
@ -712,9 +742,12 @@ static Octstr *mm7eaif_send(MmscGrp *mmc, Octstr *from, Octstr *to,
static int mms_sendtommsc(MmscGrp *mmc, Octstr *from, Octstr *to, Octstr *transid,
Octstr *orig_transid,
Octstr *linkedid, char *vasid, Octstr *service_code,
MmsMsg *m, Octstr *dlr_url, Octstr *rr_url,
List *hdrs, Octstr **err)
List *hdrs,
Octstr **new_msgid,
Octstr **err)
{
Octstr *id = NULL, *groupid = NULL;
int ret = 0, retry = 0;
@ -735,20 +768,16 @@ static int mms_sendtommsc(MmscGrp *mmc, Octstr *from, Octstr *to, Octstr *transi
} mutex_unlock(mmc->mutex); /* release lock */
if (id) {
if (dlr_url) { /* remember the url's for reporting purposes. */
mms_dlr_url_put(id, "delivery-report", groupid, dlr_url);
send_report(from, "delivery-report", dlr_url,
octstr_imm("Sent"), id, mmc->id, groupid);
}
if (dlr_url) /* remember the url's for reporting purposes. */
mms_dlr_url_put(id, "delivery-report", groupid, dlr_url, orig_transid);
if (rr_url)
mms_dlr_url_put(id, "read-report", groupid, rr_url);
octstr_destroy(id);
mms_dlr_url_put(id, "read-report", groupid, rr_url, orig_transid);
ret = MMS_SEND_OK;
} else
ret = retry ? MMS_SEND_ERROR_TRANSIENT : MMS_SEND_ERROR_FATAL;
*new_msgid = id;
octstr_destroy(groupid);
if (id && throughput > 0)
gwthread_sleep(1.0/throughput);
@ -760,7 +789,7 @@ static int sendMsg(MmsEnvelope *e)
{
MmsMsg *msg = NULL;
int i, n;
Octstr *otransid = e->hdrs ? http_header_value(e->hdrs, octstr_imm("X-Mbuni-TransactionID")) : NULL;
msg = mms_queue_getdata(e);
for (i = 0, n = gwlist_len(e->to); i<n; i++) {
@ -769,6 +798,7 @@ static int sendMsg(MmsEnvelope *e)
Octstr *err = NULL;
time_t tnow = time(NULL);
MmscGrp *mmc = NULL;
Octstr *new_msgid = NULL;
if (!to || !to->process)
continue;
@ -798,32 +828,39 @@ static int sendMsg(MmsEnvelope *e)
res = mms_sendtommsc(mmc, e->from, to->rcpt,
e->msgId,
otransid,
e->token, /* token = linkedid */
e->vasid ? octstr_get_cstr(e->vasid) : NULL,
e->vaspid,
msg,
e->url1, e->url2,
e->hdrs,
&new_msgid,
&err);
done:
if (res == MMS_SEND_OK)
if (res == MMS_SEND_OK) {
to->process = 0;
else if (res == MMS_SEND_ERROR_FATAL && mmc)
send_report(to->rcpt, "delivery-report", e->url1,
octstr_imm("Sent"), new_msgid, mmc->id, mmc->group_id, otransid, NULL, -1);
} else if (res == MMS_SEND_ERROR_FATAL && mmc)
send_report(to->rcpt, "delivery-report",
e->url1,
(e->expiryt != 0 && e->expiryt < tnow) ?
octstr_imm("Expired") : octstr_imm("Rejected"),
e->msgId, mmc->id, mmc->group_id);
e->msgId, mmc->id, mmc->group_id, otransid, NULL, -1);
if (res == MMS_SEND_ERROR_FATAL)
to->process = 0; /* No more attempts. */
info(0, "%s MMSBox Outgoing Queue MMS Send: From %s, to %s, msgsize=%ld: err=%s",
info(0, "%s MMSBox Outgoing Queue MMS Send: From %s, to %s, msgsize=%ld: msgid=[%s], err=%s",
SEND_ERROR_STR(res),
octstr_get_cstr(e->from), octstr_get_cstr(to->rcpt), e->msize,
new_msgid ? octstr_get_cstr(new_msgid) : NULL,
err ? octstr_get_cstr(err) : "(none)");
octstr_destroy(new_msgid);
e->lasttry = tnow;
if (mms_queue_update(e) == 1) {
e = NULL;
@ -833,6 +870,7 @@ static int sendMsg(MmsEnvelope *e)
}
mms_destroy(msg);
octstr_destroy(otransid);
if (e) { /* Update the queue if it is still valid (e.g. recipients not handled)
* XXX can this happen here??...

View File

@ -81,33 +81,41 @@ static int dlr_entry_fname(char *msgid, char *rtype, Octstr *mmc_gid, Octstr **e
return fd;
}
void mms_dlr_url_put(Octstr *msgid, char *rtype, Octstr *mmc_gid, Octstr *dlr_url)
void mms_dlr_url_put(Octstr *msgid, char *rtype, Octstr *mmc_gid, Octstr *dlr_url, Octstr *transid)
{
int fd = dlr_entry_fname(octstr_get_cstr(msgid), rtype, mmc_gid, NULL);
if (fd >= 0) {
octstr_write_data(dlr_url, fd, 0);
Octstr *x = octstr_format("%S %S", transid ? transid : octstr_imm("x"), dlr_url); /* better have no spaces in transid! */
octstr_write_data(x, fd, 0);
close(fd);
octstr_destroy(x);
}
}
Octstr *mms_dlr_url_get(Octstr *msgid, char *rtype, Octstr *mmc_gid)
int mms_dlr_url_get(Octstr *msgid, char *rtype, Octstr *mmc_gid, Octstr **dlr_url, Octstr **transid)
{
int fd = dlr_entry_fname(octstr_get_cstr(msgid), rtype, mmc_gid, NULL);
FILE *f;
if (fd >= 0 && (f = fdopen(fd, "r+")) != NULL) {
Octstr *s = octstr_read_pipe(f);
int i, ret;
fclose(f);
if (s && octstr_len(s) == 0) {
octstr_destroy(s);
return NULL;
ret = -1;
} else if ((i = octstr_search_char(s, ' ', 0)) >= 0) {
*transid = octstr_copy(s, 0, i);
*dlr_url = octstr_copy(s, i+1, octstr_len(s));
ret = 0;
} else
return s;
ret = -1;
octstr_destroy(s);
return ret;
} else if (fd >= 0)
close(fd);
return NULL;
return -1;
}
void mms_dlr_url_remove(Octstr *msgid, char *rtype, Octstr *mmc_gid)

View File

@ -293,6 +293,7 @@ done:
enum _xurltype {FILE_TYPE, URL_TYPE};
static Octstr *url_path_prefix(Octstr *url, int type);
/* this function constructs and sends the message -- a bit too many params XXX! */
static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
Octstr *msg_url,
Octstr *base_url, int type, MmsEnvelope *e,
@ -308,13 +309,15 @@ static int fetch_serviceurl(MmsEnvelope *e,
Octstr **err)
{
List *rh, *rph = NULL;
Octstr *body = NULL, *rb = NULL;
Octstr *body = NULL, *rb = NULL, *transid;
Octstr *ctype = NULL, *params = NULL;
Octstr *s;
int i, n, method, typ = FILE_TYPE;
FILE *fp = NULL;
int res = -1;
transid = mms_maketransid(e->xqfname, octstr_imm(MM_NAME));
switch (ms->type) {
case TRANS_TYPE_GET_URL:
case TRANS_TYPE_POST_URL:
@ -331,11 +334,25 @@ static int fetch_serviceurl(MmsEnvelope *e,
if (e->subject)
http_header_add(rh, "X-Mbuni-Subject", octstr_get_cstr(e->subject));
/* Put in a transaction ID. */
http_header_add(rh, "X-Mbuni-TransactionID", octstr_get_cstr(transid));
for (i = 0, n = gwlist_len(e->to); i < n; i++) {
MmsEnvelopeTo *r = gwlist_get(e->to, i);
if (r && r->rcpt)
http_header_add(rh, "X-Mbuni-To", octstr_get_cstr(r->rcpt));
}
if ((s = http_header_value(e->hdrs, octstr_imm("X-Mbuni-UAProf"))) != NULL) { /* add UAProf info, if any. */
Octstr *sx = http_header_value(e->hdrs,octstr_imm("X-Mbuni-Timestamp"));
http_header_add(rh, "X-Mbuni-UAProf", octstr_get_cstr(s));
if (sx)
http_header_add(rh, "X-Mbuni-Timestamp", octstr_get_cstr(sx));
octstr_destroy(sx);
octstr_destroy(s);
}
if (ms->type == TRANS_TYPE_POST_URL) { /* Put in the parameters. */
MIMEEntity *x = mime_entity_create();
@ -358,14 +375,16 @@ static int fetch_serviceurl(MmsEnvelope *e,
method = HTTP_METHOD_GET;
typ = URL_TYPE;
if (mmsbox_url_fetch_content(method, ms->url, rh, body, &rph, &rb) == HTTP_OK)
if (mmsbox_url_fetch_content(method, ms->url, rh, body, &rph, &rb) == HTTP_OK) {
get_content_type(rph, &ctype, &params);
else
/* add transaction id back.*/
http_header_remove_all(rph, "X-Mbuni-TransactionID");
http_header_add(rph, "X-Mbuni-TransactionID", octstr_get_cstr(transid));
} else
*err = octstr_format("MMSBox: Failed to fetch content for Service %S, url %S!",
ms->name, ms->url);
http_destroy_headers(rh);
if (body)
octstr_destroy(body);
octstr_destroy(body);
break;
case TRANS_TYPE_FILE:
if ((fp = fopen(octstr_get_cstr(ms->url), "r")) != NULL) {
@ -438,7 +457,8 @@ done:
octstr_destroy(rb);
http_destroy_headers(rph);
octstr_destroy(params);
octstr_destroy(transid);
return res;
}
@ -451,7 +471,8 @@ static int mmsbox_service_dispatch(MmsEnvelope *e)
Octstr *err = NULL, *keyword = NULL;
MmsService *ms;
gw_assert(e->msgtype == MMS_MSGTYPE_SEND_REQ || e->msgtype == MMS_MSGTYPE_RETRIEVE_CONF);
gw_assert(e->msgtype == MMS_MSGTYPE_SEND_REQ ||
e->msgtype == MMS_MSGTYPE_RETRIEVE_CONF);
if ((msg = mms_queue_getdata(e)) == NULL) {
err = octstr_format("Failed to read message for queue entry %s!",
@ -800,11 +821,12 @@ static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
{
Octstr *from = NULL, *xfrom = NULL, *subject = NULL, *turl = get_toplevel_url(base_url);
Octstr *dlr_url = NULL, *rr_url = NULL, *mmc = NULL, *xservice_code = NULL, *hsvc_code = NULL;
Octstr *allow_adaptations = NULL, *mclass = NULL, *prio = NULL;
Octstr *allow_adaptations = NULL, *mclass = NULL, *prio = NULL, *distro = NULL;
MmsMsg *m = NULL;
MIMEEntity *me = mime_entity_create();
List *hdrs = NULL, *xheaders = NULL;
List *xheaders = NULL;
List *hdrs = http_create_empty_headers();
Octstr *otransid = NULL;
time_t expiryt = time(NULL) + DEFAULT_EXPIRE;
Octstr *x;
@ -856,6 +878,11 @@ static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
hsvc_code = http_header_value(reply_headers, octstr_imm("X-Mbuni-ServiceCode"));
}
if (reply_headers) {
/* always capture transid and distro */
otransid = http_header_value(reply_headers, octstr_imm("X-Mbuni-TransactionID"));
distro = http_header_value(reply_headers, octstr_imm("X-Mbuni-DistributionIndicator"));
}
if (gwlist_len(xto) == 0 && e && e->from)
gwlist_append(xto, octstr_duplicate(e->from));
@ -988,7 +1015,6 @@ static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
me = xm;
}
}
/* Add some nice headers. */
xheaders = mime_entity_headers(me);
@ -1003,7 +1029,7 @@ static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
if (dlr_url)
http_header_add(xheaders, "X-Mms-Delivery-Report", "Yes");
if (rr_url)
http_header_add(xheaders, "X-Mms-Read-Report", "Yes");
http_header_add(xheaders, "X-Mms-Read-Reply", "Yes");
if (allow_adaptations)
http_header_add(xheaders, "X-Mms-Allow-Adaptations",
(octstr_str_compare(allow_adaptations, "true") == 0) ? "true" : "false");
@ -1032,11 +1058,15 @@ static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
goto done;
}
if (otransid) /* always add transid */
http_header_add(hdrs, "X-Mbuni-TransactionID", octstr_get_cstr(otransid));
if (distro) /* always add distrib */
http_header_add(hdrs, "X-Mbuni-DistributionIndicator", octstr_get_cstr(distro));
if (passthro_headers && reply_headers) { /* if user wants passthro headers, get them and add them. */
int n = gwlist_len(reply_headers);
int i;
hdrs = http_create_empty_headers();
int i;
for (i = 0; i < n; i++) {
Octstr *h = NULL, *v = NULL;
int j;
@ -1072,8 +1102,10 @@ static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
(dlr_url != NULL),
octstr_get_cstr(qdir),
octstr_imm(MM_NAME));
info(0, "MMSBox: Queued message from service [%s]: %s",
octstr_get_cstr(svc_name), octstr_get_cstr(x));
info(0, "MMSBox: Queued message from service [%s], [transid [%s]: %s",
octstr_get_cstr(svc_name),
otransid ? octstr_get_cstr(otransid) : "",
octstr_get_cstr(x));
*err = x;
res = 0;
done:
@ -1086,6 +1118,7 @@ done:
octstr_destroy(from);
octstr_destroy(xfrom);
octstr_destroy(subject);
octstr_destroy(otransid);
if (me)
mime_entity_destroy(me);
@ -1258,20 +1291,27 @@ static void sendmms_func(void *unused)
/* Requests to make_and_queue below can block, but for now we don't care. */
if (ctype && data && !rb) { /* only send if no error. */
int send_as_incoming = (send_type &&
octstr_str_case_compare(send_type, "mo") == 0);
Octstr *transid = NULL;
if (!send_as_incoming) { /* for outgoing, track TransactionID for DLR. */
transid = mms_maketransid(NULL, octstr_imm(MM_NAME));
http_header_add(rh, "X-Mbuni-TransactionID", octstr_get_cstr(transid));
}
res = make_and_queue_msg(data, ctype, rh,
data_url ? data_url : base_url,
base_url, URL_TYPE, NULL,
vasid ? vasid : octstr_imm("sendmms-user"),
u->faked_sender, service_code,
1, NULL,
(send_type &&
octstr_str_case_compare(send_type, "mo") == 0) ?
incoming_qdir : outgoing_qdir,
send_as_incoming ? incoming_qdir : outgoing_qdir,
&err);
if (res < 0)
rb = octstr_format("Error in message conversion: %S", err);
else
rb = octstr_format("Accepted: %S", err ? err : octstr_imm("1"));
rb = octstr_format("Accepted: %S", /* repeat transid. */
send_as_incoming ? err : transid);
octstr_destroy(transid);
} else if (!rb)
rb = octstr_imm("Failed to send message");
http_send_reply(client, (res == 0) ? HTTP_OK : HTTP_BAD_REQUEST, hh,
@ -1281,7 +1321,6 @@ static void sendmms_func(void *unused)
(res == 0) ? "Queued" : "Not Queued",
rb ? octstr_get_cstr(rb) : "");
http_destroy_headers(rh);
octstr_destroy(ctype);
octstr_destroy(rb);

View File

@ -15,8 +15,8 @@
#include "mmsbox_cfg.h"
extern int rstop;
void mms_dlr_url_put(Octstr *msgid, char *rtype, Octstr *mmc_gid, Octstr *dlr_url);
Octstr *mms_dlr_url_get(Octstr *msgid, char *rtype, Octstr *mmc_gid);
void mms_dlr_url_put(Octstr *msgid, char *rtype, Octstr *mmc_gid, Octstr *dlr_url, Octstr *transid);
int mms_dlr_url_get(Octstr *msgid, char *rtype, Octstr *mmc_gid, Octstr **dlr_url, Octstr **transid);
void mms_dlr_url_remove(Octstr *msgid, char *rtype, Octstr *mmc_gid);
void mmsc_receive_func(MmscGrp *m);
void mmsbox_outgoing_queue_runner(int *rstop);

View File

@ -345,6 +345,19 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays)
warning(0, "mms-to-mobile copy handler VASP specified more than once! Only last config taken.");
m->mms2mobile = mv;
}
if ((s = _mms_cfg_getx(grp, octstr_imm("send-uaprof"))) != NULL){
if (octstr_str_case_compare(s, "url") == 0)
mv->send_uaprof = UAProf_URL;
else if (octstr_str_case_compare(s, "ua") == 0)
mv->send_uaprof = UAProf_UA;
else {
warning(0, "unknown send-uaprof value '%s'. Must be \"ua\" or \"url\"!",
octstr_get_cstr(s));
mv->send_uaprof = UAProf_None;
}
octstr_destroy(s);
}
gwlist_append(m->vasp_list, mv);
}
gwlist_destroy(l, NULL);

View File

@ -31,6 +31,7 @@ typedef struct MmsVasp {
enum {SOAP_VASP, EAIF_VASP, NONE_VASP} type;
Octstr *vasp_username, *vasp_password;
Octstr *vasp_url;
enum {UAProf_None, UAProf_URL, UAProf_UA} send_uaprof;
MM7Version_t ver;
} MmsVasp;

View File

@ -49,6 +49,7 @@ static int mms_sendtoproxy(Octstr *from, Octstr *to,
int dlr, Octstr **error);
static int mms_sendtovasp(MmsVasp *vasp, Octstr *from, Octstr *to, Octstr *msgId,
List *qh,
MmsMsg *m, Octstr **error);
static int _x_octstr_int_compare(int n, Octstr *s);
@ -156,6 +157,7 @@ static int sendMsg(MmsEnvelope *e)
res = mms_sendtovasp(settings->mms2email,
e->from, to->rcpt,
e->msgId,
e->hdrs,
msg, &err);
else
res = mms_sendtoemail(pfrom, to->rcpt,
@ -191,6 +193,7 @@ static int sendMsg(MmsEnvelope *e)
int res = mms_sendtovasp(settings->mms2mobile,
e->from, to->rcpt,
e->msgId,
e->hdrs,
msg, &err);
info(0, "%s Global Queue MMS Send: Local Msg copy to VASP (%s) - "
"From %s, to %s, msgsize=%ld: err=%s",
@ -220,6 +223,7 @@ static int sendMsg(MmsEnvelope *e)
_x_octstr_int_compare(vasp->short_code, phonenum) == 0) {
res = mms_sendtovasp(vasp, e->from, to->rcpt,
e->msgId,
e->hdrs,
msg, &err);
sent = 1;
break;
@ -242,6 +246,7 @@ static int sendMsg(MmsEnvelope *e)
int res = mms_sendtovasp(settings->mms2mobile,
e->from, to->rcpt,
e->msgId,
e->hdrs,
msg, &err);
info(0, "%s Global Queue MMS Send: Local Msg copy to VASP (%s) - "
"From %s, to %s, msgsize=%ld: err=%s",
@ -310,7 +315,7 @@ static int sendMsg(MmsEnvelope *e)
gwlist_append(l, octstr_duplicate(e->from));
/* Add to queue, switch via proxy to be from proxy. */
qfs = mms_queue_add(settings->system_user, l,
qfs = mms_queue_add(to->rcpt, l,
err, NULL, e->fromproxy,
tnow, tnow+settings->default_msgexpiry, m, NULL,
NULL, NULL,
@ -528,7 +533,8 @@ static int _x_octstr_int_compare(int n, Octstr *s)
}
static int mm7soap_send(MmsVasp *vasp, Octstr *from, Octstr *to, Octstr *msgId,
MmsMsg *m, Octstr **error)
List *qh,
MmsMsg *m, Octstr **error)
{
int ret = MMS_SEND_ERROR_TRANSIENT;
int mtype = mms_messagetype(m);
@ -537,8 +543,8 @@ static int mm7soap_send(MmsVasp *vasp, Octstr *from, Octstr *to, Octstr *msgId,
MSoapMsg_t *mreq = NULL, *mresp = NULL;
List *rh = NULL, *ph = NULL;
Octstr *body = NULL, *rbody = NULL;
Octstr *s;
Octstr *uaprof = NULL, *s;
time_t tstamp;
info(0, "MMS Relay: Send[soap] to VASP[%s], msg_type=[%s], from=[%s], to=[%s]",
vasp ? octstr_get_cstr(vasp->id) : "",
@ -546,10 +552,20 @@ static int mm7soap_send(MmsVasp *vasp, Octstr *from, Octstr *to, Octstr *msgId,
gwlist_append(xto, to);
if (vasp->send_uaprof == UAProf_URL)
uaprof = http_header_value(qh, octstr_imm("X-Mbuni-Profile-Url"));
else if (vasp->send_uaprof == UAProf_UA)
uaprof = http_header_value(qh, octstr_imm("X-Mbuni-User-Agent"));
if ((s = http_header_value(qh, octstr_imm("X-Mbuni-Timestamp"))) != NULL) {
tstamp = strtoul(octstr_get_cstr(s), NULL, 10);
octstr_destroy(s);
} else
tstamp = 0;
if ((mreq = mm7_mmsmsg_to_soap(m, from, xto, msgId, settings->host_alias,
msgId,
0, NULL, NULL)) == NULL) {
0, NULL, NULL, uaprof, tstamp, NULL)) == NULL) {
*error = octstr_format("Failed to convert Msg[%s] 2 SOAP message!",
mms_message_type_to_cstr(mtype));
goto done1;
@ -604,19 +620,16 @@ static int mm7soap_send(MmsVasp *vasp, Octstr *from, Octstr *to, Octstr *msgId,
tstatus, mms_soap_status_to_cstr(tstatus));
done1:
if (mreq)
mm7_soap_destroy(mreq);
if (mresp)
mm7_soap_destroy(mresp);
if (rh)
http_destroy_headers(rh);
if (body)
octstr_destroy(body);
if (ph)
http_destroy_headers(ph);
if (rbody)
octstr_destroy(rbody);
mm7_soap_destroy(mreq);
mm7_soap_destroy(mresp);
http_destroy_headers(rh);
octstr_destroy(body);
http_destroy_headers(ph);
octstr_destroy(rbody);
octstr_destroy(uaprof);
gwlist_destroy(xto, NULL);
return ret;
@ -695,13 +708,14 @@ static int mm7eaif_send(MmsVasp *vasp, Octstr *from, Octstr *to, Octstr *msgid,
}
static int mms_sendtovasp(MmsVasp *vasp, Octstr *from, Octstr *to, Octstr *msgid,
List *qh,
MmsMsg *m, Octstr **err)
{
if (m == NULL) {
*err = octstr_format("GlobalSend: Failed to send to %S, Message format is corrupt!", to);
return MMS_SEND_ERROR_FATAL;
} else if (vasp->type == SOAP_VASP)
return mm7soap_send(vasp, from, to, msgid, m, err);
return mm7soap_send(vasp, from, to, msgid, qh, m, err);
else if (vasp->type == EAIF_VASP)
return mm7eaif_send(vasp, from, to, msgid, m, err);
else {

View File

@ -386,9 +386,7 @@ void fetchmms_proxy(MmsHTTPClientInfo *h)
/* Send to access log with success. */
mms_log2("Fetched", e ? e->from : NULL, h->client_addr,
e ? e->msize : 0, e ? e->msgId : NULL, NULL, NULL, "MM1",
h->ua, (loc == MMS_LOC_MMBOX) ? qf : NULL);
h->ua, (loc == MMS_LOC_MMBOX) ? qf : NULL);
goto free_stuff; /* Skip to end. */
failed:
@ -415,7 +413,6 @@ void fetchmms_proxy(MmsHTTPClientInfo *h)
}
free_stuff:
if (notify_cmd) /* Inform provisioning server */
notify_prov_server(octstr_get_cstr(settings->prov_notify),
h->base_client_addr ? octstr_get_cstr(h->base_client_addr) : "unknown",
@ -423,15 +420,15 @@ void fetchmms_proxy(MmsHTTPClientInfo *h)
http_destroy_headers(rh);
if (e) mms_queue_free_env(e);
mms_queue_free_env(e);
if (s) octstr_destroy(s);
if (m) mms_destroy(m);
if (mr) mms_destroy(mr);
octstr_destroy(s);
mms_destroy(m);
mms_destroy(mr);
if (qf) octstr_destroy(qf);
if (token) octstr_destroy(token);
if (transid) octstr_destroy(transid);
octstr_destroy(qf);
octstr_destroy(token);
octstr_destroy(transid);
free_clientInfo(h,1);
}
@ -446,9 +443,11 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
int ctype_set = 0;
int mtype = 0, menc;
int hstatus = HTTP_OK;
char *notify_cmd = NULL;
char *notify_cmd = NULL, tbuf[64];
int msize = h->body ? octstr_len(h->body) : 0;
List *qh = http_create_empty_headers();
debug("proxy.sendinterface", 0,
" --> Enterred sendmms interface, blen=%d <--- ",
msize);
@ -458,7 +457,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
if (!h->body) { /* A body is required. */
http_header_add(rh, "Content-Type", "text/plain");
hstatus = HTTP_FORBIDDEN;
hstatus = HTTP_BAD_REQUEST;
reply_body = octstr_format("Unexpected MMS message[%s], no body?",
mms_message_type_to_cstr(mtype));
@ -476,9 +475,17 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
goto done;
}
/* Record user agent and profile url. */
if (h->ua)
http_header_add(qh, "X-Mbuni-User-Agent", octstr_get_cstr(h->ua));
if (h->profile_url)
http_header_add(qh, "X-Mbuni-Profile-Url", octstr_get_cstr(h->profile_url));
sprintf(tbuf, "%ld", time(NULL));
http_header_add(qh, "X-Mbuni-Timestamp", tbuf); /* record time of message. */
debug("proxy.sendinterface", 0, " Client sent us: ");
#if 1
#if 0
mms_msgdump(m,1);
/* octstr_dump(h->body, 0); */
#endif
@ -495,13 +502,11 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
List *to = gwlist_create();
Octstr *subject = NULL;
time_t expiryt, deliveryt;
Octstr *otransid = NULL, *value = NULL, *msgid = NULL;
int dlr;
char *mmbox_store_status = NULL;
Octstr *mmbox_loc = NULL;
Octstr *sdf = NULL;
mms_collect_envdata_from_msgheaders(mh, &to, &subject, &otransid, &expiryt,
&deliveryt, settings->default_msgexpiry);
@ -551,14 +556,12 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
octstr_case_compare(value, octstr_imm("Yes")) == 0)
dlr = 1;
else
dlr = 0;
dlr = 0;
qf = mms_queue_add(from, to, subject,
NULL, NULL, deliveryt, expiryt, m, NULL,
NULL, NULL,
NULL, NULL,
NULL,
qh,
dlr,
octstr_get_cstr(settings->global_queuedir),
settings->host_alias);
@ -585,28 +588,16 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
mms_replace_header_value(mresp,
"X-Mms-Content-Location",
octstr_get_cstr(mmbox_loc));
}
if (otransid)
octstr_destroy(otransid);
if (value)
octstr_destroy(value);
}
octstr_destroy(otransid);
octstr_destroy(value);
octstr_destroy(msgid);
octstr_destroy(mmbox_loc);
octstr_destroy(sdf);
octstr_destroy(from);
octstr_destroy(subject);
http_destroy_headers(mh);
if (msgid)
octstr_destroy(msgid);
if (mmbox_loc)
octstr_destroy(mmbox_loc);
if (sdf)
octstr_destroy(sdf);
if (from)
octstr_destroy(from);
if (subject)
octstr_destroy(subject);
if (mh)
http_destroy_headers(mh);
gwlist_destroy(to, (gwlist_item_destructor_t *)octstr_destroy);
notify_cmd = "sent";
@ -689,8 +680,6 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
}
{ /* Found it, etc. */
Octstr *pfrom = mms_get_header_value(mfwd, octstr_imm("From"));
Octstr *pdate = mms_get_header_value(mfwd, octstr_imm("Date"));
Octstr *pmsgid = mms_get_header_value(mfwd, octstr_imm("Message-ID"));
@ -752,7 +741,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
NULL, NULL, deliveryt, expiryt, mfwd, NULL,
NULL, NULL,
NULL, NULL,
NULL,
qh,
dlr,
octstr_get_cstr(settings->global_queuedir),
settings->host_alias);
@ -969,7 +958,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
time(NULL) + settings->default_msgexpiry, mrpt, NULL,
NULL, NULL,
NULL, NULL,
NULL,
qh,
0,
octstr_get_cstr(settings->global_queuedir),
settings->host_alias);
@ -1025,7 +1014,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
m, NULL,
NULL, NULL,
NULL, NULL,
NULL,
qh,
0,
octstr_get_cstr(settings->global_queuedir),
settings->host_alias);
@ -1142,13 +1131,10 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
store_done:
if (xstate)
octstr_destroy(xstate);
octstr_destroy(xstate);
if (xflags)
gwlist_destroy(xflags, (gwlist_item_destructor_t *)octstr_destroy);
if (mstore)
mms_destroy(mstore);
gwlist_destroy(xflags, (gwlist_item_destructor_t *)octstr_destroy);
mms_destroy(mstore);
if (e) { /* Update the message queue and go. */
e->lastaccess = time(NULL);
@ -1157,23 +1143,13 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
e = NULL;
}
if (qf)
octstr_destroy(qf);
if (token)
octstr_destroy(token);
if (mh)
http_destroy_headers(mh);
if (otransid)
octstr_destroy(otransid);
if (url)
octstr_destroy(url);
if (mmbox_loc)
octstr_destroy(mmbox_loc);
if (sdf)
octstr_destroy(sdf);
octstr_destroy(qf);
octstr_destroy(token);
http_destroy_headers(mh);
octstr_destroy(otransid);
octstr_destroy(url);
octstr_destroy(mmbox_loc);
octstr_destroy(sdf);
reply_body = mms_tobinary(mresp);
notify_cmd = "stored";
@ -1514,20 +1490,19 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
done:
#if 1
if (mresp)
mms_msgdump(mresp, 0);
#endif
if (mresp)
mms_destroy(mresp);
mms_msgdump(mresp, 0);
#endif
mms_destroy(mresp);
if (!ctype_set)
http_header_add(rh, "Content-Type", "application/vnd.wap.mms-message");
http_send_reply(h->client, hstatus, rh, reply_body);
http_destroy_headers(rh);
if (reply_body)
octstr_destroy(reply_body);
octstr_destroy(reply_body);
http_destroy_headers(qh);
free_clientInfo(h,1);
}
@ -1611,7 +1586,7 @@ static void mm7soap_dispatch(MmsHTTPClientInfo *h)
sender = octstr_format("%d/TYPE=PLMN", h->vasp->short_code);
switch (mm7_msgtype(mreq)) {
case MM7_TAG_SubmitReq:
mm7_get_envelope(mreq, &from, &to, &subject, &vasid, &expiryt, &delivert);
mm7_get_envelope(mreq, &from, &to, &subject, &vasid, &expiryt, &delivert, NULL, NULL);
m = mm7_soap_to_mmsmsg(mreq, from ? from : sender);
if (m) {
Octstr *value = NULL;
@ -1629,7 +1604,7 @@ static void mm7soap_dispatch(MmsHTTPClientInfo *h)
if (expiryt < 0)
expiryt = time(NULL) + settings->default_msgexpiry;
mms_remove_headers(m, "Message-ID"); /* cannot be found here. */
qf = mms_queue_add(from ? from : sender, to, subject,
NULL, NULL,
delivert, expiryt, m, NULL,
@ -1642,8 +1617,7 @@ static void mm7soap_dispatch(MmsHTTPClientInfo *h)
msgid = mms_maketransid(octstr_get_cstr(qf), settings->host_alias);
mms_log("Received", from ? from : sender, to, -1, msgid, h->vasp->id, NULL, "MM7",
h->ua, NULL);
if (value)
octstr_destroy(value);
octstr_destroy(value);
} else {
error(0, "Failed to convert received MM7/SOAP SubmitReq message from vasp=%s to MMS Message!",
octstr_get_cstr(h->vasp->id));
@ -1696,11 +1670,9 @@ static void mm7soap_dispatch(MmsHTTPClientInfo *h)
e = NULL;
mms_log("Replace",
sender, NULL, -1, msgid, h->vasp->id, NULL, "MM7", h->ua, NULL);
if (new)
mms_destroy(new);
if (old)
mms_destroy(old);
mms_destroy(new);
mms_destroy(old);
http_destroy_headers(hh);
}
} else {
@ -1829,6 +1801,7 @@ static void mm7eaif_dispatch(MmsHTTPClientInfo *h)
goto done;
}
mms_remove_headers(m, "Message-ID");
mh = mms_message_headers(m);
/* Now get sender and receiver data.
* for now we ignore adaptation flags.