Main Page | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

smsbox.c File Reference

#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include "gwlib/gwlib.h"
#include "gwlib/regex.h"
#include "msg.h"
#include "sms.h"
#include "dlr.h"
#include "bb.h"
#include "shared.h"
#include "heartbeat.h"
#include "html.h"
#include "urltrans.h"
#include "ota_prov_attr.h"
#include "ota_prov.h"
#include "ota_compiler.h"
#include "xml_shared.h"

Include dependency graph for smsbox.c:

Include dependency graph

Go to the source code of this file.

Data Structures

struct  receiver

Defines

#define SENDSMS_DEFAULT_CHARS   "0123456789 +-"
#define O_DESTROY(a)   { if(a) octstr_destroy(a); a = NULL; }
#define HTTP_MAX_RETRIES   0
#define HTTP_RETRY_DELAY   10
#define HTTP_MAX_PENDING   512
#define OCTSTR_APPEND_XML(xml, tag, text)
#define OCTSTR_APPEND_XML_NUMBER(xml, tag, value)   octstr_format_append(xml, " \t\t<" tag ">%ld</" tag ">\n", (long) value);

Functions

int charset_processing (Octstr *charset, Octstr *text, int coding)
long get_tag (Octstr *body, Octstr *tag, Octstr **value, long pos, int nostrip)
void identify_to_bearerbox (void)
void delayed_http_reply (Msg *msg)
void read_messages_from_bearerbox (void)
int send_message (URLTranslation *trans, Msg *msg)
void * remember_receiver (Msg *msg, URLTranslation *trans, int method, Octstr *url, List *headers, Octstr *body, unsigned int retries)
void get_receiver (void *id, Msg **msg, URLTranslation **trans, int *method, Octstr **url, List **headers, Octstr **body, unsigned long *retries)
long outstanding_requests (void)
void strip_prefix_and_suffix (Octstr *html, Octstr *prefix, Octstr *suffix)
void get_x_kannel_from_headers (List *headers, Octstr **from, Octstr **to, Octstr **udh, Octstr **user, Octstr **pass, Octstr **smsc, int *mclass, int *mwi, int *coding, int *compress, int *validity, int *deferred, int *dlr_mask, Octstr **dlr_url, Octstr **account, int *pid, int *alt_dcs, int *rpi, Octstr **binfo, int *priority)
void get_x_kannel_from_xml (int requesttype, Octstr **type, Octstr **body, List *headers, Octstr **from, Octstr **to, Octstr **udh, Octstr **user, Octstr **pass, Octstr **smsc, int *mclass, int *mwi, int *coding, int *compress, int *validity, int *deferred, int *dlr_mask, Octstr **dlr_url, Octstr **account, int *pid, int *alt_dcs, int *rpi, List **tolist, Octstr **charset, Octstr **binfo, int *priority)
void fill_message (Msg *msg, URLTranslation *trans, Octstr *replytext, int octet_stream, Octstr *from, Octstr *to, Octstr *udh, int mclass, int mwi, int coding, int compress, int validity, int deferred, Octstr *dlr_url, int dlr_mask, int pid, int alt_dcs, int rpi, Octstr *smsc, Octstr *account, Octstr *charset, Octstr *binfo, int priority)
void http_queue_thread (void *arg)
void url_result_thread (void *arg)
int obey_request (Octstr **result, URLTranslation *trans, Msg *msg)
void obey_request_thread (void *arg)
Octstrstore_uuid (Msg *msg)
Octstrsmsbox_req_handle (URLTranslation *t, Octstr *client_ip, HTTPClient *client, Octstr *from, Octstr *to, Octstr *text, Octstr *charset, Octstr *udh, Octstr *smsc, int mclass, int mwi, int coding, int compress, int validity, int deferred, int *status, int dlr_mask, Octstr *dlr_url, Octstr *account, int pid, int alt_dcs, int rpi, List *receiver, Octstr *binfo, int priority)
URLTranslationauthorise_username (Octstr *username, Octstr *password, Octstr *client_ip)
URLTranslationdefault_authorise_user (List *list, Octstr *client_ip)
URLTranslationauthorise_user (List *list, Octstr *client_ip)
Octstrsmsbox_req_sendsms (List *args, Octstr *client_ip, int *status, HTTPClient *client)
Octstrsmsbox_sendsms_post (List *headers, Octstr *body, Octstr *client_ip, int *status, HTTPClient *client)
Octstrsmsbox_xmlrpc_post (List *headers, Octstr *body, Octstr *client_ip, int *status)
Octstrsmsbox_req_sendota (List *list, Octstr *client_ip, int *status, HTTPClient *client)
Octstrsmsbox_sendota_post (List *headers, Octstr *body, Octstr *client_ip, int *status, HTTPClient *client)
void sendsms_thread (void *arg)
void signal_handler (int signum)
void setup_signal_handlers (void)
Cfginit_smsbox (Cfg *cfg)
int check_args (int i, int argc, char **argv)
int main (int argc, char **argv)

Variables

volatile sig_atomic_t restart = 0
Cfgcfg
long bb_port
int bb_ssl = 0
long sendsms_port = 0
Octstrsendsms_interface = NULL
Octstrsmsbox_id = NULL
Octstrsendsms_url = NULL
Octstrsendota_url = NULL
Octstrxmlrpc_url = NULL
Octstrbb_host
Octstraccepted_chars = NULL
int only_try_http = 0
URLTranslationListtranslations = NULL
long sms_max_length = MAX_SMS_OCTETS
char * sendsms_number_chars
Octstrglobal_sender = NULL
Octstrreply_couldnotfetch = NULL
Octstrreply_couldnotrepresent = NULL
Octstrreply_requestfailed = NULL
Octstrreply_emptymessage = NULL
int mo_recode = 0
Numhashwhite_list
Numhashblack_list
regex_t * white_list_regex = NULL
regex_t * black_list_regex = NULL
long max_http_retries = HTTP_MAX_RETRIES
long http_queue_delay = HTTP_RETRY_DELAY
Octstrppg_service_name = NULL
Listsmsbox_requests = NULL
Listsmsbox_http_requests = NULL
Semaphoremax_pending_requests
int immediate_sendsms_reply = 0
Dictclient_dict = NULL
Listsendsms_reply_hdrs = NULL
Countercatenated_sms_counter
HTTPCallercaller
Counternum_outstanding_requests


Define Documentation

#define HTTP_MAX_PENDING   512
 

Definition at line 94 of file smsbox.c.

#define HTTP_MAX_RETRIES   0
 

Definition at line 92 of file smsbox.c.

#define HTTP_RETRY_DELAY   10
 

Definition at line 93 of file smsbox.c.

#define O_DESTROY  )     { if(a) octstr_destroy(a); a = NULL; }
 

Definition at line 89 of file smsbox.c.

Referenced by at2_check_sms_memory(), at2_destroy_modem(), at2_format_address_field(), at2_pdu_decode_deliver_sm(), at2_pdu_decode_report_sm(), at2_pdu_encode(), at2_read_modems(), at2_read_pending_incoming_messages(), at2_send_one_message(), at2_wait_modem_command(), at2_write_line(), fill_message(), get_x_kannel_from_xml(), obey_request(), smsbox_req_handle(), smsc_at2_create(), smsc_soap_create(), soap_listener(), soap_msgdata_attribute(), soap_o2o_msgdata_attribute(), soap_read_response(), soap_release_dependences(), soap_send(), soap_send_loop(), and soap_server().

#define OCTSTR_APPEND_XML xml,
tag,
text   ) 
 

Value:

octstr_format_append(xml, "  \t\t<" tag ">%s</" tag ">\n", \
            (text?octstr_get_cstr(text):""));

Referenced by obey_request().

#define OCTSTR_APPEND_XML_NUMBER xml,
tag,
value   )     octstr_format_append(xml, " \t\t<" tag ">%ld</" tag ">\n", (long) value);
 

Referenced by obey_request().

#define SENDSMS_DEFAULT_CHARS   "0123456789 +-"
 

Definition at line 87 of file smsbox.c.


Function Documentation

URLTranslation* authorise_user List list,
Octstr client_ip
[static]
 

Definition at line 2439 of file smsbox.c.

References default_authorise_user(), octstr_imm(), translations, and urltrans_find_username().

Referenced by smsbox_req_sendota(), and smsbox_req_sendsms().

02440 {
02441 #ifdef HAVE_SECURITY_PAM_APPL_H
02442     URLTranslation *t;
02443     
02444     t = urltrans_find_username(translations, octstr_imm("pam"));
02445     if (t != NULL) {
02446     if (pam_authorise_user(list))
02447         return t;
02448     else 
02449         return NULL;
02450     } else
02451     return default_authorise_user(list, client_ip);
02452 #else
02453     return default_authorise_user(list, client_ip);
02454 #endif
02455 }

Here is the call graph for this function:

URLTranslation* authorise_username Octstr username,
Octstr password,
Octstr client_ip
[static]
 

Definition at line 2392 of file smsbox.c.

References info(), is_allowed_ip(), octstr_compare(), octstr_get_cstr, password, translations, urltrans_allow_ip(), urltrans_deny_ip(), urltrans_find_username(), urltrans_password(), username, and warning().

Referenced by default_authorise_user(), smsbox_sendota_post(), and smsbox_sendsms_post().

02394 {
02395     URLTranslation *t = NULL;
02396 
02397     if (username == NULL || password == NULL)
02398     return NULL;
02399 
02400     if ((t = urltrans_find_username(translations, username))==NULL)
02401     return NULL;
02402 
02403     if (octstr_compare(password, urltrans_password(t))!=0)
02404     return NULL;
02405     else {
02406     Octstr *allow_ip = urltrans_allow_ip(t);
02407     Octstr *deny_ip = urltrans_deny_ip(t);
02408     
02409         if (is_allowed_ip(allow_ip, deny_ip, client_ip) == 0) {
02410         warning(0, "Non-allowed connect tried by <%s> from <%s>, ignored",
02411             octstr_get_cstr(username), octstr_get_cstr(client_ip));
02412         return NULL;
02413         }
02414     }
02415 
02416     info(0, "sendsms used by <%s>", octstr_get_cstr(username));
02417     return t;
02418 }

Here is the call graph for this function:

int charset_processing Octstr charset,
Octstr text,
int  coding
 

Definition at line 3664 of file smsbox.c.

References charset, charset_convert(), octstr_get_cstr, and octstr_len().

Referenced by smsbox_req_handle(), smsbox_sendsms_post(), and url_result_thread().

03664                                                                    {
03665 
03666     int resultcode = 0;
03667     
03668     if (octstr_len(charset)) {
03669     /* debug("sms.http", 0, "enter charset, coding=%d, msgdata is %s", coding, octstr_get_cstr(body));
03670     octstr_dump(body, 0); */
03671 
03672     if (coding == DC_7BIT) {
03673         /*
03674          * For 7 bit, convert to WINDOWS-1252
03675          */
03676         if (charset_convert(body, octstr_get_cstr(charset), "UTF-8") < 0) {
03677         resultcode = -1;
03678         }
03679     } else if (coding == DC_UCS2) {
03680         /*
03681          * For UCS-2, convert to UTF-16BE
03682          */
03683         if (charset_convert(body, octstr_get_cstr(charset), "UTF-16BE") < 0) {
03684         resultcode = -1;
03685         }
03686     }
03687     
03688     /* debug("sms.http", 0, "exit charset, coding=%d, msgdata is %s", coding, octstr_get_cstr(body));
03689     octstr_dump(body, 0); */
03690     }
03691     
03692     return resultcode;
03693 }

Here is the call graph for this function:

int check_args int  i,
int  argc,
char **  argv
[static]
 

Definition at line 3523 of file smsbox.c.

References only_try_http.

Referenced by main().

03523                                                     {
03524     if (strcmp(argv[i], "-H")==0 || strcmp(argv[i], "--tryhttp")==0) {
03525     only_try_http = 1;
03526     } else
03527     return -1;
03528 
03529     return 0;
03530 } 

URLTranslation* default_authorise_user List list,
Octstr client_ip
[static]
 

Definition at line 2425 of file smsbox.c.

References authorise_username(), and http_cgi_variable().

Referenced by authorise_user().

02426 {
02427     Octstr *pass, *user = NULL;
02428 
02429     if ((user = http_cgi_variable(list, "username")) == NULL)
02430         user = http_cgi_variable(list, "user");
02431 
02432     if ((pass = http_cgi_variable(list, "password")) == NULL)
02433     pass = http_cgi_variable(list, "pass");
02434 
02435     return authorise_username(user, pass, client_ip);
02436 }

Here is the call graph for this function:

void delayed_http_reply Msg msg  )  [static]
 

Definition at line 169 of file smsbox.c.

References ack_buffered, ack_failed, ack_failed_tmp, ack_success, client_dict, debug(), dict_remove(), error(), http_send_reply(), octstr_create, octstr_destroy(), octstr_get_cstr, sendsms_reply_hdrs, UUID_STR_LEN, and uuid_unparse().

Referenced by read_messages_from_bearerbox().

00170 {
00171     HTTPClient *client;
00172     Octstr *os, *answer;
00173     char id[UUID_STR_LEN + 1];
00174     int status;
00175       
00176     uuid_unparse(msg->ack.id, id);
00177     os = octstr_create(id);
00178     debug("sms.http", 0, "Got ACK (%ld) of %s", msg->ack.nack, octstr_get_cstr(os));
00179     client = dict_remove(client_dict, os);
00180     if (client == NULL) {
00181         debug("sms.http", 0, "No client - multi-send or ACK to pull-reply");
00182         octstr_destroy(os);
00183         return;
00184     }
00185     /* XXX  this should be fixed so that we really wait for DLR
00186      *      SMSC accept/deny before doing this - but that is far
00187      *      more slower, a bit more complex, and is done later on
00188      */
00189 
00190     switch (msg->ack.nack) {
00191       case ack_success:
00192         status = HTTP_ACCEPTED;
00193         answer = octstr_create("0: Accepted for delivery");
00194         break;
00195       case ack_buffered:
00196         status = HTTP_ACCEPTED;
00197         answer = octstr_create("3: Queued for later delivery");
00198         break;
00199       case ack_failed:
00200         status = HTTP_FORBIDDEN;
00201         answer = octstr_create("Not routable. Do not try again.");
00202         break;
00203       case ack_failed_tmp:
00204         status = HTTP_SERVICE_UNAVAILABLE;
00205         answer = octstr_create("Temporal failure, try again later.");
00206         break;
00207       default:
00208     error(0, "Strange reply from bearerbox!");
00209         status = HTTP_SERVICE_UNAVAILABLE;
00210         answer = octstr_create("Temporal failure, try again later.");
00211         break;
00212     }
00213 
00214     http_send_reply(client, status, sendsms_reply_hdrs, answer);
00215 
00216     octstr_destroy(answer);
00217     octstr_destroy(os);
00218 }

Here is the call graph for this function:

void fill_message Msg msg,
URLTranslation trans,
Octstr replytext,
int  octet_stream,
Octstr from,
Octstr to,
Octstr udh,
int  mclass,
int  mwi,
int  coding,
int  compress,
int  validity,
int  deferred,
Octstr dlr_url,
int  dlr_mask,
int  pid,
int  alt_dcs,
int  rpi,
Octstr smsc,
Octstr account,
Octstr charset,
Octstr binfo,
int  priority
[static]
 

Definition at line 869 of file smsbox.c.

References O_DESTROY, octstr_destroy(), octstr_get_cstr, octstr_len(), urltrans_accept_x_kannel_headers(), and warning().

Referenced by url_result_thread().

00877 {
00878     msg->sms.msgdata = replytext;
00879     msg->sms.time = time(NULL);
00880 
00881     if (charset)
00882         msg->sms.charset = charset;
00883 
00884     if (dlr_url != NULL) {
00885     if (urltrans_accept_x_kannel_headers(trans)) {
00886         octstr_destroy(msg->sms.dlr_url);
00887         msg->sms.dlr_url = dlr_url;
00888     } else {
00889         warning(0, "Tried to change dlr_url to '%s', denied.",
00890             octstr_get_cstr(dlr_url));
00891         octstr_destroy(dlr_url);
00892     }
00893     }
00894 
00895     if (smsc != NULL) {
00896     if (urltrans_accept_x_kannel_headers(trans)) {
00897         octstr_destroy(msg->sms.smsc_id);
00898         msg->sms.smsc_id = smsc;
00899     } else {
00900         warning(0, "Tried to change SMSC to '%s', denied.",
00901             octstr_get_cstr(smsc));
00902         octstr_destroy(smsc);
00903     }
00904     }
00905 
00906     if (from != NULL) {
00907     if (urltrans_accept_x_kannel_headers(trans)) {
00908         octstr_destroy(msg->sms.sender);
00909         msg->sms.sender = from;
00910     } else {
00911         warning(0, "Tried to change sender to '%s', denied.",
00912             octstr_get_cstr(from));
00913         octstr_destroy(from);
00914     }
00915     }
00916     if (to != NULL) {
00917     if (urltrans_accept_x_kannel_headers(trans)) {
00918         octstr_destroy(msg->sms.receiver);
00919         msg->sms.receiver = to;
00920     } else {
00921         warning(0, "Tried to change receiver to '%s', denied.",
00922             octstr_get_cstr(to));
00923         octstr_destroy(to);
00924     }
00925     }
00926     if (udh != NULL) {
00927     if (urltrans_accept_x_kannel_headers(trans)) {
00928         octstr_destroy(msg->sms.udhdata);
00929         msg->sms.udhdata = udh;
00930     } else {
00931         warning(0, "Tried to set UDH field, denied.");
00932         O_DESTROY(udh);
00933     }
00934     }
00935     if (mclass != SMS_PARAM_UNDEFINED) {
00936         if (urltrans_accept_x_kannel_headers(trans))
00937         msg->sms.mclass = mclass;
00938     else
00939         warning(0, "Tried to set MClass field, denied.");
00940     }
00941     if (pid != SMS_PARAM_UNDEFINED) {
00942         if (urltrans_accept_x_kannel_headers(trans))
00943         msg->sms.pid = pid;
00944     else
00945         warning(0, "Tried to set PID field, denied.");
00946     }
00947     if (rpi != SMS_PARAM_UNDEFINED) {
00948         if (urltrans_accept_x_kannel_headers(trans))
00949         msg->sms.rpi = rpi;
00950     else
00951         warning(0, "Tried to set RPI field, denied.");
00952     }
00953     if (alt_dcs != SMS_PARAM_UNDEFINED) {
00954         if (urltrans_accept_x_kannel_headers(trans))
00955         msg->sms.alt_dcs = alt_dcs;
00956     else
00957         warning(0, "Tried to set Alt-DCS field, denied.");
00958     }
00959     if (mwi != SMS_PARAM_UNDEFINED) {
00960         if (urltrans_accept_x_kannel_headers(trans))
00961         msg->sms.mwi = mwi;
00962     else
00963         warning(0, "Tried to set MWI field, denied.");
00964     }
00965     if (coding != SMS_PARAM_UNDEFINED) {
00966         if (urltrans_accept_x_kannel_headers(trans))
00967         msg->sms.coding = coding;
00968     else
00969         warning(0, "Tried to set Coding field, denied.");
00970     }
00971     if (compress != SMS_PARAM_UNDEFINED) {
00972         if (urltrans_accept_x_kannel_headers(trans))
00973         msg->sms.compress = compress;
00974     else
00975         warning(0, "Tried to set Compress field, denied.");
00976     }
00977     /* Compatibility Mode */
00978     if ( msg->sms.coding == DC_UNDEF) {
00979     if(octstr_len(udh))
00980       msg->sms.coding = DC_8BIT;
00981     else
00982       msg->sms.coding = DC_7BIT;
00983     }
00984 
00985     if (validity != SMS_PARAM_UNDEFINED) {
00986     if (urltrans_accept_x_kannel_headers(trans))
00987         msg->sms.validity = validity;
00988     else
00989         warning(0, "Tried to change validity to '%d', denied.",
00990             validity);
00991     }
00992     if (deferred != SMS_PARAM_UNDEFINED) {
00993     if (urltrans_accept_x_kannel_headers(trans))
00994         msg->sms.deferred = deferred;
00995     else
00996         warning(0, "Tried to change deferred to '%d', denied.",
00997             deferred);
00998     }
00999 
01000     if (dlr_mask != SMS_PARAM_UNDEFINED) {
01001     if (urltrans_accept_x_kannel_headers(trans)) {
01002         msg->sms.dlr_mask = dlr_mask;
01003     } else
01004         warning(0, "Tried to change dlr_mask to '%d', denied.",
01005             dlr_mask);
01006     }
01007 
01008     if (account) {
01009         if (urltrans_accept_x_kannel_headers(trans)) {
01010             msg->sms.account = account;
01011         } else {
01012             warning(0, "Tried to change account to '%s', denied.",
01013                     octstr_get_cstr(account));
01014             octstr_destroy(account);
01015         }
01016     }
01017 
01018     if (binfo) {
01019         if (urltrans_accept_x_kannel_headers(trans)) {
01020             msg->sms.binfo = binfo;
01021         } else {
01022             warning(0, "Tried to change billing info to '%s', denied.",
01023                     octstr_get_cstr(binfo));
01024             octstr_destroy(binfo);
01025         }
01026     }
01027 
01028     if (priority != SMS_PARAM_UNDEFINED) {
01029         if (urltrans_accept_x_kannel_headers(trans))
01030             msg->sms.priority = priority;
01031         else
01032             warning(0, "Tried to change priority to '%d', denied.", priority);
01033     }
01034 }

