misc. fixes: DLR, UAProf on mmsbox side
This commit is contained in:
parent
67cdf0f387
commit
96811a10b7
|
@ -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>
|
2007-08-03 P. A. Bagyenda <bagyenda@dsmagic.com>
|
||||||
* added mms-direction CGI param to send-mms interface (see doc for additional info)
|
* added mms-direction CGI param to send-mms interface (see doc for additional info)
|
||||||
2007-07-27 P. A. Bagyenda <bagyenda@dsmagic.com>
|
2007-07-27 P. A. Bagyenda <bagyenda@dsmagic.com>
|
||||||
|
|
|
@ -1828,6 +1828,26 @@ Boolean
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</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>
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
@ -2600,6 +2620,16 @@ faked-sender = 100<br>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</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>
|
</table>
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
|
@ -3176,6 +3206,44 @@ A detailed list of configuration parameters for MMS Services is given below.
|
||||||
MMS message priority
|
MMS message priority
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</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>
|
</table>
|
||||||
</p>
|
</p>
|
||||||
|
@ -3590,7 +3658,9 @@ maximum, and the queue entry ID is printed to standard output.
|
||||||
queue. If the
|
queue. If the
|
||||||
sender requested a read or delivery report (by specifying the
|
sender requested a read or delivery report (by specifying the
|
||||||
requisite URL), the relevant URL is
|
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,
|
<li><b>MMSC handler module:</b> Receives messages coming from MMSCs,
|
||||||
and saves them to the incoming queue. Also watches the outgoing
|
and saves them to the incoming queue. Also watches the outgoing
|
||||||
message queue for new messages, which it dispatches to the relevant
|
message queue for new messages, which it dispatches to the relevant
|
||||||
|
|
|
@ -107,7 +107,8 @@ MULTI_GROUP(mms-vasp,
|
||||||
OCTSTR(vasp-password)
|
OCTSTR(vasp-password)
|
||||||
OCTSTR(vasp-url)
|
OCTSTR(vasp-url)
|
||||||
OCTSTR(mms-to-email-handler)
|
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,
|
MULTI_GROUP(send-mms-user,
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* MM7/SOAP message encoder/decoder and helper functions
|
* 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>
|
* Paul Bagyenda <bagyenda@dsmagic.com>
|
||||||
*
|
*
|
||||||
|
@ -26,7 +26,7 @@ struct MSoapMsg_t {
|
||||||
|
|
||||||
/* We expect ISO formatted time, or interval. */
|
/* 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);
|
time_t t = time(NULL);
|
||||||
Octstr *p = octstr_create(s);
|
Octstr *p = octstr_create(s);
|
||||||
|
@ -83,7 +83,7 @@ static Octstr *parse_time(char *s)
|
||||||
|
|
||||||
done:
|
done:
|
||||||
octstr_destroy(p);
|
octstr_destroy(p);
|
||||||
return date_format_http(t);
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parse_header(xmlNodePtr node, List *headers, int *sigparent)
|
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:
|
case MM7_TAG_Recipient:
|
||||||
*sigparent = MM7_TAG_To; /* make it a To field. */
|
*sigparent = MM7_TAG_To; /* make it a To field. */
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case MM7_TAG_To:
|
case MM7_TAG_To:
|
||||||
case MM7_TAG_Cc:
|
case MM7_TAG_Cc:
|
||||||
|
@ -159,11 +158,15 @@ static int parse_header(xmlNodePtr node, List *headers, int *sigparent)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MM7_TAG_Content:
|
case MM7_TAG_Content:
|
||||||
if ((s = xmlGetProp(node, (unsigned char *)"href")) != NULL) {
|
if ((s = xmlGetProp(node, (unsigned char *)"href")) != NULL) {
|
||||||
value = octstr_create((char *)s);
|
value = octstr_create((char *)s);
|
||||||
|
xmlFree(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((s = xmlGetProp(node, (unsigned char *)"allowAdaptations")) != NULL) {
|
||||||
|
http_header_add(headers, "allowAdaptations", (char *)s);
|
||||||
xmlFree(s);
|
xmlFree(s);
|
||||||
}
|
}
|
||||||
/* we keep 'cid:' bit. ignore the bit about adaptation. */
|
|
||||||
break;
|
break;
|
||||||
case MM7_TAG_ShortCode:
|
case MM7_TAG_ShortCode:
|
||||||
case MM7_TAG_Number: /* we will not normalise number here, that's for upper level. */
|
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_ExpiryDate:
|
||||||
case MM7_TAG_TimeStamp:
|
case MM7_TAG_TimeStamp:
|
||||||
case MM7_TAG_Date:
|
case MM7_TAG_Date:
|
||||||
value = parse_time(nvalue);
|
value = date_format_http(parse_time(nvalue));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MM7_TAG_ReplyCharging:
|
case MM7_TAG_ReplyCharging:
|
||||||
|
@ -199,12 +202,25 @@ static int parse_header(xmlNodePtr node, List *headers, int *sigparent)
|
||||||
xmlFree(s);
|
xmlFree(s);
|
||||||
}
|
}
|
||||||
if ((s = xmlGetProp(node, (unsigned char *)"replyDeadline")) != NULL) {
|
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));
|
http_header_add(headers, "replyDeadline", octstr_get_cstr(t));
|
||||||
xmlFree(s);
|
xmlFree(s);
|
||||||
octstr_destroy(t);
|
octstr_destroy(t);
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -487,9 +503,9 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver)
|
||||||
}
|
}
|
||||||
|
|
||||||
octstr_append_cstr(s, "</mm7:SenderIdentification>\n");
|
octstr_append_cstr(s, "</mm7:SenderIdentification>\n");
|
||||||
if (p) octstr_destroy(p);
|
octstr_destroy(p);
|
||||||
if (q) octstr_destroy(q);
|
octstr_destroy(q);
|
||||||
if (r) octstr_destroy(r);
|
octstr_destroy(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
p = octstr_create("");
|
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++) {
|
for (i = 0, n = gwlist_len(hdrs); i < n; i++) {
|
||||||
Octstr *h = NULL, *v = NULL;
|
Octstr *h = NULL, *v = NULL;
|
||||||
char *zz;
|
char *zz, *s1, *s2;
|
||||||
int tag;
|
int tag;
|
||||||
int skip = 0;
|
int skip = 0;
|
||||||
|
|
||||||
|
@ -610,7 +626,19 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver)
|
||||||
octstr_append_cstr(s, "</mm7:Status>\n");
|
octstr_append_cstr(s, "</mm7:Status>\n");
|
||||||
skip = 1;
|
skip = 1;
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -618,14 +646,12 @@ static Octstr *headers_to_soapxml(List *hdrs, MM7Version_t *ver)
|
||||||
if (!skip && h && v)
|
if (!skip && h && v)
|
||||||
octstr_format_append(s, "<mm7:%S>%S</mm7:%S>\n", h, v, h);
|
octstr_format_append(s, "<mm7:%S>%S</mm7:%S>\n", h, v, h);
|
||||||
|
|
||||||
if (h) octstr_destroy(h);
|
octstr_destroy(h);
|
||||||
if (v) octstr_destroy(v);
|
octstr_destroy(v);
|
||||||
}
|
}
|
||||||
octstr_format_append(s, "</mm7:%S>\n", mtype);
|
octstr_format_append(s, "</mm7:%S>\n", mtype);
|
||||||
octstr_destroy(mtype);
|
octstr_destroy(mtype);
|
||||||
|
if (fault) {
|
||||||
if (fault) {
|
|
||||||
|
|
||||||
octstr_append_cstr(s, "</detail>\n");
|
octstr_append_cstr(s, "</detail>\n");
|
||||||
octstr_append_cstr(s, "</" SOAP_ENV ":Fault>\n");
|
octstr_append_cstr(s, "</" SOAP_ENV ":Fault>\n");
|
||||||
octstr_destroy(fault);
|
octstr_destroy(fault);
|
||||||
|
@ -757,7 +783,9 @@ int mm7_get_envelope(MSoapMsg_t *m,
|
||||||
List **to, Octstr **subject,
|
List **to, Octstr **subject,
|
||||||
Octstr **vasid,
|
Octstr **vasid,
|
||||||
time_t *expiry_t,
|
time_t *expiry_t,
|
||||||
time_t *delivery_t)
|
time_t *delivery_t,
|
||||||
|
Octstr **uaprof,
|
||||||
|
time_t *uaprof_tstamp)
|
||||||
{
|
{
|
||||||
Octstr *s;
|
Octstr *s;
|
||||||
|
|
||||||
|
@ -801,6 +829,20 @@ int mm7_get_envelope(MSoapMsg_t *m,
|
||||||
octstr_destroy(s);
|
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;
|
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) {
|
if ((s = http_header_value(m->envelope, octstr_imm("ReadReply"))) != NULL) {
|
||||||
long x = mms_string_to_boolean_flag(s);
|
long x = mms_string_to_boolean_flag(s);
|
||||||
if (x >= 0)
|
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));
|
(char *)mms_reports_to_cstr(x));
|
||||||
octstr_destroy(s);
|
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,
|
MSoapMsg_t *mm7_mmsmsg_to_soap(MmsMsg *msg, Octstr *from, List *xto,
|
||||||
Octstr *transid, Octstr *srvcode,
|
Octstr *transid, Octstr *srvcode,
|
||||||
Octstr *linkedid, int isclientside,
|
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);
|
int i, n, mtype = mms_messagetype(msg);
|
||||||
MSoapMsg_t *m = NULL;
|
MSoapMsg_t *m = NULL;
|
||||||
List *headers;
|
List *headers;
|
||||||
Octstr *xfrom = (from != NULL) ? octstr_format("+ %S", from) : NULL, *s;
|
Octstr *xfrom = (from != NULL) ? octstr_format("+ %S", from) : NULL, *s;
|
||||||
|
Octstr *xuaprof_val = (uaprof) ? octstr_format("%S,%ld", uaprof, uaprof_tstamp) : NULL;
|
||||||
|
|
||||||
switch(mtype) {
|
switch(mtype) {
|
||||||
case MMS_MSGTYPE_SEND_REQ:
|
case MMS_MSGTYPE_SEND_REQ:
|
||||||
|
@ -1024,7 +1070,7 @@ MSoapMsg_t *mm7_mmsmsg_to_soap(MmsMsg *msg, Octstr *from, List *xto,
|
||||||
octstr_destroy(s);
|
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) ?
|
char *val = (octstr_case_compare(s, octstr_imm("Yes")) == 0) ?
|
||||||
"true" : "false";
|
"true" : "false";
|
||||||
http_header_add(m->envelope, "ReadReply", val);
|
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);
|
http_header_add(m->envelope, "allowAdaptations", val);
|
||||||
octstr_destroy(s);
|
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) {
|
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));
|
http_header_add(m->envelope, "MMStatus", octstr_get_cstr(s));
|
||||||
octstr_destroy(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;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (xfrom)
|
|
||||||
octstr_destroy(xfrom);
|
|
||||||
|
|
||||||
|
octstr_destroy(xfrom);
|
||||||
|
octstr_destroy(xuaprof_val);
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,9 @@ extern int mm7_get_envelope(MSoapMsg_t *m, Octstr **sender,
|
||||||
List **to, Octstr **subject,
|
List **to, Octstr **subject,
|
||||||
Octstr **vasid,
|
Octstr **vasid,
|
||||||
time_t *expiry_t,
|
time_t *expiry_t,
|
||||||
time_t *delivery_t);
|
time_t *delivery_t,
|
||||||
|
Octstr **uaprof,
|
||||||
|
time_t *uaprof_tstamp);
|
||||||
|
|
||||||
/* Delete the thingie... */
|
/* Delete the thingie... */
|
||||||
extern void mm7_soap_destroy(MSoapMsg_t *m);
|
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 *transid, Octstr *srvcode,
|
||||||
Octstr *linkedid,
|
Octstr *linkedid,
|
||||||
int isclientside,
|
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);
|
MSoapMsg_t *mm7_make_resp(MSoapMsg_t *mreq, int status, Octstr *msgid, int isclientside);
|
||||||
/* Return the header value for some header. */
|
/* Return the header value for some header. */
|
||||||
Octstr *mm7_soap_header_value(MSoapMsg_t *m, Octstr *header);
|
Octstr *mm7_soap_header_value(MSoapMsg_t *m, Octstr *header);
|
||||||
|
|
|
@ -779,6 +779,7 @@ static int free_envelope(MmsEnvelope *e, int removefromqueue)
|
||||||
{
|
{
|
||||||
int i, n;
|
int i, n;
|
||||||
|
|
||||||
|
if (e == NULL) return 0;
|
||||||
octstr_destroy(e->msgId);
|
octstr_destroy(e->msgId);
|
||||||
|
|
||||||
for (i = 0, n = gwlist_len(e->to); i < n; i++) {
|
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)
|
int mms_queue_free_env(MmsEnvelope *e)
|
||||||
{
|
{
|
||||||
|
|
||||||
return free_envelope(e, 0);
|
return free_envelope(e, 0);
|
||||||
}
|
}
|
||||||
int mms_queue_update(MmsEnvelope *e)
|
int mms_queue_update(MmsEnvelope *e)
|
||||||
|
|
|
@ -88,7 +88,8 @@ int mms_init_queuedir(Octstr *qdir);
|
||||||
extern Octstr *mms_queue_add(Octstr *from, List *to,
|
extern Octstr *mms_queue_add(Octstr *from, List *to,
|
||||||
Octstr *subject,
|
Octstr *subject,
|
||||||
Octstr *fromproxy, Octstr *viaproxy,
|
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 *vaspid, Octstr *vasid,
|
||||||
Octstr *url1, Octstr *url2,
|
Octstr *url1, Octstr *url2,
|
||||||
List *hdrs,
|
List *hdrs,
|
||||||
|
|
|
@ -308,6 +308,8 @@ VNSTRING(MM7_5, "replyChargingSize", MM7_TAG_replyChargingSize)
|
||||||
VNSTRING(MM7_5, "replyDeadline", MM7_TAG_replyDeadline)
|
VNSTRING(MM7_5, "replyDeadline", MM7_TAG_replyDeadline)
|
||||||
VNSTRING(MM7_5, "DeliveryReport", MM7_TAG_DeliveryReport)
|
VNSTRING(MM7_5, "DeliveryReport", MM7_TAG_DeliveryReport)
|
||||||
VNSTRING(MM7_5, "allowAdaptations", MM7_TAG_allowAdaptations)
|
VNSTRING(MM7_5, "allowAdaptations", MM7_TAG_allowAdaptations)
|
||||||
|
VNSTRING(MM7_5, "DistributionIndicator",MM7_TAG_distributionIndicator)
|
||||||
|
VNSTRING(MM7_5, "UACapabilities",MM7_TAG_UACapabilities)
|
||||||
)
|
)
|
||||||
|
|
||||||
NUMBERED(soap_status,
|
NUMBERED(soap_status,
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* User-Agent profiles handling, content adaptation.
|
* 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>
|
* Paul Bagyenda <bagyenda@dsmagic.com>
|
||||||
*
|
*
|
||||||
|
|
|
@ -68,26 +68,31 @@ static int auth_check(Octstr *user, Octstr *pass, List *headers)
|
||||||
else
|
else
|
||||||
res = 0;
|
res = 0;
|
||||||
done:
|
done:
|
||||||
if (v)
|
octstr_destroy(v);
|
||||||
octstr_destroy(v);
|
octstr_destroy(p);
|
||||||
if (p)
|
octstr_destroy(q);
|
||||||
octstr_destroy(p);
|
|
||||||
if (q)
|
|
||||||
octstr_destroy(q);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int send_report(Octstr *from, char *report_type,
|
static int send_report(Octstr *from, char *report_type,
|
||||||
Octstr *dlr_url, Octstr *status,
|
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;
|
List *rh, *rph = NULL;
|
||||||
Octstr *rb = NULL;
|
Octstr *rb = NULL;
|
||||||
|
Octstr *xtransid = NULL;
|
||||||
|
|
||||||
if (!url) {
|
if (dlr_url)
|
||||||
info(0, "Sending delivery-report Failed: `url' is NULL, `group_id'=[%s], `msgid'=[%s]",
|
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));
|
octstr_get_cstr(mmc_gid), octstr_get_cstr(msgid));
|
||||||
return 0;
|
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-Report-Type", report_type);
|
||||||
http_header_add(rh, "X-Mbuni-MM-Status", octstr_get_cstr(status));
|
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-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-MMSC-GID", octstr_get_cstr(mmc_gid));
|
||||||
http_header_add(rh, "X-Mbuni-From", octstr_get_cstr(from));
|
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);
|
mms_url_fetch_content(HTTP_METHOD_GET, url, rh, octstr_imm(""), &rph, &rb);
|
||||||
|
|
||||||
octstr_destroy(rb);
|
octstr_destroy(rb);
|
||||||
octstr_destroy(url);
|
octstr_destroy(url);
|
||||||
|
octstr_destroy(xtransid);
|
||||||
|
|
||||||
http_destroy_headers(rph);
|
http_destroy_headers(rph);
|
||||||
http_destroy_headers(rh);
|
http_destroy_headers(rh);
|
||||||
|
@ -130,8 +145,8 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
|
||||||
Octstr *reply_body = NULL, *value, *desc;
|
Octstr *reply_body = NULL, *value, *desc;
|
||||||
|
|
||||||
List *to = NULL;
|
List *to = NULL;
|
||||||
Octstr *from = NULL, *subject = NULL, *vasid = NULL, *msgid = NULL;
|
Octstr *from = NULL, *subject = NULL, *vasid = NULL, *msgid = NULL, *uaprof = NULL;
|
||||||
time_t expiryt = -1, delivert = -1;
|
time_t expiryt = -1, delivert = -1, uaprof_tstamp = -1;
|
||||||
MmsMsg *m = NULL;
|
MmsMsg *m = NULL;
|
||||||
int status = 1000;
|
int status = 1000;
|
||||||
unsigned char *msgtype = (unsigned char *)"";
|
unsigned char *msgtype = (unsigned char *)"";
|
||||||
|
@ -152,7 +167,7 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
|
||||||
goto done;
|
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)
|
if (!from)
|
||||||
from = octstr_imm("anon@anon");
|
from = octstr_imm("anon@anon");
|
||||||
|
@ -164,27 +179,34 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
|
||||||
Octstr *value = NULL;
|
Octstr *value = NULL;
|
||||||
/* Store linked id so we use it in response. */
|
/* Store linked id so we use it in response. */
|
||||||
Octstr *linkedid = mm7_soap_header_value(mreq, octstr_imm("LinkedID"));
|
Octstr *linkedid = mm7_soap_header_value(mreq, octstr_imm("LinkedID"));
|
||||||
|
List *qh = http_create_empty_headers();
|
||||||
int dlr;
|
int dlr;
|
||||||
|
|
||||||
value = mms_get_header_value(m, octstr_imm("X-Mms-Delivery-Report"));
|
value = mms_get_header_value(m, octstr_imm("X-Mms-Delivery-Report"));
|
||||||
if (value &&
|
if (value &&
|
||||||
octstr_case_compare(value, octstr_imm("Yes")) == 0)
|
octstr_case_compare(value, octstr_imm("Yes")) == 0)
|
||||||
dlr = 1;
|
dlr = 1;
|
||||||
else
|
else
|
||||||
dlr = 0;
|
dlr = 0;
|
||||||
|
|
||||||
if (delivert < 0)
|
if (delivert < 0)
|
||||||
delivert = time(NULL);
|
delivert = time(NULL);
|
||||||
|
|
||||||
if (expiryt < 0)
|
if (expiryt < 0)
|
||||||
expiryt = time(NULL) + DEFAULT_EXPIRE;
|
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,
|
qf = mms_queue_add(from, to, subject,
|
||||||
h->m->id, NULL,
|
h->m->id, NULL,
|
||||||
delivert, expiryt, m, linkedid,
|
delivert, expiryt, m, linkedid,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
NULL,
|
qh,
|
||||||
dlr,
|
dlr,
|
||||||
octstr_get_cstr(incoming_qdir),
|
octstr_get_cstr(incoming_qdir),
|
||||||
octstr_imm(MM_NAME));
|
octstr_imm(MM_NAME));
|
||||||
|
@ -193,12 +215,15 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
|
||||||
|
|
||||||
octstr_destroy(linkedid);
|
octstr_destroy(linkedid);
|
||||||
octstr_destroy(value);
|
octstr_destroy(value);
|
||||||
|
http_destroy_headers(qh);
|
||||||
} else {
|
} 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));
|
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;
|
||||||
|
|
||||||
case MM7_TAG_DeliveryReportReq:
|
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(from), octstr_get_cstr(value), octstr_get_cstr(desc),
|
||||||
octstr_get_cstr(h->m->id));
|
octstr_get_cstr(h->m->id));
|
||||||
send_report(from, "delivery-report", NULL,
|
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(desc);
|
||||||
octstr_destroy(value);
|
octstr_destroy(value);
|
||||||
|
@ -225,7 +250,7 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
|
||||||
|
|
||||||
send_report(from,
|
send_report(from,
|
||||||
"read-report", NULL, value, msgid,
|
"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);
|
octstr_destroy(value);
|
||||||
mms_log("ReadReport",
|
mms_log("ReadReport",
|
||||||
|
@ -255,6 +280,7 @@ static void mm7soap_receive(MmsHTTPClientInfo *h)
|
||||||
octstr_destroy(vasid);
|
octstr_destroy(vasid);
|
||||||
octstr_destroy(msgid);
|
octstr_destroy(msgid);
|
||||||
octstr_destroy(qf);
|
octstr_destroy(qf);
|
||||||
|
octstr_destroy(uaprof);
|
||||||
mms_destroy(m);
|
mms_destroy(m);
|
||||||
http_destroy_headers(rh);
|
http_destroy_headers(rh);
|
||||||
octstr_destroy(reply_body);
|
octstr_destroy(reply_body);
|
||||||
|
@ -383,7 +409,7 @@ static void mm7eaif_receive(MmsHTTPClientInfo *h)
|
||||||
case MMS_MSGTYPE_DELIVERY_IND:
|
case MMS_MSGTYPE_DELIVERY_IND:
|
||||||
value = http_header_value(mh, octstr_imm("X-Mms-Status"));
|
value = http_header_value(mh, octstr_imm("X-Mms-Status"));
|
||||||
value2 = http_header_value(mh, octstr_imm("Message-ID"));
|
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(value);
|
||||||
octstr_destroy(value2);
|
octstr_destroy(value2);
|
||||||
|
@ -392,7 +418,7 @@ static void mm7eaif_receive(MmsHTTPClientInfo *h)
|
||||||
case MMS_MSGTYPE_READ_ORIG_IND:
|
case MMS_MSGTYPE_READ_ORIG_IND:
|
||||||
value = http_header_value(mh, octstr_imm("X-Mms-Read-Status"));
|
value = http_header_value(mh, octstr_imm("X-Mms-Read-Status"));
|
||||||
value2 = http_header_value(mh, octstr_imm("Message-ID"));
|
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);
|
octstr_destroy(value);
|
||||||
|
@ -521,7 +547,7 @@ static Octstr *mm7soap_send(MmscGrp *mmc, Octstr *from, Octstr *to,
|
||||||
MSoapMsg_t *mreq = NULL, *mresp = NULL;
|
MSoapMsg_t *mreq = NULL, *mresp = NULL;
|
||||||
List *rh = NULL, *ph = NULL;
|
List *rh = NULL, *ph = NULL;
|
||||||
Octstr *body = NULL, *rbody = NULL, *url = 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",
|
info(0, "MMSBox: Send[soap] to MMSC[%s], msg type [%s], from %s, to %s",
|
||||||
mmc->id ? octstr_get_cstr(mmc->id) : "",
|
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));
|
octstr_get_cstr(from), octstr_get_cstr(to));
|
||||||
|
|
||||||
gwlist_append(xto, 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,
|
if ((mreq = mm7_mmsmsg_to_soap(m, from, xto, transid,
|
||||||
service_code,
|
service_code,
|
||||||
linkedid,
|
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!",
|
*error = octstr_format("Failed to convert Msg[%S] 2 SOAP message!",
|
||||||
mms_message_type_to_string(mtype));
|
mms_message_type_to_string(mtype));
|
||||||
goto done1;
|
goto done1;
|
||||||
|
@ -606,7 +635,7 @@ done1:
|
||||||
http_destroy_headers(ph);
|
http_destroy_headers(ph);
|
||||||
octstr_destroy(rbody);
|
octstr_destroy(rbody);
|
||||||
octstr_destroy(url);
|
octstr_destroy(url);
|
||||||
|
octstr_destroy(distrib);
|
||||||
gwlist_destroy(xto, NULL);
|
gwlist_destroy(xto, NULL);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -696,10 +725,11 @@ static Octstr *mm7eaif_send(MmscGrp *mmc, Octstr *from, Octstr *to,
|
||||||
if (ret)
|
if (ret)
|
||||||
mms_log2("Sent", from, to, -1, ret, NULL, mmc->id, "MMSBox", NULL, NULL);
|
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]",
|
info(0, "Sent to MMC[%s], code=[%d], resp=[%s] msgid [%s]",
|
||||||
octstr_get_cstr(mmc->id),
|
octstr_get_cstr(mmc->id),
|
||||||
hstatus, resp ? octstr_get_cstr(resp) : "(none)", ret ? octstr_get_cstr(ret) : "(none)");
|
hstatus, resp ? octstr_get_cstr(resp) : "(none)", ret ? octstr_get_cstr(ret) : "(none)");
|
||||||
|
#endif
|
||||||
|
|
||||||
http_destroy_headers(rh);
|
http_destroy_headers(rh);
|
||||||
octstr_destroy(body);
|
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,
|
static int mms_sendtommsc(MmscGrp *mmc, Octstr *from, Octstr *to, Octstr *transid,
|
||||||
|
Octstr *orig_transid,
|
||||||
Octstr *linkedid, char *vasid, Octstr *service_code,
|
Octstr *linkedid, char *vasid, Octstr *service_code,
|
||||||
MmsMsg *m, Octstr *dlr_url, Octstr *rr_url,
|
MmsMsg *m, Octstr *dlr_url, Octstr *rr_url,
|
||||||
List *hdrs, Octstr **err)
|
List *hdrs,
|
||||||
|
Octstr **new_msgid,
|
||||||
|
Octstr **err)
|
||||||
{
|
{
|
||||||
Octstr *id = NULL, *groupid = NULL;
|
Octstr *id = NULL, *groupid = NULL;
|
||||||
int ret = 0, retry = 0;
|
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 */
|
} mutex_unlock(mmc->mutex); /* release lock */
|
||||||
|
|
||||||
if (id) {
|
if (id) {
|
||||||
if (dlr_url) { /* remember the url's for reporting purposes. */
|
if (dlr_url) /* remember the url's for reporting purposes. */
|
||||||
mms_dlr_url_put(id, "delivery-report", groupid, dlr_url);
|
mms_dlr_url_put(id, "delivery-report", groupid, dlr_url, orig_transid);
|
||||||
send_report(from, "delivery-report", dlr_url,
|
|
||||||
octstr_imm("Sent"), id, mmc->id, groupid);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rr_url)
|
if (rr_url)
|
||||||
mms_dlr_url_put(id, "read-report", groupid, rr_url);
|
mms_dlr_url_put(id, "read-report", groupid, rr_url, orig_transid);
|
||||||
|
|
||||||
octstr_destroy(id);
|
|
||||||
ret = MMS_SEND_OK;
|
ret = MMS_SEND_OK;
|
||||||
} else
|
} else
|
||||||
ret = retry ? MMS_SEND_ERROR_TRANSIENT : MMS_SEND_ERROR_FATAL;
|
ret = retry ? MMS_SEND_ERROR_TRANSIENT : MMS_SEND_ERROR_FATAL;
|
||||||
|
|
||||||
|
*new_msgid = id;
|
||||||
|
|
||||||
octstr_destroy(groupid);
|
octstr_destroy(groupid);
|
||||||
if (id && throughput > 0)
|
if (id && throughput > 0)
|
||||||
gwthread_sleep(1.0/throughput);
|
gwthread_sleep(1.0/throughput);
|
||||||
|
@ -760,7 +789,7 @@ static int sendMsg(MmsEnvelope *e)
|
||||||
{
|
{
|
||||||
MmsMsg *msg = NULL;
|
MmsMsg *msg = NULL;
|
||||||
int i, n;
|
int i, n;
|
||||||
|
Octstr *otransid = e->hdrs ? http_header_value(e->hdrs, octstr_imm("X-Mbuni-TransactionID")) : NULL;
|
||||||
msg = mms_queue_getdata(e);
|
msg = mms_queue_getdata(e);
|
||||||
|
|
||||||
for (i = 0, n = gwlist_len(e->to); i<n; i++) {
|
for (i = 0, n = gwlist_len(e->to); i<n; i++) {
|
||||||
|
@ -769,6 +798,7 @@ static int sendMsg(MmsEnvelope *e)
|
||||||
Octstr *err = NULL;
|
Octstr *err = NULL;
|
||||||
time_t tnow = time(NULL);
|
time_t tnow = time(NULL);
|
||||||
MmscGrp *mmc = NULL;
|
MmscGrp *mmc = NULL;
|
||||||
|
Octstr *new_msgid = NULL;
|
||||||
|
|
||||||
if (!to || !to->process)
|
if (!to || !to->process)
|
||||||
continue;
|
continue;
|
||||||
|
@ -798,32 +828,39 @@ static int sendMsg(MmsEnvelope *e)
|
||||||
|
|
||||||
res = mms_sendtommsc(mmc, e->from, to->rcpt,
|
res = mms_sendtommsc(mmc, e->from, to->rcpt,
|
||||||
e->msgId,
|
e->msgId,
|
||||||
|
otransid,
|
||||||
e->token, /* token = linkedid */
|
e->token, /* token = linkedid */
|
||||||
e->vasid ? octstr_get_cstr(e->vasid) : NULL,
|
e->vasid ? octstr_get_cstr(e->vasid) : NULL,
|
||||||
e->vaspid,
|
e->vaspid,
|
||||||
msg,
|
msg,
|
||||||
e->url1, e->url2,
|
e->url1, e->url2,
|
||||||
e->hdrs,
|
e->hdrs,
|
||||||
|
&new_msgid,
|
||||||
&err);
|
&err);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (res == MMS_SEND_OK)
|
if (res == MMS_SEND_OK) {
|
||||||
to->process = 0;
|
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",
|
send_report(to->rcpt, "delivery-report",
|
||||||
e->url1,
|
e->url1,
|
||||||
(e->expiryt != 0 && e->expiryt < tnow) ?
|
(e->expiryt != 0 && e->expiryt < tnow) ?
|
||||||
octstr_imm("Expired") : octstr_imm("Rejected"),
|
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)
|
if (res == MMS_SEND_ERROR_FATAL)
|
||||||
to->process = 0; /* No more attempts. */
|
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),
|
SEND_ERROR_STR(res),
|
||||||
octstr_get_cstr(e->from), octstr_get_cstr(to->rcpt), e->msize,
|
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)");
|
err ? octstr_get_cstr(err) : "(none)");
|
||||||
|
|
||||||
|
octstr_destroy(new_msgid);
|
||||||
|
|
||||||
e->lasttry = tnow;
|
e->lasttry = tnow;
|
||||||
if (mms_queue_update(e) == 1) {
|
if (mms_queue_update(e) == 1) {
|
||||||
e = NULL;
|
e = NULL;
|
||||||
|
@ -833,6 +870,7 @@ static int sendMsg(MmsEnvelope *e)
|
||||||
}
|
}
|
||||||
|
|
||||||
mms_destroy(msg);
|
mms_destroy(msg);
|
||||||
|
octstr_destroy(otransid);
|
||||||
|
|
||||||
if (e) { /* Update the queue if it is still valid (e.g. recipients not handled)
|
if (e) { /* Update the queue if it is still valid (e.g. recipients not handled)
|
||||||
* XXX can this happen here??...
|
* XXX can this happen here??...
|
||||||
|
|
|
@ -81,33 +81,41 @@ static int dlr_entry_fname(char *msgid, char *rtype, Octstr *mmc_gid, Octstr **e
|
||||||
return fd;
|
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);
|
int fd = dlr_entry_fname(octstr_get_cstr(msgid), rtype, mmc_gid, NULL);
|
||||||
|
|
||||||
if (fd >= 0) {
|
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);
|
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);
|
int fd = dlr_entry_fname(octstr_get_cstr(msgid), rtype, mmc_gid, NULL);
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
|
||||||
if (fd >= 0 && (f = fdopen(fd, "r+")) != NULL) {
|
if (fd >= 0 && (f = fdopen(fd, "r+")) != NULL) {
|
||||||
Octstr *s = octstr_read_pipe(f);
|
Octstr *s = octstr_read_pipe(f);
|
||||||
|
int i, ret;
|
||||||
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
if (s && octstr_len(s) == 0) {
|
if (s && octstr_len(s) == 0) {
|
||||||
octstr_destroy(s);
|
ret = -1;
|
||||||
return NULL;
|
} 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
|
} else
|
||||||
return s;
|
ret = -1;
|
||||||
|
octstr_destroy(s);
|
||||||
|
return ret;
|
||||||
} else if (fd >= 0)
|
} else if (fd >= 0)
|
||||||
close(fd);
|
close(fd);
|
||||||
return NULL;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mms_dlr_url_remove(Octstr *msgid, char *rtype, Octstr *mmc_gid)
|
void mms_dlr_url_remove(Octstr *msgid, char *rtype, Octstr *mmc_gid)
|
||||||
|
|
|
@ -293,6 +293,7 @@ done:
|
||||||
enum _xurltype {FILE_TYPE, URL_TYPE};
|
enum _xurltype {FILE_TYPE, URL_TYPE};
|
||||||
static Octstr *url_path_prefix(Octstr *url, int 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,
|
static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
|
||||||
Octstr *msg_url,
|
Octstr *msg_url,
|
||||||
Octstr *base_url, int type, MmsEnvelope *e,
|
Octstr *base_url, int type, MmsEnvelope *e,
|
||||||
|
@ -308,13 +309,15 @@ static int fetch_serviceurl(MmsEnvelope *e,
|
||||||
Octstr **err)
|
Octstr **err)
|
||||||
{
|
{
|
||||||
List *rh, *rph = NULL;
|
List *rh, *rph = NULL;
|
||||||
Octstr *body = NULL, *rb = NULL;
|
Octstr *body = NULL, *rb = NULL, *transid;
|
||||||
Octstr *ctype = NULL, *params = NULL;
|
Octstr *ctype = NULL, *params = NULL;
|
||||||
|
Octstr *s;
|
||||||
int i, n, method, typ = FILE_TYPE;
|
int i, n, method, typ = FILE_TYPE;
|
||||||
FILE *fp = NULL;
|
FILE *fp = NULL;
|
||||||
|
|
||||||
int res = -1;
|
int res = -1;
|
||||||
|
|
||||||
|
transid = mms_maketransid(e->xqfname, octstr_imm(MM_NAME));
|
||||||
switch (ms->type) {
|
switch (ms->type) {
|
||||||
case TRANS_TYPE_GET_URL:
|
case TRANS_TYPE_GET_URL:
|
||||||
case TRANS_TYPE_POST_URL:
|
case TRANS_TYPE_POST_URL:
|
||||||
|
@ -331,11 +334,25 @@ static int fetch_serviceurl(MmsEnvelope *e,
|
||||||
|
|
||||||
if (e->subject)
|
if (e->subject)
|
||||||
http_header_add(rh, "X-Mbuni-Subject", octstr_get_cstr(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++) {
|
for (i = 0, n = gwlist_len(e->to); i < n; i++) {
|
||||||
MmsEnvelopeTo *r = gwlist_get(e->to, i);
|
MmsEnvelopeTo *r = gwlist_get(e->to, i);
|
||||||
if (r && r->rcpt)
|
if (r && r->rcpt)
|
||||||
http_header_add(rh, "X-Mbuni-To", octstr_get_cstr(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. */
|
if (ms->type == TRANS_TYPE_POST_URL) { /* Put in the parameters. */
|
||||||
MIMEEntity *x = mime_entity_create();
|
MIMEEntity *x = mime_entity_create();
|
||||||
|
|
||||||
|
@ -358,14 +375,16 @@ static int fetch_serviceurl(MmsEnvelope *e,
|
||||||
method = HTTP_METHOD_GET;
|
method = HTTP_METHOD_GET;
|
||||||
|
|
||||||
typ = URL_TYPE;
|
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, ¶ms);
|
get_content_type(rph, &ctype, ¶ms);
|
||||||
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!",
|
*err = octstr_format("MMSBox: Failed to fetch content for Service %S, url %S!",
|
||||||
ms->name, ms->url);
|
ms->name, ms->url);
|
||||||
http_destroy_headers(rh);
|
http_destroy_headers(rh);
|
||||||
if (body)
|
octstr_destroy(body);
|
||||||
octstr_destroy(body);
|
|
||||||
break;
|
break;
|
||||||
case TRANS_TYPE_FILE:
|
case TRANS_TYPE_FILE:
|
||||||
if ((fp = fopen(octstr_get_cstr(ms->url), "r")) != NULL) {
|
if ((fp = fopen(octstr_get_cstr(ms->url), "r")) != NULL) {
|
||||||
|
@ -438,7 +457,8 @@ done:
|
||||||
octstr_destroy(rb);
|
octstr_destroy(rb);
|
||||||
http_destroy_headers(rph);
|
http_destroy_headers(rph);
|
||||||
octstr_destroy(params);
|
octstr_destroy(params);
|
||||||
|
octstr_destroy(transid);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -451,7 +471,8 @@ static int mmsbox_service_dispatch(MmsEnvelope *e)
|
||||||
Octstr *err = NULL, *keyword = NULL;
|
Octstr *err = NULL, *keyword = NULL;
|
||||||
MmsService *ms;
|
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) {
|
if ((msg = mms_queue_getdata(e)) == NULL) {
|
||||||
err = octstr_format("Failed to read message for queue entry %s!",
|
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 *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 *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;
|
MmsMsg *m = NULL;
|
||||||
MIMEEntity *me = mime_entity_create();
|
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;
|
time_t expiryt = time(NULL) + DEFAULT_EXPIRE;
|
||||||
Octstr *x;
|
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"));
|
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)
|
if (gwlist_len(xto) == 0 && e && e->from)
|
||||||
gwlist_append(xto, octstr_duplicate(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;
|
me = xm;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Add some nice headers. */
|
/* Add some nice headers. */
|
||||||
xheaders = mime_entity_headers(me);
|
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)
|
if (dlr_url)
|
||||||
http_header_add(xheaders, "X-Mms-Delivery-Report", "Yes");
|
http_header_add(xheaders, "X-Mms-Delivery-Report", "Yes");
|
||||||
if (rr_url)
|
if (rr_url)
|
||||||
http_header_add(xheaders, "X-Mms-Read-Report", "Yes");
|
http_header_add(xheaders, "X-Mms-Read-Reply", "Yes");
|
||||||
if (allow_adaptations)
|
if (allow_adaptations)
|
||||||
http_header_add(xheaders, "X-Mms-Allow-Adaptations",
|
http_header_add(xheaders, "X-Mms-Allow-Adaptations",
|
||||||
(octstr_str_compare(allow_adaptations, "true") == 0) ? "true" : "false");
|
(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;
|
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. */
|
if (passthro_headers && reply_headers) { /* if user wants passthro headers, get them and add them. */
|
||||||
int n = gwlist_len(reply_headers);
|
int n = gwlist_len(reply_headers);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
hdrs = http_create_empty_headers();
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
Octstr *h = NULL, *v = NULL;
|
Octstr *h = NULL, *v = NULL;
|
||||||
int j;
|
int j;
|
||||||
|
@ -1072,8 +1102,10 @@ static int make_and_queue_msg(Octstr *data, Octstr *ctype, List *reply_headers,
|
||||||
(dlr_url != NULL),
|
(dlr_url != NULL),
|
||||||
octstr_get_cstr(qdir),
|
octstr_get_cstr(qdir),
|
||||||
octstr_imm(MM_NAME));
|
octstr_imm(MM_NAME));
|
||||||
info(0, "MMSBox: Queued message from service [%s]: %s",
|
info(0, "MMSBox: Queued message from service [%s], [transid [%s]: %s",
|
||||||
octstr_get_cstr(svc_name), octstr_get_cstr(x));
|
octstr_get_cstr(svc_name),
|
||||||
|
otransid ? octstr_get_cstr(otransid) : "",
|
||||||
|
octstr_get_cstr(x));
|
||||||
*err = x;
|
*err = x;
|
||||||
res = 0;
|
res = 0;
|
||||||
done:
|
done:
|
||||||
|
@ -1086,6 +1118,7 @@ done:
|
||||||
octstr_destroy(from);
|
octstr_destroy(from);
|
||||||
octstr_destroy(xfrom);
|
octstr_destroy(xfrom);
|
||||||
octstr_destroy(subject);
|
octstr_destroy(subject);
|
||||||
|
octstr_destroy(otransid);
|
||||||
if (me)
|
if (me)
|
||||||
mime_entity_destroy(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. */
|
/* Requests to make_and_queue below can block, but for now we don't care. */
|
||||||
if (ctype && data && !rb) { /* only send if no error. */
|
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,
|
res = make_and_queue_msg(data, ctype, rh,
|
||||||
data_url ? data_url : base_url,
|
data_url ? data_url : base_url,
|
||||||
base_url, URL_TYPE, NULL,
|
base_url, URL_TYPE, NULL,
|
||||||
vasid ? vasid : octstr_imm("sendmms-user"),
|
vasid ? vasid : octstr_imm("sendmms-user"),
|
||||||
u->faked_sender, service_code,
|
u->faked_sender, service_code,
|
||||||
1, NULL,
|
1, NULL,
|
||||||
(send_type &&
|
send_as_incoming ? incoming_qdir : outgoing_qdir,
|
||||||
octstr_str_case_compare(send_type, "mo") == 0) ?
|
|
||||||
incoming_qdir : outgoing_qdir,
|
|
||||||
&err);
|
&err);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
rb = octstr_format("Error in message conversion: %S", err);
|
rb = octstr_format("Error in message conversion: %S", err);
|
||||||
else
|
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)
|
} else if (!rb)
|
||||||
rb = octstr_imm("Failed to send message");
|
rb = octstr_imm("Failed to send message");
|
||||||
http_send_reply(client, (res == 0) ? HTTP_OK : HTTP_BAD_REQUEST, hh,
|
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",
|
(res == 0) ? "Queued" : "Not Queued",
|
||||||
rb ? octstr_get_cstr(rb) : "");
|
rb ? octstr_get_cstr(rb) : "");
|
||||||
|
|
||||||
|
|
||||||
http_destroy_headers(rh);
|
http_destroy_headers(rh);
|
||||||
octstr_destroy(ctype);
|
octstr_destroy(ctype);
|
||||||
octstr_destroy(rb);
|
octstr_destroy(rb);
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
#include "mmsbox_cfg.h"
|
#include "mmsbox_cfg.h"
|
||||||
|
|
||||||
extern int rstop;
|
extern int rstop;
|
||||||
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);
|
||||||
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);
|
||||||
void mms_dlr_url_remove(Octstr *msgid, char *rtype, Octstr *mmc_gid);
|
void mms_dlr_url_remove(Octstr *msgid, char *rtype, Octstr *mmc_gid);
|
||||||
void mmsc_receive_func(MmscGrp *m);
|
void mmsc_receive_func(MmscGrp *m);
|
||||||
void mmsbox_outgoing_queue_runner(int *rstop);
|
void mmsbox_outgoing_queue_runner(int *rstop);
|
||||||
|
|
|
@ -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.");
|
warning(0, "mms-to-mobile copy handler VASP specified more than once! Only last config taken.");
|
||||||
m->mms2mobile = mv;
|
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_append(m->vasp_list, mv);
|
||||||
}
|
}
|
||||||
gwlist_destroy(l, NULL);
|
gwlist_destroy(l, NULL);
|
||||||
|
|
|
@ -31,6 +31,7 @@ typedef struct MmsVasp {
|
||||||
enum {SOAP_VASP, EAIF_VASP, NONE_VASP} type;
|
enum {SOAP_VASP, EAIF_VASP, NONE_VASP} type;
|
||||||
Octstr *vasp_username, *vasp_password;
|
Octstr *vasp_username, *vasp_password;
|
||||||
Octstr *vasp_url;
|
Octstr *vasp_url;
|
||||||
|
enum {UAProf_None, UAProf_URL, UAProf_UA} send_uaprof;
|
||||||
MM7Version_t ver;
|
MM7Version_t ver;
|
||||||
} MmsVasp;
|
} MmsVasp;
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,7 @@ static int mms_sendtoproxy(Octstr *from, Octstr *to,
|
||||||
int dlr, Octstr **error);
|
int dlr, Octstr **error);
|
||||||
|
|
||||||
static int mms_sendtovasp(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 **error);
|
MmsMsg *m, Octstr **error);
|
||||||
|
|
||||||
static int _x_octstr_int_compare(int n, Octstr *s);
|
static int _x_octstr_int_compare(int n, Octstr *s);
|
||||||
|
@ -156,6 +157,7 @@ static int sendMsg(MmsEnvelope *e)
|
||||||
res = mms_sendtovasp(settings->mms2email,
|
res = mms_sendtovasp(settings->mms2email,
|
||||||
e->from, to->rcpt,
|
e->from, to->rcpt,
|
||||||
e->msgId,
|
e->msgId,
|
||||||
|
e->hdrs,
|
||||||
msg, &err);
|
msg, &err);
|
||||||
else
|
else
|
||||||
res = mms_sendtoemail(pfrom, to->rcpt,
|
res = mms_sendtoemail(pfrom, to->rcpt,
|
||||||
|
@ -191,6 +193,7 @@ static int sendMsg(MmsEnvelope *e)
|
||||||
int res = mms_sendtovasp(settings->mms2mobile,
|
int res = mms_sendtovasp(settings->mms2mobile,
|
||||||
e->from, to->rcpt,
|
e->from, to->rcpt,
|
||||||
e->msgId,
|
e->msgId,
|
||||||
|
e->hdrs,
|
||||||
msg, &err);
|
msg, &err);
|
||||||
info(0, "%s Global Queue MMS Send: Local Msg copy to VASP (%s) - "
|
info(0, "%s Global Queue MMS Send: Local Msg copy to VASP (%s) - "
|
||||||
"From %s, to %s, msgsize=%ld: err=%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) {
|
_x_octstr_int_compare(vasp->short_code, phonenum) == 0) {
|
||||||
res = mms_sendtovasp(vasp, e->from, to->rcpt,
|
res = mms_sendtovasp(vasp, e->from, to->rcpt,
|
||||||
e->msgId,
|
e->msgId,
|
||||||
|
e->hdrs,
|
||||||
msg, &err);
|
msg, &err);
|
||||||
sent = 1;
|
sent = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -242,6 +246,7 @@ static int sendMsg(MmsEnvelope *e)
|
||||||
int res = mms_sendtovasp(settings->mms2mobile,
|
int res = mms_sendtovasp(settings->mms2mobile,
|
||||||
e->from, to->rcpt,
|
e->from, to->rcpt,
|
||||||
e->msgId,
|
e->msgId,
|
||||||
|
e->hdrs,
|
||||||
msg, &err);
|
msg, &err);
|
||||||
info(0, "%s Global Queue MMS Send: Local Msg copy to VASP (%s) - "
|
info(0, "%s Global Queue MMS Send: Local Msg copy to VASP (%s) - "
|
||||||
"From %s, to %s, msgsize=%ld: err=%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));
|
gwlist_append(l, octstr_duplicate(e->from));
|
||||||
|
|
||||||
/* Add to queue, switch via proxy to be from proxy. */
|
/* 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,
|
err, NULL, e->fromproxy,
|
||||||
tnow, tnow+settings->default_msgexpiry, m, NULL,
|
tnow, tnow+settings->default_msgexpiry, m, NULL,
|
||||||
NULL, 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,
|
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 ret = MMS_SEND_ERROR_TRANSIENT;
|
||||||
int mtype = mms_messagetype(m);
|
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;
|
MSoapMsg_t *mreq = NULL, *mresp = NULL;
|
||||||
List *rh = NULL, *ph = NULL;
|
List *rh = NULL, *ph = NULL;
|
||||||
Octstr *body = NULL, *rbody = NULL;
|
Octstr *body = NULL, *rbody = NULL;
|
||||||
|
Octstr *uaprof = NULL, *s;
|
||||||
Octstr *s;
|
time_t tstamp;
|
||||||
|
|
||||||
info(0, "MMS Relay: Send[soap] to VASP[%s], msg_type=[%s], from=[%s], to=[%s]",
|
info(0, "MMS Relay: Send[soap] to VASP[%s], msg_type=[%s], from=[%s], to=[%s]",
|
||||||
vasp ? octstr_get_cstr(vasp->id) : "",
|
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);
|
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,
|
if ((mreq = mm7_mmsmsg_to_soap(m, from, xto, msgId, settings->host_alias,
|
||||||
msgId,
|
msgId,
|
||||||
0, NULL, NULL)) == NULL) {
|
0, NULL, NULL, uaprof, tstamp, NULL)) == NULL) {
|
||||||
*error = octstr_format("Failed to convert Msg[%s] 2 SOAP message!",
|
*error = octstr_format("Failed to convert Msg[%s] 2 SOAP message!",
|
||||||
mms_message_type_to_cstr(mtype));
|
mms_message_type_to_cstr(mtype));
|
||||||
goto done1;
|
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));
|
tstatus, mms_soap_status_to_cstr(tstatus));
|
||||||
done1:
|
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);
|
gwlist_destroy(xto, NULL);
|
||||||
|
|
||||||
return ret;
|
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,
|
static int mms_sendtovasp(MmsVasp *vasp, Octstr *from, Octstr *to, Octstr *msgid,
|
||||||
|
List *qh,
|
||||||
MmsMsg *m, Octstr **err)
|
MmsMsg *m, Octstr **err)
|
||||||
{
|
{
|
||||||
if (m == NULL) {
|
if (m == NULL) {
|
||||||
*err = octstr_format("GlobalSend: Failed to send to %S, Message format is corrupt!", to);
|
*err = octstr_format("GlobalSend: Failed to send to %S, Message format is corrupt!", to);
|
||||||
return MMS_SEND_ERROR_FATAL;
|
return MMS_SEND_ERROR_FATAL;
|
||||||
} else if (vasp->type == SOAP_VASP)
|
} 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)
|
else if (vasp->type == EAIF_VASP)
|
||||||
return mm7eaif_send(vasp, from, to, msgid, m, err);
|
return mm7eaif_send(vasp, from, to, msgid, m, err);
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -386,9 +386,7 @@ void fetchmms_proxy(MmsHTTPClientInfo *h)
|
||||||
/* Send to access log with success. */
|
/* Send to access log with success. */
|
||||||
mms_log2("Fetched", e ? e->from : NULL, h->client_addr,
|
mms_log2("Fetched", e ? e->from : NULL, h->client_addr,
|
||||||
e ? e->msize : 0, e ? e->msgId : NULL, NULL, NULL, "MM1",
|
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. */
|
goto free_stuff; /* Skip to end. */
|
||||||
|
|
||||||
failed:
|
failed:
|
||||||
|
@ -415,7 +413,6 @@ void fetchmms_proxy(MmsHTTPClientInfo *h)
|
||||||
}
|
}
|
||||||
|
|
||||||
free_stuff:
|
free_stuff:
|
||||||
|
|
||||||
if (notify_cmd) /* Inform provisioning server */
|
if (notify_cmd) /* Inform provisioning server */
|
||||||
notify_prov_server(octstr_get_cstr(settings->prov_notify),
|
notify_prov_server(octstr_get_cstr(settings->prov_notify),
|
||||||
h->base_client_addr ? octstr_get_cstr(h->base_client_addr) : "unknown",
|
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);
|
http_destroy_headers(rh);
|
||||||
if (e) mms_queue_free_env(e);
|
mms_queue_free_env(e);
|
||||||
|
|
||||||
if (s) octstr_destroy(s);
|
octstr_destroy(s);
|
||||||
if (m) mms_destroy(m);
|
mms_destroy(m);
|
||||||
if (mr) mms_destroy(mr);
|
mms_destroy(mr);
|
||||||
|
|
||||||
if (qf) octstr_destroy(qf);
|
octstr_destroy(qf);
|
||||||
if (token) octstr_destroy(token);
|
octstr_destroy(token);
|
||||||
if (transid) octstr_destroy(transid);
|
octstr_destroy(transid);
|
||||||
|
|
||||||
free_clientInfo(h,1);
|
free_clientInfo(h,1);
|
||||||
}
|
}
|
||||||
|
@ -446,9 +443,11 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
||||||
int ctype_set = 0;
|
int ctype_set = 0;
|
||||||
int mtype = 0, menc;
|
int mtype = 0, menc;
|
||||||
int hstatus = HTTP_OK;
|
int hstatus = HTTP_OK;
|
||||||
char *notify_cmd = NULL;
|
char *notify_cmd = NULL, tbuf[64];
|
||||||
int msize = h->body ? octstr_len(h->body) : 0;
|
int msize = h->body ? octstr_len(h->body) : 0;
|
||||||
|
List *qh = http_create_empty_headers();
|
||||||
|
|
||||||
|
|
||||||
debug("proxy.sendinterface", 0,
|
debug("proxy.sendinterface", 0,
|
||||||
" --> Enterred sendmms interface, blen=%d <--- ",
|
" --> Enterred sendmms interface, blen=%d <--- ",
|
||||||
msize);
|
msize);
|
||||||
|
@ -458,7 +457,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
||||||
|
|
||||||
if (!h->body) { /* A body is required. */
|
if (!h->body) { /* A body is required. */
|
||||||
http_header_add(rh, "Content-Type", "text/plain");
|
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?",
|
reply_body = octstr_format("Unexpected MMS message[%s], no body?",
|
||||||
mms_message_type_to_cstr(mtype));
|
mms_message_type_to_cstr(mtype));
|
||||||
|
|
||||||
|
@ -476,9 +475,17 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
||||||
goto done;
|
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: ");
|
debug("proxy.sendinterface", 0, " Client sent us: ");
|
||||||
|
|
||||||
#if 1
|
#if 0
|
||||||
mms_msgdump(m,1);
|
mms_msgdump(m,1);
|
||||||
/* octstr_dump(h->body, 0); */
|
/* octstr_dump(h->body, 0); */
|
||||||
#endif
|
#endif
|
||||||
|
@ -495,13 +502,11 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
||||||
List *to = gwlist_create();
|
List *to = gwlist_create();
|
||||||
Octstr *subject = NULL;
|
Octstr *subject = NULL;
|
||||||
time_t expiryt, deliveryt;
|
time_t expiryt, deliveryt;
|
||||||
|
|
||||||
Octstr *otransid = NULL, *value = NULL, *msgid = NULL;
|
Octstr *otransid = NULL, *value = NULL, *msgid = NULL;
|
||||||
int dlr;
|
int dlr;
|
||||||
char *mmbox_store_status = NULL;
|
char *mmbox_store_status = NULL;
|
||||||
Octstr *mmbox_loc = NULL;
|
Octstr *mmbox_loc = NULL;
|
||||||
Octstr *sdf = NULL;
|
Octstr *sdf = NULL;
|
||||||
|
|
||||||
|
|
||||||
mms_collect_envdata_from_msgheaders(mh, &to, &subject, &otransid, &expiryt,
|
mms_collect_envdata_from_msgheaders(mh, &to, &subject, &otransid, &expiryt,
|
||||||
&deliveryt, settings->default_msgexpiry);
|
&deliveryt, settings->default_msgexpiry);
|
||||||
|
@ -551,14 +556,12 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
||||||
octstr_case_compare(value, octstr_imm("Yes")) == 0)
|
octstr_case_compare(value, octstr_imm("Yes")) == 0)
|
||||||
dlr = 1;
|
dlr = 1;
|
||||||
else
|
else
|
||||||
dlr = 0;
|
dlr = 0;
|
||||||
|
|
||||||
|
|
||||||
qf = mms_queue_add(from, to, subject,
|
qf = mms_queue_add(from, to, subject,
|
||||||
NULL, NULL, deliveryt, expiryt, m, NULL,
|
NULL, NULL, deliveryt, expiryt, m, NULL,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
NULL,
|
qh,
|
||||||
dlr,
|
dlr,
|
||||||
octstr_get_cstr(settings->global_queuedir),
|
octstr_get_cstr(settings->global_queuedir),
|
||||||
settings->host_alias);
|
settings->host_alias);
|
||||||
|
@ -585,28 +588,16 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
||||||
mms_replace_header_value(mresp,
|
mms_replace_header_value(mresp,
|
||||||
"X-Mms-Content-Location",
|
"X-Mms-Content-Location",
|
||||||
octstr_get_cstr(mmbox_loc));
|
octstr_get_cstr(mmbox_loc));
|
||||||
}
|
}
|
||||||
|
octstr_destroy(otransid);
|
||||||
if (otransid)
|
octstr_destroy(value);
|
||||||
octstr_destroy(otransid);
|
octstr_destroy(msgid);
|
||||||
if (value)
|
octstr_destroy(mmbox_loc);
|
||||||
octstr_destroy(value);
|
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);
|
gwlist_destroy(to, (gwlist_item_destructor_t *)octstr_destroy);
|
||||||
|
|
||||||
notify_cmd = "sent";
|
notify_cmd = "sent";
|
||||||
|
@ -689,8 +680,6 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
||||||
}
|
}
|
||||||
|
|
||||||
{ /* Found it, etc. */
|
{ /* Found it, etc. */
|
||||||
|
|
||||||
|
|
||||||
Octstr *pfrom = mms_get_header_value(mfwd, octstr_imm("From"));
|
Octstr *pfrom = mms_get_header_value(mfwd, octstr_imm("From"));
|
||||||
Octstr *pdate = mms_get_header_value(mfwd, octstr_imm("Date"));
|
Octstr *pdate = mms_get_header_value(mfwd, octstr_imm("Date"));
|
||||||
Octstr *pmsgid = mms_get_header_value(mfwd, octstr_imm("Message-ID"));
|
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, deliveryt, expiryt, mfwd, NULL,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
NULL,
|
qh,
|
||||||
dlr,
|
dlr,
|
||||||
octstr_get_cstr(settings->global_queuedir),
|
octstr_get_cstr(settings->global_queuedir),
|
||||||
settings->host_alias);
|
settings->host_alias);
|
||||||
|
@ -969,7 +958,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
||||||
time(NULL) + settings->default_msgexpiry, mrpt, NULL,
|
time(NULL) + settings->default_msgexpiry, mrpt, NULL,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
NULL,
|
qh,
|
||||||
0,
|
0,
|
||||||
octstr_get_cstr(settings->global_queuedir),
|
octstr_get_cstr(settings->global_queuedir),
|
||||||
settings->host_alias);
|
settings->host_alias);
|
||||||
|
@ -1025,7 +1014,7 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
||||||
m, NULL,
|
m, NULL,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
NULL,
|
qh,
|
||||||
0,
|
0,
|
||||||
octstr_get_cstr(settings->global_queuedir),
|
octstr_get_cstr(settings->global_queuedir),
|
||||||
settings->host_alias);
|
settings->host_alias);
|
||||||
|
@ -1142,13 +1131,10 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
||||||
|
|
||||||
store_done:
|
store_done:
|
||||||
|
|
||||||
if (xstate)
|
octstr_destroy(xstate);
|
||||||
octstr_destroy(xstate);
|
|
||||||
if (xflags)
|
if (xflags)
|
||||||
gwlist_destroy(xflags, (gwlist_item_destructor_t *)octstr_destroy);
|
gwlist_destroy(xflags, (gwlist_item_destructor_t *)octstr_destroy);
|
||||||
|
mms_destroy(mstore);
|
||||||
if (mstore)
|
|
||||||
mms_destroy(mstore);
|
|
||||||
|
|
||||||
if (e) { /* Update the message queue and go. */
|
if (e) { /* Update the message queue and go. */
|
||||||
e->lastaccess = time(NULL);
|
e->lastaccess = time(NULL);
|
||||||
|
@ -1157,23 +1143,13 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
||||||
e = NULL;
|
e = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qf)
|
octstr_destroy(qf);
|
||||||
octstr_destroy(qf);
|
octstr_destroy(token);
|
||||||
if (token)
|
http_destroy_headers(mh);
|
||||||
octstr_destroy(token);
|
octstr_destroy(otransid);
|
||||||
if (mh)
|
octstr_destroy(url);
|
||||||
http_destroy_headers(mh);
|
octstr_destroy(mmbox_loc);
|
||||||
if (otransid)
|
octstr_destroy(sdf);
|
||||||
octstr_destroy(otransid);
|
|
||||||
if (url)
|
|
||||||
octstr_destroy(url);
|
|
||||||
|
|
||||||
|
|
||||||
if (mmbox_loc)
|
|
||||||
octstr_destroy(mmbox_loc);
|
|
||||||
|
|
||||||
if (sdf)
|
|
||||||
octstr_destroy(sdf);
|
|
||||||
|
|
||||||
reply_body = mms_tobinary(mresp);
|
reply_body = mms_tobinary(mresp);
|
||||||
notify_cmd = "stored";
|
notify_cmd = "stored";
|
||||||
|
@ -1514,20 +1490,19 @@ static void sendmms_proxy(MmsHTTPClientInfo *h)
|
||||||
done:
|
done:
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
if (mresp)
|
|
||||||
mms_msgdump(mresp, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (mresp)
|
if (mresp)
|
||||||
mms_destroy(mresp);
|
mms_msgdump(mresp, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
mms_destroy(mresp);
|
||||||
if (!ctype_set)
|
if (!ctype_set)
|
||||||
http_header_add(rh, "Content-Type", "application/vnd.wap.mms-message");
|
http_header_add(rh, "Content-Type", "application/vnd.wap.mms-message");
|
||||||
|
|
||||||
http_send_reply(h->client, hstatus, rh, reply_body);
|
http_send_reply(h->client, hstatus, rh, reply_body);
|
||||||
http_destroy_headers(rh);
|
http_destroy_headers(rh);
|
||||||
if (reply_body)
|
octstr_destroy(reply_body);
|
||||||
octstr_destroy(reply_body);
|
http_destroy_headers(qh);
|
||||||
|
|
||||||
free_clientInfo(h,1);
|
free_clientInfo(h,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1611,7 +1586,7 @@ static void mm7soap_dispatch(MmsHTTPClientInfo *h)
|
||||||
sender = octstr_format("%d/TYPE=PLMN", h->vasp->short_code);
|
sender = octstr_format("%d/TYPE=PLMN", h->vasp->short_code);
|
||||||
switch (mm7_msgtype(mreq)) {
|
switch (mm7_msgtype(mreq)) {
|
||||||
case MM7_TAG_SubmitReq:
|
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);
|
m = mm7_soap_to_mmsmsg(mreq, from ? from : sender);
|
||||||
if (m) {
|
if (m) {
|
||||||
Octstr *value = NULL;
|
Octstr *value = NULL;
|
||||||
|
@ -1629,7 +1604,7 @@ static void mm7soap_dispatch(MmsHTTPClientInfo *h)
|
||||||
|
|
||||||
if (expiryt < 0)
|
if (expiryt < 0)
|
||||||
expiryt = time(NULL) + settings->default_msgexpiry;
|
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,
|
qf = mms_queue_add(from ? from : sender, to, subject,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
delivert, expiryt, m, 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);
|
msgid = mms_maketransid(octstr_get_cstr(qf), settings->host_alias);
|
||||||
mms_log("Received", from ? from : sender, to, -1, msgid, h->vasp->id, NULL, "MM7",
|
mms_log("Received", from ? from : sender, to, -1, msgid, h->vasp->id, NULL, "MM7",
|
||||||
h->ua, NULL);
|
h->ua, NULL);
|
||||||
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!",
|
error(0, "Failed to convert received MM7/SOAP SubmitReq message from vasp=%s to MMS Message!",
|
||||||
octstr_get_cstr(h->vasp->id));
|
octstr_get_cstr(h->vasp->id));
|
||||||
|
@ -1696,11 +1670,9 @@ static void mm7soap_dispatch(MmsHTTPClientInfo *h)
|
||||||
e = NULL;
|
e = NULL;
|
||||||
mms_log("Replace",
|
mms_log("Replace",
|
||||||
sender, NULL, -1, msgid, h->vasp->id, NULL, "MM7", h->ua, NULL);
|
sender, NULL, -1, msgid, h->vasp->id, NULL, "MM7", h->ua, NULL);
|
||||||
|
|
||||||
if (new)
|
mms_destroy(new);
|
||||||
mms_destroy(new);
|
mms_destroy(old);
|
||||||
if (old)
|
|
||||||
mms_destroy(old);
|
|
||||||
http_destroy_headers(hh);
|
http_destroy_headers(hh);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1829,6 +1801,7 @@ static void mm7eaif_dispatch(MmsHTTPClientInfo *h)
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mms_remove_headers(m, "Message-ID");
|
||||||
mh = mms_message_headers(m);
|
mh = mms_message_headers(m);
|
||||||
/* Now get sender and receiver data.
|
/* Now get sender and receiver data.
|
||||||
* for now we ignore adaptation flags.
|
* for now we ignore adaptation flags.
|
||||||
|
|
Loading…
Reference in New Issue