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?
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.");