Here is the call graph for this function:

void get_receiver void *  id,
Msg **  msg,
URLTranslation **  trans,
int *  method,
Octstr **  url,
List **  headers,
Octstr **  body,
unsigned long *  retries
[static]
 

Definition at line 452 of file smsbox.c.

References receiver::body, counter_decrease(), receiver::http_headers, receiver::method, receiver::msg, num_outstanding_requests, receiver::retries, receiver::trans, and receiver::url.

Referenced by http_queue_thread(), and url_result_thread().

00455 {
00456     struct receiver *receiver;
00457 
00458     receiver = id;
00459     *msg = receiver->msg;
00460     *trans = receiver->trans;
00461     *method = receiver->method;
00462     *url = receiver->url;
00463     *headers = receiver->http_headers;
00464     *body = receiver->body;
00465     *retries = receiver->retries;
00466     gw_free(receiver);
00467     counter_decrease(num_outstanding_requests);
00468 }

Here is the call graph for this function:

long get_tag Octstr body,
Octstr tag,
Octstr **  value,
long  pos,
int  nostrip
[static]
 

Definition at line 604 of file smsbox.c.

References debug(), octstr_append(), octstr_copy, octstr_create, octstr_destroy(), octstr_get_cstr, octstr_imm(), octstr_len(), octstr_search(), and octstr_strip_blanks().

Referenced by get_x_kannel_from_xml().

00604                                                                                       {
00605     long start, end;
00606     int taglen;
00607     Octstr *tmp;
00608 
00609     tmp = octstr_create("<");
00610     octstr_append(tmp, tag);
00611     octstr_append(tmp, octstr_imm(">"));
00612     taglen = octstr_len(tmp);
00613 
00614     start = octstr_search(body, tmp, pos);
00615     octstr_destroy(tmp);
00616     if(start != -1) {
00617     tmp = octstr_create("</");
00618     octstr_append(tmp, tag);
00619     octstr_append(tmp, octstr_imm(">"));
00620 
00621     end = octstr_search(body, tmp, start);
00622     octstr_destroy(tmp);
00623     if(end != -1) {
00624         octstr_destroy(*value);
00625         *value = octstr_copy(body, start + taglen, end - start - taglen);
00626         if(nostrip == 0) {
00627         octstr_strip_blanks(*value);
00628         debug("sms", 0, "XMLParsing: tag <%s> value <%s>", octstr_get_cstr(tag),
00629             octstr_get_cstr(*value));
00630         }
00631         return end + taglen + 1;
00632     } else {
00633         debug("sms", 0, "XMLParsing: end tag </%s> not found", octstr_get_cstr(tag));
00634         return -1;
00635     }
00636     } else {
00637     /* debug("sms", 0, "XMLParsing: tag <%s> not found", octstr_get_cstr(tag)); */
00638     return -1;
00639     }
00640 }

Here is the call graph for this function:

void get_x_kannel_from_headers List headers,
Octstr **  from,
Octstr **  to,
Octstr **  udh,
Octstr **  user,
Octstr **  pass,
Octstr **  smsc,
int *  mclass,
int *  mwi,
int *  coding,
int *  compress,
int *  validity,
int *  deferred,
int *  dlr_mask,
Octstr **  dlr_url,
Octstr **  account,
int *  pid,
int *  alt_dcs,
int *  rpi,
Octstr **  binfo,
int *  priority
[static]
 

Definition at line 501 of file smsbox.c.

References gwlist_len(), http_header_get(), name, octstr_case_compare(), octstr_destroy(), octstr_duplicate, octstr_get_cstr, octstr_hex_to_binary(), octstr_imm(), octstr_strip_blanks(), octstr_url_decode(), and warning().

Referenced by smsbox_sendsms_post(), and url_result_thread().

00510 {
00511     Octstr *name, *val;
00512     long l;
00513 
00514     for(l=0; l<gwlist_len(headers); l++) {
00515     http_header_get(headers, l, &name, &val);
00516 
00517     if (octstr_case_compare(name, octstr_imm("X-Kannel-From")) == 0) {
00518         *from = octstr_duplicate(val);
00519         octstr_strip_blanks(*from);
00520     }
00521     else if (octstr_case_compare(name, octstr_imm("X-Kannel-To")) == 0) {
00522         *to = octstr_duplicate(val);
00523         octstr_strip_blanks(*to);
00524     }
00525     else if (octstr_case_compare(name, octstr_imm("X-Kannel-Username")) == 0) {
00526         if (user != NULL) {
00527         *user = octstr_duplicate(val);
00528         octstr_strip_blanks(*user);
00529         }
00530     }
00531     else if (octstr_case_compare(name, octstr_imm("X-Kannel-Password")) == 0) {
00532         if (pass != NULL) {
00533         *pass = octstr_duplicate(val);
00534         octstr_strip_blanks(*pass);
00535         }
00536     }
00537     else if (octstr_case_compare(name, octstr_imm("X-Kannel-SMSC")) == 0) {
00538         if (smsc != NULL) {
00539         *smsc = octstr_duplicate(val);
00540         octstr_strip_blanks(*smsc);
00541         }
00542     }
00543     else if (octstr_case_compare(name, octstr_imm("X-Kannel-UDH")) == 0) {
00544         *udh = octstr_duplicate(val);
00545         octstr_strip_blanks(*udh);
00546         if (octstr_hex_to_binary(*udh) == -1) {
00547         if (octstr_url_decode(*udh) == -1) {
00548             warning(0, "Invalid UDH received in X-Kannel-UDH");
00549             octstr_destroy(*udh);
00550             *udh = NULL;
00551         }
00552         }
00553     }
00554     else if (octstr_case_compare(name, octstr_imm("X-Kannel-DLR-URL")) == 0) {
00555         *dlr_url = octstr_duplicate(val);
00556         octstr_strip_blanks(*dlr_url);
00557     }
00558     else if (octstr_case_compare(name, octstr_imm("X-Kannel-Account")) == 0) {
00559         *account = octstr_duplicate(val);
00560         octstr_strip_blanks(*account);
00561     }
00562     else if (octstr_case_compare(name, octstr_imm("X-Kannel-BInfo")) == 0) {
00563             *binfo = octstr_duplicate(val);
00564             octstr_strip_blanks(*binfo);
00565     }
00566     else if (octstr_case_compare(name, octstr_imm("X-Kannel-Coding")) == 0) {
00567             sscanf(octstr_get_cstr(val),"%d", coding);
00568     }
00569     else if (octstr_case_compare(name, octstr_imm("X-Kannel-PID")) == 0) {
00570             sscanf(octstr_get_cstr(val),"%d", pid);
00571     }
00572     else if (octstr_case_compare(name, octstr_imm("X-Kannel-MWI")) == 0) {
00573             sscanf(octstr_get_cstr(val),"%d", mwi);
00574         }
00575     else if (octstr_case_compare(name, octstr_imm("X-Kannel-MClass")) == 0) {
00576             sscanf(octstr_get_cstr(val),"%d", mclass);
00577         }
00578     else if (octstr_case_compare(name, octstr_imm("X-Kannel-Alt-DCS")) == 0) {
00579             sscanf(octstr_get_cstr(val),"%d", alt_dcs);
00580         }
00581     else if (octstr_case_compare(name, octstr_imm("X-Kannel-Compress")) == 0) {
00582             sscanf(octstr_get_cstr(val),"%d", compress);
00583         }
00584     else if (octstr_case_compare(name, octstr_imm("X-Kannel-Validity")) == 0) {
00585             sscanf(octstr_get_cstr(val),"%d", validity);
00586     }
00587     else if (octstr_case_compare(name, octstr_imm("X-Kannel-Deferred")) == 0) {
00588             sscanf(octstr_get_cstr(val),"%d", deferred);
00589     }
00590     else if (octstr_case_compare(name, octstr_imm("X-Kannel-DLR-Mask")) == 0) {
00591             sscanf(octstr_get_cstr(val),"%d", dlr_mask);
00592     }
00593     else if (octstr_case_compare(name, octstr_imm("X-Kannel-RPI")) == 0) {
00594             sscanf(octstr_get_cstr(val),"%d", rpi);
00595     }
00596     else if (octstr_case_compare(name, octstr_imm("X-Kannel-Priority")) == 0) {
00597             sscanf(octstr_get_cstr(val),"%d", priority);
00598     }
00599     octstr_destroy(name);
00600     octstr_destroy(val);
00601     }
00602 }

Here is the call graph for this function:

void get_x_kannel_from_xml int  requesttype,
Octstr **  type,
Octstr **  body,
List headers,
Octstr **  from,
Octstr **  to,
Octstr **  udh,
Octstr **  user,
Octstr **  pass,
Octstr **  smsc,
int *  mclass,
int *  mwi,
int *  coding,
int *  compress,
int *  validity,
int *  deferred,
int *  dlr_mask,
Octstr **  dlr_url,
Octstr **  account,
int *  pid,
int *  alt_dcs,
int *  rpi,
List **  tolist,
Octstr **  charset,
Octstr **  binfo,
int *  priority
[static]
 

Definition at line 645 of file smsbox.c.

References charset, debug(), find_charset_encoding(), get_tag(), gwlist_append(), gwlist_create, O_DESTROY, octstr_create, octstr_duplicate, octstr_get_cstr, octstr_hex_to_binary(), octstr_imm(), octstr_parse_long(), octstr_url_decode(), text, and type.

Referenced by smsbox_sendsms_post(), and url_result_thread().

00656 {                                    
00657 
00658     Octstr *text, *tmp, *tmp2;
00659     long tmplong, where;
00660     
00661     tmp = tmp2 = text = NULL;
00662 
00663     debug("sms", 0, "XMLParsing: XML: <%s>", octstr_get_cstr(*body));
00664 
00665     /* auth */
00666     get_tag(*body, octstr_imm("from"), &tmp, 0, 0);
00667     if(tmp) {
00668     if(requesttype == mt_push) {
00669         /* user */
00670         get_tag(tmp, octstr_imm("user"), user, 0, 0);
00671         get_tag(tmp, octstr_imm("username"), user, 0, 0);
00672 
00673         /* pass */
00674         get_tag(tmp, octstr_imm("pass"), pass, 0, 0);
00675         get_tag(tmp, octstr_imm("password"), pass, 0, 0);
00676     }
00677 
00678     /* account */
00679     get_tag(tmp, octstr_imm("account"), account, 0, 0);
00680 
00681     /* binfo */
00682     get_tag(tmp, octstr_imm("binfo"), binfo, 0, 0);
00683 
00684     O_DESTROY(tmp);
00685     }
00686 
00687     get_tag(*body, octstr_imm("oa"), &tmp, 0, 0);
00688     if(tmp) {
00689        /* sender address */
00690         get_tag(tmp, octstr_imm("number"), from, 0, 0);
00691         O_DESTROY(tmp);
00692     }
00693 
00694     if(requesttype == mt_push) {
00695     /* to (da/number) Multiple tags */ 
00696     *tolist = gwlist_create();
00697     where = get_tag(*body, octstr_imm("da"), &tmp, 0, 0);
00698     if(tmp) {
00699         get_tag(tmp, octstr_imm("number"), to, 0, 0);
00700         gwlist_append(*tolist, octstr_duplicate(*to));
00701         O_DESTROY(*to);
00702 
00703         while(tmp && where != -1) {
00704         O_DESTROY(tmp);
00705         where = get_tag(*body, octstr_imm("da"), &tmp, where, 0);
00706         if(tmp) {
00707             get_tag(tmp, octstr_imm("number"), &tmp2, 0, 0);
00708             if(tmp2 != NULL) {
00709             gwlist_append(*tolist, octstr_duplicate(tmp2));
00710             O_DESTROY(tmp2);
00711             }
00712         }
00713         }
00714     }
00715     }
00716 
00717     /* udh */
00718     get_tag(*body, octstr_imm("udh"), &tmp, 0, 0);
00719     if(tmp) {
00720     O_DESTROY(*udh);
00721     *udh = octstr_duplicate(tmp);
00722     if(octstr_hex_to_binary(*udh) == -1)
00723         octstr_url_decode(*udh);
00724     O_DESTROY(tmp);
00725     }
00726 
00727     /* smsc */
00728     get_tag(*body, octstr_imm("to"), &tmp, 0, 0);
00729     if(tmp) {
00730         O_DESTROY(*smsc);
00731         *smsc = tmp;
00732         tmp = NULL;
00733     }
00734 
00735     /* pid */
00736     get_tag(*body, octstr_imm("pid"), &tmp, 0, 0);
00737     if(tmp) {
00738     if(octstr_parse_long(&tmplong, tmp, 0, 10) != -1)
00739         *pid = tmplong;
00740     O_DESTROY(tmp);
00741     }
00742 
00743     /* rpi */
00744     get_tag(*body, octstr_imm("rpi"), &tmp, 0, 0);
00745     if(tmp) {
00746     if(octstr_parse_long(&tmplong, tmp, 0, 10) != -1)
00747         *rpi = tmplong;
00748     O_DESTROY(tmp);
00749     }
00750 
00751     /* dcs* (dcs/ *) */
00752     get_tag(*body, octstr_imm("dcs"), &tmp, 0, 0);
00753     if(tmp) {
00754     /* mclass (dcs/mclass) */
00755     get_tag(tmp, octstr_imm("mclass"), &tmp2, 0, 0);
00756     if(tmp2) {
00757         if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1)
00758         *mclass = tmplong;
00759         O_DESTROY(tmp2);
00760     }
00761     /* mwi (dcs/mwi) */
00762     get_tag(tmp, octstr_imm("mwi"), &tmp2, 0, 0);
00763     if(tmp2) {
00764         if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1)
00765         *mwi = tmplong;
00766         O_DESTROY(tmp2);
00767     }
00768     /* coding (dcs/coding) */
00769     get_tag(tmp, octstr_imm("coding"), &tmp2, 0, 0);
00770     if(tmp2) {
00771         if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1)
00772         *coding = tmplong;
00773         O_DESTROY(tmp2);
00774     }
00775     /* compress (dcs/compress) */
00776     get_tag(tmp, octstr_imm("compress"), &tmp2, 0, 0);
00777     if(tmp2) {
00778         if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1)
00779         *compress = tmplong;
00780         O_DESTROY(tmp2);
00781     }
00782     /* alt-dcs (dcs/alt-dcs) */
00783     get_tag(tmp, octstr_imm("alt-dcs"), &tmp2, 0, 0);
00784     if(tmp2) {
00785         if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1)
00786         *alt_dcs = tmplong;
00787         O_DESTROY(tmp2);
00788     }
00789     O_DESTROY(tmp);
00790     }
00791 
00792     /* statusrequest* (statusrequest/ *) */
00793     get_tag(*body, octstr_imm("statusrequest"), &tmp, 0, 0);
00794     if(tmp) {
00795     /* dlr-mask (statusrequest/dlr-mask) */
00796     get_tag(tmp, octstr_imm("dlr-mask"), &tmp2, 0, 0);
00797     if(tmp2) {
00798         if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1)
00799         *dlr_mask = tmplong;
00800         O_DESTROY(tmp2);
00801     }
00802     get_tag(tmp, octstr_imm("dlr-url"), dlr_url, 0, 0);
00803     O_DESTROY(tmp);
00804     }
00805 
00806     /* validity (vp/delay) */
00807     get_tag(*body, octstr_imm("vp"), &tmp, 0, 0);
00808     if(tmp) {
00809     get_tag(tmp, octstr_imm("delay"), &tmp2, 0, 0);
00810     if(tmp2) {
00811         if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1)
00812         *validity = tmplong;
00813         O_DESTROY(tmp2);
00814     }
00815     O_DESTROY(tmp);
00816     }
00817 
00818     /* deferred (timing/delay) */
00819     get_tag(*body, octstr_imm("timing"), &tmp, 0, 0);
00820     if(tmp) {
00821     get_tag(tmp, octstr_imm("delay"), &tmp2, 0, 0);
00822     if(tmp2) {
00823         if(octstr_parse_long(&tmplong, tmp2, 0, 10) != -1)
00824         *deferred = tmplong;
00825         O_DESTROY(tmp2);
00826     }
00827     O_DESTROY(tmp);
00828     }
00829 
00830     /* priority */
00831     get_tag(*body, octstr_imm("priority"), &tmp, 0, 0);
00832     if(tmp) {
00833     if(octstr_parse_long(&tmplong, tmp, 0, 10) != -1)
00834         *priority = tmplong;
00835     O_DESTROY(tmp);
00836     }
00837     
00838     /* charset from <?xml...encoding=?> */
00839     tmp = find_charset_encoding(*body);
00840     O_DESTROY(*charset);
00841     if(tmp) {
00842     *charset = octstr_duplicate(tmp);
00843     O_DESTROY(tmp);
00844     } else {
00845     *charset = octstr_create("UTF-8");
00846     }
00847 
00848     /* text */
00849     text = NULL;
00850     get_tag(*body, octstr_imm("ud"), &tmp, 0, 0);
00851     if(tmp) {
00852     O_DESTROY(text);
00853     text = octstr_duplicate(tmp);
00854     if(octstr_hex_to_binary(text) == -1)
00855         octstr_url_decode(text);
00856     O_DESTROY(tmp);
00857     }
00858 
00859     if(text)
00860     *body = text;
00861     else
00862     *body = octstr_create("");
00863 
00864     O_DESTROY(*type);
00865     *type = octstr_create("text/plain");
00866 }

Here is the call graph for this function:

void http_queue_thread void *  arg  )  [static]
 

Definition at line 1044 of file smsbox.c.

References caller, debug(), get_receiver(), gwlist_consume(), gwlist_len(), gwthread_sleep(), http_destroy_headers(), http_queue_delay, http_start_request(), max_http_retries, msg_destroy(), octstr_destroy(), octstr_get_cstr, remember_receiver(), and smsbox_http_requests.

Referenced by main().

01045 {
01046     void *id;
01047     Msg *msg;
01048     URLTranslation *trans;
01049     Octstr *req_url;
01050     List *req_headers;
01051     Octstr *req_body;
01052     unsigned long retries;
01053     int method;
01054 
01055     while ((id = gwlist_consume(smsbox_http_requests)) != NULL) {
01056         /*
01057          * Sleep for a while in order not to block other operting requests.
01058          * Defaults to 10 sec. if not given via http-queue-delay directive in
01059          * smsbox group.
01060          */
01061         if (http_queue_delay > 0)
01062             gwthread_sleep(http_queue_delay);
01063 
01064         debug("sms.http",0,"HTTP: Queue contains %ld outstanding requests",
01065               gwlist_len(smsbox_http_requests));
01066 
01067         /*
01068          * Get all required HTTP request data from the queue and reconstruct
01069          * the id pointer for later lookup in url_result_thread.
01070          */
01071         get_receiver(id, &msg, &trans, &method, &req_url, &req_headers, &req_body, &retries);
01072 
01073         if (retries < max_http_retries) {
01074             id = remember_receiver(msg, trans, method, req_url, req_headers, req_body, ++retries);
01075 
01076             debug("sms.http",0,"HTTP: Retrying request <%s> (%ld/%ld)",
01077                   octstr_get_cstr(req_url), retries, max_http_retries);
01078 
01079             /* re-queue this request to the HTTPCaller list */
01080             http_start_request(caller, method, req_url, req_headers, req_body,
01081                                1, id, NULL);
01082         }
01083 
01084         msg_destroy(msg);
01085         octstr_destroy(req_url);
01086         http_destroy_headers(req_headers);
01087         octstr_destroy(req_body);
01088     }
01089 }

