On 01.02.2008, at 13:29, Stipe Tolj wrote:

Hi all,

attached is a patch (work in progress) which allows us to support MT messages that have no sender address set. Meaning we change the current behavior of smsbox, and remove the error condition if no 'to' URI is passed.

The main reason for this is the fact that SMPP v3.4 allows submit_sm.source_address = NULL to be passed. But technically we can't do it, since smsbox will already claim for the missing piece.

Constraints/TODOs:
- smsbox changes are for the GET variant only, I haven't touched the POST things yet.
- SMPP client module has been addopted to work for the condition.
- Other SMSC client modules need to be adopted too?


EMI/UCP supports missing sender address in operation 01 but I dont think it does it in operation 51

BTW, introduces some macros in smsbox that make the conditional checks a bit more easier to read.

Before committing the TODOs need to get touched of course.

Comments?

Stipe

-------------------------------------------------------------------
Kölner Landstrasse 419
40589 Düsseldorf, NRW, Germany

tolj.org system architecture      Kannel Software Foundation (KSF)
http://www.tolj.org/              http://www.kannel.org/

mailto:st_{at}_tolj.org           mailto:stolj_{at}_kannel.org
-------------------------------------------------------------------
### Eclipse Workspace Patch 1.0
#P gateway-cvs-head
Index: gw/smsc/smsc_smpp.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsc/smsc_smpp.c,v
retrieving revision 1.102
diff -u -r1.102 smsc_smpp.c
--- gw/smsc/smsc_smpp.c 9 Jan 2008 20:06:52 -0000       1.102
+++ gw/smsc/smsc_smpp.c 1 Feb 2008 12:19:38 -0000
@@ -760,8 +760,13 @@
    }

    if (smpp->autodetect_addr) {
+               /* check if we have an empty source address */
+        if (octstr_len(pdu->u.submit_sm.source_addr) == 0) {
+            pdu->u.submit_sm.source_addr_ton = GSM_ADDR_TON_UNKNOWN;
+            pdu->u.submit_sm.source_addr_npi = GSM_ADDR_NPI_UNKNOWN;
+        }
        /* lets see if its international or alphanumeric sender */
- if (octstr_get_char(pdu->u.submit_sm.source_addr, 0) == '+') { + else if (octstr_get_char(pdu->u.submit_sm.source_addr, 0) == '+') { if (!octstr_check_range(pdu->u.submit_sm.source_addr, 1, 256, gw_isdigit)) { pdu->u.submit_sm.source_addr_ton = GSM_ADDR_TON_ALPHANUMERIC; /* alphanum */ pdu->u.submit_sm.source_addr_npi = GSM_ADDR_NPI_UNKNOWN; /* short code */
Index: gw/smsbox.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsbox.c,v
retrieving revision 1.277
diff -u -r1.277 smsbox.c
--- gw/smsbox.c 9 Jan 2008 20:06:58 -0000       1.277
+++ gw/smsbox.c 1 Feb 2008 12:19:34 -0000
@@ -1968,6 +1968,7 @@
    List *denied = NULL;
    int no_recv, ret = 0, i;
    long del;
+    struct sms *p;

    /*
     * Multi-cast messages with several receivers in 'to' are handled
@@ -1975,7 +1976,7 @@
* loop below, because everything else is identical for all receivers.
     * If receiver is not null, to list is already present on it
     */
-    if(receiver == NULL) {
+    if (receiver == NULL) {
        receiver = octstr_split_words(to);
    }
    no_recv = gwlist_len(receiver);
@@ -2007,14 +2008,14 @@
    for (i = 0; i < no_recv; i++) {
        receiv = gwlist_get(receiver, i);

-       /*
-        * Check if there are any illegal characters in the 'to' scheme
-        */
- if (strspn(octstr_get_cstr(receiv), sendsms_number_chars) < octstr_len(receiv)) {
-           info(0,"Illegal characters in 'to' string ('%s') vs '%s'",
-               octstr_get_cstr(receiv), sendsms_number_chars);
+        /*
+ * Check if there are any illegal characters in the 'to' scheme
+         */
+ if (strspn(octstr_get_cstr(receiv), sendsms_number_chars) < octstr_len(receiv)) { + info(0,"Illegal characters in 'to' string ('%s') vs '%s'",
+                 octstr_get_cstr(receiv), sendsms_number_chars);
            gwlist_append_unique(denied, receiv, octstr_item_match);
-       }
+        }

        /*
         * First of all fill the two lists systematicaly by the rules,
@@ -2111,17 +2112,14 @@
    }

    if (urltrans_faked_sender(t) != NULL) {
-       /* discard previous from */
-       newfrom = octstr_duplicate(urltrans_faked_sender(t));
+        /* discard previous from */
+        newfrom = octstr_duplicate(urltrans_faked_sender(t));
    } else if (octstr_len(from) > 0) {
-       newfrom = octstr_duplicate(from);
+        newfrom = octstr_duplicate(from);
    } else if (urltrans_default_sender(t) != NULL) {
-       newfrom = octstr_duplicate(urltrans_default_sender(t));
+        newfrom = octstr_duplicate(urltrans_default_sender(t));
    } else if (global_sender != NULL) {
-       newfrom = octstr_duplicate(global_sender);
-    } else {
- returnerror = octstr_create("Sender missing and no global set, rejected");
-       goto field_error;
+        newfrom = octstr_duplicate(global_sender);
    }

    info(0, "sendsms sender:<%s:%s> (%s) to:<%s> msg:<%s>",
@@ -2140,14 +2138,14 @@
    msg->sms.service = octstr_duplicate(urltrans_name(t));
    msg->sms.sms_type = mt_push;
    msg->sms.sender = octstr_duplicate(newfrom);
-    if(octstr_len(account)) {
-       if(octstr_len(account) <= 32 &&
-          octstr_search_chars(account, octstr_imm("[]\n\r"), 0) == -1) {
-           msg->sms.account = account ? octstr_duplicate(account) : NULL;
-       } else {
- returnerror = octstr_create("Account field misformed, rejected");
-           goto field_error;
-       }
+    if (octstr_len(account)) {
+        if (octstr_len(account) <= 32 &&
+ octstr_search_chars(account, octstr_imm("[]\n\r"), 0) == -1) { + msg->sms.account = account ? octstr_duplicate(account) : NULL;
+        } else {
+ returnerror = octstr_create("Account field misformed, rejected");
+            goto field_error;
+        }
    }
msg->sms.msgdata = text ? octstr_duplicate(text) : octstr_create(""); msg->sms.udhdata = udh ? octstr_duplicate(udh) : octstr_create("");
@@ -2155,133 +2153,92 @@
    if (octstr_len(binfo))
        msg->sms.binfo = octstr_duplicate(binfo);

-    if(octstr_len(dlr_url)) {
-       if(octstr_len(dlr_url) < 8) { /* http(s):// */
- returnerror = octstr_create("DLR-URL field misformed, rejected");
-           goto field_error;
-       } else {
-           Octstr *tmp;
-           tmp = octstr_copy(dlr_url, 0, 7);
-           if(octstr_case_compare(tmp, octstr_imm("http://";)) == 0) {
-               msg->sms.dlr_url = octstr_duplicate(dlr_url);
-           } else {
-               O_DESTROY(tmp);
-               tmp = octstr_copy(dlr_url, 0, 8);
-               if(octstr_case_compare(tmp, octstr_imm("https://";)) != 0) {
- returnerror = octstr_create("DLR-URL field misformed, rejected");
-                   O_DESTROY(tmp);
-                   goto field_error;
-               }
+    if (octstr_len(dlr_url)) {
+        if (octstr_len(dlr_url) < 8) { /* http(s):// */
+ returnerror = octstr_create("DLR-URL field misformed, rejected");
+            goto field_error;
+        } else {
+            Octstr *tmp;
+            tmp = octstr_copy(dlr_url, 0, 7);
+ if (octstr_case_compare(tmp, octstr_imm("http://";)) == 0) {
+                msg->sms.dlr_url = octstr_duplicate(dlr_url);
+            } else {
+                O_DESTROY(tmp);
+                tmp = octstr_copy(dlr_url, 0, 8);
+ if (octstr_case_compare(tmp, octstr_imm("https://";)) != 0) { + returnerror = octstr_create("DLR-URL field misformed, rejected");
+                    O_DESTROY(tmp);
+                    goto field_error;
+                }
#ifdef HAVE_LIBSSL
-               msg->sms.dlr_url = octstr_duplicate(dlr_url);
+                msg->sms.dlr_url = octstr_duplicate(dlr_url);
#else /* HAVE_LIBSSL */
-               else {
- warning(0, "DLR-URL with https but SSL not supported, url is < %s>",
-                           octstr_get_cstr(dlr_url));
-               }
+                else {
+ warning(0, "DLR-URL with https but SSL not supported, url is <%s>",
+                            octstr_get_cstr(dlr_url));
+                }
#endif /* HAVE_LIBSSL */
-           }
-           O_DESTROY(tmp);
-       }
+            }
+            O_DESTROY(tmp);
+        }
    } else {
-       msg->sms.dlr_url = octstr_create("");
+        msg->sms.dlr_url = octstr_create("");
    }

-    if ( dlr_mask < -1 || dlr_mask > 31 ) { /* 00011111 */
-       returnerror = octstr_create("DLR-Mask field misformed, rejected");
-       goto field_error;
-    }
-    msg->sms.dlr_mask = dlr_mask;
-
-    if ( mclass < -1 || mclass > 3 ) {
-       returnerror = octstr_create("MClass field misformed, rejected");
-       goto field_error;
-    }
-    msg->sms.mclass = mclass;
-
-    if ( pid < -1 || pid > 255 ) {
-       returnerror = octstr_create("PID field misformed, rejected");
-       goto field_error;
-    }
-    msg->sms.pid = pid;
-
-    if ( rpi < -1 || rpi > 2) {
-       returnerror = octstr_create("RPI field misformed, rejected");
-       goto field_error;
-    }
-    msg->sms.rpi = rpi;
-
-    if ( alt_dcs < -1 || alt_dcs > 1 ) {
-       returnerror = octstr_create("Alt-DCS field misformed, rejected");
-       goto field_error;
-    }
-    msg->sms.alt_dcs = alt_dcs;
-
-    if ( mwi < -1 || mwi > 7 ) {
-       returnerror = octstr_create("MWI field misformed, rejected");
-       goto field_error;
-    }
-    msg->sms.mwi = mwi;
-
-    if ( coding < -1 || coding > 2 ) {
-       returnerror = octstr_create("Coding field misformed, rejected");
-       goto field_error;
-    }
-    msg->sms.coding = coding;
-
-    if ( compress < -1 || compress > 1 ) {
-       returnerror = octstr_create("Compress field misformed, rejected");
-       goto field_error;
-    }
-    msg->sms.compress = compress;
+    /* Define macros that are used to reduce code replication. */
+#define MINMAX(var, min, max, string) \
+    if (var < min || var > max) { \
+ returnerror = octstr_create(string " field misformed, rejected"); \
+        goto field_error; \
+    } \
+    { p->var = var; }
+
+#define MIN(var, min, string) \
+    if (var < min) { \
+ returnerror = octstr_create(string " field misformed, rejected"); \
+        goto field_error; \
+    } \
+    { p->var = var; }
+
+    p = &msg->sms;
+    MINMAX(dlr_mask, DLR_UNDEFINED, 31, "DLR-Mask");
+    MINMAX(mclass, MC_UNDEF, MC_CLASS3, "MClass");
+    MINMAX(pid, SMS_PARAM_UNDEFINED, 255, "PID");
+    MINMAX(rpi, RPI_UNDEF, RPI_ON, "RPI");
+    MINMAX(alt_dcs, SMS_PARAM_UNDEFINED, 1, "Alt-DCS");
+    MINMAX(mwi, MWI_UNDEF, MWI_OTHER_OFF, "MWI");
+    MINMAX(coding, DC_UNDEF, DC_UCS2, "Coding");
+    MINMAX(compress, SMS_PARAM_UNDEFINED, 1, "Compress");
+    MINMAX(priority, SMS_PARAM_UNDEFINED, 3, "Priority");
+    MIN(validity, SMS_PARAM_UNDEFINED, "Validity");
+    MIN(deferred, SMS_PARAM_UNDEFINED, "Deferred");

    /* Compatibility Mode */
-    if ( msg->sms.coding == DC_UNDEF) {
-       if(octstr_len(udh))
-         msg->sms.coding = DC_8BIT;
-       else
-         msg->sms.coding = DC_7BIT;
-    }
-       
-
-    if ( validity < -1 ) {
-       returnerror = octstr_create("Validity field misformed, rejected");
-       goto field_error;
-    }
-    msg->sms.validity = validity;
-
-    if ( deferred < -1 ) {
-       returnerror = octstr_create("Deferred field misformed, rejected");
-       goto field_error;
+    if (msg->sms.coding == DC_UNDEF) {
+        if( octstr_len(udh))
+            msg->sms.coding = DC_8BIT;
+        else
+            msg->sms.coding = DC_7BIT;
    }
-    msg->sms.deferred = deferred;

- if (priority != SMS_PARAM_UNDEFINED && (priority < 0 || priority > 3)) { - returnerror = octstr_create("Priority field misformed, rejected");
-        goto field_error;
-    }
-    msg->sms.priority = priority;
-
-
    /* new smsc-id argument - we should check this one, if able,
       but that's advanced logics -- Kalle */

    if (urltrans_forced_smsc(t)) {
-       msg->sms.smsc_id = octstr_duplicate(urltrans_forced_smsc(t));
-       if (smsc)
-           info(0, "send-sms request smsc id ignored, "
-                   "as smsc id forced to %s",
-                   octstr_get_cstr(urltrans_forced_smsc(t)));
+        msg->sms.smsc_id = octstr_duplicate(urltrans_forced_smsc(t));
+        if (smsc)
+ info(0, "send-sms request smsc id ignored, as smsc id forced to %s",
+                 octstr_get_cstr(urltrans_forced_smsc(t)));
    } else if (smsc) {
-       msg->sms.smsc_id = octstr_duplicate(smsc);
+        msg->sms.smsc_id = octstr_duplicate(smsc);
    } else if (urltrans_default_smsc(t)) {
-       msg->sms.smsc_id = octstr_duplicate(urltrans_default_smsc(t));
+ msg->sms.smsc_id = octstr_duplicate(urltrans_default_smsc(t));
    } else
-       msg->sms.smsc_id = NULL;
+        msg->sms.smsc_id = NULL;

if (charset_processing(charset, msg->sms.msgdata, msg- >sms.coding) == -1) {
-       returnerror = octstr_create("Charset or body misformed, rejected");
-       goto field_error;
+ returnerror = octstr_create("Charset or body misformed, rejected");
+        goto field_error;
    }

    msg->sms.receiver = NULL;
@@ -2301,7 +2258,7 @@

    while ((receiv = gwlist_extract_first(allowed)) != NULL) {

-       O_DESTROY(msg->sms.receiver);
+        O_DESTROY(msg->sms.receiver);
        msg->sms.receiver = octstr_duplicate(receiv);

        msg->sms.time = time(NULL);
@@ -2322,7 +2279,7 @@
    }

    if (gwlist_len(failed_id) > 0)
-       goto transmit_error;
+        goto transmit_error;

    *status = HTTP_ACCEPTED;
    returnerror = octstr_create("Sent.");


Reply via email to