mapping.c

Go to the documentation of this file.
00001 /* OpenSER PURPLE MODULE
00002  * 
00003  * Copyright (C) 2008 Atos Worldline
00004  * Contact: Eric PTAK <eric.ptak@atosorigin.com>
00005  *
00006  * This program is free software: you can redistribute it and/or modify
00007  * it under the terms of the GNU General Public License as published by
00008  * the Free Software Foundation, either version 2 of the License, or
00009  * (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00018  *
00019  */
00020 #include <stdlib.h>
00021 #include <stdio.h>
00022 #include <string.h>
00023 
00024 #include "../../str.h"
00025 #include "../../db/db.h"
00026 #include "../../dprint.h"
00027 
00028 #include "mapping.h"
00029 
00030 
00031 
00032 /*
00033  * CREATE TABLE purple_map (
00034  *    id INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
00035  *    sip_user VARCHAR(128) NOT NULL,
00036  *    ext_user VARCHAR(128) NOT NULL,
00037  *    ext_prot VARCHAR(16) NOT NULL,
00038  *    ext_pass VARCHAR(64)
00039  * );
00040  *
00041  * +----------+------------------+------+-----+---------+----------------+
00042  * | Field    | Type             | Null | Key | Default | Extra          |
00043  * +----------+------------------+------+-----+---------+----------------+
00044  * | id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
00045  * | sip_user | varchar(128)     | NO   |     | NULL    |                |
00046  * | ext_user | varchar(128)     | NO   |     | NULL    |                |
00047  * | ext_prot | varchar(16)      | NO   |     | NULL    |                |
00048  * | ext_pass | varchar(64)      | YES  |     | NULL    |                |
00049  * +----------+------------------+------+-----+---------+----------------+
00050  * 
00051  */
00052 
00053 
00054 extern db_func_t pa_dbf;
00055 extern str db_url;
00056 extern str db_table;
00057 
00058 void extern_account_free(extern_account_t *accounts, int count) {
00059    if (accounts) {
00060       int i;
00061       for (i = 0; i < count; i++) {
00062          if (accounts[i].protocol)
00063             pkg_free(accounts[i].protocol);
00064          if (accounts[i].username)
00065             pkg_free(accounts[i].username);
00066          if (accounts[i].password)
00067             pkg_free(accounts[i].password);
00068       }
00069       pkg_free(accounts);
00070    }
00071 }
00072 
00073 void extern_user_free(extern_user_t *users, int count) {
00074    if (users) {
00075       int i;
00076       for (i = 0; i < count; i++) {
00077          if (users[i].protocol)
00078             pkg_free(users[i].protocol);
00079          if (users[i].username)
00080             pkg_free(users[i].username);
00081       }
00082       pkg_free(users);
00083    }
00084 }
00085 
00086 char *find_sip_user(char *extern_user) {
00087    LM_DBG("looking up sip user for %s\n", extern_user);
00088    char *sip_user_r;
00089    str sip_user;
00090 
00091    str ext_user;
00092    ext_user.s = extern_user;
00093    ext_user.len = strlen(extern_user);
00094    
00095    db_key_t query_cols[6];
00096    db_op_t  query_ops[6];
00097    db_val_t query_vals[6];
00098    db_key_t result_cols[6];
00099    int n_query_cols = 0, n_result_cols = 0;
00100    db_row_t *row;
00101    db_val_t *row_vals;
00102    db_res_t *result = NULL;
00103    int sip_user_col;
00104 
00105    str q_ext_user = {"ext_user", 8};
00106    query_cols[n_query_cols] = &q_ext_user;
00107    query_ops[n_query_cols] = OP_EQ;
00108    query_vals[n_query_cols].type = DB_STR;
00109    query_vals[n_query_cols].nul = 0;
00110    query_vals[n_query_cols].val.str_val = ext_user;
00111    n_query_cols++;
00112    
00113    str r_sip_user = {"sip_user", 8};
00114    result_cols[sip_user_col=n_result_cols++] = &r_sip_user;
00115 
00116    db_con_t *pa_db;
00117    pa_db = pa_dbf.init(&db_url);
00118    if (!pa_db) {
00119       LM_ERR("error connecting database\n");
00120       return NULL;
00121    }
00122    
00123    if (pa_dbf.use_table(pa_db, &db_table) < 0) {
00124       LM_ERR("error in use_table\n");
00125       return NULL;
00126    }
00127 
00128    if (pa_dbf.query(pa_db, query_cols, query_ops, query_vals, result_cols, n_query_cols, n_result_cols, 0, &result) < 0) {
00129       LM_ERR("error in sql query\n");
00130       pa_dbf.close(pa_db);
00131       return NULL;
00132    }
00133    
00134    if (result == NULL)
00135       return NULL;
00136    if (result->n <= 0)
00137       return NULL;
00138 
00139    row = &result->rows[0];
00140    row_vals = ROW_VALUES(row);
00141 
00142    sip_user_r = (char*) row_vals[sip_user_col].val.string_val;
00143    
00144    if (sip_user_r == NULL)
00145       return NULL;
00146 
00147    sip_user.s = (char*) pkg_malloc(sizeof(char) * (strlen(sip_user_r)+1));
00148    sip_user.len = sprintf(sip_user.s, "%s", sip_user_r);
00149 
00150    pa_dbf.free_result(pa_db, result);
00151    pa_dbf.close(pa_db);
00152 
00153    return sip_user.len ? sip_user.s : NULL;
00154 }
00155 
00156 extern_account_t *find_accounts(char* sip_user, int* count) {
00157    LM_DBG("looking up external account for %s\n", sip_user);
00158    extern_account_t* accounts = NULL;
00159    *count = 0;
00160 
00161    db_key_t query_cols[6];
00162    db_op_t  query_ops[6];
00163    db_val_t query_vals[6];
00164    db_key_t result_cols[6];
00165    int n_query_cols = 0, n_result_cols = 0;
00166    db_row_t *row;
00167    db_val_t *row_vals;
00168    db_res_t *result = NULL;
00169    int ext_prot_col, ext_user_col, ext_pass_col;
00170 
00171    str q_sip_user = {"sip_user", 8};
00172    query_cols[n_query_cols] = &q_sip_user;
00173    query_ops[n_query_cols] = OP_EQ;
00174    query_vals[n_query_cols].type = DB_STRING;
00175    query_vals[n_query_cols].nul = 0;
00176    query_vals[n_query_cols].val.string_val = sip_user;
00177    n_query_cols++;
00178    
00179    str r_ext_prot = {"ext_prot", 8};
00180    str r_ext_user = {"ext_user", 8};
00181    str r_ext_pass = {"ext_pass", 8};
00182    result_cols[ext_prot_col=n_result_cols++] = &r_ext_prot;
00183    result_cols[ext_user_col=n_result_cols++] = &r_ext_user;
00184    result_cols[ext_pass_col=n_result_cols++] = &r_ext_pass;
00185 
00186    db_con_t *pa_db;
00187    pa_db = pa_dbf.init(&db_url);
00188    if (!pa_db) {
00189       LM_ERR("error connecting database\n");
00190       return NULL;
00191    }
00192    
00193    if (pa_dbf.use_table(pa_db, &db_table) < 0) {
00194       LM_ERR("error in use_table\n");
00195       return NULL;
00196    }
00197 
00198    if (pa_dbf.query(pa_db, query_cols, query_ops, query_vals, result_cols, n_query_cols, n_result_cols, 0, &result) < 0) {
00199       LM_ERR("in sql query\n");
00200       pa_dbf.close(pa_db);
00201       return NULL;
00202    }
00203    else
00204       LM_DBG("sql query done\n");
00205 
00206    if (result == NULL) {
00207       LM_ERR("result = NULL\n");
00208       return NULL;
00209    }
00210    if (result->n <= 0) {
00211       LM_ERR("result count = %d\n", result->n);
00212       return NULL;
00213    }
00214 
00215    accounts = (extern_account_t*) pkg_malloc(sizeof(extern_account_t)*result->n);
00216 
00217    int i;
00218    char *val;
00219    for (i = 0; i < result->n; i++) {
00220       row = &result->rows[i];
00221       row_vals = ROW_VALUES(row);
00222 
00223       val = (char*) row_vals[ext_user_col].val.string_val;
00224       accounts[i].username = (char*)pkg_malloc(sizeof(char)*(strlen(val)+1));
00225       strcpy(accounts[i].username, val);
00226       
00227       val = (char*) row_vals[ext_pass_col].val.string_val;
00228       accounts[i].password = (char*)pkg_malloc(sizeof(char)*(strlen(val)+1));
00229       strcpy(accounts[i].password, val);
00230       
00231       val = (char*) row_vals[ext_prot_col].val.string_val;
00232       accounts[i].protocol = (char*)pkg_malloc(sizeof(char)*(strlen(val)+1));
00233       strcpy(accounts[i].protocol, val);
00234 
00235    }
00236 
00237    *count = result->n;
00238    
00239    pa_dbf.free_result(pa_db, result);
00240    pa_dbf.close(pa_db);
00241    
00242    return accounts;
00243 }
00244 
00245 extern_user_t *find_users(char *sip_user, int* count) {
00246    LM_DBG("looking up external users for %s\n", sip_user);
00247    extern_user_t* users = NULL;
00248    *count = 0;
00249 
00250    db_key_t query_cols[6];
00251    db_op_t  query_ops[6];
00252    db_val_t query_vals[6];
00253    db_key_t result_cols[6];
00254    int n_query_cols = 0, n_result_cols = 0;
00255    db_row_t *row;
00256    db_val_t *row_vals;
00257    db_res_t *result = NULL;
00258    int ext_prot_col, ext_user_col;
00259    
00260    str q_sip_user = {"sip_user", 8};
00261    query_cols[n_query_cols] = &q_sip_user;
00262    query_ops[n_query_cols] = OP_EQ;
00263    query_vals[n_query_cols].type = DB_STRING;
00264    query_vals[n_query_cols].nul = 0;
00265    query_vals[n_query_cols].val.string_val = sip_user;
00266    n_query_cols++;
00267    
00268    str r_ext_prot = {"ext_prot", 8};
00269    str r_ext_user = {"ext_user", 8};
00270    result_cols[ext_prot_col=n_result_cols++] = &r_ext_prot;
00271    result_cols[ext_user_col=n_result_cols++] = &r_ext_user;
00272 
00273    db_con_t *pa_db;
00274    pa_db = pa_dbf.init(&db_url);
00275    if (!pa_db) {
00276       LM_ERR("error connecting database\n");
00277       return NULL;
00278    }
00279    
00280    if (pa_dbf.use_table(pa_db, &db_table) < 0) {
00281       LM_ERR("error in use_table\n");
00282       return NULL;
00283    }
00284 
00285    if (pa_dbf.query(pa_db, query_cols, query_ops, query_vals, result_cols, n_query_cols, n_result_cols, 0, &result) < 0) {
00286       LM_ERR("in sql query\n");
00287       pa_dbf.close(pa_db);
00288       return NULL;
00289    }
00290 
00291    if (result == NULL)
00292       return NULL;
00293    if (result->n <= 0)
00294       return NULL;
00295 
00296    users = (extern_user_t*) pkg_malloc(sizeof(extern_user_t)*result->n);
00297 
00298    int i;
00299    char *val;
00300    for (i = 0; i < result->n; i++) {
00301       row = &result->rows[i];
00302       row_vals = ROW_VALUES(row);
00303 
00304       val = (char*) row_vals[ext_user_col].val.string_val;
00305       users[i].username = (char*) pkg_malloc(sizeof(char)*(strlen(val)+1));
00306       strcpy(users[i].username, val);
00307       
00308       val = (char*) row_vals[ext_prot_col].val.string_val;
00309       users[i].protocol = (char*) pkg_malloc(sizeof(char)*(strlen(val)+1));
00310       strcpy(users[i].protocol, val);
00311 
00312    }
00313 
00314    *count = result->n;
00315    
00316    pa_dbf.free_result(pa_db, result);
00317    pa_dbf.close(pa_db);
00318    
00319    return users;
00320 }
00321 
00322 

Generated on Wed May 23 18:00:28 2012 for Kamailio - The Open Source SIP Server by  doxygen 1.5.6