Here is the call graph for this function:

void identify_to_bearerbox void   )  [static]
 

Definition at line 156 of file smsbox.c.

References admin, msg_create, octstr_duplicate, smsbox_id, and write_to_bearerbox().

Referenced by main().

00157 {
00158     Msg *msg;
00159 
00160     msg = msg_create(admin);
00161     msg->admin.command = cmd_identify;
00162     msg->admin.boxc_id = octstr_duplicate(smsbox_id);
00163     write_to_bearerbox(msg);
00164 }

Here is the call graph for this function:

Cfg* init_smsbox Cfg cfg  )  [static]
 

Definition at line 3294 of file smsbox.c.

References accepted_chars, alog_open(), BB_DEFAULT_HOST, bb_host, bb_port, bb_ssl, black_list, black_list_regex, cfg, cfg_get, cfg_get_bool(), cfg_get_integer(), cfg_get_list(), cfg_get_single_group(), conn_config_ssl(), error(), global_sender, GW_NON_EXCL, gwlist_destroy(), gwthread_create, http_open_port_if(), http_queue_delay, http_use_proxy(), immediate_sendsms_reply, info(), log_open(), m, max_http_retries, max_pending_requests, mo_recode, numhash_create(), octstr_case_compare(), octstr_create, octstr_destroy(), octstr_destroy_item(), octstr_get_cstr, octstr_imm(), panic, ppg_service_name, reply_couldnotfetch, reply_couldnotrepresent, reply_emptymessage, reply_requestfailed, semaphore_create(), sendota_url, sendsms_interface, sendsms_number_chars, sendsms_port, sendsms_thread(), sendsms_url, sms_max_length, smsbox_id, ssl, white_list, white_list_regex, and xmlrpc_url.

Referenced by main().

03295 {
03296     CfgGroup *grp;
03297     Octstr *logfile;
03298     Octstr *p;
03299     long lvl;
03300     Octstr *http_proxy_host = NULL;
03301     long http_proxy_port = -1;
03302     int http_proxy_ssl = 0;
03303     List *http_proxy_exceptions = NULL;
03304     Octstr *http_proxy_username = NULL;
03305     Octstr *http_proxy_password = NULL;
03306     Octstr *http_proxy_exceptions_regex = NULL;
03307     int ssl = 0;
03308     int lf, m;
03309     long max_req;
03310 
03311     bb_port = BB_DEFAULT_SMSBOX_PORT;
03312     bb_ssl = 0;
03313     bb_host = octstr_create(BB_DEFAULT_HOST);
03314     logfile = NULL;
03315     lvl = 0;
03316     lf = m = 1;
03317 
03318     /*
03319      * first we take the port number in bearerbox and other values from the
03320      * core group in configuration file
03321      */
03322 
03323     grp = cfg_get_single_group(cfg, octstr_imm("core"));
03324     
03325     cfg_get_integer(&bb_port, grp, octstr_imm("smsbox-port"));
03326 #ifdef HAVE_LIBSSL
03327     cfg_get_bool(&bb_ssl, grp, octstr_imm("smsbox-port-ssl"));
03328 #endif /* HAVE_LIBSSL */
03329 
03330     cfg_get_integer(&http_proxy_port, grp, octstr_imm("http-proxy-port"));
03331 #ifdef HAVE_LIBSSL
03332     cfg_get_bool(&http_proxy_ssl, grp, octstr_imm("http-proxy-ssl"));
03333 #endif /* HAVE_LIBSSL */
03334 
03335     http_proxy_host = cfg_get(grp, 
03336                         octstr_imm("http-proxy-host"));
03337     http_proxy_username = cfg_get(grp, 
03338                             octstr_imm("http-proxy-username"));
03339     http_proxy_password = cfg_get(grp, 
03340                             octstr_imm("http-proxy-password"));
03341     http_proxy_exceptions = cfg_get_list(grp,
03342                             octstr_imm("http-proxy-exceptions"));
03343     http_proxy_exceptions_regex = cfg_get(grp,
03344                             octstr_imm("http-proxy-exceptions-regex"));
03345 
03346 #ifdef HAVE_LIBSSL
03347     conn_config_ssl(grp);
03348 #endif 
03349     
03350     /*
03351      * get the remaining values from the smsbox group
03352      */
03353     grp = cfg_get_single_group(cfg, octstr_imm("smsbox"));
03354     if (grp == NULL)
03355     panic(0, "No 'smsbox' group in configuration");
03356 
03357     smsbox_id = cfg_get(grp, octstr_imm("smsbox-id"));
03358 
03359     p = cfg_get(grp, octstr_imm("bearerbox-host"));
03360     if (p != NULL) {
03361     octstr_destroy(bb_host);
03362     bb_host = p;
03363     }
03364     cfg_get_integer(&bb_port, grp, octstr_imm("bearerbox-port"));
03365 #ifdef HAVE_LIBSSL
03366     if (cfg_get_bool(&ssl, grp, octstr_imm("bearerbox-port-ssl")) != -1)
03367         bb_ssl = ssl;
03368 #endif /* HAVE_LIBSSL */
03369 
03370     cfg_get_bool(&mo_recode, grp, octstr_imm("mo-recode"));
03371     if(mo_recode < 0)
03372     mo_recode = 0;
03373 
03374     reply_couldnotfetch= cfg_get(grp, octstr_imm("reply-couldnotfetch"));
03375     if (reply_couldnotfetch == NULL)
03376     reply_couldnotfetch = octstr_create("Could not fetch content, sorry.");
03377 
03378     reply_couldnotrepresent= cfg_get(grp, octstr_imm("reply-couldnotfetch"));
03379     if (reply_couldnotrepresent == NULL)
03380     reply_couldnotrepresent = octstr_create("Result could not be represented "
03381                             "as an SMS message.");
03382     reply_requestfailed= cfg_get(grp, octstr_imm("reply-requestfailed"));
03383     if (reply_requestfailed == NULL)
03384     reply_requestfailed = octstr_create("Request Failed");
03385 
03386     reply_emptymessage= cfg_get(grp, octstr_imm("reply-emptymessage"));
03387     if (reply_emptymessage == NULL)
03388     reply_emptymessage = octstr_create("<Empty reply from service provider>");
03389 
03390     {   
03391     Octstr *os;
03392     os = cfg_get(grp, octstr_imm("white-list"));
03393     if (os != NULL) {
03394         white_list = numhash_create(octstr_get_cstr(os));
03395         octstr_destroy(os);
03396     }
03397 
03398     os = cfg_get(grp, octstr_imm("white-list-regex"));
03399     if (os != NULL) {
03400         if ((white_list_regex = gw_regex_comp(os, REG_EXTENDED)) == NULL)
03401                         panic(0, "Could not compile pattern '%s'", octstr_get_cstr(os));
03402         octstr_destroy(os);
03403     }
03404 
03405     os = cfg_get(grp, octstr_imm("black-list"));
03406     if (os != NULL) {
03407         black_list = numhash_create(octstr_get_cstr(os));
03408         octstr_destroy(os);
03409     }
03410     os = cfg_get(grp, octstr_imm("black-list-regex"));
03411     if (os != NULL) {
03412         if ((black_list_regex = gw_regex_comp(os, REG_EXTENDED)) == NULL)
03413                         panic(0, "Could not compile pattern '%s'", octstr_get_cstr(os));
03414         octstr_destroy(os);
03415     }
03416     }
03417 
03418     cfg_get_integer(&sendsms_port, grp, octstr_imm("sendsms-port"));
03419     
03420     /* check if want to bind to a specific interface */
03421     sendsms_interface = cfg_get(grp, octstr_imm("sendsms-interface"));    
03422 
03423     cfg_get_integer(&sms_max_length, grp, octstr_imm("sms-length"));
03424 
03425 #ifdef HAVE_LIBSSL
03426     cfg_get_bool(&ssl, grp, octstr_imm("sendsms-port-ssl"));
03427 #endif /* HAVE_LIBSSL */
03428 
03429     /*
03430      * load the configuration settings for the sendsms and sendota URIs
03431      * else assume the default URIs, st.
03432      */
03433     if ((sendsms_url = cfg_get(grp, octstr_imm("sendsms-url"))) == NULL)
03434         sendsms_url = octstr_imm("/cgi-bin/sendsms");
03435     if ((xmlrpc_url = cfg_get(grp, octstr_imm("xmlrpc-url"))) == NULL)
03436         xmlrpc_url = octstr_imm("/cgi-bin/xmlrpc");
03437     if ((sendota_url = cfg_get(grp, octstr_imm("sendota-url"))) == NULL)
03438         sendota_url = octstr_imm("/cgi-bin/sendota");
03439 
03440     global_sender = cfg_get(grp, octstr_imm("global-sender"));
03441     accepted_chars = cfg_get(grp, octstr_imm("sendsms-chars"));
03442     sendsms_number_chars = accepted_chars ? 
03443         octstr_get_cstr(accepted_chars) : SENDSMS_DEFAULT_CHARS;
03444     logfile = cfg_get(grp, octstr_imm("log-file"));
03445 
03446     cfg_get_integer(&lvl, grp, octstr_imm("log-level"));
03447 
03448     if (logfile != NULL) {
03449     info(0, "Starting to log to file %s level %ld", 
03450          octstr_get_cstr(logfile), lvl);
03451     log_open(octstr_get_cstr(logfile), lvl, GW_NON_EXCL);
03452     octstr_destroy(logfile);
03453     }
03454     if (global_sender != NULL) {
03455     info(0, "Service global sender set as '%s'", 
03456          octstr_get_cstr(global_sender));
03457     }
03458     
03459     /* should smsbox reply to sendsms immediate or wait for bearerbox ack */
03460     cfg_get_bool(&immediate_sendsms_reply, grp, octstr_imm("immediate-sendsms-reply"));
03461 
03462     /* determine which timezone we use for access logging */
03463     if ((p = cfg_get(grp, octstr_imm("access-log-time"))) != NULL) {
03464         lf = (octstr_case_compare(p, octstr_imm("gmt")) == 0) ? 0 : 1;
03465         octstr_destroy(p);
03466     }
03467 
03468     /* should predefined markers be used, ie. prefixing timestamp */
03469     cfg_get_bool(&m, grp, octstr_imm("access-log-clean"));
03470 
03471     /* open access-log file */
03472     if ((p = cfg_get(grp, octstr_imm("access-log"))) != NULL) {
03473         info(0, "Logging accesses to '%s'.", octstr_get_cstr(p));
03474         alog_open(octstr_get_cstr(p), lf, m ? 0 : 1);
03475         octstr_destroy(p);
03476     }
03477 
03478     /* HTTP queueing values */
03479     cfg_get_integer(&max_http_retries, grp, octstr_imm("http-request-retry"));
03480     cfg_get_integer(&http_queue_delay, grp, octstr_imm("http-queue-delay"));
03481 
03482     if (sendsms_port > 0) {
03483         if (http_open_port_if(sendsms_port, ssl, sendsms_interface) == -1) {    
03484             if (only_try_http)
03485                 error(0, "Failed to open HTTP socket, ignoring it");
03486             else
03487                 panic(0, "Failed to open HTTP socket");
03488         } else {
03489             info(0, "Set up send sms service at port %ld", sendsms_port);
03490             gwthread_create(sendsms_thread, NULL);
03491         }
03492     }
03493 
03494     /* set maximum allowed MO/DLR requests in parallel */
03495     if (cfg_get_integer(&max_req, grp, octstr_imm("max-pending-requests")) == -1)
03496         max_req = HTTP_MAX_PENDING; 
03497     max_pending_requests = semaphore_create(max_req);
03498 
03499     /*
03500      * Reading the name we are using for ppg services from ppg core group
03501      */
03502     if ((grp = cfg_get_single_group(cfg, octstr_imm("ppg"))) != NULL) {
03503         if ((ppg_service_name = cfg_get(grp, octstr_imm("service-name"))) == NULL)
03504             ppg_service_name = octstr_create("ppg");
03505     }
03506 
03507     if (http_proxy_host != NULL && http_proxy_port > 0) {
03508         http_use_proxy(http_proxy_host, http_proxy_port, http_proxy_ssl,
03509                http_proxy_exceptions, http_proxy_username,
03510                        http_proxy_password, http_proxy_exceptions_regex);
03511     }
03512 
03513     octstr_destroy(http_proxy_host);
03514     octstr_destroy(http_proxy_username);
03515     octstr_destroy(http_proxy_password);
03516     octstr_destroy(http_proxy_exceptions_regex);
03517     gwlist_destroy(http_proxy_exceptions, octstr_destroy_item);
03518 
03519     return cfg;
03520 }

Here is the call graph for this function:

int main int  argc,
char **  argv
 

Definition at line 3533 of file smsbox.c.

References accepted_chars, ALL_HEARTBEATS, alog_close(), bb_host, bb_port, bb_ssl, black_list, black_list_regex, caller, catenated_sms_counter, cfg, cfg_create(), cfg_destroy(), cfg_read(), check_args(), client_dict, close_connection_to_bearerbox(), connect_to_bearerbox(), counter_create(), counter_destroy(), debug(), dict_create(), dict_destroy(), filename, get_and_set_debugs(), global_sender, gw_assert, GW_NAME, gw_regex_destroy(), GW_VERSION, gwlib_init(), gwlib_shutdown(), gwlist_add_producer(), gwlist_create, gwlist_destroy(), gwlist_len(), gwlist_remove_producer(), gwthread_create, gwthread_join_every(), gwthread_sleep(), heartbeat_start(), heartbeat_stop(), http_caller_create(), http_caller_destroy(), http_caller_signal_shutdown(), http_close_all_ports(), http_create_empty_headers(), http_destroy_headers(), http_header_add(), http_queue_delay, http_queue_thread(), identify_to_bearerbox(), info(), init_smsbox(), max_http_retries, max_pending_requests, num_outstanding_requests, numhash_destroy(), obey_request_thread(), octstr_create, octstr_destroy(), octstr_get_cstr, outstanding_requests(), panic, ppg_service_name, read_messages_from_bearerbox(), reply_couldnotfetch, reply_couldnotrepresent, reply_emptymessage, reply_requestfailed, report_versions(), semaphore_destroy(), sendota_url, sendsms_interface, sendsms_reply_hdrs, sendsms_thread(), sendsms_url, setup_signal_handlers(), smsbox_http_requests, smsbox_id, smsbox_requests, translations, url_result_thread(), urltrans_add_cfg(), urltrans_create(), urltrans_destroy(), white_list, white_list_regex, write_to_bearerbox(), and xmlrpc_url.

03534 {
03535     int cf_index;
03536     Octstr *filename;
03537     double heartbeat_freq = DEFAULT_HEARTBEAT;
03538 
03539     gwlib_init();
03540     cf_index = get_and_set_debugs(argc, argv, check_args);
03541     
03542     setup_signal_handlers();
03543     
03544     if (argv[cf_index] == NULL)
03545     filename = octstr_create("kannel.conf");
03546     else
03547     filename = octstr_create(argv[cf_index]);
03548     cfg = cfg_create(filename);
03549 
03550     if (cfg_read(cfg) == -1)
03551     panic(0, "Couldn't read configuration from `%s'.", octstr_get_cstr(filename));
03552 
03553     octstr_destroy(filename);
03554 
03555     report_versions("smsbox");
03556 
03557     init_smsbox(cfg);
03558 
03559     if (max_http_retries > 0) {
03560         info(0, "Using HTTP request queueing with %ld retries, %lds delay.", 
03561                 max_http_retries, http_queue_delay);
03562     }
03563 
03564     debug("sms", 0, "----------------------------------------------");
03565     debug("sms", 0, GW_NAME " smsbox version %s starting", GW_VERSION);
03566 
03567     translations = urltrans_create();
03568     if (translations == NULL)
03569     panic(0, "urltrans_create failed");
03570     if (urltrans_add_cfg(translations, cfg) == -1)
03571     panic(0, "urltrans_add_cfg failed");
03572 
03573     client_dict = dict_create(32, NULL);
03574     sendsms_reply_hdrs = http_create_empty_headers();
03575     http_header_add(sendsms_reply_hdrs, "Content-type", "text/html");
03576     http_header_add(sendsms_reply_hdrs, "Pragma", "no-cache");
03577     http_header_add(sendsms_reply_hdrs, "Cache-Control", "no-cache");
03578 
03579 
03580     caller = http_caller_create();
03581     smsbox_requests = gwlist_create();
03582     smsbox_http_requests = gwlist_create();
03583     gwlist_add_producer(smsbox_requests);
03584     gwlist_add_producer(smsbox_http_requests);
03585     num_outstanding_requests = counter_create();
03586     catenated_sms_counter = counter_create();
03587     gwthread_create(obey_request_thread, NULL);
03588     gwthread_create(url_result_thread, NULL);
03589     gwthread_create(http_queue_thread, NULL);
03590 
03591     connect_to_bearerbox(bb_host, bb_port, bb_ssl, NULL /* bb_our_host */);
03592     /* XXX add our_host if required */
03593 
03594     if (0 > heartbeat_start(write_to_bearerbox, heartbeat_freq,
03595                        outstanding_requests)) {
03596         info(0, GW_NAME "Could not start heartbeat.");
03597     }
03598 
03599     identify_to_bearerbox();
03600     read_messages_from_bearerbox();
03601 
03602     info(0, GW_NAME " smsbox terminating.");
03603 
03604     heartbeat_stop(ALL_HEARTBEATS);
03605     http_close_all_ports();
03606     gwthread_join_every(sendsms_thread);
03607     gwlist_remove_producer(smsbox_requests);
03608     gwlist_remove_producer(smsbox_http_requests);
03609     gwthread_join_every(obey_request_thread);
03610     http_caller_signal_shutdown(caller);
03611     gwthread_join_every(url_result_thread);
03612     gwthread_join_every(http_queue_thread);
03613 
03614     close_connection_to_bearerbox();
03615     alog_close();
03616     urltrans_destroy(translations);
03617     gw_assert(gwlist_len(smsbox_requests) == 0);
03618     gw_assert(gwlist_len(smsbox_http_requests) == 0);
03619     gwlist_destroy(smsbox_requests, NULL);
03620     gwlist_destroy(smsbox_http_requests, NULL);
03621     http_caller_destroy(caller);
03622     counter_destroy(num_outstanding_requests);
03623     counter_destroy(catenated_sms_counter);
03624     octstr_destroy(bb_host);
03625     octstr_destroy(global_sender);
03626     octstr_destroy(accepted_chars);
03627     octstr_destroy(smsbox_id);
03628     octstr_destroy(sendsms_url);
03629     octstr_destroy(sendota_url);
03630     octstr_destroy(xmlrpc_url);
03631     octstr_destroy(reply_emptymessage);
03632     octstr_destroy(reply_requestfailed);
03633     octstr_destroy(reply_couldnotfetch);
03634     octstr_destroy(reply_couldnotrepresent);
03635     octstr_destroy(sendsms_interface);    
03636     octstr_destroy(ppg_service_name);    
03637     numhash_destroy(black_list);
03638     numhash_destroy(white_list);
03639     if (white_list_regex != NULL) gw_regex_destroy(white_list_regex);
03640     if (black_list_regex != NULL) gw_regex_destroy(black_list_regex);
03641     semaphore_destroy(max_pending_requests);
03642     cfg_destroy(cfg);
03643 
03644     dict_destroy(client_dict); 
03645     http_destroy_headers(sendsms_reply_hdrs);
03646 
03647     /* 
03648      * Just sleep for a while to get bearerbox chance to restart.
03649      * Otherwise we will fail while trying to connect to bearerbox!
03650      */
03651     if (restart) {
03652         gwthread_sleep(5.0);
03653     }
03654 
03655     gwlib_shutdown();
03656 
03657     /* now really restart */
03658     if (restart)
03659         execvp(argv[0], argv);
03660 
03661     return 0;
03662 }

Here is the call graph for this function:

int obey_request Octstr **  result,
URLTranslation trans,
Msg msg
[static]
 

Definition at line 1245 of file smsbox.c.

