Kannel: Open Source WAP and SMS gateway  svn-r5335
urltrans.h File Reference
#include "gwlib/gwlib.h"
#include "msg.h"
#include "numhash.h"
#include "gwlib/gw-regex.h"

Go to the source code of this file.

Typedefs

typedef struct URLTranslationList URLTranslationList
 
typedef struct URLTranslation URLTranslation
 

Enumerations

enum  {
  TRANSTYPE_GET_URL = 0, TRANSTYPE_POST_URL, TRANSTYPE_POST_XML, TRANSTYPE_TEXT,
  TRANSTYPE_FILE, TRANSTYPE_EXECUTE, TRANSTYPE_SENDSMS
}
 

Functions

URLTranslationListurltrans_create (void)
 
void urltrans_destroy (URLTranslationList *list)
 
int urltrans_add_one (URLTranslationList *trans, CfgGroup *grp)
 
int urltrans_add_cfg (URLTranslationList *trans, Cfg *cfg)
 
URLTranslationurltrans_find (URLTranslationList *trans, Msg *msg)
 
URLTranslationurltrans_find_service (URLTranslationList *trans, Msg *msg)
 
URLTranslationurltrans_find_username (URLTranslationList *trans, Octstr *name)
 
Octstrurltrans_fill_escape_codes (Octstr *pattern, Msg *request)
 
Octstrurltrans_get_pattern (URLTranslation *t, Msg *sms)
 
int urltrans_type (URLTranslation *t)
 
Octstrurltrans_prefix (URLTranslation *t)
 
Octstrurltrans_suffix (URLTranslation *t)
 
Octstrurltrans_default_sender (URLTranslation *t)
 
Octstrurltrans_faked_sender (URLTranslation *t)
 
int urltrans_max_messages (URLTranslation *t)
 
int urltrans_concatenation (URLTranslation *t)
 
Octstrurltrans_split_chars (URLTranslation *t)
 
Octstrurltrans_split_suffix (URLTranslation *t)
 
int urltrans_omit_empty (URLTranslation *t)
 
Octstrurltrans_header (URLTranslation *t)
 
Octstrurltrans_footer (URLTranslation *t)
 
Octstrurltrans_alt_charset (URLTranslation *t)
 
Octstrurltrans_name (URLTranslation *t)
 
Octstrurltrans_username (URLTranslation *t)
 
Octstrurltrans_password (URLTranslation *t)
 
Octstrurltrans_forced_smsc (URLTranslation *t)
 
Octstrurltrans_default_smsc (URLTranslation *t)
 
Octstrurltrans_allow_ip (URLTranslation *t)
 
Octstrurltrans_deny_ip (URLTranslation *t)
 
Octstrurltrans_allowed_prefix (URLTranslation *t)
 
Octstrurltrans_denied_prefix (URLTranslation *t)
 
Octstrurltrans_allowed_recv_prefix (URLTranslation *t)
 
Octstrurltrans_denied_recv_prefix (URLTranslation *t)
 
regex_t * urltrans_allowed_prefix_regex (URLTranslation *t)
 
regex_t * urltrans_denied_prefix_regex (URLTranslation *t)
 
Numhashurltrans_white_list (URLTranslation *t)
 
Numhashurltrans_black_list (URLTranslation *t)
 
regex_t * urltrans_white_list_regex (URLTranslation *t)
 
regex_t * urltrans_black_list_regex (URLTranslation *t)
 
int urltrans_assume_plain_text (URLTranslation *t)
 
int urltrans_accept_x_kannel_headers (URLTranslation *t)
 
int urltrans_strip_keyword (URLTranslation *t)
 
int urltrans_send_sender (URLTranslation *t)
 
Octstrurltrans_dlr_url (URLTranslation *t)
 
int urltrans_dlr_mask (URLTranslation *t)
 
int urltrans_forced_priority (URLTranslation *t)
 
int urltrans_max_priority (URLTranslation *t)
 

Typedef Documentation

◆ URLTranslation

Definition at line 100 of file urltrans.h.

◆ URLTranslationList

Definition at line 93 of file urltrans.h.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
TRANSTYPE_GET_URL 
TRANSTYPE_POST_URL 
TRANSTYPE_POST_XML 
TRANSTYPE_TEXT 
TRANSTYPE_FILE 
TRANSTYPE_EXECUTE 
TRANSTYPE_SENDSMS 

Definition at line 102 of file urltrans.h.

Function Documentation

◆ urltrans_accept_x_kannel_headers()

int urltrans_accept_x_kannel_headers ( URLTranslation t)

Definition at line 950 of file urltrans.c.

References URLTranslation::accept_x_kannel_headers.

Referenced by fill_message().

951 {
952  return t->accept_x_kannel_headers;
953 }
int accept_x_kannel_headers
Definition: urltrans.c:126

◆ urltrans_add_cfg()

int urltrans_add_cfg ( URLTranslationList trans,
Cfg cfg 
)

Definition at line 230 of file urltrans.c.

References cfg, cfg_get_multi_group(), gwlist_destroy(), gwlist_extract_first(), octstr_imm(), and urltrans_add_one().

Referenced by main().

