alookup.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. /*
  2. * $Id$
  3. *
  4. * ALIAS_DB Module
  5. *
  6. * Copyright (C) 2004 Voice Sistem SRL
  7. *
  8. * This file is part of a module for Kamailio, a free SIP server.
  9. *
  10. * Kamailio is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version
  14. *
  15. * Kamailio is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  23. *
  24. * History:
  25. * --------
  26. * 2004-09-01: first version (ramona)
  27. */
  28. #include <string.h>
  29. #include "../../dprint.h"
  30. #include "../../action.h"
  31. #include "../../config.h"
  32. #include "../../ut.h"
  33. #include "../../parser/parse_uri.h"
  34. #include "../../lib/srdb1/db.h"
  35. #include "../../mod_fix.h"
  36. #include "../../dset.h"
  37. #include "alias_db.h"
  38. #include "alookup.h"
  39. #define MAX_USERURI_SIZE 256
  40. extern db_func_t adbf; /* DB functions */
  41. char useruri_buf[MAX_USERURI_SIZE];
  42. /**
  43. * Rewrite Request-URI
  44. */
  45. static inline int rewrite_ruri(struct sip_msg* _m, char* _s)
  46. {
  47. struct action act;
  48. struct run_act_ctx ra_ctx;
  49. memset(&act, 0, sizeof(act));
  50. act.type = SET_URI_T;
  51. act.val[0].type = STRING_ST;
  52. act.val[0].u.string = _s;
  53. init_run_actions_ctx(&ra_ctx);
  54. if (do_action(&ra_ctx, &act, _m) < 0)
  55. {
  56. LM_ERR("do_action failed\n");
  57. return -1;
  58. }
  59. return 0;
  60. }
  61. /**
  62. *
  63. */
  64. int alias_db_lookup(struct sip_msg* _msg, str table_s)
  65. {
  66. str user_s;
  67. db_key_t db_keys[2] = {&alias_user_column, &alias_domain_column};
  68. db_val_t db_vals[2];
  69. db_key_t db_cols[] = {&user_column, &domain_column};
  70. db1_res_t* db_res = NULL;
  71. int i;
  72. if (parse_sip_msg_uri(_msg) < 0)
  73. return -1;
  74. db_vals[0].type = DB1_STR;
  75. db_vals[0].nul = 0;
  76. db_vals[0].val.str_val.s = _msg->parsed_uri.user.s;
  77. db_vals[0].val.str_val.len = _msg->parsed_uri.user.len;
  78. if (use_domain)
  79. {
  80. db_vals[1].type = DB1_STR;
  81. db_vals[1].nul = 0;
  82. db_vals[1].val.str_val.s = _msg->parsed_uri.host.s;
  83. db_vals[1].val.str_val.len = _msg->parsed_uri.host.len;
  84. if (domain_prefix.s && domain_prefix.len>0
  85. && domain_prefix.len<_msg->parsed_uri.host.len
  86. && strncasecmp(_msg->parsed_uri.host.s,domain_prefix.s,
  87. domain_prefix.len)==0)
  88. {
  89. db_vals[1].val.str_val.s += domain_prefix.len;
  90. db_vals[1].val.str_val.len -= domain_prefix.len;
  91. }
  92. }
  93. adbf.use_table(db_handle, &table_s);
  94. if(adbf.query(db_handle, db_keys, NULL, db_vals, db_cols,
  95. (use_domain)?2:1 /*no keys*/, 2 /*no cols*/, NULL, &db_res)!=0)
  96. {
  97. LM_ERR("failed to query database\n");
  98. goto err_server;
  99. }
  100. if (RES_ROW_N(db_res)<=0 || RES_ROWS(db_res)[0].values[0].nul != 0)
  101. {
  102. LM_DBG("no alias found for R-URI\n");
  103. if (db_res!=NULL && adbf.free_result(db_handle, db_res) < 0)
  104. LM_DBG("failed to freeing result of query\n");
  105. return -1;
  106. }
  107. memcpy(useruri_buf, "sip:", 4);
  108. for(i=0; i<RES_ROW_N(db_res); i++)
  109. {
  110. user_s.len = 4;
  111. user_s.s = useruri_buf+4;
  112. switch(RES_ROWS(db_res)[i].values[0].type)
  113. {
  114. case DB1_STRING:
  115. strcpy(user_s.s,
  116. (char*)RES_ROWS(db_res)[i].values[0].val.string_val);
  117. user_s.len += strlen(user_s.s);
  118. break;
  119. case DB1_STR:
  120. strncpy(user_s.s,
  121. (char*)RES_ROWS(db_res)[i].values[0].val.str_val.s,
  122. RES_ROWS(db_res)[i].values[0].val.str_val.len);
  123. user_s.len += RES_ROWS(db_res)[i].values[0].val.str_val.len;
  124. break;
  125. case DB1_BLOB:
  126. strncpy(user_s.s,
  127. (char*)RES_ROWS(db_res)[i].values[0].val.blob_val.s,
  128. RES_ROWS(db_res)[i].values[0].val.blob_val.len);
  129. user_s.len += RES_ROWS(db_res)[i].values[0].val.blob_val.len;
  130. break;
  131. default:
  132. LM_ERR("unknown type of DB user column\n");
  133. if (db_res != NULL && adbf.free_result(db_handle, db_res) < 0)
  134. {
  135. LM_DBG("failed to freeing result of query\n");
  136. }
  137. goto err_server;
  138. }
  139. /* add the @*/
  140. useruri_buf[user_s.len] = '@';
  141. user_s.len++;
  142. /* add the domain */
  143. user_s.s = useruri_buf+user_s.len;
  144. switch(RES_ROWS(db_res)[i].values[1].type)
  145. {
  146. case DB1_STRING:
  147. strcpy(user_s.s,
  148. (char*)RES_ROWS(db_res)[i].values[1].val.string_val);
  149. user_s.len += strlen(user_s.s);
  150. break;
  151. case DB1_STR:
  152. strncpy(user_s.s,
  153. (char*)RES_ROWS(db_res)[i].values[1].val.str_val.s,
  154. RES_ROWS(db_res)[i].values[1].val.str_val.len);
  155. user_s.len += RES_ROWS(db_res)[i].values[1].val.str_val.len;
  156. useruri_buf[user_s.len] = '\0';
  157. break;
  158. case DB1_BLOB:
  159. strncpy(user_s.s,
  160. (char*)RES_ROWS(db_res)[i].values[1].val.blob_val.s,
  161. RES_ROWS(db_res)[i].values[1].val.blob_val.len);
  162. user_s.len += RES_ROWS(db_res)[i].values[1].val.blob_val.len;
  163. useruri_buf[user_s.len] = '\0';
  164. break;
  165. default:
  166. LM_ERR("unknown type of DB user column\n");
  167. if (db_res != NULL && adbf.free_result(db_handle, db_res) < 0)
  168. {
  169. LM_DBG("failed to freeing result of query\n");
  170. }
  171. goto err_server;
  172. }
  173. /* set the URI */
  174. LM_DBG("new URI [%d] is [%s]\n", i, useruri_buf);
  175. if(i==0)
  176. {
  177. if(rewrite_ruri(_msg, useruri_buf)<0)
  178. {
  179. LM_ERR("cannot replace the R-URI\n");
  180. goto err_server;
  181. }
  182. if(ald_append_branches==0)
  183. break;
  184. } else {
  185. user_s.s = useruri_buf;
  186. if (append_branch(_msg, &user_s, 0, 0, MIN_Q, 0, 0,
  187. 0, 0, 0, 0) == -1)
  188. {
  189. LM_ERR("error while appending branches\n");
  190. goto err_server;
  191. }
  192. }
  193. }
  194. /**
  195. * Free the DB result
  196. */
  197. if (db_res!=NULL && adbf.free_result(db_handle, db_res) < 0)
  198. LM_DBG("failed to freeing result of query\n");
  199. return 1;
  200. err_server:
  201. if (db_res!=NULL && adbf.free_result(db_handle, db_res) < 0)
  202. LM_DBG("failed to freeing result of query\n");
  203. return -1;
  204. }