References alog(), caller, DC_UCS2, debug(), error(), gw_assert, gw_gmtime(), GW_NAME, GW_VERSION, http_create_empty_headers(), http_destroy_headers(), http_header_add(), HTTP_METHOD_GET, HTTP_METHOD_POST, http_start_request(), max_pending_requests, msg_type, O_DESTROY, octstr_append(), OCTSTR_APPEND_XML, OCTSTR_APPEND_XML_NUMBER, octstr_create, octstr_destroy(), octstr_duplicate, octstr_format(), octstr_get_cstr, octstr_imm(), octstr_len(), octstr_read_file(), octstr_read_pipe(), octstr_url_encode(), remember_receiver(), result, semaphore_down(), semaphore_up(), sms, TRANSTYPE_EXECUTE, TRANSTYPE_FILE, TRANSTYPE_GET_URL, TRANSTYPE_POST_URL, TRANSTYPE_POST_XML, TRANSTYPE_SENDSMS, TRANSTYPE_TEXT, type, urltrans_get_pattern(), urltrans_send_sender(), and urltrans_type().

Referenced by obey_request_thread().

01246 {
01247     Octstr *pattern, *xml, *tmp;
01248     List *request_headers;
01249     void *id;
01250     struct tm tm;
01251     char p[22];
01252     int type;
01253     FILE *f;
01254 
01255     gw_assert(msg != NULL);
01256     gw_assert(msg_type(msg) == sms);
01257 
01258     if (msg->sms.sms_type == report_mo)
01259     type = TRANSTYPE_GET_URL;
01260     else
01261     type = urltrans_type(trans);
01262 
01263     pattern = urltrans_get_pattern(trans, msg);
01264     gw_assert(pattern != NULL);
01265 
01266     switch (type) {
01267     case TRANSTYPE_TEXT:
01268     debug("sms", 0, "formatted text answer: <%s>",
01269           octstr_get_cstr(pattern));
01270     *result = pattern;
01271     alog("SMS request sender:%s request: '%s' fixed answer: '%s'",
01272          octstr_get_cstr(msg->sms.receiver),
01273          octstr_get_cstr(msg->sms.msgdata),
01274          octstr_get_cstr(pattern));
01275     break;
01276 
01277     case TRANSTYPE_FILE:
01278     *result = octstr_read_file(octstr_get_cstr(pattern));
01279     octstr_destroy(pattern);
01280     alog("SMS request sender:%s request: '%s' file answer: '%s'",
01281          octstr_get_cstr(msg->sms.receiver),
01282          octstr_get_cstr(msg->sms.msgdata),
01283          octstr_get_cstr(*result));
01284     break;
01285 
01286     case TRANSTYPE_EXECUTE:
01287         semaphore_down(max_pending_requests);
01288         debug("sms.exec", 0, "executing sms-service '%s'",
01289               octstr_get_cstr(pattern));
01290         if ((f = popen(octstr_get_cstr(pattern), "r")) != NULL) {
01291             octstr_destroy(pattern);
01292             *result = octstr_read_pipe(f);
01293             pclose(f);
01294             semaphore_up(max_pending_requests);
01295             alog("SMS request sender:%s request: '%s' file answer: '%s'",
01296                 octstr_get_cstr(msg->sms.receiver),
01297                 octstr_get_cstr(msg->sms.msgdata),
01298                 octstr_get_cstr(*result));
01299         } else {
01300             error(0, "popen failed for '%s': %d: %s",
01301                   octstr_get_cstr(pattern), errno, strerror(errno));
01302             *result = NULL;
01303             octstr_destroy(pattern);
01304             return -1;
01305         }
01306         break;
01307 
01308     /*
01309      * No Kannel headers when we are sending dlrs to wap push
01310      */
01311     case TRANSTYPE_GET_URL:
01312     request_headers = http_create_empty_headers();
01313         http_header_add(request_headers, "User-Agent", GW_NAME "/" GW_VERSION);
01314         if (trans != 0) {
01315         if (urltrans_send_sender(trans)) {
01316             http_header_add(request_headers, "X-Kannel-From",
01317                     octstr_get_cstr(msg->sms.receiver));
01318         }
01319         }
01320 
01321     id = remember_receiver(msg, trans, HTTP_METHOD_GET, pattern, request_headers, NULL, 0);
01322         semaphore_down(max_pending_requests);
01323     http_start_request(caller, HTTP_METHOD_GET, pattern, request_headers,
01324                        NULL, 1, id, NULL);
01325     octstr_destroy(pattern);
01326     http_destroy_headers(request_headers);
01327     *result = NULL;
01328     return 0;
01329 
01330     case TRANSTYPE_POST_URL:
01331     request_headers = http_create_empty_headers();
01332     http_header_add(request_headers, "User-Agent", GW_NAME "/" GW_VERSION);
01333     if (msg->sms.coding == DC_8BIT)
01334         http_header_add(request_headers, "Content-Type",
01335                 "application/octet-stream");
01336     else
01337         if(msg->sms.coding == DC_UCS2)
01338         http_header_add(request_headers, "Content-Type", "text/plain; charset=\"UTF-16BE\"");
01339         else {
01340         Octstr *header;
01341         header = octstr_create("text/plain");
01342         if(msg->sms.charset) {
01343             octstr_append(header, octstr_imm("; charset=\""));
01344             octstr_append(header, msg->sms.charset);
01345             octstr_append(header, octstr_imm("\""));
01346         }
01347         http_header_add(request_headers, "Content-Type", octstr_get_cstr(header));
01348         O_DESTROY(header);
01349         }
01350     if (urltrans_send_sender(trans))
01351         http_header_add(request_headers, "X-Kannel-From",
01352                 octstr_get_cstr(msg->sms.receiver));
01353     http_header_add(request_headers, "X-Kannel-To",
01354             octstr_get_cstr(msg->sms.sender));
01355 
01356     tm = gw_gmtime(msg->sms.time);
01357     sprintf(p, "%04d-%02d-%02d %02d:%02d:%02d",
01358         tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
01359         tm.tm_hour, tm.tm_min, tm.tm_sec);
01360     http_header_add(request_headers, "X-Kannel-Time", p);
01361 
01362     tm = gw_gmtime(time(NULL));
01363     sprintf(p, "%04d-%02d-%02d %02d:%02d:%02d",
01364         tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
01365         tm.tm_hour, tm.tm_min, tm.tm_sec);
01366     http_header_add(request_headers, "Date", p); /* HTTP RFC 14.18 */
01367 
01368     if (octstr_len(msg->sms.udhdata)) {
01369         Octstr *os;
01370         os = octstr_duplicate(msg->sms.udhdata);
01371         octstr_url_encode(os);
01372         http_header_add(request_headers, "X-Kannel-UDH",
01373                 octstr_get_cstr(os));
01374         octstr_destroy(os);
01375     }
01376     if (octstr_len(msg->sms.smsc_id)) {
01377         Octstr *os;
01378         os = octstr_duplicate(msg->sms.smsc_id);
01379         http_header_add(request_headers, "X-Kannel-SMSC",
01380                         octstr_get_cstr(os));
01381         octstr_destroy(os);
01382     }
01383 
01384     if(msg->sms.mclass != SMS_PARAM_UNDEFINED) {
01385         Octstr *os;
01386         os = octstr_format("%d",msg->sms.mclass);
01387         http_header_add(request_headers, "X-Kannel-MClass",
01388             octstr_get_cstr(os));
01389         octstr_destroy(os);
01390     }
01391     if(msg->sms.pid != SMS_PARAM_UNDEFINED) {
01392         Octstr *os;
01393         os = octstr_format("%d",msg->sms.pid);
01394         http_header_add(request_headers, "X-Kannel-PID",
01395             octstr_get_cstr(os));
01396         octstr_destroy(os);
01397     }
01398     if(msg->sms.rpi != SMS_PARAM_UNDEFINED) {
01399         Octstr *os;
01400         os = octstr_format("%d",msg->sms.rpi);
01401         http_header_add(request_headers, "X-Kannel-RPI",
01402             octstr_get_cstr(os));
01403         octstr_destroy(os);
01404     }
01405     if(msg->sms.alt_dcs != SMS_PARAM_UNDEFINED) {
01406         Octstr *os;
01407         os = octstr_format("%d",msg->sms.alt_dcs);
01408         http_header_add(request_headers, "X-Kannel-Alt-DCS",
01409             octstr_get_cstr(os));
01410         octstr_destroy(os);
01411     }
01412     if(msg->sms.mwi != SMS_PARAM_UNDEFINED) {
01413         Octstr *os;
01414         os = octstr_format("%d",msg->sms.mwi);
01415         http_header_add(request_headers, "X-Kannel-MWI",
01416             octstr_get_cstr(os));
01417         octstr_destroy(os);
01418     }
01419     if(msg->sms.coding != SMS_PARAM_UNDEFINED) {
01420         Octstr *os;
01421         os = octstr_format("%d",msg->sms.coding);
01422         http_header_add(request_headers, "X-Kannel-Coding",
01423             octstr_get_cstr(os));
01424         octstr_destroy(os);
01425     }
01426     if(msg->sms.compress != SMS_PARAM_UNDEFINED) {
01427         Octstr *os;
01428         os = octstr_format("%d",msg->sms.compress);
01429         http_header_add(request_headers, "X-Kannel-Compress",
01430             octstr_get_cstr(os));
01431         octstr_destroy(os);
01432     }
01433     if (msg->sms.validity != SMS_PARAM_UNDEFINED) {
01434         Octstr *os;
01435         os = octstr_format("%d",msg->sms.validity);
01436         http_header_add(request_headers, "X-Kannel-Validity",
01437             octstr_get_cstr(os));
01438         octstr_destroy(os);
01439     }
01440     if (msg->sms.deferred != SMS_PARAM_UNDEFINED) {
01441         Octstr *os;
01442         os = octstr_format("%d",msg->sms.deferred);
01443         http_header_add(request_headers, "X-Kannel-Deferred",
01444             octstr_get_cstr(os));
01445         octstr_destroy(os);
01446     }
01447     if (octstr_len(msg->sms.service)) {
01448         Octstr *os;
01449         os = octstr_duplicate(msg->sms.service);
01450         http_header_add(request_headers, "X-Kannel-Service",
01451             octstr_get_cstr(os));
01452         octstr_destroy(os);
01453     }
01454     if (octstr_len(msg->sms.binfo)) {
01455         Octstr *os;
01456         os = octstr_duplicate(msg->sms.binfo);
01457         http_header_add(request_headers, "X-Kannel-BInfo",
01458             octstr_get_cstr(os));
01459         octstr_destroy(os);
01460     }
01461     id = remember_receiver(msg, trans, HTTP_METHOD_POST, pattern, request_headers, msg->sms.msgdata, 0);
01462         semaphore_down(max_pending_requests);
01463     http_start_request(caller, HTTP_METHOD_POST, pattern, request_headers,
01464                        msg->sms.msgdata, 1, id, NULL);
01465     octstr_destroy(pattern);
01466     http_destroy_headers(request_headers);
01467     *result = NULL;
01468     return 0;
01469 
01470     case TRANSTYPE_POST_XML:
01471 
01472 /* XXX The first two chars are beeing eaten somewhere and
01473  * only sometimes - something must be ungry */
01474 
01475 #define OCTSTR_APPEND_XML(xml, tag, text)                  \
01476         octstr_format_append(xml, "  \t\t<" tag ">%s</" tag ">\n", \
01477             (text?octstr_get_cstr(text):""));
01478 
01479 #define OCTSTR_APPEND_XML_NUMBER(xml, tag, value)          \
01480         octstr_format_append(xml, "  \t\t<" tag ">%ld</" tag ">\n", (long) value);
01481 
01482     request_headers = http_create_empty_headers();
01483     http_header_add(request_headers, "User-Agent", GW_NAME "/" GW_VERSION);
01484         if(msg->sms.coding == DC_UCS2) {
01485         http_header_add(request_headers, "Content-Type",
01486                 "text/xml; charset=\"ISO-8859-1\""); /* for account and other strings */
01487     } else {
01488         Octstr *header;
01489         header = octstr_create("text/xml");
01490         if(msg->sms.charset) {
01491         octstr_append(header, octstr_imm("; charset=\""));
01492         octstr_append(header, msg->sms.charset);
01493         octstr_append(header, octstr_imm("\""));
01494         }
01495         http_header_add(request_headers, "Content-Type", octstr_get_cstr(header));
01496         O_DESTROY(header);
01497     }
01498 
01499     tm = gw_gmtime(time(NULL));
01500     sprintf(p, "%04d-%02d-%02d %02d:%02d:%02d",
01501         tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
01502         tm.tm_hour, tm.tm_min, tm.tm_sec);
01503     http_header_add(request_headers, "Date", p); /* HTTP RFC 14.18 */
01504 
01505     xml = octstr_create("");
01506     octstr_append(xml, octstr_imm("<?xml version=\"1.0\" encoding=\""));
01507         if(msg->sms.coding == DC_UCS2 || msg->sms.charset == NULL)
01508         octstr_append(xml, octstr_imm("ISO-8859-1"));
01509     else
01510         octstr_append(xml, msg->sms.charset);
01511     octstr_append(xml, octstr_imm("\"?>\n"));
01512 
01513     /*
01514      * XXX  damn windows that breaks with this :
01515      * octstr_append(xml, octstr_imm("<!DOCTYPE message SYSTEM \"SMSmessage.dtd\">\n"));
01516      */
01517     octstr_append(xml, octstr_imm("<message cid=\"1\">\n"));
01518     octstr_append(xml, octstr_imm("\t<submit>\n"));
01519 
01520     /* oa */
01521     if(urltrans_send_sender(trans)) {
01522         tmp = octstr_create("");
01523         OCTSTR_APPEND_XML(tmp, "number", msg->sms.receiver);
01524         OCTSTR_APPEND_XML(xml, "oa", tmp);
01525         octstr_destroy(tmp);
01526     }
01527 
01528     /* da */
01529     tmp = octstr_create("");
01530     OCTSTR_APPEND_XML(tmp, "number", msg->sms.sender);
01531     OCTSTR_APPEND_XML(xml, "da", tmp);
01532     octstr_destroy(tmp);
01533 
01534     /* udh */
01535     if(octstr_len(msg->sms.udhdata)) {
01536         Octstr *t;
01537         t = octstr_duplicate(msg->sms.udhdata);
01538         octstr_url_encode(t);
01539         OCTSTR_APPEND_XML(xml, "udh", t);
01540         octstr_destroy(t);
01541     }
01542 
01543     /* ud */
01544     if(octstr_len(msg->sms.msgdata)) {
01545         octstr_url_encode(msg->sms.msgdata);
01546             OCTSTR_APPEND_XML(xml, "ud", msg->sms.msgdata);
01547         }
01548 
01549     /* pid */
01550     if(msg->sms.pid != SMS_PARAM_UNDEFINED)
01551         OCTSTR_APPEND_XML_NUMBER(xml, "pid", msg->sms.pid);
01552 
01553     /* rpi */
01554     if(msg->sms.rpi != SMS_PARAM_UNDEFINED)
01555         OCTSTR_APPEND_XML_NUMBER(xml, "rpi", msg->sms.rpi);
01556 
01557     /* dcs */
01558     tmp = octstr_create("");
01559     if(msg->sms.coding != SMS_PARAM_UNDEFINED)
01560         OCTSTR_APPEND_XML_NUMBER(tmp, "coding", msg->sms.coding);
01561     if(msg->sms.mclass != SMS_PARAM_UNDEFINED)
01562         OCTSTR_APPEND_XML_NUMBER(tmp, "mclass", msg->sms.mclass);
01563     if(msg->sms.alt_dcs != SMS_PARAM_UNDEFINED)
01564         OCTSTR_APPEND_XML_NUMBER(tmp, "alt-dcs", msg->sms.alt_dcs);
01565     if(msg->sms.mwi != SMS_PARAM_UNDEFINED)
01566         OCTSTR_APPEND_XML_NUMBER(tmp, "mwi", msg->sms.mwi);
01567     if(msg->sms.compress != SMS_PARAM_UNDEFINED)
01568         OCTSTR_APPEND_XML_NUMBER(tmp, "compress", msg->sms.compress);
01569     if(octstr_len(tmp))
01570         OCTSTR_APPEND_XML(xml, "dcs", tmp)
01571     octstr_destroy(tmp);
01572 
01573     /* deferred (timing/delay) */
01574     tmp = octstr_create("");
01575     if(msg->sms.deferred != SMS_PARAM_UNDEFINED)
01576         OCTSTR_APPEND_XML_NUMBER(tmp, "delay", msg->sms.deferred);
01577     if(octstr_len(tmp))
01578         OCTSTR_APPEND_XML(xml, "timing", tmp)
01579     octstr_destroy(tmp);
01580 
01581     /* validity (vp/delay) */
01582     tmp = octstr_create("");
01583     if(msg->sms.validity != SMS_PARAM_UNDEFINED)
01584         OCTSTR_APPEND_XML_NUMBER(tmp, "delay", msg->sms.validity);
01585     if(octstr_len(tmp))
01586         OCTSTR_APPEND_XML(xml, "vp", tmp)
01587     octstr_destroy(tmp);
01588 
01589     /* time (at) */
01590     tm = gw_gmtime(msg->sms.time);
01591     tmp = octstr_format("<year>%04d</year><month>%02d</month>"
01592             "<day>%02d</day><hour>%02d</hour><minute>%02d</minute>"
01593             "<second>%02d</second><timezone>0</timezone>",
01594                 tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
01595                 tm.tm_hour, tm.tm_min, tm.tm_sec);
01596     OCTSTR_APPEND_XML(xml, "at", tmp);
01597     octstr_destroy(tmp);
01598 
01599     /* smsc */
01600     if (octstr_len(msg->sms.smsc_id)) {
01601         tmp = octstr_create("");
01602         if(octstr_len(msg->sms.smsc_id))
01603         OCTSTR_APPEND_XML(tmp, "account", msg->sms.smsc_id);
01604         if(octstr_len(tmp))
01605         OCTSTR_APPEND_XML(xml, "from", tmp);
01606         O_DESTROY(tmp);
01607     }
01608 
01609     /* service = to/service */
01610     if(octstr_len(msg->sms.service)) {
01611         tmp = octstr_create("");
01612         OCTSTR_APPEND_XML(tmp, "service", msg->sms.service);
01613         if(octstr_len(tmp))
01614         OCTSTR_APPEND_XML(xml, "to", tmp);
01615         O_DESTROY(tmp);
01616     }
01617 
01618     /* End XML */
01619     octstr_append(xml, octstr_imm("\t</submit>\n"));
01620     octstr_append(xml, octstr_imm("</message>\n"));
01621 
01622     if(msg->sms.msgdata != NULL)
01623         octstr_destroy(msg->sms.msgdata);
01624 
01625     msg->sms.msgdata = xml;
01626 
01627     debug("sms", 0, "XMLBuild: XML: <%s>", octstr_get_cstr(msg->sms.msgdata));
01628     id = remember_receiver(msg, trans, HTTP_METHOD_POST, pattern, request_headers, msg->sms.msgdata, 0);
01629         semaphore_down(max_pending_requests);
01630     http_start_request(caller, HTTP_METHOD_POST, pattern, request_headers,
01631                        msg->sms.msgdata, 1, id, NULL);
01632     octstr_destroy(pattern);
01633     http_destroy_headers(request_headers);
01634     *result = NULL;
01635     return 0;
01636 
01637     case TRANSTYPE_SENDSMS:
01638     error(0, "Got URL translation type SENDSMS for incoming message.");
01639     alog("SMS request sender:%s request: '%s' FAILED bad translation",
01640          octstr_get_cstr(msg->sms.receiver),
01641          octstr_get_cstr(msg->sms.msgdata));
01642     octstr_destroy(pattern);
01643     return -1;
01644 
01645     default:
01646     error(0, "Unknown URL translation type %d", urltrans_type(trans));
01647     alog("SMS request sender:%s request: '%s' FAILED unknown translation",
01648          octstr_get_cstr(msg->sms.receiver),
01649          octstr_get_cstr(msg->sms.msgdata));
01650     octstr_destroy(pattern);
01651     return -1;
01652     }
01653 
01654     return 1;
01655 }

Here is the call graph for this function:

void obey_request_thread void *  arg  )  [static]
 

Definition at line 1657 of file smsbox.c.

References ack, error(), global_sender, gwlist_consume(), info(), mo_recode, msg_create, msg_destroy(), msg_dump(), obey_request(), octstr_compare(), octstr_create, octstr_destroy(), octstr_duplicate, octstr_get_cstr, octstr_imm(), octstr_len(), octstr_recode(), ppg_service_name, reply_requestfailed, send_message(), sms, sms_swap(), smsbox_requests, text, translations, urltrans_faked_sender(), urltrans_find(), urltrans_find_service(), urltrans_name(), uuid_copy(), warning(), and write_to_bearerbox().