231 {
232  CfgGroup *grp;
233  List *list;
234 
235  list = cfg_get_multi_group(cfg, octstr_imm("sms-service"));
236  while (list && (grp = gwlist_extract_first(list)) != NULL) {
237  if (urltrans_add_one(trans, grp) == -1) {
238  gwlist_destroy(list, NULL);
239  return -1;
240  }
241  }
242  gwlist_destroy(list, NULL);
243 
244  list = cfg_get_multi_group(cfg, octstr_imm("sendsms-user"));
245  while (list && (grp = gwlist_extract_first(list)) != NULL) {
246  if (urltrans_add_one(trans, grp) == -1) {
247  gwlist_destroy(list, NULL);
248  return -1;
249  }
250  }
251  gwlist_destroy(list, NULL);
252 
253  return 0;
254 }
static Cfg * cfg
Definition: opensmppbox.c:95
Octstr * octstr_imm(const char *cstr)
Definition: octstr.c:283
void * gwlist_extract_first(List *list)
Definition: list.c:305
List * cfg_get_multi_group(Cfg *cfg, Octstr *name)
Definition: cfg.c:645
int urltrans_add_one(URLTranslationList *trans, CfgGroup *grp)
Definition: urltrans.c:205
Definition: cfg.c:73
Definition: list.c:102
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145

◆ urltrans_add_one()

int urltrans_add_one ( URLTranslationList trans,
CfgGroup grp 
)

Definition at line 205 of file urltrans.c.

References create_onetrans(), URLTranslationList::defaults, dict_get(), dict_put(), gwlist_append(), gwlist_create, URLTranslation::keyword_regex, URLTranslationList::list, URLTranslation::name, URLTranslationList::names, TRANSTYPE_SENDSMS, and URLTranslation::type.

Referenced by urltrans_add_cfg().

206 {
207  URLTranslation *ot;
208  List *list2;
209 
210  ot = create_onetrans(grp);
211  if (ot == NULL)
212  return -1;
213 
214  if (ot->type != TRANSTYPE_SENDSMS && ot->keyword_regex == NULL)
215  gwlist_append(trans->defaults, ot);
216  else
217  gwlist_append(trans->list, ot);
218 
219  list2 = dict_get(trans->names, ot->name);
220  if (list2 == NULL) {
221  list2 = gwlist_create();
222  dict_put(trans->names, ot->name, list2);
223  }
224  gwlist_append(list2, ot);
225 
226  return 0;
227 }
void dict_put(Dict *dict, Octstr *key, void *value)
Definition: dict.c:240
void gwlist_append(List *list, void *item)
Definition: list.c:179
void * dict_get(Dict *dict, Octstr *key)
Definition: dict.c:286
static URLTranslation * create_onetrans(CfgGroup *grp)
Definition: urltrans.c:994
#define gwlist_create()
Definition: list.h:136
regex_t * keyword_regex
Definition: urltrans.c:136
Definition: list.c:102
Octstr * name
Definition: urltrans.c:108

◆ urltrans_allow_ip()

Octstr* urltrans_allow_ip ( URLTranslation t)

Definition at line 885 of file urltrans.c.

References URLTranslation::allow_ip.

Referenced by authorise_username().

886 {
887  return t->allow_ip;
888 }
Octstr * allow_ip
Definition: urltrans.c:115

◆ urltrans_allowed_prefix()

Octstr* urltrans_allowed_prefix ( URLTranslation t)

Definition at line 895 of file urltrans.c.

References URLTranslation::allowed_prefix.

Referenced by smsbox_req_handle().

896 {
897  return t->allowed_prefix;
898 }
Octstr * allowed_prefix
Definition: urltrans.c:118

◆ urltrans_allowed_prefix_regex()

regex_t* urltrans_allowed_prefix_regex ( URLTranslation t)

Definition at line 900 of file urltrans.c.

References URLTranslation::allowed_prefix_regex.

Referenced by smsbox_req_handle().

901 {
902  return t->allowed_prefix_regex;
903 }
regex_t * allowed_prefix_regex
Definition: urltrans.c:139

◆ urltrans_allowed_recv_prefix()

Octstr* urltrans_allowed_recv_prefix ( URLTranslation t)

Definition at line 915 of file urltrans.c.

References URLTranslation::allowed_recv_prefix.

916 {
917  return t->allowed_recv_prefix;
918 }
Octstr * allowed_recv_prefix
Definition: urltrans.c:120

◆ urltrans_alt_charset()

Octstr* urltrans_alt_charset ( URLTranslation t)

Definition at line 855 of file urltrans.c.

References URLTranslation::alt_charset.

Referenced by obey_request_thread(), and url_result_thread().

856 {
857  return t->alt_charset;
858 }
Octstr * alt_charset
Definition: urltrans.c:102

◆ urltrans_assume_plain_text()

int urltrans_assume_plain_text ( URLTranslation t)

Definition at line 945 of file urltrans.c.

References URLTranslation::assume_plain_text.

946 {
947  return t->assume_plain_text;
948 }
int assume_plain_text
Definition: urltrans.c:125

◆ urltrans_black_list()

Numhash* urltrans_black_list ( URLTranslation t)

Definition at line 935 of file urltrans.c.

References URLTranslation::black_list.

Referenced by smsbox_req_handle().

936 {
937  return t->black_list;
938 }
Numhash * black_list
Definition: urltrans.c:123

◆ urltrans_black_list_regex()

regex_t* urltrans_black_list_regex ( URLTranslation t)

Definition at line 940 of file urltrans.c.

References URLTranslation::black_list_regex.

Referenced by smsbox_req_handle().

941 {
942  return t->black_list_regex;
943 }
regex_t * black_list_regex
Definition: urltrans.c:144

◆ urltrans_concatenation()

int urltrans_concatenation ( URLTranslation t)

