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

Reply via email to