Referenced by main().

01658 {
01659     Msg *msg, *mack, *reply_msg;
01660     Octstr *tmp, *reply;
01661     URLTranslation *trans;
01662     Octstr *p;
01663     int ret, dreport=0;
01664 
01665     while ((msg = gwlist_consume(smsbox_requests)) != NULL) {
01666     if (msg->sms.sms_type == report_mo)
01667         dreport = 1;
01668     else
01669         dreport = 0;
01670 
01671     /* Recode to UTF-8 the MO message if possible */
01672     if (mo_recode && msg->sms.coding == DC_UCS2) {
01673             int converted = 0;
01674         Octstr *text;
01675 
01676         text = octstr_duplicate(msg->sms.msgdata);
01677         if(0 == octstr_recode(octstr_imm("UTF-8"), octstr_imm("UTF-16BE"), text)) {
01678                 info(0, "MO message converted from UCS-2 to UTF-8");
01679                 octstr_destroy(msg->sms.msgdata);
01680                 msg->sms.msgdata = octstr_duplicate(text);
01681                 msg->sms.charset = octstr_create("UTF-8");
01682                 msg->sms.coding = DC_7BIT;
01683                 converted=1;
01684         }
01685         octstr_destroy(text);
01686     }
01687 
01688     if (octstr_len(msg->sms.sender) == 0 ||
01689         octstr_len(msg->sms.receiver) == 0) {
01690         error(0, "smsbox_req_thread: no sender/receiver, dump follows:");
01691         msg_dump(msg, 0);
01692             /*
01693              * Send NACK to bearerbox, otherwise message remains in store file.
01694              */
01695             mack = msg_create(ack);
01696             mack->ack.nack = ack_failed;
01697             mack->ack.time = msg->sms.time;
01698             uuid_copy(mack->ack.id, msg->sms.id);
01699             write_to_bearerbox(mack);
01700 
01701         msg_destroy(msg);
01702         continue;
01703     }
01704 
01705     /* create ack message to be sent afterwards */
01706     mack = msg_create(ack);
01707     mack->ack.nack = ack_success;
01708     mack->ack.time = msg->sms.time;
01709     uuid_copy(mack->ack.id, msg->sms.id);
01710 
01711         /*
01712          * no smsbox services when we are doing ppg dlr - so trans would be
01713          * NULL in this case.
01714          */
01715         if (dreport) {
01716             if (msg->sms.service == NULL || (msg->sms.service != NULL &&
01717                  ppg_service_name != NULL &&
01718                  octstr_compare(msg->sms.service, ppg_service_name) == 0)) {
01719                 trans = NULL;
01720             } else {
01721                 trans = urltrans_find_service(translations, msg);
01722             }
01723 
01724         info(0, "Starting delivery report <%s> from <%s>",
01725         octstr_get_cstr(msg->sms.service),
01726         octstr_get_cstr(msg->sms.sender));
01727 
01728     } else {
01729         trans = urltrans_find(translations, msg);
01730         if (trans == NULL) {
01731         warning(0, "No translation found for <%s> from <%s> to <%s>",
01732             octstr_get_cstr(msg->sms.msgdata),
01733             octstr_get_cstr(msg->sms.sender),
01734             octstr_get_cstr(msg->sms.receiver));
01735                 sms_swap(msg);
01736         goto error;
01737         }
01738 
01739         info(0, "Starting to service <%s> from <%s> to <%s>",
01740         octstr_get_cstr(msg->sms.msgdata),
01741         octstr_get_cstr(msg->sms.sender),
01742         octstr_get_cstr(msg->sms.receiver));
01743 
01744         /*
01745          * now, we change the sender (receiver now 'cause we swap them later)
01746          * if faked-sender or similar set. Note that we ignore if the
01747          * replacement fails.
01748          */
01749         tmp = octstr_duplicate(msg->sms.sender);
01750 
01751         p = urltrans_faked_sender(trans);
01752         if (p != NULL) {
01753         octstr_destroy(msg->sms.sender);
01754         msg->sms.sender = octstr_duplicate(p);
01755         } else if (global_sender != NULL) {
01756         octstr_destroy(msg->sms.sender);
01757         msg->sms.sender = octstr_duplicate(global_sender);
01758         } else {
01759         octstr_destroy(msg->sms.sender);
01760         msg->sms.sender = octstr_duplicate(msg->sms.receiver);
01761         }
01762         octstr_destroy(msg->sms.receiver);
01763         msg->sms.receiver = tmp;
01764             msg->sms.sms_type = mt_reply;
01765     }
01766 
01767     /* TODO: check if the sender is approved to use this service */
01768 
01769     if(msg->sms.service == NULL && trans != NULL)
01770         msg->sms.service = octstr_duplicate(urltrans_name(trans));
01771     ret = obey_request(&reply, trans, msg);
01772     if (ret != 0) {
01773         if (ret == -1) {
01774     error:
01775             error(0, "request failed");
01776             /* XXX this can be something different, according to
01777                urltranslation */
01778             reply = octstr_duplicate(reply_requestfailed);
01779             trans = NULL;   /* do not use any special translation */
01780         }
01781             if (!dreport) {
01782                 /* create reply message */
01783                 reply_msg = msg_create(sms);
01784                 reply_msg->sms.sms_type = mt_reply;
01785                 reply_msg->sms.sender = msg->sms.sender;
01786                 msg->sms.sender = NULL;
01787                 reply_msg->sms.receiver = msg->sms.receiver;
01788                 msg->sms.receiver = NULL;
01789                 reply_msg->sms.smsc_id = msg->sms.smsc_id;
01790                 msg->sms.smsc_id = NULL;
01791                 reply_msg->sms.msgdata = reply;
01792                 reply_msg->sms.time = time(NULL);   /* set current time */
01793 
01794                 /* send message */
01795                 if (send_message(trans, reply_msg) < 0)
01796                     error(0, "request_thread: failed");
01797 
01798                 /* cleanup */
01799                 msg_destroy(reply_msg);
01800             }
01801     }
01802 
01803     write_to_bearerbox(mack); /* implicit msg_destroy */
01804 
01805     msg_destroy(msg);
01806     }
01807 }

Here is the call graph for this function:

long outstanding_requests void   )  [static]
 

Definition at line 471 of file smsbox.c.

References counter_value(), and num_outstanding_requests.

Referenced by main().

00472 {
00473     return counter_value(num_outstanding_requests);
00474 }

Here is the call graph for this function:

void read_messages_from_bearerbox void   )  [static]
 

Definition at line 226 of file smsbox.c.

References delayed_http_reply(), gwlist_produce(), INFINITE_TIME, info(), msg_destroy(), msg_type, program_status, read_from_bearerbox(), restart, smsbox_requests, and warning().

Referenced by main().

00227 {
00228     time_t start, t;
00229     int secs;
00230     int total = 0;
00231     int ret;
00232     Msg *msg;
00233 
00234     start = t = time(NULL);
00235     while (program_status != shutting_down) {
00236         /* block infinite for reading messages */
00237         ret = read_from_bearerbox(&msg, INFINITE_TIME);
00238         if (ret == -1)
00239             break;
00240         else if (ret == 1) /* timeout */
00241             continue;
00242         else if (msg == NULL) /* just to be sure, may not happens */
00243             break;
00244 
00245     if (msg_type(msg) == admin) {
00246         if (msg->admin.command == cmd_shutdown) {
00247         info(0, "Bearerbox told us to die");
00248         program_status = shutting_down;
00249         } else if (msg->admin.command == cmd_restart) {
00250         info(0, "Bearerbox told us to restart");
00251         restart = 1;
00252         program_status = shutting_down;
00253         }
00254         /*
00255          * XXXX here should be suspend/resume, add RSN
00256          */
00257         msg_destroy(msg);
00258     } else if (msg_type(msg) == sms) {
00259         if (total == 0)
00260         start = time(NULL);
00261         total++;
00262         gwlist_produce(smsbox_requests, msg);
00263     } else if (msg_type(msg) == ack) {
00264         if (!immediate_sendsms_reply)
00265         delayed_http_reply(msg);
00266         msg_destroy(msg);
00267     } else {
00268         warning(0, "Received other message than sms/admin, ignoring!");
00269         msg_destroy(msg);
00270     }
00271     }
00272     secs = difftime(time(NULL), start);
00273     info(0, "Received (and handled?) %d requests in %d seconds "
00274          "(%.2f per second)", total, secs, (float)total / secs);
00275 }

Here is the call graph for this function:

void* remember_receiver Msg msg,
URLTranslation trans,
int  method,
Octstr url,
List headers,
Octstr body,
unsigned int  retries
[static]
 

Definition at line 415 of file smsbox.c.

References counter_increase(), http_header_duplicate(), receiver::msg, msg_create, num_outstanding_requests, octstr_compare(), octstr_duplicate, ppg_service_name, sms, and urltrans_name().

Referenced by http_queue_thread(), obey_request(), and url_result_thread().

00418 {
00419     struct receiver *receiver;
00420 
00421     counter_increase(num_outstanding_requests);
00422     receiver = gw_malloc(sizeof(*receiver));
00423 
00424     receiver->msg = msg_create(sms);
00425 
00426     receiver->msg->sms.sender = octstr_duplicate(msg->sms.sender);
00427     receiver->msg->sms.receiver = octstr_duplicate(msg->sms.receiver);
00428     /* ppg_service_name should always be not NULL here */
00429     if (trans != NULL && (msg->sms.service == NULL || ppg_service_name == NULL ||
00430         octstr_compare(msg->sms.service, ppg_service_name) != 0)) {
00431         receiver->msg->sms.service = octstr_duplicate(urltrans_name(trans));
00432     } else {
00433         receiver->msg->sms.service = octstr_duplicate(msg->sms.service);
00434     }
00435     receiver->msg->sms.smsc_id = octstr_duplicate(msg->sms.smsc_id);
00436     /* to remember if it's a DLR http get */
00437     receiver->msg->sms.sms_type = msg->sms.sms_type;
00438 
00439     receiver->trans = trans;
00440 
00441     /* remember the HTTP request if we need to queue this */
00442     receiver->method = method;
00443     receiver->url = octstr_duplicate(url);
00444     receiver->http_headers = http_header_duplicate(headers);
00445     receiver->body = octstr_duplicate(body);
00446     receiver->retries = retries;
00447 
00448     return receiver;
00449 }

Here is the call graph for this function:

int send_message URLTranslation trans,
Msg msg
[static]
 

Definition at line 294 of file smsbox.c.

References catenated_sms_counter, counter_increase(), debug(), gw_assert, gwlist_destroy(), gwlist_extract_first(), gwlist_len(), info(), msg_destroy(), msg_duplicate(), msg_type, octstr_append(), octstr_delete(), octstr_duplicate, octstr_len(), reply_emptymessage, sms, sms_max_length, sms_split(), smsbox_id, urltrans_concatenation(), urltrans_footer(), urltrans_header(), urltrans_max_messages(), urltrans_omit_empty(), urltrans_split_chars(), urltrans_split_suffix(), and write_to_bearerbox().

00295 {
00296     int max_msgs;
00297     Octstr *header, *footer, *suffix, *split_chars;
00298     int catenate;
00299     unsigned long msg_sequence, msg_count;
00300     List *list;
00301     Msg *part;
00302 
00303     gw_assert(msg != NULL);
00304     gw_assert(msg_type(msg) == sms);
00305 
00306     if (trans != NULL)
00307     max_msgs = urltrans_max_messages(trans);
00308     else
00309     max_msgs = 1;
00310 
00311     if (max_msgs == 0) {
00312     info(0, "No reply sent, denied.");
00313     return 0;
00314     }
00315 
00316     /*
00317      * Encode our smsbox-id to the msg structure.
00318      * This will allow bearerbox to return specific answers to the
00319      * same smsbox, mainly for DLRs and SMS proxy modes.
00320      */
00321     if (smsbox_id != NULL) {
00322         msg->sms.boxc_id = octstr_duplicate(smsbox_id);
00323     }
00324 
00325     /*
00326      * Empty message? Two alternatives have to be handled:
00327      *  a) it's a HTTP sms-service reply: either ignore it or
00328      *     substitute the "empty" warning defined
00329      *  b) it's a sendsms HTTP interface call: leave the message empty
00330      */
00331     if (octstr_len(msg->sms.msgdata) == 0 && msg->sms.sms_type == mt_reply) {
00332         if (trans != NULL && urltrans_omit_empty(trans))
00333             return 0;
00334         else
00335             msg->sms.msgdata = octstr_duplicate(reply_emptymessage);
00336     }
00337 
00338     if (trans == NULL) {
00339     header = NULL;
00340     footer = NULL;
00341     suffix = NULL;
00342     split_chars = NULL;
00343     catenate = 0;
00344     } else {
00345         header = urltrans_header(trans);
00346     footer = urltrans_footer(trans);
00347     suffix = urltrans_split_suffix(trans);
00348     split_chars = urltrans_split_chars(trans);
00349     catenate = urltrans_concatenation(trans);
00350     }
00351 
00352     if (catenate)
00353         msg_sequence = counter_increase(catenated_sms_counter) & 0xFF;
00354     else
00355         msg_sequence = 0;
00356 
00357     list = sms_split(msg, header, footer, suffix, split_chars, catenate,
00358                      msg_sequence, max_msgs, sms_max_length);
00359     msg_count = gwlist_len(list);
00360     
00361     debug("sms", 0, "message length %ld, sending %ld messages",
00362           octstr_len(msg->sms.msgdata), msg_count);
00363     
00364     /*
00365      * In order to get catenated msgs work properly, we
00366      * have moved catenation to bearerbox.
00367      * So here we just need to put splitted msgs into one again and send
00368      * to bearerbox that will care about catenation.
00369      */
00370     if (catenate) {
00371         Msg *new_msg = msg_duplicate(msg);
00372         octstr_delete(new_msg->sms.msgdata, 0, octstr_len(new_msg->sms.msgdata));
00373         while((part = gwlist_extract_first(list)) != NULL) {
00374             octstr_append(new_msg->sms.msgdata, part->sms.msgdata);
00375             msg_destroy(part);
00376         }
00377         write_to_bearerbox(new_msg);
00378     } else {
00379         /* msgs are the independed parts so sent those as is */
00380         while ((part = gwlist_extract_first(list)) != NULL)
00381             write_to_bearerbox(part);
00382     }
00383     
00384     gwlist_destroy(list, NULL);
00385 
00386     return msg_count;
00387 }

Here is the call graph for this function:

void sendsms_thread void *  arg  )  [static]
 

Definition at line 3161 of file smsbox.c.

References debug(), http_accept_request(), http_destroy_cgiargs(), http_destroy_headers(), http_send_reply(), immediate_sendsms_reply, info(), octstr_compare(), octstr_create, octstr_destroy(), octstr_get_cstr, sendota_url, sendsms_port, sendsms_reply_hdrs, sendsms_url, smsbox_req_sendota(), smsbox_req_sendsms(), smsbox_sendota_post(), smsbox_sendsms_post(), smsbox_xmlrpc_post(), and xmlrpc_url.

Referenced by init_smsbox(), and main().

03162  {
03163     HTTPClient *client;
03164     Octstr *ip, *url, *body, *answer;
03165     List *hdrs, *args;
03166     int status;
03167     
03168     for (;;) {
03169         client = http_accept_request(sendsms_port, &ip, &url, &hdrs, &body, 
03170                                  &args);
03171     if (client == NULL)
03172         break;
03173 
03174     info(0, "smsbox: Got HTTP request <%s> from <%s>",
03175         octstr_get_cstr(url), octstr_get_cstr(ip));
03176 
03177     /*
03178      * determine which kind of HTTP request this is any
03179      * call the necessary routine for it
03180      */
03181 
03182     /* sendsms */
03183     if (octstr_compare(url, sendsms_url) == 0)
03184     {
03185     /* 
03186      * decide if this is a GET or POST request and let the 
03187      * related routine handle the checking
03188      */
03189     if (body == NULL)
03190         answer = smsbox_req_sendsms(args, ip, &status, client);
03191     else
03192         answer = smsbox_sendsms_post(hdrs, body, ip, &status, client);
03193     }
03194     /* XML-RPC */
03195     else if (octstr_compare(url, xmlrpc_url) == 0)
03196     {
03197         /*
03198          * XML-RPC request needs to have a POST body
03199          */
03200         if (body == NULL) {
03201             answer = octstr_create("Incomplete request.");
03202             status = HTTP_BAD_REQUEST;
03203         } else
03204             answer = smsbox_xmlrpc_post(hdrs, body, ip, &status);
03205     }
03206     /* sendota */
03207     else if (octstr_compare(url, sendota_url) == 0)
03208     {
03209     if (body == NULL)
03210             answer = smsbox_req_sendota(args, ip, &status, client);
03211         else
03212             answer = smsbox_sendota_post(hdrs, body, ip, &status, client);
03213     }
03214     /* add aditional URI compares here */
03215     else {
03216         answer = octstr_create("Unknown request.");
03217         status = HTTP_NOT_FOUND;
03218     }
03219 
03220     debug("sms.http", 0, "Status: %d Answer: <%s>", status,
03221           octstr_get_cstr(answer));
03222 
03223     octstr_destroy(ip);
03224     octstr_destroy(url);
03225     http_destroy_headers(hdrs);
03226     octstr_destroy(body);
03227     http_destroy_cgiargs(args);
03228 
03229     if (immediate_sendsms_reply || status != HTTP_ACCEPTED)
03230       http_send_reply(client, status, sendsms_reply_hdrs, answer);
03231     else {
03232       debug("sms.http", 0, "Delayed reply - wait for bearerbox");
03233     }
03234     octstr_destroy(answer);
03235     }
03236 
03237 }

Here is the call graph for this function:

void setup_signal_handlers void   )  [static]
 

Definition at line 3280 of file smsbox.c.

03280                                         {
03281     struct sigaction act;
03282 
03283     act.sa_handler = signal_handler;
03284     sigemptyset(&act.sa_mask);
03285     act.sa_flags = 0;
03286     sigaction(SIGINT, &act, NULL);
03287     sigaction(SIGQUIT, &act, NULL);
03288     sigaction(SIGHUP, &act, NULL);
03289     sigaction(SIGPIPE, &act, NULL);
03290 }

void signal_handler int  signum  )  [static]
 

Definition at line 3244 of file smsbox.c.

References alog_reopen(), error(), gwthread_shouldhandlesignal(), log_reopen(), program_status, and warning().

03244                                        {
03245     /* On some implementations (i.e. linuxthreads), signals are delivered
03246      * to all threads.  We only want to handle each signal once for the
03247      * entire box, and we let the gwthread wrapper take care of choosing
03248      * one.
03249      */
03250     if (!gwthread_shouldhandlesignal(signum))
03251         return;
03252 
03253     switch (signum) {
03254         case SIGINT:
03255 
03256             if (program_status != shutting_down) {
03257                 error(0, "SIGINT received, aborting program...");
03258                 program_status = shutting_down;
03259             }
03260             break;
03261 
03262         case SIGHUP:
03263             warning(0, "SIGHUP received, catching and re-opening logs");
03264             log_reopen();
03265             alog_reopen();
03266             break;
03267 
03268         /* 
03269          * It would be more proper to use SIGUSR1 for this, but on some
03270          * platforms that's reserved by the pthread support. 
03271          */
03272         case SIGQUIT:
03273            warning(0, "SIGQUIT received, reporting memory usage.");
03274            gw_check_leaks();
03275            break;
03276     }
03277 }

Here is the call graph for this function:

Octstr* smsbox_req_handle URLTranslation t,
Octstr client_ip,
HTTPClient client,
Octstr from,
Octstr to,
Octstr text,
Octstr charset,
Octstr udh,
Octstr smsc,
int  mclass,
int  mwi,
int  coding,
int  compress,
int  validity,
int  deferred,
int *  status,
int  dlr_mask,
Octstr dlr_url,
Octstr account,
int  pid,
int  alt_dcs,
int  rpi,
List receiver,
Octstr binfo,
int  priority
[static]
 

Definition at line 1950 of file smsbox.c.