Definition at line 825 of file urltrans.c.

References URLTranslation::concatenation.

Referenced by send_message().

826 {
827  return t->concatenation;
828 }
int concatenation
Definition: urltrans.c:96

◆ urltrans_create()

URLTranslationList* urltrans_create ( void  )

Definition at line 184 of file urltrans.c.

References URLTranslationList::defaults, destroy_keyword_list(), dict_create(), gwlist_create, URLTranslationList::list, and URLTranslationList::names.

Referenced by main().

185 {
186  URLTranslationList *trans;
187 
188  trans = gw_malloc(sizeof(URLTranslationList));
189  trans->list = gwlist_create();
190  trans->defaults = gwlist_create();
191  trans->names = dict_create(1024, destroy_keyword_list);
192  return trans;
193 }
Dict * dict_create(long size_hint, void(*destroy_value)(void *))
Definition: dict.c:192
#define gwlist_create()
Definition: list.h:136
static void destroy_keyword_list(void *list)
Definition: urltrans.c:178

◆ urltrans_default_sender()

Octstr* urltrans_default_sender ( URLTranslation t)

Definition at line 810 of file urltrans.c.

References URLTranslation::default_sender.

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

811 {
812  return t->default_sender;
813 }
Octstr * default_sender
Definition: urltrans.c:94

◆ urltrans_default_smsc()

Octstr* urltrans_default_smsc ( URLTranslation t)

Definition at line 880 of file urltrans.c.

References URLTranslation::default_smsc.

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

881 {
882  return t->default_smsc;
883 }
Octstr * default_smsc
Definition: urltrans.c:114

◆ urltrans_denied_prefix()

Octstr* urltrans_denied_prefix ( URLTranslation t)

Definition at line 905 of file urltrans.c.

References URLTranslation::denied_prefix.

Referenced by smsbox_req_handle().

906 {
907  return t->denied_prefix;
908 }
Octstr * denied_prefix
Definition: urltrans.c:119

◆ urltrans_denied_prefix_regex()

regex_t* urltrans_denied_prefix_regex ( URLTranslation t)

Definition at line 910 of file urltrans.c.

References URLTranslation::denied_prefix_regex.

Referenced by smsbox_req_handle().

911 {
912  return t->denied_prefix_regex;
913 }
regex_t * denied_prefix_regex
Definition: urltrans.c:140

◆ urltrans_denied_recv_prefix()

Octstr* urltrans_denied_recv_prefix ( URLTranslation t)

Definition at line 920 of file urltrans.c.

References URLTranslation::denied_recv_prefix.

921 {
922  return t->denied_recv_prefix;
923 }
Octstr * denied_recv_prefix
Definition: urltrans.c:121

◆ urltrans_deny_ip()

Octstr* urltrans_deny_ip ( URLTranslation t)

Definition at line 890 of file urltrans.c.

References URLTranslation::deny_ip.

Referenced by authorise_username().

891 {
892  return t->deny_ip;
893 }
Octstr * deny_ip
Definition: urltrans.c:117

◆ urltrans_destroy()

void urltrans_destroy ( URLTranslationList list)

Definition at line 196 of file urltrans.c.

References URLTranslationList::defaults, destroy_onetrans(), dict_destroy(), gwlist_destroy(), URLTranslationList::list, and URLTranslationList::names.

Referenced by main().

197 {
198  gwlist_destroy(trans->list, destroy_onetrans);
199  gwlist_destroy(trans->defaults, destroy_onetrans);
200  dict_destroy(trans->names);
201  gw_free(trans);
202 }
void dict_destroy(Dict *dict)
Definition: dict.c:215
static void destroy_onetrans(void *ot)
Definition: urltrans.c:1323
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145

◆ urltrans_dlr_mask()

int urltrans_dlr_mask ( URLTranslation t)

Definition at line 970 of file urltrans.c.

References URLTranslation::dlr_mask.

Referenced by send_message().

971 {
972  return t->dlr_mask;
973 }

◆ urltrans_dlr_url()

Octstr* urltrans_dlr_url ( URLTranslation t)

Definition at line 965 of file urltrans.c.

References URLTranslation::dlr_url.

Referenced by send_message().

966 {
967  return t->dlr_url;
968 }
Octstr * dlr_url
Definition: urltrans.c:133

◆ urltrans_faked_sender()

Octstr* urltrans_faked_sender ( URLTranslation t)

Definition at line 815 of file urltrans.c.

References URLTranslation::faked_sender.

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

816 {
817  return t->faked_sender;
818 }
Octstr * faked_sender
Definition: urltrans.c:93

◆ urltrans_fill_escape_codes()

Octstr* urltrans_fill_escape_codes ( Octstr pattern,
Msg request 
)

Definition at line 325 of file urltrans.c.

References DC_7BIT, DC_8BIT, DC_UCS2, DC_UNDEF, fields_to_dcs(), gw_gmtime(), gwlist_create, gwlist_destroy(), gwlist_get(), gwlist_len(), meta_data_get_value(), MSG_PARAM_UNDEFINED, octstr_append(), octstr_append_char(), octstr_append_cstr(), octstr_append_decimal(), octstr_binary_to_hex(), octstr_copy, octstr_create, octstr_destroy(), octstr_destroy_item(), octstr_duplicate, octstr_format_append(), octstr_get_char(), octstr_get_cstr, octstr_imm(), octstr_len(), octstr_search_char(), octstr_split_words(), octstr_url_encode(), uuid_is_null(), UUID_STR_LEN, and uuid_unparse().

