Re: [PATCH] empty msg->sms.sender support
Andreas Fink <[email protected]>
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Message-ID | <[email protected]> |
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.");