References alog(), black_list, black_list_regex, charset, charset_processing(), client_dict, dict_put(), dict_remove(), error(), global_sender, gwlist_append(), gwlist_append_unique(), gwlist_create, gwlist_delete_matching(), gwlist_destroy(), gwlist_extract_first(), gwlist_get(), gwlist_len(), info(), msg_create, msg_destroy(), numhash_find_number(), O_DESTROY, octstr_case_compare(), octstr_copy, octstr_create, octstr_destroy(), octstr_destroy_item(), octstr_duplicate, octstr_format_append(), octstr_get_char(), octstr_get_cstr, octstr_imm(), octstr_item_match(), octstr_len(), octstr_search_chars(), octstr_split_words(), send_message(), sendsms_number_chars, sms, SMS_PARAM_UNDEFINED, store_uuid(), text, urltrans_black_list(), urltrans_black_list_regex(), urltrans_default_sender(), urltrans_default_smsc(), urltrans_faked_sender(), urltrans_forced_smsc(), urltrans_name(), urltrans_username(), urltrans_white_list(), urltrans_white_list_regex(), warning(), white_list, and white_list_regex.

Referenced by smsbox_req_sendsms(), and smsbox_sendsms_post().

01959 {                    
01960     Msg *msg = NULL;
01961     Octstr *newfrom = NULL;
01962     Octstr *returnerror = NULL;
01963     Octstr *receiv;
01964     Octstr *stored_uuid = NULL;
01965     List *failed_id = NULL;
01966     List *allowed = NULL;
01967     List *denied = NULL;
01968     int no_recv, ret = 0, i;
01969     long del;
01970 
01971     /*
01972      * Multi-cast messages with several receivers in 'to' are handled
01973      * in a loop. We only change sms.time and sms.receiver within the
01974      * loop below, because everything else is identical for all receivers.
01975      * If receiver is not null, to list is already present on it
01976      */
01977     if(receiver == NULL) {
01978         receiver = octstr_split_words(to);
01979     }
01980     no_recv = gwlist_len(receiver);
01981 
01982     /*
01983      * check if UDH length is legal, or otherwise discard the
01984      * message, to prevent intentional buffer overflow schemes
01985      */
01986     if (udh != NULL && (octstr_len(udh) != octstr_get_char(udh, 0) + 1)) {
01987         returnerror = octstr_create("UDH field misformed, rejected");
01988         goto field_error;
01989     }
01990     if (udh != NULL && octstr_len(udh) > MAX_SMS_OCTETS) {
01991         returnerror = octstr_create("UDH field is too long, rejected");
01992         goto field_error;
01993     }
01994 
01995     /*
01996      * Check for white and black lists, first for the URLTranlation
01997      * lists and then for the global lists.
01998      *
01999      * Set the 'allowed' and 'denied' lists accordingly to process at
02000      * least all allowed receiver messages. This is a constrain
02001      * walk through all disallowing rules within the lists.
02002      */
02003     allowed = gwlist_create();
02004     denied = gwlist_create();
02005 
02006     for (i = 0; i < no_recv; i++) {
02007         receiv = gwlist_get(receiver, i); 
02008             
02009     /*
02010      * Check if there are any illegal characters in the 'to' scheme
02011      */
02012     if (strspn(octstr_get_cstr(receiv), sendsms_number_chars) < octstr_len(receiv)) {
02013         info(0,"Illegal characters in 'to' string ('%s') vs '%s'",
02014         octstr_get_cstr(receiv), sendsms_number_chars);
02015             gwlist_append_unique(denied, receiv, octstr_item_match);
02016     }
02017 
02018         /*
02019          * First of all fill the two lists systematicaly by the rules,
02020          * then we will revice the lists.
02021          */
02022         if (urltrans_white_list(t) &&
02023             numhash_find_number(urltrans_white_list(t), receiv) < 1) {
02024             info(0, "Number <%s> is not in white-list, message discarded",
02025                  octstr_get_cstr(receiv));
02026             gwlist_append_unique(denied, receiv, octstr_item_match);
02027         } else {
02028             gwlist_append_unique(allowed, receiv, octstr_item_match);
02029         }
02030 
02031         if (urltrans_white_list_regex(t) &&
02032                 gw_regex_match_pre(urltrans_white_list_regex(t), receiv) == 0) {
02033             info(0, "Number <%s> is not in white-list-regex, message discarded",
02034                  octstr_get_cstr(receiv));
02035             gwlist_append_unique(denied, receiv, octstr_item_match);
02036         } else {
02037             gwlist_append_unique(allowed, receiv, octstr_item_match);
02038         }
02039         
02040         if (urltrans_black_list(t) &&
02041             numhash_find_number(urltrans_black_list(t), receiv) == 1) {
02042             info(0, "Number <%s> is in black-list, message discarded",
02043                  octstr_get_cstr(receiv));
02044             gwlist_append_unique(denied, receiv, octstr_item_match);
02045         } else {
02046             gwlist_append_unique(allowed, receiv, octstr_item_match);
02047         }
02048 
02049         if (urltrans_black_list_regex(t) &&
02050                 gw_regex_match_pre(urltrans_black_list_regex(t), receiv) == 1) {
02051             info(0, "Number <%s> is in black-list-regex, message discarded",
02052                  octstr_get_cstr(receiv));
02053             gwlist_append_unique(denied, receiv, octstr_item_match);
02054         } else {
02055             gwlist_append_unique(allowed, receiv, octstr_item_match);
02056         }
02057         
02058 
02059         if (white_list &&
02060             numhash_find_number(white_list, receiv) < 1) {
02061             info(0, "Number <%s> is not in global white-list, message discarded",
02062                  octstr_get_cstr(receiv));
02063             gwlist_append_unique(denied, receiv, octstr_item_match);
02064         } else {
02065             gwlist_append_unique(allowed, receiv, octstr_item_match);
02066         }
02067 
02068         if (white_list_regex &&
02069             gw_regex_match_pre(white_list_regex, receiv) == 0) {
02070             info(0, "Number <%s> is not in global white-list-regex, message discarded",
02071                  octstr_get_cstr(receiv));
02072             gwlist_append_unique(denied, receiv, octstr_item_match);
02073         } else {
02074             gwlist_append_unique(allowed, receiv, octstr_item_match);
02075         }
02076 
02077         if (black_list &&
02078             numhash_find_number(black_list, receiv) == 1) {
02079             info(0, "Number <%s> is in global black-list, message discarded",
02080                  octstr_get_cstr(receiv));
02081             gwlist_append_unique(denied, receiv, octstr_item_match);
02082         } else {
02083             gwlist_append_unique(allowed, receiv, octstr_item_match);
02084         }
02085 
02086         if (black_list_regex &&
02087             gw_regex_match_pre(black_list_regex, receiv) == 1) {
02088             info(0, "Number <%s> is in global black-list-regex, message discarded",
02089                  octstr_get_cstr(receiv));
02090             gwlist_append_unique(denied, receiv, octstr_item_match);
02091         } else {
02092             gwlist_append_unique(allowed, receiv, octstr_item_match);
02093         }
02094     }
02095     
02096     /*
02097      * Now we have to revise the 'allowed' and 'denied' lists by walking
02098      * the 'denied' list and check if items are also present in 'allowed',
02099      * then we will discard them from 'allowed'.
02100      */
02101     for (i = 0; i < gwlist_len(denied); i++) {
02102         receiv = gwlist_get(denied, i);
02103         del = gwlist_delete_matching(allowed, receiv, octstr_item_match);
02104     }
02105 
02106     /* have all receivers been denied by list rules?! */
02107     if (gwlist_len(allowed) == 0) {
02108         returnerror = octstr_create("Number(s) has/have been denied by white- and/or black-lists.");
02109         goto field_error;
02110     }
02111 
02112     if (urltrans_faked_sender(t) != NULL) {
02113     /* discard previous from */
02114     newfrom = octstr_duplicate(urltrans_faked_sender(t));
02115     } else if (octstr_len(from) > 0) {
02116     newfrom = octstr_duplicate(from);
02117     } else if (urltrans_default_sender(t) != NULL) {
02118     newfrom = octstr_duplicate(urltrans_default_sender(t));
02119     } else if (global_sender != NULL) {
02120     newfrom = octstr_duplicate(global_sender);
02121     } else {
02122     returnerror = octstr_create("Sender missing and no global set, rejected");
02123     goto field_error;
02124     }
02125 
02126     info(0, "sendsms sender:<%s:%s> (%s) to:<%s> msg:<%s>",
02127          octstr_get_cstr(urltrans_username(t)),
02128          octstr_get_cstr(newfrom),
02129          octstr_get_cstr(client_ip),
02130          ( to == NULL ? "multi-cast" : octstr_get_cstr(to) ),
02131          ( text == NULL ? "" : octstr_get_cstr(text) ));
02132     
02133     /*
02134      * Create the msg structure and fill the types. Note that sms.receiver
02135      * and sms.time are set in the multi-cast support loop below.
02136      */
02137     msg = msg_create(sms);
02138     
02139     msg->sms.service = octstr_duplicate(urltrans_name(t));
02140     msg->sms.sms_type = mt_push;
02141     msg->sms.sender = octstr_duplicate(newfrom);
02142     if(octstr_len(account)) {
02143     if(octstr_len(account) <= 32 && 
02144        octstr_search_chars(account, octstr_imm("[]\n\r"), 0) == -1) {
02145         msg->sms.account = account ? octstr_duplicate(account) : NULL;
02146     } else {
02147         returnerror = octstr_create("Account field misformed, rejected");
02148         goto field_error;
02149     }
02150     }
02151     msg->sms.msgdata = text ? octstr_duplicate(text) : octstr_create("");
02152     msg->sms.udhdata = udh ? octstr_duplicate(udh) : octstr_create("");
02153     
02154     if (octstr_len(binfo))
02155         msg->sms.binfo = octstr_duplicate(binfo);
02156 
02157     if(octstr_len(dlr_url)) {
02158     if(octstr_len(dlr_url) < 8) { /* http(s):// */
02159         returnerror = octstr_create("DLR-URL field misformed, rejected");
02160         goto field_error;
02161     } else {
02162         Octstr *tmp;
02163         tmp = octstr_copy(dlr_url, 0, 7);
02164         if(octstr_case_compare(tmp, octstr_imm("http://")) == 0) {
02165         msg->sms.dlr_url = octstr_duplicate(dlr_url);
02166         } else {
02167         O_DESTROY(tmp);
02168         tmp = octstr_copy(dlr_url, 0, 8);
02169         if(octstr_case_compare(tmp, octstr_imm("https://")) != 0) {
02170             returnerror = octstr_create("DLR-URL field misformed, rejected");
02171             O_DESTROY(tmp);
02172             goto field_error;
02173         }
02174 #ifdef HAVE_LIBSSL
02175         msg->sms.dlr_url = octstr_duplicate(dlr_url);
02176 #else /* HAVE_LIBSSL */
02177         else {    
02178             warning(0, "DLR-URL with https but SSL not supported, url is <%s>",
02179                 octstr_get_cstr(dlr_url));
02180         }
02181 #endif /* HAVE_LIBSSL */
02182         }
02183         O_DESTROY(tmp);
02184     }
02185     } else {
02186     msg->sms.dlr_url = octstr_create("");
02187     }
02188 
02189     if ( dlr_mask < -1 || dlr_mask > 31 ) { /* 00011111 */
02190     returnerror = octstr_create("DLR-Mask field misformed, rejected");
02191     goto field_error;
02192     }
02193     msg->sms.dlr_mask = dlr_mask;
02194     
02195     if ( mclass < -1 || mclass > 3 ) {
02196     returnerror = octstr_create("MClass field misformed, rejected");
02197     goto field_error;
02198     }
02199     msg->sms.mclass = mclass;
02200     
02201     if ( pid < -1 || pid > 255 ) {
02202     returnerror = octstr_create("PID field misformed, rejected");
02203     goto field_error;
02204     }
02205     msg->sms.pid = pid;
02206 
02207     if ( rpi < -1 || rpi > 2) {
02208     returnerror = octstr_create("RPI field misformed, rejected");
02209     goto field_error;
02210     }
02211     msg->sms.rpi = rpi;
02212     
02213     if ( alt_dcs < -1 || alt_dcs > 1 ) {
02214     returnerror = octstr_create("Alt-DCS field misformed, rejected");
02215     goto field_error;
02216     }
02217     msg->sms.alt_dcs = alt_dcs;
02218     
02219     if ( mwi < -1 || mwi > 7 ) {
02220     returnerror = octstr_create("MWI field misformed, rejected");
02221     goto field_error;
02222     }
02223     msg->sms.mwi = mwi;
02224 
02225     if ( coding < -1 || coding > 2 ) {
02226     returnerror = octstr_create("Coding field misformed, rejected");
02227     goto field_error;
02228     }
02229     msg->sms.coding = coding;
02230 
02231     if ( compress < -1 || compress > 1 ) {
02232     returnerror = octstr_create("Compress field misformed, rejected");
02233     goto field_error;
02234     }
02235     msg->sms.compress = compress;
02236 
02237     /* Compatibility Mode */
02238     if ( msg->sms.coding == DC_UNDEF) {
02239     if(octstr_len(udh))
02240       msg->sms.coding = DC_8BIT;
02241     else
02242       msg->sms.coding = DC_7BIT;
02243     }
02244     
02245 
02246     if ( validity < -1 ) {
02247     returnerror = octstr_create("Validity field misformed, rejected");
02248     goto field_error;
02249     }
02250     msg->sms.validity = validity;
02251 
02252     if ( deferred < -1 ) {
02253     returnerror = octstr_create("Deferred field misformed, rejected");
02254     goto field_error;
02255     }
02256     msg->sms.deferred = deferred;
02257     
02258     if (priority != SMS_PARAM_UNDEFINED && (priority < 0 || priority > 3)) {
02259         returnerror = octstr_create("Priority field misformed, rejected");
02260         goto field_error;
02261     }
02262     msg->sms.priority = priority;
02263 
02264 
02265     /* new smsc-id argument - we should check this one, if able,
02266        but that's advanced logics -- Kalle */
02267     
02268     if (urltrans_forced_smsc(t)) {
02269     msg->sms.smsc_id = octstr_duplicate(urltrans_forced_smsc(t));
02270     if (smsc)
02271         info(0, "send-sms request smsc id ignored, "
02272                 "as smsc id forced to %s",
02273             octstr_get_cstr(urltrans_forced_smsc(t)));
02274     } else if (smsc) {
02275     msg->sms.smsc_id = octstr_duplicate(smsc);
02276     } else if (urltrans_default_smsc(t)) {
02277     msg->sms.smsc_id = octstr_duplicate(urltrans_default_smsc(t));
02278     } else
02279     msg->sms.smsc_id = NULL;
02280 
02281     if (charset_processing(charset, msg->sms.msgdata, msg->sms.coding) == -1) {
02282     returnerror = octstr_create("Charset or body misformed, rejected");
02283     goto field_error;
02284     }
02285 
02286     msg->sms.receiver = NULL;
02287 
02288     /* 
02289      * All checks are done, now add multi-cast request support by
02290      * looping through 'allowed'. This should work for any
02291      * number of receivers within 'to'. If the message fails append
02292      * it to 'failed_id'.
02293      */
02294     failed_id = gwlist_create();
02295 
02296     if (!immediate_sendsms_reply) {
02297         stored_uuid = store_uuid(msg);
02298         dict_put(client_dict, stored_uuid, client);
02299     }
02300 
02301     while ((receiv = gwlist_extract_first(allowed)) != NULL) {
02302 
02303     O_DESTROY(msg->sms.receiver);
02304         msg->sms.receiver = octstr_duplicate(receiv);
02305 
02306         msg->sms.time = time(NULL);
02307         /* send the message and return number of splits */
02308         ret = send_message(t, msg);
02309 
02310         if (ret == -1) {
02311             /* add the receiver to the failed list */
02312             gwlist_append(failed_id, receiv);
02313         } else {
02314             /* log the sending as successful for this particular message */
02315             alog("send-SMS request added - sender:%s:%s %s target:%s request: '%s'",
02316                  octstr_get_cstr(urltrans_username(t)),
02317                  octstr_get_cstr(newfrom), octstr_get_cstr(client_ip),
02318                  octstr_get_cstr(receiv),
02319                  udh == NULL ? ( text == NULL ? "" : octstr_get_cstr(text) ) : "<< UDH >>");
02320         }
02321     }
02322 
02323     if (gwlist_len(failed_id) > 0)
02324     goto transmit_error;
02325     
02326     *status = HTTP_ACCEPTED;
02327     returnerror = octstr_create("Sent.");
02328 
02329     /* 
02330      * Append all denied receivers to the returned body in case this is
02331      * a multi-cast send request
02332      */
02333     if (gwlist_len(denied) > 0) {
02334         octstr_format_append(returnerror, " Denied receivers are:");
02335         while ((receiv = gwlist_extract_first(denied)) != NULL) {
02336             octstr_format_append(returnerror, " %s", octstr_get_cstr(receiv));
02337         }
02338     }
02339 
02340     /*
02341      * Append number of splits to returned body. 
02342      * This may be used by the calling client.
02343      */
02344     if (ret > 1) 
02345         octstr_format_append(returnerror, " Message splits: %d", ret);
02346 
02347 cleanup:
02348     octstr_destroy(stored_uuid);
02349     gwlist_destroy(failed_id, NULL);
02350     gwlist_destroy(allowed, NULL);
02351     gwlist_destroy(denied, NULL);
02352     gwlist_destroy(receiver, octstr_destroy_item);
02353     octstr_destroy(newfrom);
02354     msg_destroy(msg);
02355 
02356     return returnerror;
02357     
02358 
02359 field_error:
02360     alog("send-SMS request failed - %s",
02361             octstr_get_cstr(returnerror));
02362     *status = HTTP_BAD_REQUEST;
02363 
02364     goto cleanup;
02365 
02366 transmit_error:
02367     error(0, "sendsms_request: failed");
02368     *status = HTTP_INTERNAL_SERVER_ERROR;
02369     returnerror = octstr_create("Sending failed.");
02370 
02371     if (!immediate_sendsms_reply)
02372         dict_remove(client_dict, stored_uuid);
02373 
02374     /* 
02375      * Append all receivers to the returned body in case this is
02376      * a multi-cast send request
02377      */
02378     if (no_recv > 1) {
02379         octstr_format_append(returnerror, " Failed receivers are:");
02380         while ((receiv = gwlist_extract_first(failed_id)) != NULL) {
02381             octstr_format_append(returnerror, " %s", octstr_get_cstr(receiv));
02382         }
02383     }
02384 
02385     goto cleanup;
02386 }

Here is the call graph for this function:

Octstr* smsbox_req_sendota List list,
Octstr client_ip,
int *  status,
HTTPClient client
[static]
 

Definition at line 2781 of file smsbox.c.

References authorise_user(), cfg, cfg_get, cfg_get_multi_group(), client_dict, debug(), dict_put(), dict_remove(), error(), global_sender, gwlist_destroy(), gwlist_extract_first(), http_cgi_variable(), info(), msg_destroy(), octstr_compare(), octstr_create, octstr_destroy(), octstr_dump, octstr_duplicate, octstr_format(), octstr_get_cstr, octstr_imm(), octstr_len(), ota_pack_message(), ota_tokenize_bookmarks(), ota_tokenize_settings(), send_message(), sendota_url, store_uuid(), urltrans_default_sender(), urltrans_default_smsc(), urltrans_faked_sender(), and urltrans_forced_smsc().

Referenced by sendsms_thread().