Referenced by generic_receive_sms(), generic_send_sms(), and urltrans_get_pattern().

326 {
327  Octstr *enc;
328  Octstr *meta_group, *meta_param;
329  int nextarg, j;
330  struct tm tm;
331  int num_words;
332  List *word_list;
333  Octstr *result;
334  long pattern_len;
335  long pos;
336  int c;
337  long i, k;
338  Octstr *temp;
339 
340  result = octstr_create("");
341 
342  if (request->sms.msgdata) {
343  word_list = octstr_split_words(request->sms.msgdata);
344  num_words = gwlist_len(word_list);
345  } else {
346  word_list = gwlist_create();
347  num_words = 0;
348  }
349 
350  pattern_len = octstr_len(pattern);
351  nextarg = 1;
352  pos = 0;
353  for (;;) {
354  while (pos < pattern_len) {
355  c = octstr_get_char(pattern, pos);
356  if (c == '%' && pos + 1 < pattern_len)
357  break;
358  octstr_append_char(result, c);
359  ++pos;
360  }
361 
362  if (pos == pattern_len)
363  break;
364 
365  switch (octstr_get_char(pattern, pos + 1)) {
366  case 'a':
367  for (j = 0; j < num_words; ++j) {
368  enc = octstr_duplicate(gwlist_get(word_list, j));
369  octstr_url_encode(enc);
370  if (j > 0)
371  octstr_append_char(result, '+');
372  octstr_append(result, enc);
373  octstr_destroy(enc);
374  }
375  break;
376 
377  case 'A':
378  if (request->sms.msgdata) {
379  enc = octstr_duplicate(request->sms.msgdata);
380  octstr_url_encode(enc);
381  octstr_append(result, enc);
382  octstr_destroy(enc);
383  }
384  break;
385 
386  case 'b': /* message payload, URL-encoded */
387  enc = octstr_duplicate(request->sms.msgdata);
388  octstr_url_encode(enc);
389  octstr_append(result, enc);
390  octstr_destroy(enc);
391  break;
392 
393  case 'B': /* billing identifier/information */
394  if (octstr_len(request->sms.binfo)) {
395  enc = octstr_duplicate(request->sms.binfo);
396  octstr_url_encode(enc);
397  octstr_append(result, enc);
398  octstr_destroy(enc);
399  }
400  break;
401 
402  case 'c':
403  octstr_append_decimal(result, request->sms.coding);
404  break;
405 
406  case 'C':
407  if (octstr_len(request->sms.charset)) {
408  octstr_append(result, request->sms.charset);
409  } else {
410  switch (request->sms.coding) {
411  case DC_UNDEF:
412  case DC_7BIT:
413  octstr_append(result, octstr_imm("UTF-8"));
414  break;
415  case DC_8BIT:
416  octstr_append(result, octstr_imm("8-BIT"));
417  break;
418  case DC_UCS2:
419  octstr_append(result, octstr_imm("UTF-16BE"));
420  break;
421  }
422  }
423  break;
424 
425  case 'd':
426  enc = octstr_create("");
427  octstr_append_decimal(enc, request->sms.dlr_mask);
428  octstr_url_encode(enc);
429  octstr_append(result, enc);
430  octstr_destroy(enc);
431  break;
432 
433  case 'D': /* meta_data */
434  if (octstr_len(request->sms.meta_data)) {
435  enc = octstr_duplicate(request->sms.meta_data);
436  octstr_url_encode(enc);
437  octstr_append(result, enc);
438  octstr_destroy(enc);
439  }
440  break;
441 
442  case 'e': /* message payload, printable hexadecimal byte codes */
443  if (octstr_len(request->sms.msgdata)) {
444  enc = octstr_duplicate(request->sms.msgdata);
445  octstr_binary_to_hex(enc, 1);
446  octstr_append(result, enc);
447  octstr_destroy(enc);
448  }
449  break;
450 
451  case 'f': /* smsc number*/
452  if (octstr_len(request->sms.smsc_number)) {
453  enc = octstr_duplicate(request->sms.smsc_number);
454  octstr_url_encode(enc);
455  octstr_append(result, enc);
456  octstr_destroy(enc);
457  }
458  break;
459 
460  case 'F':
461  if (request->sms.foreign_id == NULL)
462  break;
463  enc = octstr_duplicate(request->sms.foreign_id);
464  octstr_url_encode(enc);
465  octstr_append(result, enc);
466  octstr_destroy(enc);
467  break;
468 
469  case 'i':
470  if (request->sms.smsc_id == NULL)
471  break;
472  enc = octstr_duplicate(request->sms.smsc_id);
473  octstr_url_encode(enc);
474  octstr_append(result, enc);
475  octstr_destroy(enc);
476  break;
477 
478  case 'I':
479  if (!uuid_is_null(request->sms.id)) {
480  char id[UUID_STR_LEN + 1];
481  uuid_unparse(request->sms.id, id);
482  octstr_append_cstr(result, id);
483  }
484  break;
485 
486  case 'k':
487  if (num_words <= 0)
488  break;
489  enc = octstr_duplicate(gwlist_get(word_list, 0));
490  octstr_url_encode(enc);
491  octstr_append(result, enc);
492  octstr_destroy(enc);
493  break;
494 
495  case 'm': /* mclass - message class */
496  enc = octstr_create("");
497  octstr_append_decimal(enc, request->sms.mclass);
498  octstr_url_encode(enc);
499  octstr_append(result, enc);
500  octstr_destroy(enc);
501  break;
502 
503  case 'M': /* mwi - message waiting indicator */
504  enc = octstr_create("");
505  octstr_append_decimal(enc, request->sms.mwi);
506  octstr_url_encode(enc);
507  octstr_append(result, enc);
508  octstr_destroy(enc);
509  break;
510 
511  case 'n':
512  if (request->sms.service == NULL)
513  break;
514  enc = octstr_duplicate(request->sms.service);
515  octstr_url_encode(enc);
516  octstr_append(result, enc);
517  octstr_destroy(enc);
518  break;
519 
520  case 'o': /* account information (may be operator id for aggregators */
521  if (octstr_len(request->sms.account)) {
522  enc = octstr_duplicate(request->sms.account);
523  octstr_url_encode(enc);
524  octstr_append(result, enc);
525  octstr_destroy(enc);
526  }
527  break;
528 
529  case 'O': /* DCS */
530  {
531  int dcs;
532  dcs = fields_to_dcs(request, request->sms.alt_dcs);
533  octstr_format_append(result, "%02d", dcs);
534  break;
535  }
536 
537  /* NOTE: the sender and receiver is already switched in
538  * message, so that's why we must use 'sender' when
539  * we want original receiver and vice versa
540  */
541  case 'P':
542  enc = octstr_duplicate(request->sms.sender);
543  octstr_url_encode(enc);
544  octstr_append(result, enc);
545  octstr_destroy(enc);
546  break;
547 
548  case 'p':
549  enc = octstr_duplicate(request->sms.receiver);
550  octstr_url_encode(enc);
551  octstr_append(result, enc);
552  octstr_destroy(enc);
553  break;
554 
555  case 'q':
556  if (strncmp(octstr_get_cstr(request->sms.receiver),"00",2)==0) {
557  enc = octstr_copy(request->sms.receiver, 2,
558  octstr_len(request->sms.receiver));
559  octstr_url_encode(enc);
560  octstr_format_append(result, "%%2B%S", enc);
561  octstr_destroy(enc);
562  } else {
563  enc = octstr_duplicate(request->sms.receiver);
564  octstr_url_encode(enc);
565  octstr_append(result, enc);
566  octstr_destroy(enc);
567  }
568  break;
569 
570  case 'Q':
571  if (strncmp(octstr_get_cstr(request->sms.sender), "00", 2) == 0) {
572  enc = octstr_copy(request->sms.sender, 2,
573  octstr_len(request->sms.sender));
574  octstr_url_encode(enc);
575  octstr_format_append(result, "%%2B%S", enc);
576  octstr_destroy(enc);
577  } else {
578  enc = octstr_duplicate(request->sms.sender);
579  octstr_url_encode(enc);
580  octstr_append(result, enc);
581  octstr_destroy(enc);
582  }
583  break;
584 
585  case 'r':
586  for (j = nextarg; j < num_words; ++j) {
587  enc = octstr_duplicate(gwlist_get(word_list, j));
588  octstr_url_encode(enc);
589  if (j != nextarg)
590  octstr_append_char(result, '+');
591  octstr_append(result, enc);
592  octstr_destroy(enc);
593  }
594  break;
595 
596  case 'R': /* dlr_url */
597  if (octstr_len(request->sms.dlr_url)) {
598  enc = octstr_duplicate(request->sms.dlr_url);
599  octstr_url_encode(enc);
600  octstr_append(result, enc);
601  octstr_destroy(enc);
602  }
603  break;
604 
605  case 's':
606  if (nextarg >= num_words)
607  break;
608  enc = octstr_duplicate(gwlist_get(word_list, nextarg));
609  octstr_url_encode(enc);
610  octstr_append(result, enc);
611  octstr_destroy(enc);
612  ++nextarg;
613  break;
614 
615  case 'S':
616  if (nextarg >= num_words)
617  break;
618  temp = gwlist_get(word_list, nextarg);
619  for (i = 0; i < octstr_len(temp); ++i) {
620  if (octstr_get_char(temp, i) == '*')
621  octstr_append_char(result, '~');
622  else
623  octstr_append_char(result, octstr_get_char(temp, i));
624  }
625  ++nextarg;
626  break;
627 
628  case 't':
629  tm = gw_gmtime(request->sms.time);
630  octstr_format_append(result, "%04d-%02d-%02d+%02d:%02d:%02d",
631  tm.tm_year + 1900,
632  tm.tm_mon + 1,
633  tm.tm_mday,
634  tm.tm_hour,
635  tm.tm_min,
636  tm.tm_sec);
637  break;
638 
639  case 'T':
640  if (request->sms.time == MSG_PARAM_UNDEFINED)
641  break;
642  octstr_format_append(result, "%ld", request->sms.time);
643  break;
644 
645  case 'u': /* UDH, URL-encoded */
646  if(octstr_len(request->sms.udhdata)) {
647  enc = octstr_duplicate(request->sms.udhdata);
648  octstr_url_encode(enc);
649  octstr_append(result, enc);
650  octstr_destroy(enc);
651  }
652  break;
653 
654  case 'U': /* UDH, printable hexadecimal byte codes */
655  if(octstr_len(request->sms.udhdata)) {
656  enc = octstr_duplicate(request->sms.udhdata);
657  octstr_binary_to_hex(enc, 1);
658  octstr_append(result, enc);
659  octstr_destroy(enc);
660  }
661  break;
662 
663  case 'v':
664  if (request->sms.validity != MSG_PARAM_UNDEFINED) {
665  octstr_format_append(result, "%ld", (request->sms.validity - time(NULL)) / 60);
666  }
667  break;
668 
669  case 'V':
670  if (request->sms.deferred != MSG_PARAM_UNDEFINED) {
671  octstr_format_append(result, "%ld", (request->sms.deferred - time(NULL)) / 60);
672  }
673  break;
674 
675  case 'y': /* message priority */
676  enc = octstr_create("");
677  octstr_append_decimal(enc, request->sms.priority);
678  octstr_url_encode(enc);
679  octstr_append(result, enc);
680  octstr_destroy(enc);
681  break;
682 
683  case 'x': /* smsbox-id */
684  if (octstr_len(request->sms.boxc_id)) {
685  enc = octstr_duplicate(request->sms.boxc_id);
686  octstr_url_encode(enc);
687  octstr_append(result, enc);
688  octstr_destroy(enc);
689  }
690  break;
691 
692  /*
693  * This allows to pass meta-data individual parameters into urls.
694  * The syntax is as follows: %#group#parameter#
695  * For example: %#smpp#my_param# would be replaced with the value
696  * 'my_param' from the group 'smpp' coming inside the meta_data field.
697  */
698  case '#':
699  /* ASCII 0x23 == '#' */
700  k = octstr_search_char(pattern, 0x23, pos + 2);
701  if (k >= 0) {
702  pos += 2;
703  meta_group = octstr_copy(pattern, pos, (k-pos));
704  pos = k + 1;
705  k = octstr_search_char(pattern, 0x23, pos);
706  if (k >= 0) {
707  meta_param = octstr_copy(pattern, pos, (k-pos));
708  pos = k - 1;
709  if (request->sms.meta_data != NULL) {
710  enc = meta_data_get_value(request->sms.meta_data,
711  octstr_get_cstr(meta_group), meta_param);
712  octstr_url_encode(enc);
713  octstr_append(result, enc);
714  octstr_destroy(enc);
715  }
716  octstr_destroy(meta_param);
717  } else {
718  pos++;
719  }
720  octstr_destroy(meta_group);
721  }
722  break;
723 
724  /* XXX sms.parameters not present in here:
725  * * pid - will we receive this ?
726  * * alt-dcs - shouldn't be required unless we want to inform
727  * which alt-dcs external server should use back
728  * * compress - if we use compression, probably kannel would
729  * decompress and reset this to 0. not required
730  * * rpi - we don't receive these from smsc
731  * * username, password, dlr-url, account - nonsense to send
732  */
733  case '%':
734  octstr_format_append(result, "%%");
735  break;
736 
737  default:
738  octstr_format_append(result, "%%%c",
739  octstr_get_char(pattern, pos + 1));
740  break;
741  }
742 
743  pos += 2;
744  }
745 
746  gwlist_destroy(word_list, octstr_destroy_item);
747 
748  return result;
749 }
void octstr_append(Octstr *ostr1, const Octstr *ostr2)
Definition: octstr.c:1504
struct tm gw_gmtime(time_t t)
Definition: protected.c:137
long gwlist_len(List *list)
Definition: list.c:166
void * gwlist_get(List *list, long pos)
Definition: list.c:292
void octstr_append_char(Octstr *ostr, int ch)
Definition: octstr.c:1517
#define DC_8BIT
Definition: sms.h:111
void uuid_unparse(const uuid_t uu, char *out)
Definition: gw_uuid.c:562
Octstr * meta_data_get_value(Octstr *data, const char *group, const Octstr *key)
Definition: meta_data.c:368
void octstr_append_cstr(Octstr *ostr, const char *cstr)
Definition: octstr.c:1511
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
#define octstr_copy(ostr, from, len)
Definition: octstr.h:178
void octstr_binary_to_hex(Octstr *ostr, int uppercase)
Definition: octstr.c:465
long octstr_search_char(const Octstr *ostr, int ch, long pos)
Definition: octstr.c:1012
Octstr * octstr_imm(const char *cstr)
Definition: octstr.c:283
int uuid_is_null(const uuid_t uu)
Definition: gw_uuid.c:413
#define octstr_duplicate(ostr)
Definition: octstr.h:187
List * octstr_split_words(const Octstr *ostr)
Definition: octstr.c:1602
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:324
#define octstr_create(cstr)
Definition: octstr.h:125
void octstr_destroy_item(void *os)
Definition: octstr.c:336
int fields_to_dcs(Msg *msg, int mode)
Definition: sms.c:73
#define UUID_STR_LEN
Definition: gw_uuid.h:19
long octstr_len(const Octstr *ostr)
Definition: octstr.c:342
void octstr_append_decimal(Octstr *ostr, long value)
Definition: octstr.c:1976
Definition: octstr.c:118
#define MSG_PARAM_UNDEFINED
Definition: msg.h:71
void octstr_format_append(Octstr *os, const char *fmt,...)
Definition: octstr.c:2507
#define gwlist_create()
Definition: list.h:136
#define DC_UNDEF
Definition: sms.h:109
int octstr_get_char(const Octstr *ostr, long pos)
Definition: octstr.c:406
Definition: list.c:102
void octstr_url_encode(Octstr *ostr)
Definition: octstr.c:1673
#define DC_UCS2
Definition: sms.h:112
#define DC_7BIT
Definition: sms.h:110
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)
Definition: list.c:145

