Hello,
Here is another version on the same idea but against kannel-1.4.0.
The main difference is that it does add the dst field check for all
the DLR backends and it does normalize the phone number received in
all the smsc prior to looking for the DLR.
Hopefully this should a solution closer to what was already discussed
on the list some month ago. It has been tested for the CIMD2 protocol
on a real SMSC and for the EMI only on a fake one yet. also the DLR
storage backend was only tested for the SDB and internal one.
Cheers,
Olivier
--
----------------------------------------------------------------------
Mobile News Channel Direct phone: +41 21 317 50 25
Olivier Dormond Central: +41 21 317 50 20
Av. de la Gare 10
1003 Lausanne Email: [EMAIL PROTECTED]
diff -rubB -x CVS kannel-1.4.0/gw/dlr_mem.c ../eclipse/workspace/kannel-1.4.0/gw/dlr_mem.c
--- kannel-1.4.0/gw/dlr_mem.c 2004-08-08 21:50:18.000000000 +0200
+++ ../eclipse/workspace/kannel-1.4.0/gw/dlr_mem.c 2006-01-04 11:25:56.000000000 +0100
@@ -125,7 +125,9 @@
/* XXX: check destination addr too, because e.g. for UCP is not enough to check only
* smsc and timestamp (timestamp is even without milliseconds)
*/
- if(octstr_compare(dlr->smsc,smsc) == 0 && octstr_compare(dlr->timestamp,ts) == 0)
+ if(octstr_compare(dlr->smsc,smsc) == 0 &&
+ octstr_compare(dlr->timestamp,ts) == 0 &&
+ octstr_compare(dlr->destination,dst) == 0)
return 0;
return 1;
diff -rubB -x CVS kannel-1.4.0/gw/dlr_mysql.c ../eclipse/workspace/kannel-1.4.0/gw/dlr_mysql.c
--- kannel-1.4.0/gw/dlr_mysql.c 2004-01-22 15:08:24.000000000 +0100
+++ ../eclipse/workspace/kannel-1.4.0/gw/dlr_mysql.c 2006-01-04 11:25:56.000000000 +0100
@@ -170,12 +170,14 @@
MYSQL_RES *result;
MYSQL_ROW row;
- sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s';",
+ sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s' AND %s='%s';",
octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_serv),
octstr_get_cstr(fields->field_url), octstr_get_cstr(fields->field_src),
octstr_get_cstr(fields->field_dst), octstr_get_cstr(fields->field_boxc),
- octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
- octstr_get_cstr(smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
+ octstr_get_cstr(fields->table),
+ octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
+ octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+ octstr_get_cstr(fileds->field_dst), octstr_get_cstr(dst));
result = mysql_select(sql);
@@ -219,9 +221,11 @@
Octstr *sql;
debug("dlr.mysql", 0, "removing DLR from database");
- sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' LIMIT 1;",
- octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
- octstr_get_cstr(smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
+ sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' AND %s='%s' LIMIT 1;",
+ octstr_get_cstr(fields->table),
+ octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
+ octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+ octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst));
mysql_update(sql);
@@ -234,11 +238,12 @@
Octstr *sql;
debug("dlr.mysql", 0, "updating DLR status in database");
- sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND %s='%s' LIMIT 1;",
+ sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND %s='%s' AND %s='%s' LIMIT 1;",
octstr_get_cstr(fields->table),
octstr_get_cstr(fields->field_status), status,
octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
- octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
+ octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+ octstr_get_cstr(fileds->field_dst), octstr_get_cstr(dst));
mysql_update(sql);
diff -rubB -x CVS kannel-1.4.0/gw/dlr_pgsql.c ../eclipse/workspace/kannel-1.4.0/gw/dlr_pgsql.c
--- kannel-1.4.0/gw/dlr_pgsql.c 2004-06-09 12:06:33.000000000 +0200
+++ ../eclipse/workspace/kannel-1.4.0/gw/dlr_pgsql.c 2006-01-04 11:25:56.000000000 +0100
@@ -163,12 +163,14 @@
Octstr *sql;
List *result, *row;
- sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s';",
+ sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s' AND %s='%s';",
octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_serv),
octstr_get_cstr(fields->field_url), octstr_get_cstr(fields->field_src),
octstr_get_cstr(fields->field_dst), octstr_get_cstr(fields->field_boxc),
- octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
- octstr_get_cstr(smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
+ octstr_get_cstr(fields->table),
+ octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
+ octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+ octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst));
result = pgsql_select(sql);
@@ -215,9 +217,11 @@
Octstr *sql;
debug("dlr.pgsql", 0, "removing DLR from database");
- sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' LIMIT 1;",
- octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
- octstr_get_cstr(smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
+ sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' AND %s='%s' LIMIT 1;",
+ octstr_get_cstr(fields->table),
+ octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
+ octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+ octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst));
pgsql_update(sql);
@@ -229,11 +233,12 @@
Octstr *sql;
debug("dlr.pgsql", 0, "updating DLR status in database");
- sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND %s='%s' LIMIT 1;",
+ sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND %s='%s' AND %s='%s' LIMIT 1;",
octstr_get_cstr(fields->table),
octstr_get_cstr(fields->field_status), status,
octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
- octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
+ octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+ octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst));
pgsql_update(sql);
octstr_destroy(sql);
}
diff -rubB -x CVS kannel-1.4.0/gw/dlr_sdb.c ../eclipse/workspace/kannel-1.4.0/gw/dlr_sdb.c
--- kannel-1.4.0/gw/dlr_sdb.c 2004-05-18 15:04:20.000000000 +0200
+++ ../eclipse/workspace/kannel-1.4.0/gw/dlr_sdb.c 2006-01-04 11:25:56.000000000 +0100
@@ -216,13 +216,15 @@
gw_assert(res != NULL);
- sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s' %s",
+ sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s' AND %s='%s' %s",
octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_serv),
octstr_get_cstr(fields->field_url), octstr_get_cstr(fields->field_src),
octstr_get_cstr(fields->field_dst), octstr_get_cstr(fields->field_boxc),
octstr_get_cstr(fields->table),
octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
- octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts), sdb_get_limit_str());
+ octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+ octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst),
+ sdb_get_limit_str());
#if defined(DLR_TRACE)
debug("dlr.sdb", 0, "SDB: sql: %s", octstr_get_cstr(sql));
@@ -254,11 +256,13 @@
int state;
debug("dlr.sdb", 0, "SDB: updating DLR status in database");
- sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND %s='%s' %s",
+ sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND %s='%s' AND %s='%s' %s",
octstr_get_cstr(fields->table),
octstr_get_cstr(fields->field_status), status,
octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
- octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts), sdb_get_limit_str());
+ octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+ octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst),
+ sdb_get_limit_str());
#if defined(DLR_TRACE)
debug("dlr.sdb", 0, "SDB: sql: %s", octstr_get_cstr(sql));
@@ -286,16 +290,19 @@
* to hit duplicates since oid's are given in a row
*/
sql = octstr_format("DELETE FROM %s WHERE oid = \
- (SELECT oid FROM %s WHERE %s='%s' AND %s='%s' LIMIT 1)",
+ (SELECT oid FROM %s WHERE %s='%s' AND %s='%s' AND %s='%s' LIMIT 1)",
octstr_get_cstr(fields->table),
octstr_get_cstr(fields->table),
octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
- octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
+ octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+ octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst));
} else {
- sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' %s",
+ sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' AND %s='%s' %s",
octstr_get_cstr(fields->table),
octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
- octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts), sdb_get_limit_str());
+ octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts),
+ octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst),
+ sdb_get_limit_str());
}
#if defined(DLR_TRACE)
diff -rubB -x CVS kannel-1.4.0/gw/smsc/smsc_at.c ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_at.c
--- kannel-1.4.0/gw/smsc/smsc_at.c 2004-09-18 00:20:50.000000000 +0200
+++ ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_at.c 2006-01-04 11:46:23.000000000 +0100
@@ -1653,7 +1653,7 @@
Msg* dlrmsg = NULL;
Octstr *pdu, *msg_id, *tmpstr = NULL, *receiver = NULL;
int type, tp_mr, len, ntype, pos;
-
+ char *uf = privdata->conn->unified_prefix ? octstr_get_cstr(privdata->conn->unified_prefix) : NULL;
/*
* parse the PDU.
*/
@@ -1696,6 +1696,7 @@
octstr_get_cstr(privdata->name), ((ntype & 0x90) == 0x90 ? "(international)" : ""),
octstr_get_cstr(receiver));
}
+ normalize_number(uf, &receiver);
pos += 14; /* skip time stamps for now */
diff -rubB -x CVS kannel-1.4.0/gw/smsc/smsc_cgw.c ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_cgw.c
--- kannel-1.4.0/gw/smsc/smsc_cgw.c 2004-02-16 20:41:26.000000000 +0100
+++ ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_cgw.c 2006-01-04 11:49:07.000000000 +0100
@@ -1075,6 +1075,7 @@
long trn, stat; /* transaction number for ack */
Msg *dlrmsg = NULL, *origmsg = NULL;
Octstr *ts;
+ char *uf = conn->unified_prefix ? octstr_get_cstr(conn->unified_prefix) : NULL;
if (cgwop == NULL) return 0;
@@ -1087,6 +1088,7 @@
txt = cgwop_get(cgwop, octstr_imm("txt"));
msid = cgwop_get(cgwop, octstr_imm("msid"));
+ normalize_number(uf, &msid);
status = cgwop_get(cgwop, octstr_imm("status"));
clid = cgwop_get(cgwop, octstr_imm("client-id"));
diff -rubB -x CVS kannel-1.4.0/gw/smsc/smsc_cimd2.c ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_cimd2.c
--- kannel-1.4.0/gw/smsc/smsc_cimd2.c 2004-06-21 23:16:06.000000000 +0200
+++ ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_cimd2.c 2006-01-04 11:50:51.000000000 +0100
@@ -2090,8 +2090,10 @@
Octstr *statuscode = NULL;
int st_code;
int code;
+ char *uf = conn->unified_prefix ? octstr_get_cstr(conn->unified_prefix) : NULL;
destination = packet_get_parm(request, P_DESTINATION_ADDRESS);
+ normalize_number(uf, &destination);
timestamp = packet_get_parm(request, P_MC_TIMESTAMP);
statuscode = packet_get_parm(request, P_STATUS_CODE);
diff -rubB -x CVS kannel-1.4.0/gw/smsc/smsc_emi.c ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_emi.c
--- kannel-1.4.0/gw/smsc/smsc_emi.c 2004-09-08 12:54:06.000000000 +0200
+++ ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_emi.c 2006-01-04 11:39:30.000000000 +0100
@@ -575,6 +575,7 @@
struct universaltime unitime;
int st_code;
PrivData *privdata = conn->data;
+ char *uf = conn->unified_prefix ? octstr_get_cstr(conn->unified_prefix) : NULL;
switch(emimsg->ot) {
@@ -835,27 +836,31 @@
*/
case 53:
st_code = atoi(octstr_get_cstr(emimsg->fields[E50_DST]));
+ tempstr = octstr_duplicate(emimsg->fields[E50_OADC]);
+ normalize_number(uf, &tempstr);
+
switch(st_code)
{
case 0: /* delivered */
msg = dlr_find((conn->id ? conn->id : privdata->name),
emimsg->fields[E50_SCTS], /* timestamp */
- emimsg->fields[E50_OADC], /* destination */
+ tempstr, /* destination */
DLR_SUCCESS);
break;
case 1: /* buffered */
msg = dlr_find((conn->id ? conn->id : privdata->name),
emimsg->fields[E50_SCTS], /* timestamp */
- emimsg->fields[E50_OADC], /* destination */
+ tempstr, /* destination */
DLR_BUFFERED);
break;
case 2: /* not delivered */
msg = dlr_find((conn->id ? conn->id : privdata->name),
emimsg->fields[E50_SCTS], /* timestamp */
- emimsg->fields[E50_OADC], /* destination */
+ tempstr, /* destination */
DLR_FAIL);
break;
}
+ octstr_destroy(tempstr);
if (msg != NULL) {
/*
* Recode the msg structure with the given msgdata.
diff -rubB -x CVS kannel-1.4.0/gw/smsc/smsc_fake.c ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_fake.c
--- kannel-1.4.0/gw/smsc/smsc_fake.c 2004-02-16 20:41:26.000000000 +0100
+++ ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_fake.c 2006-01-04 12:06:37.000000000 +0100
@@ -265,21 +265,25 @@
*/
if (DLR_IS_ENABLED_DEVICE(msg->sms.dlr_mask)) {
Msg *dlrmsg;
- Octstr *tmp;
+ Octstr *tmp, *tmpdst;
int dlrstat = DLR_SUCCESS;
char id[UUID_STR_LEN + 1];
+ char *uf = conn->unified_prefix ? octstr_get_cstr(conn->unified_prefix) : NULL;
uuid_unparse(msg->sms.id, id);
tmp = octstr_create(id);
+ tmpdst = octstr_duplicate(msg->sms.receiver);
+ normalize_number(uf, &tmpdst);
dlrmsg = dlr_find(conn->id,
tmp, /* smsc message id */
- msg->sms.receiver, /* destination */
+ tmpdst, /* destination */
dlrstat);
if (dlrmsg != NULL) {
bb_smscconn_receive(conn, dlrmsg);
} else {
error(0,"smsc_fale: got DLR but could not find message or was not interested in it");
}
+ octstr_destroy(tmpdst);
octstr_destroy(tmp);
}
diff -rubB -x CVS kannel-1.4.0/gw/smsc/smsc_oisd.c ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_oisd.c
--- kannel-1.4.0/gw/smsc/smsc_oisd.c 2004-06-15 20:04:34.000000000 +0200
+++ ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_oisd.c 2006-01-04 11:54:08.000000000 +0100
@@ -1282,11 +1282,13 @@
int st_code;
int code;
int dest_len;
+ char *uf = conn->unified_prefix ? octstr_get_cstr(conn->unified_prefix) : NULL;
/* MSISDN length */
dest_len = octstr_get_char(request->data, 10);
/* MSISDN */
destination = octstr_copy(request->data, 10+1, dest_len);
+ normalize_number(uf, &destination);
/* Accept time */
timestamp = octstr_copy(request->data, 10+1+dest_len+1+4+4, 14);
/* SM status */
diff -rubB -x CVS kannel-1.4.0/gw/smsc/smsc_smpp.c ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_smpp.c
--- kannel-1.4.0/gw/smsc/smsc_smpp.c 2004-10-21 14:33:40.000000000 +0200
+++ ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_smpp.c 2006-01-04 12:06:58.000000000 +0100
@@ -1050,7 +1050,9 @@
tmp = octstr_format("0");
if (msgid != NULL) {
-
+ char *uf = smpp->conn->unified_prefix ? octstr_get_cstr(smpp->conn->unified_prefix) : NULL;
+ Octstr *tmpdst = octstr_duplicate(pdu->u.deliver_sm.source_addr);
+ normalize_number(uf, &tmpdst);
/*
* Obey which SMPP msg_id type this SMSC is using, where we
* have the following semantics for the variable smpp_msg_id:
@@ -1080,9 +1082,10 @@
dlrmsg = dlr_find(smpp->conn->id,
tmp, /* smsc message id */
- pdu->u.deliver_sm.source_addr, /* destination */
+ tmpdst, /* destination */
dlrstat);
+ octstr_destroy(tmpdst);
octstr_destroy(msgid);
}
diff -rubB -x CVS kannel-1.4.0/gw/smsc/smsc_soap.c ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_soap.c
--- kannel-1.4.0/gw/smsc/smsc_soap.c 2004-08-28 20:09:19.000000000 +0200
+++ ../eclipse/workspace/kannel-1.4.0/gw/smsc/smsc_soap.c 2006-01-04 12:07:19.000000000 +0100
@@ -1518,6 +1518,8 @@
Msg* dlrmsg = NULL;
long dlrtype;
int pos;
+ Octstr *tmpdst;
+ char *uf = conn->unified_prefix ? octstr_get_cstr(conn->unified_prefix) : NULL;
List* maps;
char receiver[30], soapdate[30], msgid[30];
@@ -1615,10 +1617,11 @@
dlrtype = DLR_FAIL;
/* fetch the DLR */
-
- dlrmsg = dlr_find(conn->id, octstr_imm(msgid), octstr_imm("receiver"), /* destination */
+ tmpdst = octstr_duplicate(octstr_imm("receiver"));
+ normalize_number(uf, &tmpdst);
+ dlrmsg = dlr_find(conn->id, octstr_imm(msgid), tmpdst, /* destination */
dlrtype);
-
+ octstr_destroy(tmpdst);
if (!dlrmsg) {
error(0,"SOAP[%s]: parse_dlr invoked (%ld), but no DLR found for MsgID %s", octstr_get_cstr(privdata->name),dlrtype,msgid);
*response = octstr_create(SOAP_ERROR_NO_DLR_MESSAGE);