02783 {
02784     Octstr *id, *from, *phonenumber, *smsc, *ota_doc, *doc_type, *account;
02785     CfgGroup *grp;
02786     Octstr *returnerror;
02787     Octstr *stored_uuid = NULL;
02788     List *grplist;
02789     Octstr *p;
02790     URLTranslation *t;
02791     Msg *msg;
02792     int ret, ota_type;
02793     
02794     id = phonenumber = smsc = account = NULL;
02795 
02796     /* check the username and password */
02797     t = authorise_user(list, client_ip);
02798     if (t == NULL) {
02799     *status = HTTP_FORBIDDEN;
02800     return octstr_create("Authorization failed for sendota");
02801     }
02802     
02803     if ((phonenumber = http_cgi_variable(list, "to")) == NULL) {
02804         if ((phonenumber = http_cgi_variable(list, "phonenumber")) == NULL) {
02805             error(0, "%s needs a valid phone number.", octstr_get_cstr(sendota_url));
02806             *status = HTTP_BAD_REQUEST;
02807             return octstr_create("Wrong sendota args.");
02808         }
02809     }
02810 
02811     if (urltrans_faked_sender(t) != NULL) {
02812     from = octstr_duplicate(urltrans_faked_sender(t));
02813     } else if ((from = http_cgi_variable(list, "from")) != NULL &&
02814            octstr_len(from) > 0) {
02815     from = octstr_duplicate(from);
02816     } else if (urltrans_default_sender(t) != NULL) {
02817     from = octstr_duplicate(urltrans_default_sender(t));
02818     } else if (global_sender != NULL) {
02819     from = octstr_duplicate(global_sender);
02820     } else {
02821     *status = HTTP_BAD_REQUEST;
02822     return octstr_create("Sender missing and no global set, rejected");
02823     }
02824         
02825     /* check does we have an external XML source for configuration */
02826     if ((ota_doc = http_cgi_variable(list, "text")) != NULL) {
02827         Octstr *sec, *pin;
02828         
02829         /*
02830          * We are doing the XML OTA compiler mode for this request
02831          */
02832         debug("sms", 0, "OTA service with XML document");
02833         ota_doc = octstr_duplicate(ota_doc);
02834         if ((doc_type = http_cgi_variable(list, "type")) == NULL)
02835             doc_type = octstr_format("%s", "settings");
02836         else 
02837             doc_type = octstr_duplicate(doc_type);
02838         if ((sec = http_cgi_variable(list, "sec")) == NULL)
02839             sec = octstr_create("USERPIN");
02840         else 
02841             sec = octstr_duplicate(sec);
02842         if ((pin = http_cgi_variable(list, "pin")) == NULL)
02843             pin = octstr_create("12345");
02844         else
02845             pin = octstr_duplicate(pin);
02846 
02847         if ((ret = ota_pack_message(&msg, ota_doc, doc_type, from, 
02848                                 phonenumber, sec, pin)) < 0) {
02849             *status = HTTP_BAD_REQUEST;
02850             msg_destroy(msg);
02851             if (ret == -2)
02852                 return octstr_create("Erroneous document type, cannot"
02853                                      " compile\n");
02854             else if (ret == -1)
02855             return octstr_create("Erroneous ota source, cannot compile\n");
02856         }
02857 
02858         goto send;
02859 
02860     } else {
02861 
02862         /* 
02863          * We are doing the ota-settings or ota-bookmark group mode
02864          * for this request.
02865          *
02866          * Check if a ota-setting ID has been given and decide which OTA
02867          * properties to be send to the client otherwise try to find a
02868          * ota-bookmark ID. If none is found then send the default 
02869          * ota-setting group, which is the first within the config file.
02870          */
02871         id = http_cgi_variable(list, "otaid");
02872     
02873         grplist = cfg_get_multi_group(cfg, octstr_imm("ota-setting"));
02874         while (grplist && (grp = gwlist_extract_first(grplist)) != NULL) {
02875             p = cfg_get(grp, octstr_imm("ota-id"));
02876             if (id == NULL || (p != NULL && octstr_compare(p, id) == 0)) {
02877                 ota_type = 1;
02878                 goto found;
02879             }
02880             octstr_destroy(p);
02881         }
02882         gwlist_destroy(grplist, NULL);
02883         
02884         grplist = cfg_get_multi_group(cfg, octstr_imm("ota-bookmark"));
02885         while (grplist && (grp = gwlist_extract_first(grplist)) != NULL) {
02886             p = cfg_get(grp, octstr_imm("ota-id"));
02887             if (id == NULL || (p != NULL && octstr_compare(p, id) == 0)) {
02888                 ota_type = 0;             
02889                 goto found;
02890             }
02891             octstr_destroy(p);
02892         }
02893         gwlist_destroy(grplist, NULL);
02894         
02895         if (id != NULL)
02896             error(0, "%s can't find any ota-setting or ota-bookmark group with ota-id '%s'.", 
02897                  octstr_get_cstr(sendota_url), octstr_get_cstr(id));
02898         else
02899            error(0, "%s can't find any ota-setting group.", octstr_get_cstr(sendota_url));
02900         octstr_destroy(from);
02901         *status = HTTP_BAD_REQUEST;
02902         return octstr_create("Missing ota-setting or ota-bookmark group.");
02903     }
02904     
02905 found:
02906     octstr_destroy(p);
02907     gwlist_destroy(grplist, NULL);
02908 
02909     /* tokenize the OTA settings or bookmarks group and return the message */
02910     if (ota_type)
02911         msg = ota_tokenize_settings(grp, from, phonenumber);
02912     else
02913         msg = ota_tokenize_bookmarks(grp, from, phonenumber);
02914 
02915 send: 
02916     /* we still need to check if smsc is forced for this */
02917     smsc = http_cgi_variable(list, "smsc");
02918     if (urltrans_forced_smsc(t)) {
02919         msg->sms.smsc_id = octstr_duplicate(urltrans_forced_smsc(t));
02920         if (smsc)
02921             info(0, "send-sms request smsc id ignored, as smsc id forced to %s",
02922                  octstr_get_cstr(urltrans_forced_smsc(t)));
02923     } else if (smsc) {
02924         msg->sms.smsc_id = octstr_duplicate(smsc);
02925     } else if (urltrans_default_smsc(t)) {
02926         msg->sms.smsc_id = octstr_duplicate(urltrans_default_smsc(t));
02927     } else
02928         msg->sms.smsc_id = NULL;
02929 
02930     account = http_cgi_variable(list, "account");
02931     if (octstr_len(account) > 0)
02932         msg->sms.account = octstr_duplicate(account);
02933 
02934     octstr_dump(msg->sms.msgdata, 0);
02935 
02936     info(0, "%s <%s> <%s>", octstr_get_cstr(sendota_url), 
02937          id ? octstr_get_cstr(id) : "<default>", octstr_get_cstr(phonenumber));
02938 
02939     if (!immediate_sendsms_reply) {
02940         stored_uuid = store_uuid(msg);
02941         dict_put(client_dict, stored_uuid, client);
02942     }
02943 
02944     ret = send_message(t, msg); 
02945 
02946     if (ret == -1) {
02947         error(0, "sendota_request: failed");
02948         *status = HTTP_INTERNAL_SERVER_ERROR;
02949         returnerror = octstr_create("Sending failed.");
02950         dict_remove(client_dict, stored_uuid);
02951     } else {
02952         *status = HTTP_ACCEPTED;
02953         returnerror = octstr_create("Sent.");
02954     }
02955 
02956     msg_destroy(msg);
02957     octstr_destroy(stored_uuid);
02958 
02959     return returnerror;
02960 }

Here is the call graph for this function:

Octstr* smsbox_req_sendsms List args,
Octstr client_ip,
int *  status,
HTTPClient client
[static]
 

Definition at line 2462 of file smsbox.c.

References authorise_user(), charset, error(), http_cgi_variable(), octstr_create, octstr_get_cstr, octstr_len(), sendsms_url, smsbox_req_handle(), text, and warning().

Referenced by sendsms_thread().

02464 {
02465     URLTranslation *t = NULL;
02466     Octstr *tmp_string;
02467     Octstr *from, *to, *charset, *text, *udh, *smsc, *dlr_url, *account;
02468     Octstr *binfo;
02469     int dlr_mask, mclass, mwi, coding, compress, validity, deferred, pid;
02470     int alt_dcs, rpi, priority;
02471 
02472     from = to = udh = text = smsc = account = dlr_url = charset = binfo = NULL;
02473     mclass = mwi = coding = compress = validity = deferred = dlr_mask = 
02474         pid = alt_dcs = rpi = priority = SMS_PARAM_UNDEFINED;
02475  
02476     /* check the username and password */
02477     t = authorise_user(args, client_ip);
02478     if (t == NULL) {
02479     *status = HTTP_FORBIDDEN;
02480     return octstr_create("Authorization failed for sendsms");
02481     }
02482     
02483     udh = http_cgi_variable(args, "udh");
02484     text = http_cgi_variable(args, "text");
02485     charset = http_cgi_variable(args, "charset");
02486     smsc = http_cgi_variable(args, "smsc");
02487     from = http_cgi_variable(args, "from");
02488     to = http_cgi_variable(args, "to");
02489     account = http_cgi_variable(args, "account");
02490     binfo = http_cgi_variable(args, "binfo");
02491     dlr_url = http_cgi_variable(args, "dlr-url");
02492     if(dlr_url == NULL) { /* deprecated dlrurl without "-" */
02493     dlr_url = http_cgi_variable(args, "dlrurl");
02494     if(dlr_url != NULL)
02495         warning(0, "<dlrurl> field used and deprecated. Please use dlr-url instead.");
02496     }
02497     tmp_string = http_cgi_variable(args, "dlr-mask");
02498     if(tmp_string == NULL) { /* deprecated dlrmask without "-" */
02499     tmp_string = http_cgi_variable(args, "dlrmask");
02500     if(tmp_string != NULL)
02501         warning(0, "<dlrmask> field used and deprecated. Please use dlr-mask instead.");
02502     }
02503     if(tmp_string != NULL)
02504         sscanf(octstr_get_cstr(tmp_string),"%d", &dlr_mask);
02505 
02506     tmp_string = http_cgi_variable(args, "mclass");
02507     if(tmp_string != NULL)
02508         sscanf(octstr_get_cstr(tmp_string),"%d", &mclass);
02509 
02510     tmp_string = http_cgi_variable(args, "pid");
02511     if(tmp_string != NULL)
02512         sscanf(octstr_get_cstr(tmp_string),"%d", &pid);
02513 
02514     tmp_string = http_cgi_variable(args, "rpi");
02515     if(tmp_string != NULL)
02516         sscanf(octstr_get_cstr(tmp_string),"%d", &rpi);
02517 
02518     tmp_string = http_cgi_variable(args, "alt-dcs");
02519     if(tmp_string != NULL)
02520         sscanf(octstr_get_cstr(tmp_string),"%d", &alt_dcs);
02521 
02522     tmp_string = http_cgi_variable(args, "mwi");
02523     if(tmp_string != NULL)
02524         sscanf(octstr_get_cstr(tmp_string),"%d", &mwi);
02525 
02526     tmp_string = http_cgi_variable(args, "coding");
02527     if(tmp_string != NULL)
02528         sscanf(octstr_get_cstr(tmp_string),"%d", &coding);
02529 
02530     tmp_string = http_cgi_variable(args, "compress");
02531     if(tmp_string != NULL)
02532         sscanf(octstr_get_cstr(tmp_string),"%d", &compress);
02533 
02534     tmp_string = http_cgi_variable(args, "validity");
02535     if(tmp_string != NULL)
02536         sscanf(octstr_get_cstr(tmp_string),"%d", &validity);
02537 
02538     tmp_string = http_cgi_variable(args, "deferred");
02539     if(tmp_string != NULL)
02540         sscanf(octstr_get_cstr(tmp_string),"%d", &deferred);
02541 
02542     tmp_string = http_cgi_variable(args, "priority");
02543     if(tmp_string != NULL)
02544         sscanf(octstr_get_cstr(tmp_string),"%d", &priority);
02545     
02546     /*
02547      * we required "to" to be defined
02548      */
02549     if (to == NULL) {
02550     error(0, "%s got insufficient headers (<to> is NULL)",
02551           octstr_get_cstr(sendsms_url));
02552     *status = HTTP_BAD_REQUEST;
02553     return octstr_create("Missing receiver number, rejected");
02554     } 
02555     else if (octstr_len(to) == 0) {
02556     error(0, "%s got empty <to> cgi variable", octstr_get_cstr(sendsms_url));
02557     *status = HTTP_BAD_REQUEST;
02558     return octstr_create("Empty receiver number not allowed, rejected");
02559     }
02560 
02561     return smsbox_req_handle(t, client_ip, client, from, to, text, charset, udh,
02562                  smsc, mclass, mwi, coding, compress, validity, 
02563                  deferred, status, dlr_mask, dlr_url, account,
02564                  pid, alt_dcs, rpi, NULL, binfo, priority);
02565     
02566 }

Here is the call graph for this function:

Octstr* smsbox_sendota_post List headers,
Octstr body,
Octstr client_ip,
int *  status,
HTTPClient client
[static]
 

Definition at line 2971 of file smsbox.c.

References authorise_username(), charset, client_dict, dict_put(), dict_remove(), error(), global_sender, gwlist_len(), http_header_get(), http_header_get_content_type(), info(), msg_destroy(), name, octstr_case_compare(), octstr_create, octstr_destroy(), octstr_duplicate, octstr_format(), octstr_get_cstr, octstr_imm(), octstr_len(), octstr_strip_blanks(), ota_pack_message(), send_message(), sendota_url, store_uuid(), type, urltrans_default_sender(), urltrans_default_smsc(), urltrans_faked_sender(), and urltrans_forced_smsc().

Referenced by sendsms_thread().

02974 {
02975     Octstr *name, *val, *ret;
02976     Octstr *from, *to, *id, *user, *pass, *smsc;
02977     Octstr *type, *charset, *doc_type, *ota_doc, *sec, *pin;
02978     Octstr *stored_uuid = NULL;
02979     URLTranslation *t;
02980     Msg *msg;
02981     long l;
02982     int r;
02983 
02984     id = from = to = user = pass = smsc = NULL;
02985     doc_type = ota_doc = sec = pin = NULL;
02986 
02987     /* 
02988      * process all special HTTP headers 
02989      * 
02990      * XXX can't we do this better? 
02991      * Obviously http_header_find_first() does this
02992      */
02993     for (l = 0; l < gwlist_len(headers); l++) {
02994         http_header_get(headers, l, &name, &val);
02995 
02996         if (octstr_case_compare(name, octstr_imm("X-Kannel-OTA-ID")) == 0) {
02997             id = octstr_duplicate(val);
02998             octstr_strip_blanks(id);
02999         }
03000         else if (octstr_case_compare(name, octstr_imm("X-Kannel-From")) == 0) {
03001             from = octstr_duplicate(val);
03002             octstr_strip_blanks(from);
03003         }
03004         else if (octstr_case_compare(name, octstr_imm("X-Kannel-To")) == 0) {
03005             to = octstr_duplicate(val);
03006             octstr_strip_blanks(to);
03007         }
03008         else if (octstr_case_compare(name, octstr_imm("X-Kannel-Username")) == 0) {
03009             user = octstr_duplicate(val);
03010             octstr_strip_blanks(user);
03011         }
03012         else if (octstr_case_compare(name, octstr_imm("X-Kannel-Password")) == 0) {
03013             pass = octstr_duplicate(val);
03014             octstr_strip_blanks(pass);
03015         }
03016         else if (octstr_case_compare(name, octstr_imm("X-Kannel-SMSC")) == 0) {
03017             smsc = octstr_duplicate(val);
03018             octstr_strip_blanks(smsc);
03019         }
03020         else if (octstr_case_compare(name, octstr_imm("X-Kannel-SEC")) == 0) {
03021             sec = octstr_duplicate(val);
03022             octstr_strip_blanks(sec);
03023         }
03024         else if (octstr_case_compare(name, octstr_imm("X-Kannel-PIN")) == 0) {
03025             pin = octstr_duplicate(val);
03026             octstr_strip_blanks(pin);
03027         }
03028     }
03029 
03030     /* apply defaults */
03031     if (!sec)
03032         sec =  octstr_imm("USERPIN");
03033     if (!pin)
03034         pin = octstr_imm("1234");
03035 
03036     /* check the username and password */
03037     t = authorise_username(user, pass, client_ip);
03038     if (t == NULL) {
03039        *status = HTTP_FORBIDDEN;
03040        ret = octstr_create("Authorization failed for sendota");
03041     }
03042     /* let's see if we have at least a target msisdn */
03043     else if (to == NULL) {
03044        error(0, "%s needs a valid phone number.", octstr_get_cstr(sendota_url));
03045        *status = HTTP_BAD_REQUEST;
03046        ret = octstr_create("Wrong sendota args.");
03047     } else {
03048 
03049     if (urltrans_faked_sender(t) != NULL) {
03050         from = octstr_duplicate(urltrans_faked_sender(t));
03051     } 
03052     else if (from != NULL && octstr_len(from) > 0) {
03053     } 
03054     else if (urltrans_default_sender(t) != NULL) {
03055         from = octstr_duplicate(urltrans_default_sender(t));
03056     } 
03057     else if (global_sender != NULL) {
03058         from = octstr_duplicate(global_sender);
03059     } 
03060     else {
03061         *status = HTTP_BAD_REQUEST;
03062         ret = octstr_create("Sender missing and no global set, rejected");
03063         goto error;
03064     }
03065 
03066     /*
03067      * get the content-type of the body document 
03068      */
03069     http_header_get_content_type(headers, &type, &charset);
03070 
03071     if (octstr_case_compare(type, 
03072         octstr_imm("application/x-wap-prov.browser-settings")) == 0) {
03073         doc_type = octstr_format("%s", "settings");
03074     } 
03075     else if (octstr_case_compare(type, 
03076              octstr_imm("application/x-wap-prov.browser-bookmarks")) == 0) {
03077         doc_type = octstr_format("%s", "bookmarks");
03078     }
03079     else if (octstr_case_compare(type, 
03080              octstr_imm("text/vnd.wap.connectivity-xml")) == 0) {
03081         doc_type = octstr_format("%s", "oma-settings");
03082     }
03083 
03084     if (doc_type == NULL) {
03085         error(0, "%s got weird content type %s", octstr_get_cstr(sendota_url),
03086               octstr_get_cstr(type));
03087         *status = HTTP_UNSUPPORTED_MEDIA_TYPE;
03088         ret = octstr_create("Unsupported content-type, rejected");
03089     } else {
03090 
03091         /* 
03092          * ok, this is want we expect
03093          * now lets compile the whole thing 
03094          */
03095         ota_doc = octstr_duplicate(body);
03096 
03097         if ((r = ota_pack_message(&msg, ota_doc, doc_type, from, to, sec, pin)) < 0) {
03098         *status = HTTP_BAD_REQUEST;
03099         msg_destroy(msg);
03100         if (r == -2) {
03101             ret = octstr_create("Erroneous document type, cannot"
03102                     " compile\n");
03103             goto error;
03104         }
03105         else if (r == -1) {
03106             ret = octstr_create("Erroneous ota source, cannot compile\n");
03107             goto error;
03108         }
03109         }
03110 
03111         /* we still need to check if smsc is forced for this */
03112         if (urltrans_forced_smsc(t)) {
03113         msg->sms.smsc_id = octstr_duplicate(urltrans_forced_smsc(t));
03114         if (smsc)
03115             info(0, "send-sms request smsc id ignored, as smsc id forced to %s",
03116              octstr_get_cstr(urltrans_forced_smsc(t)));
03117         } else if (smsc) {
03118         msg->sms.smsc_id = octstr_duplicate(smsc);
03119         } else if (urltrans_default_smsc(t)) {
03120         msg->sms.smsc_id = octstr_duplicate(urltrans_default_smsc(t));
03121         } else
03122         msg->sms.smsc_id = NULL;
03123 
03124         info(0, "%s <%s> <%s>", octstr_get_cstr(sendota_url), 
03125          id ? octstr_get_cstr(id) : "XML", octstr_get_cstr(to));
03126     
03127 
03128         if (!immediate_sendsms_reply) {
03129             stored_uuid = store_uuid(msg);
03130             dict_put(client_dict, stored_uuid, client);
03131         }
03132 
03133         r = send_message(t, msg); 
03134 
03135         if (r == -1) {
03136             error(0, "sendota_request: failed");
03137             *status = HTTP_INTERNAL_SERVER_ERROR;
03138             ret = octstr_create("Sending failed.");
03139             if (!immediate_sendsms_reply) 
03140                 dict_remove(client_dict, stored_uuid);
03141        } else  {
03142             *status = HTTP_ACCEPTED;
03143             ret = octstr_create("Sent.");
03144         }
03145 
03146        msg_destroy(msg);
03147        octstr_destroy(stored_uuid);
03148 
03149     }
03150     }    
03151     
03152 error:
03153     octstr_destroy(user);
03154     octstr_destroy(pass);
03155     octstr_destroy(smsc);
03156 
03157     return ret;
03158 }

Here is the call graph for this function:

Octstr* smsbox_sendsms_post List headers,
Octstr body,
Octstr client_ip,
int *  status,
HTTPClient client
[static]
 

Definition at line 2573 of file smsbox.c.

References authorise_username(), charset, charset_processing(), error(), get_x_kannel_from_headers(), get_x_kannel_from_xml(), html_to_sms(), http_header_get_content_type(), mt_push, octstr_case_compare(), octstr_create, octstr_destroy(), octstr_get_cstr, octstr_imm(), octstr_len(), octstr_strip_blanks(), sendsms_url, smsbox_req_handle(), text, and type.

Referenced by sendsms_thread().