◆ urltrans_find()

URLTranslation* urltrans_find ( URLTranslationList trans,
Msg msg 
)

Definition at line 257 of file urltrans.c.

References find_default_translation(), find_translation(), and msg.

Referenced by main(), and obey_request_thread().

258 {
259  URLTranslation *t = NULL;
260 
261  t = find_translation(trans, msg);
262  if (t == NULL) {
263  t = find_default_translation(trans, msg->sms.smsc_id, msg->sms.sender, msg->sms.receiver, msg->sms.account);
264  }
265 
266  return t;
267 }
static URLTranslation * find_default_translation(URLTranslationList *trans, Octstr *smsc, Octstr *sender, Octstr *receiver, Octstr *account)
Definition: urltrans.c:1561
static URLTranslation * find_translation(URLTranslationList *trans, Msg *msg)
Definition: urltrans.c:1521
static XMLRPCDocument * msg
Definition: test_xmlrpc.c:86

◆ urltrans_find_service()

URLTranslation* urltrans_find_service ( URLTranslationList trans,
Msg msg 
)

Definition at line 270 of file urltrans.c.

References dict_get(), gwlist_get(), msg, and URLTranslationList::names.

Referenced by obey_request_thread().

271 {
272  URLTranslation *t;
273  List *list;
274 
275  list = dict_get(trans->names, msg->sms.service);
276  if (list != NULL) {
277  t = gwlist_get(list, 0);
278  } else {
279  t = NULL;
280  }
281  return t;
282 }
void * gwlist_get(List *list, long pos)
Definition: list.c:292
void * dict_get(Dict *dict, Octstr *key)
Definition: dict.c:286
Definition: list.c:102
static XMLRPCDocument * msg
Definition: test_xmlrpc.c:86

◆ urltrans_find_username()

URLTranslation* urltrans_find_username ( URLTranslationList trans,
Octstr name 
)

Definition at line 286 of file urltrans.c.

References gw_assert(), gwlist_get(), gwlist_len(), URLTranslationList::list, name, octstr_compare(), TRANSTYPE_SENDSMS, URLTranslation::type, and URLTranslation::username.

Referenced by authorise_user(), and authorise_username().

287 {
288  URLTranslation *t;
289  int i;
290 
291  gw_assert(name != NULL);
292  for (i = 0; i < gwlist_len(trans->list); ++i) {
293  t = gwlist_get(trans->list, i);
294  if (t->type == TRANSTYPE_SENDSMS) {
295  if (octstr_compare(name, t->username) == 0)
296  return t;
297  }
298  }
299  return NULL;
300 }
gw_assert(wtls_machine->packet_to_send !=NULL)
long gwlist_len(List *list)
Definition: list.c:166
void * gwlist_get(List *list, long pos)
Definition: list.c:292
Octstr * username
Definition: urltrans.c:109
char * name
Definition: smsc_cimd2.c:212
int octstr_compare(const Octstr *ostr1, const Octstr *ostr2)
Definition: octstr.c:871

◆ urltrans_footer()

Octstr* urltrans_footer ( URLTranslation t)