02576 {
02577     URLTranslation *t = NULL;
02578     Octstr *user, *pass, *ret, *type;
02579     List *tolist;
02580     Octstr *text_html, *text_plain, *text_wml, *text_xml, *octet_stream;
02581     Octstr *text;
02582     Octstr *from, *to, *udh, *smsc, *charset, *dlr_url, *account, *binfo;
02583     int dlr_mask, mclass, mwi, coding, compress, validity, deferred;
02584     int pid, alt_dcs, rpi, priority;
02585  
02586     text_html = octstr_imm("text/html");
02587     text_wml = octstr_imm("text/vnd.wap.wml");
02588     text_plain = octstr_imm("text/plain");
02589     text_xml = octstr_imm("text/xml");
02590     octet_stream = octstr_imm("application/octet-stream");
02591 
02592     user = pass = ret = type = NULL;
02593     tolist = NULL;
02594     from = to = udh = smsc = account = dlr_url = charset = binfo = NULL;
02595     mclass = mwi = coding = compress = validity = deferred = dlr_mask = 
02596         pid = alt_dcs = rpi = priority = SMS_PARAM_UNDEFINED;
02597  
02598     http_header_get_content_type(headers, &type, &charset);
02599     if (octstr_case_compare(type, text_html) == 0 ||
02600     octstr_case_compare(type, text_wml) == 0) {
02601     text = html_to_sms(body);
02602     octstr_strip_blanks(text);
02603     octstr_destroy(body);
02604     body = text;
02605     get_x_kannel_from_headers(headers, &from, &to, &udh,
02606                   &user, &pass, &smsc, &mclass, &mwi, 
02607                   &coding, &compress, &validity, 
02608                   &deferred, &dlr_mask, &dlr_url, 
02609                   &account, &pid, &alt_dcs, &rpi,
02610                   &binfo, &priority);
02611     } else if (octstr_case_compare(type, text_plain) == 0 ||
02612                octstr_case_compare(type, octet_stream) == 0) {
02613     get_x_kannel_from_headers(headers, &from, &to, &udh,
02614                   &user, &pass, &smsc, &mclass, &mwi, 
02615                   &coding, &compress, &validity, 
02616                   &deferred, &dlr_mask, &dlr_url, 
02617                   &account, &pid, &alt_dcs, &rpi,
02618                   &binfo, &priority);
02619     } else if (octstr_case_compare(type, text_xml) == 0) {
02620     get_x_kannel_from_xml(mt_push, &type, &body, headers, 
02621                               &from, &to, &udh, &user, &pass, &smsc, &mclass, 
02622                   &mwi, &coding, &compress, &validity, &deferred,
02623                   &dlr_mask, &dlr_url, &account, &pid, &alt_dcs,
02624                   &rpi, &tolist, &charset, &binfo, &priority);
02625     } else {
02626     *status = HTTP_BAD_REQUEST;
02627     ret = octstr_create("Invalid content-type");
02628     goto error;
02629     }
02630 
02631     if (charset_processing(charset, body, coding) == -1) {
02632     *status = HTTP_BAD_REQUEST;
02633     ret = octstr_create("Invalid charset");
02634     goto error2;
02635     }
02636 
02637     /* check the username and password */
02638     t = authorise_username(user, pass, client_ip);
02639     if (t == NULL) {
02640     *status = HTTP_FORBIDDEN;
02641     ret = octstr_create("Authorization failed for sendsms");
02642     }
02643     else if (to == NULL && tolist == NULL) {
02644     error(0, "%s got insufficient headers (<to> and <tolist> are NULL)",
02645           octstr_get_cstr(sendsms_url));
02646     *status = HTTP_BAD_REQUEST;
02647     ret = octstr_create("Missing receiver(s) number(s), rejected");
02648     } 
02649     else if (to != NULL && octstr_len(to) == 0) {
02650     error(0, "%s got empty <to> cgi variable", octstr_get_cstr(sendsms_url));
02651     *status = HTTP_BAD_REQUEST;
02652     return octstr_create("Empty receiver number not allowed, rejected");
02653     } 
02654     else {
02655     if (octstr_case_compare(type,
02656                 octstr_imm("application/octet-stream")) == 0) {
02657         if (coding == DC_UNDEF)
02658         coding = DC_8BIT; /* XXX Force UCS-2 with DC Field */
02659     } else if (octstr_case_compare(type,
02660                        octstr_imm("text/plain")) == 0) {
02661         if (coding == DC_UNDEF)
02662         coding = DC_7BIT;
02663     } else {
02664         error(0, "%s got weird content type %s", octstr_get_cstr(sendsms_url),
02665           octstr_get_cstr(type));
02666         *status = HTTP_UNSUPPORTED_MEDIA_TYPE;
02667         ret = octstr_create("Unsupported content-type, rejected");
02668     }
02669 
02670     if (ret == NULL)
02671         ret = smsbox_req_handle(t, client_ip, client, from, to, body, charset,
02672                     udh, smsc, mclass, mwi, coding, compress, 
02673                     validity, deferred, status, dlr_mask, 
02674                     dlr_url, account, pid, alt_dcs, rpi, tolist,
02675                     binfo, priority);
02676 
02677     }
02678 error2:
02679     octstr_destroy(user);
02680     octstr_destroy(pass);
02681     octstr_destroy(from);
02682     octstr_destroy(to);
02683     octstr_destroy(udh);
02684     octstr_destroy(smsc);
02685     octstr_destroy(dlr_url);
02686     octstr_destroy(account);
02687     octstr_destroy(binfo);
02688 error:
02689     octstr_destroy(type);
02690     octstr_destroy(charset);
02691     return ret;
02692 }

Here is the call graph for this function:

Octstr* smsbox_xmlrpc_post List headers,
Octstr body,
Octstr client_ip,
int *  status
[static]
 

Definition at line 2706 of file smsbox.c.

References charset, error(), http_header_get_content_type(), octstr_case_compare(), octstr_destroy(), octstr_format(), octstr_get_cstr, octstr_imm(), type, xmlrpc_destroy_call, xmlrpc_get_call_name(), xmlrpc_parse_call, xmlrpc_parse_error(), xmlrpc_parse_status(), and XMLRPCDocument.

Referenced by sendsms_thread().

02708 {
02709     Octstr *ret, *type, *user, *pass;
02710     Octstr *from, *to, *udh, *smsc, *charset, *dlr_url, *account, *binfo;
02711     Octstr *output;
02712     Octstr *method_name;
02713     XMLRPCDocument *msg;
02714 
02715     int dlr_mask, mclass, mwi, coding, compress, validity, 
02716     deferred, pid, alt_dcs, rpi;
02717 
02718     from = to = udh = smsc = account = dlr_url = charset = binfo = NULL;
02719     mclass = mwi = coding = compress = validity = deferred = dlr_mask = 
02720         pid = alt_dcs = rpi = -1;
02721  
02722     user = pass = ret = NULL;
02723 
02724     /*
02725      * check if the content type is valid for this request
02726      */
02727     http_header_get_content_type(headers, &type, &charset);
02728     if (octstr_case_compare(type, octstr_imm("text/xml")) != 0) {
02729         error(0, "Unsupported content-type '%s'", octstr_get_cstr(type));
02730         *status = HTTP_BAD_REQUEST;
02731         ret = octstr_format("Unsupported content-type '%s'", octstr_get_cstr(type));
02732     } else {
02733 
02734         /*
02735          * parse the body of the request and check if it is a valid XML-RPC
02736          * structure
02737          */
02738         msg = xmlrpc_parse_call(body);
02739 
02740         if ((xmlrpc_parse_status(msg) != XMLRPC_COMPILE_OK) && 
02741             ((output = xmlrpc_parse_error(msg)) != NULL)) {
02742             /* parse failure */
02743             error(0, "%s", octstr_get_cstr(output));
02744             *status = HTTP_BAD_REQUEST;
02745             ret = octstr_format("%s", octstr_get_cstr(output));
02746             octstr_destroy(output);
02747         } else {
02748 
02749             /*
02750              * at least the structure has been valid, now check for the
02751              * required methodName and the required variables
02752              */
02753             if (octstr_case_compare((method_name = xmlrpc_get_call_name(msg)), 
02754                                     octstr_imm("sms.send")) != 0) {
02755                 error(0, "Unknown method name '%s'", octstr_get_cstr(method_name));
02756                 *status = HTTP_BAD_REQUEST;
02757                 ret = octstr_format("Unkown method name '%s'", 
02758                                     octstr_get_cstr(method_name));
02759             } else {
02760 
02761                 /*
02762                  * TODO: check for the required struct members
02763                  */
02764 
02765             }
02766         }
02767 
02768         xmlrpc_destroy_call(msg);
02769     }
02770     
02771     return ret;
02772 }

Here is the call graph for this function:

Octstr* store_uuid Msg msg  )  [static]
 

Definition at line 1929 of file smsbox.c.

References debug(), gw_assert, immediate_sendsms_reply, octstr_create, octstr_get_cstr, UUID_STR_LEN, and uuid_unparse().

Referenced by smsbox_req_handle(), smsbox_req_sendota(), and smsbox_sendota_post().

01930 {
01931     char id[UUID_STR_LEN + 1];
01932     Octstr *stored_uuid;
01933 
01934     gw_assert(msg != NULL);
01935     gw_assert(!immediate_sendsms_reply);
01936     
01937     uuid_unparse(msg->sms.id, id);
01938     stored_uuid = octstr_create(id);
01939 
01940     debug("sms.http", 0, "Stored UUID %s", octstr_get_cstr(stored_uuid));
01941 
01942     /* this octstr is then used to store the HTTP client into 
01943      * client_dict, if need to, in sendsms_thread */
01944 
01945     return stored_uuid;
01946 }

Here is the call graph for this function:

void strip_prefix_and_suffix Octstr html,
Octstr prefix,
Octstr suffix
[static]
 

Definition at line 482 of file smsbox.c.

References octstr_case_search(), octstr_delete(), octstr_len(), and octstr_truncate().

Referenced by url_result_thread().

00484 {
00485     long prefix_end, suffix_start;
00486 
00487     if (prefix == NULL || suffix == NULL)
00488         return;
00489     prefix_end = octstr_case_search(html, prefix, 0);
00490     if (prefix_end == -1)
00491         return;
00492     prefix_end += octstr_len(prefix);
00493     suffix_start = octstr_case_search(html, suffix, prefix_end);
00494     if (suffix_start == -1)
00495         return;
00496     octstr_delete(html, 0, prefix_end);
00497     octstr_truncate(html, suffix_start - prefix_end);
00498 }

Here is the call graph for this function:

void url_result_thread void *  arg  )  [static]
 

Definition at line 1092 of file smsbox.c.

References alog(), caller, charset, charset_processing(), error(), fill_message(), get_receiver(), get_x_kannel_from_headers(), get_x_kannel_from_xml(), gwlist_produce(), html_to_sms(), http_destroy_headers(), http_header_get_content_type(), HTTP_OK, http_receive_result, max_http_retries, max_pending_requests, msg_destroy(), mt_reply, octstr_case_compare(), octstr_destroy(), octstr_duplicate, octstr_get_cstr, octstr_imm(), octstr_strip_blanks(), remember_receiver(), reply_couldnotfetch, reply_couldnotrepresent, report_mo, semaphore_up(), send_message(), smsbox_http_requests, strip_prefix_and_suffix(), type, urltrans_prefix(), and urltrans_suffix().

Referenced by main().

01093 {
01094     Octstr *final_url, *req_body, *type, *replytext;
01095     List *reply_headers;
01096     int status, method;
01097     void *id;
01098     Msg *msg;
01099     URLTranslation *trans;
01100     Octstr *req_url;
01101     List *req_headers;
01102     Octstr *text_html, *text_plain, *text_wml, *text_xml;
01103     Octstr *octet_stream;
01104     int octets;
01105     unsigned long retries;
01106     unsigned int queued; /* indicate if processes reply is requeued */
01107 
01108     Octstr *reply_body, *charset;
01109     Octstr *udh, *from, *to, *dlr_url, *account, *smsc, *binfo;
01110     int dlr_mask, mclass, mwi, coding, compress, pid, alt_dcs, rpi;
01111     int validity, deferred, priority;
01112 
01113     text_html = octstr_imm("text/html");
01114     text_wml = octstr_imm("text/vnd.wap.wml");
01115     text_plain = octstr_imm("text/plain");
01116     text_xml = octstr_imm("text/xml");
01117     octet_stream = octstr_imm("application/octet-stream");
01118 
01119     for (;;) {
01120         queued = 0;
01121         id = http_receive_result(caller, &status, &final_url, &reply_headers,
01122                              &reply_body);
01123         semaphore_up(max_pending_requests);
01124         if (id == NULL)
01125             break;
01126 
01127     octets = 0;
01128         from = to = udh = smsc = dlr_url = account = binfo = charset = NULL;
01129         mclass = mwi = coding = compress = pid = alt_dcs = rpi = dlr_mask 
01130             = validity = deferred = priority = SMS_PARAM_UNDEFINED;
01131 
01132         get_receiver(id, &msg, &trans, &method, &req_url, &req_headers, &req_body, &retries);
01133 
01134         if (status == HTTP_OK || status == HTTP_ACCEPTED) {
01135             http_header_get_content_type(reply_headers, &type, &charset);
01136             if (octstr_case_compare(type, text_html) == 0 ||
01137                 octstr_case_compare(type, text_wml) == 0) {
01138                 if (trans != NULL)
01139                     strip_prefix_and_suffix(reply_body, urltrans_prefix(trans),
01140                                         urltrans_suffix(trans));
01141                 replytext = html_to_sms(reply_body);
01142                 octstr_strip_blanks(replytext);
01143                 get_x_kannel_from_headers(reply_headers, &from, &to, &udh,
01144                       NULL, NULL, &smsc, &mclass, &mwi,
01145                       &coding, &compress, &validity,
01146                       &deferred, &dlr_mask, &dlr_url,
01147                       &account, &pid, &alt_dcs, &rpi,
01148                       &binfo, &priority);
01149             } else if (octstr_case_compare(type, text_plain) == 0) {
01150                 replytext = octstr_duplicate(reply_body);
01151                 octstr_destroy(reply_body);
01152                 reply_body = NULL;
01153                 get_x_kannel_from_headers(reply_headers, &from, &to, &udh,
01154                       NULL, NULL, &smsc, &mclass, &mwi,
01155                       &coding, &compress, &validity,
01156                       &deferred, &dlr_mask, &dlr_url,
01157                       &account, &pid, &alt_dcs, &rpi,
01158                       &binfo, &priority);
01159             } else if (octstr_case_compare(type, text_xml) == 0) {
01160                 replytext = octstr_duplicate(reply_body);
01161                 octstr_destroy(reply_body);
01162                 reply_body = NULL;
01163                 get_x_kannel_from_xml(mt_reply, &type, &replytext, reply_headers,
01164                         &from, &to, &udh, NULL, NULL, &smsc, &mclass, &mwi,
01165                         &coding, &compress, &validity, &deferred, &dlr_mask,
01166                         &dlr_url, &account, &pid, &alt_dcs, &rpi, NULL, &charset,
01167                         &binfo, &priority);
01168             } else if (octstr_case_compare(type, octet_stream) == 0) {
01169                 replytext = octstr_duplicate(reply_body);
01170                 octstr_destroy(reply_body);
01171                 octets = 1;
01172                 reply_body = NULL;
01173                 get_x_kannel_from_headers(reply_headers, &from, &to, &udh,
01174                       NULL, NULL, &smsc, &mclass, &mwi,
01175                       &coding, &compress, &validity,
01176                       &deferred, &dlr_mask, &dlr_url,
01177                       &account, &pid, &alt_dcs, &rpi,
01178                       &binfo, &priority);
01179             } else {
01180                 replytext = octstr_duplicate(reply_couldnotrepresent);
01181             }
01182 
01183             if (charset_processing(charset, replytext, coding) == -1) {
01184                 replytext = octstr_duplicate(reply_couldnotrepresent);
01185             }
01186             octstr_destroy(type);
01187         } else if (max_http_retries > retries) {
01188             id = remember_receiver(msg, trans, method, req_url, req_headers, req_body, retries);
01189             gwlist_produce(smsbox_http_requests, id);
01190             queued++;
01191             goto requeued;
01192         } else
01193             replytext = octstr_duplicate(reply_couldnotfetch);
01194 
01195         fill_message(msg, trans, replytext, octets, from, to, udh, mclass,
01196             mwi, coding, compress, validity, deferred, dlr_url,
01197             dlr_mask, pid, alt_dcs, rpi, smsc, account, charset,
01198             binfo, priority);
01199 
01200         if (final_url == NULL)
01201             final_url = octstr_imm("");
01202         if (reply_body == NULL)
01203             reply_body = octstr_imm("");
01204 
01205         if (msg->sms.sms_type != report_mo) {
01206             alog("SMS HTTP-request sender:%s request: '%s' "
01207                  "url: '%s' reply: %d '%s'",
01208                  octstr_get_cstr(msg->sms.receiver),
01209                  (msg->sms.msgdata != NULL) ? octstr_get_cstr(msg->sms.msgdata) : "",
01210                  octstr_get_cstr(final_url), status,
01211                  (status == HTTP_OK) ? "<< successful >>" : octstr_get_cstr(reply_body));
01212         }
01213 
01214 requeued:
01215         octstr_destroy(final_url);
01216         http_destroy_headers(reply_headers);
01217         octstr_destroy(reply_body);
01218         octstr_destroy(req_url);
01219         http_destroy_headers(req_headers);
01220         octstr_destroy(req_body);
01221 
01222         if (msg->sms.sms_type != report_mo && !queued) {
01223             if (send_message(trans, msg) < 0)
01224                 error(0, "failed to send message to phone");
01225         }
01226         msg_destroy(msg);
01227     }
01228 }

Here is the call graph for this function:


Variable Documentation

Octstr* accepted_chars = NULL [static]
 

Definition at line 109 of file smsbox.c.

Referenced by init_smsbox(), and main().

Octstr* bb_host [static]
 

Definition at line 108 of file smsbox.c.

Referenced by init_smsbox(), and main().

long bb_port [static]
 

Definition at line 100 of file smsbox.c.

Referenced by init_smsbox(), and main().

int bb_ssl = 0 [static]
 

Definition at line 101 of file smsbox.c.

Referenced by init_smsbox(), and main().

Numhash* black_list [static]
 

Definition at line 121 of file smsbox.c.

Referenced by init_smsbox(), main(), and smsbox_req_handle().

regex_t* black_list_regex = NULL [static]
 

Definition at line 123 of file smsbox.c.

Referenced by init_smsbox(), main(), and smsbox_req_handle().

HTTPCaller* caller [static]
 

Definition at line 398 of file smsbox.c.

Referenced by http_queue_thread(), main(), obey_request(), and url_result_thread().

Counter* catenated_sms_counter [static]
 

Definition at line 286 of file smsbox.c.

Referenced by main(), and send_message().

Cfg* cfg [static]
 

Definition at line 99 of file smsbox.c.

Referenced by init_smsbox(), main(), and smsbox_req_sendota().

Dict* client_dict = NULL [static]
 

Definition at line 143 of file smsbox.c.

Referenced by delayed_http_reply(), main(), smsbox_req_handle(), smsbox_req_sendota(), and smsbox_sendota_post().

Octstr* global_sender = NULL [static]
 

Definition at line 114 of file smsbox.c.

Referenced by init_smsbox(), main(), obey_request_thread(), smsbox_req_handle(), smsbox_req_sendota(), and smsbox_sendota_post().

long http_queue_delay = HTTP_RETRY_DELAY [static]
 

Definition at line 125 of file smsbox.c.

Referenced by http_queue_thread(), init_smsbox(), and main().

int immediate_sendsms_reply = 0 [static]
 

Definition at line 142 of file smsbox.c.

Referenced by init_smsbox(), sendsms_thread(), and store_uuid().

long max_http_retries = HTTP_MAX_RETRIES [static]
 

Definition at line 124 of file smsbox.c.

Referenced by http_queue_thread(), init_smsbox(), main(), and url_result_thread().

Semaphore* max_pending_requests [static]
 

Definition at line 132 of file smsbox.c.

Referenced by init_smsbox(), main(), obey_request(), and url_result_thread().

int mo_recode = 0 [static]
 

Definition at line 119 of file smsbox.c.

Referenced by init_smsbox(), and obey_request_thread().

Counter* num_outstanding_requests [static]
 

Definition at line 399 of file smsbox.c.

Referenced by get_receiver(), main(), outstanding_requests(), and