Definition at line 850 of file urltrans.c.

References URLTranslation::footer.

Referenced by send_message().

851 {
852  return t->footer;
853 }
Octstr * footer
Definition: urltrans.c:101

◆ urltrans_forced_priority()

int urltrans_forced_priority ( URLTranslation t)

Definition at line 975 of file urltrans.c.

References URLTranslation::forced_priority.

Referenced by smsbox_req_handle().

976 {
977  return t->forced_priority;
978 }
long forced_priority
Definition: urltrans.c:112

◆ urltrans_forced_smsc()

Octstr* urltrans_forced_smsc ( URLTranslation t)

Definition at line 875 of file urltrans.c.

References URLTranslation::forced_smsc.

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

876 {
877  return t->forced_smsc;
878 }
Octstr * forced_smsc
Definition: urltrans.c:111

◆ urltrans_get_pattern()

Octstr* urltrans_get_pattern ( URLTranslation t,
Msg sms 
)

Definition at line 756 of file urltrans.c.

References URLTranslation::dlr_url, octstr_create, octstr_len(), URLTranslation::pattern, report_mo, URLTranslation::strip_keyword, strip_keyword(), TRANSTYPE_POST_URL, TRANSTYPE_POST_XML, TRANSTYPE_SENDSMS, URLTranslation::type, and urltrans_fill_escape_codes().

Referenced by obey_request().

757 {
758  Octstr *result, *pattern;
759 
760  if (request->sms.sms_type != report_mo && t->type == TRANSTYPE_SENDSMS)
761  return octstr_create("");
762 
763  /* check if this is a delivery report message or not */
764  if (request->sms.sms_type != report_mo) {
765  pattern = t->pattern;
766  } else {
767  /* this is a DLR message */
768  pattern = request->sms.dlr_url;
769  if (octstr_len(pattern) == 0) {
770  if (t && octstr_len(t->dlr_url)) {
771  pattern = t->dlr_url;
772  } else {
773  return octstr_create("");
774  }
775  }
776  }
777 
778  /* We have pulled this out into an own exported function. This
779  * gives other modules the chance to use the same escape code
780  * semantics for Msgs. */
781  result = urltrans_fill_escape_codes(pattern, request);
782 
783  /*
784  * this SHOULD be done in smsbox, not here, but well,
785  * much easier to do here
786  */
787  if (t && (t->type == TRANSTYPE_POST_URL || t->type == TRANSTYPE_POST_XML)
788  && t->strip_keyword)
789  strip_keyword(request);
790 
791  return result;
792 }
Definition: msg.h:109
static void strip_keyword(Msg *request)
Definition: urltrans.c:306
Octstr * dlr_url
Definition: urltrans.c:133
Octstr * urltrans_fill_escape_codes(Octstr *pattern, Msg *request)
Definition: urltrans.c:325
#define octstr_create(cstr)
Definition: octstr.h:125
int strip_keyword
Definition: urltrans.c:127
Octstr * pattern
Definition: urltrans.c:90
long octstr_len(const Octstr *ostr)
Definition: octstr.c:342
Definition: octstr.c:118

◆ urltrans_header()

Octstr* urltrans_header ( URLTranslation t)

Definition at line 845 of file urltrans.c.

References URLTranslation::header.

Referenced by send_message().

846 {
847  return t->header;
848 }
Octstr * header
Definition: urltrans.c:100

◆ urltrans_max_messages()

int urltrans_max_messages ( URLTranslation t)

Definition at line 820 of file urltrans.c.

References URLTranslation::max_messages.

Referenced by send_message().

821 {
822  return t->max_messages;
823 }
long max_messages
Definition: urltrans.c:95

◆ urltrans_max_priority()

int urltrans_max_priority ( URLTranslation t)

Definition at line 980 of file urltrans.c.

References URLTranslation::max_priority.

Referenced by smsbox_req_handle().

981 {
982  return t->max_priority;
983 }
long max_priority
Definition: urltrans.c:113

◆ urltrans_name()

Octstr* urltrans_name ( URLTranslation t)

Definition at line 860 of file urltrans.c.

References URLTranslation::name.

Referenced by obey_request_thread(), remember_receiver(), and smsbox_req_handle().

861 {
862  return t->name;
863 }
Octstr * name
Definition: urltrans.c:108

◆ urltrans_omit_empty()

int urltrans_omit_empty ( URLTranslation t)

Definition at line 840 of file urltrans.c.

References URLTranslation::omit_empty.

Referenced by send_message().

841 {
842  return t->omit_empty;
843 }
int omit_empty
Definition: urltrans.c:99

◆ urltrans_password()

Octstr* urltrans_password ( URLTranslation t)

Definition at line 870 of file urltrans.c.

References URLTranslation::password.

Referenced by authorise_username().

871 {
872  return t->password;
873 }
Octstr * password
Definition: urltrans.c:110

◆ urltrans_prefix()

Octstr* urltrans_prefix ( URLTranslation t)

Definition at line 800 of file urltrans.c.

References URLTranslation::prefix.

Referenced by url_result_thread().

801 {
802  return t->prefix;
803 }
Octstr * prefix
Definition: urltrans.c:91

◆ urltrans_send_sender()

int urltrans_send_sender ( URLTranslation t)

Definition at line 960 of file urltrans.c.

References URLTranslation::send_sender.

Referenced by obey_request().

961 {
962  return t->send_sender;
963 }

◆ urltrans_split_chars()

Octstr* urltrans_split_chars ( URLTranslation t)

Definition at line 830 of file urltrans.c.

References URLTranslation::split_chars.

Referenced by send_message().

831 {
832  return t->split_chars;
833 }
Octstr * split_chars
Definition: urltrans.c:97

◆ urltrans_split_suffix()

Octstr* urltrans_split_suffix ( URLTranslation t)

Definition at line 835 of file urltrans.c.

References URLTranslation::split_suffix.

Referenced by send_message().

836 {
837  return t->split_suffix;
838 }
Octstr * split_suffix
Definition: urltrans.c:98

◆ urltrans_strip_keyword()

int urltrans_strip_keyword ( URLTranslation t)

Definition at line 955 of file urltrans.c.

References URLTranslation::strip_keyword.

956 {
957  return t->strip_keyword;
958 }
int strip_keyword
Definition: urltrans.c:127

◆ urltrans_suffix()

Octstr* urltrans_suffix ( URLTranslation t)

Definition at line 805 of file urltrans.c.

References URLTranslation::suffix.

Referenced by url_result_thread().

806 {
807  return t->suffix;
808 }
Octstr * suffix
Definition: urltrans.c:92

◆ urltrans_type()

int urltrans_type ( URLTranslation t)

Definition at line 795 of file urltrans.c.

References URLTranslation::type.

Referenced by main(), and obey_request().

796 {
797  return t->type;
798 }

◆ urltrans_username()

Octstr* urltrans_username ( URLTranslation t)

Definition at line 865 of file urltrans.c.

References URLTranslation::username.

Referenced by smsbox_req_handle().

866 {
867  return t->username;
868 }
Octstr * username
Definition: urltrans.c:109

◆ urltrans_white_list()

Numhash* urltrans_white_list ( URLTranslation t)

Definition at line 925 of file urltrans.c.

References URLTranslation::white_list.

Referenced by smsbox_req_handle().

926 {
927  return t->white_list;
928 }
Numhash * white_list
Definition: urltrans.c:122

◆ urltrans_white_list_regex()

regex_t* urltrans_white_list_regex ( URLTranslation t)

Definition at line 930 of file urltrans.c.

References URLTranslation::white_list_regex.

Referenced by smsbox_req_handle().

931 {
932  return t->white_list_regex;
933 }
regex_t * white_list_regex
Definition: urltrans.c:143
See file LICENSE for details about the license agreement for using, modifying, copying or deriving work from this software.