int alias_db_lookup(struct sip_msg* _msg, str table_s) { str user_s; db_key_t db_keys[2] = {&alias_user_column, &alias_domain_column}; db_val_t db_vals[2]; db_key_t db_cols[] = {&user_column, &domain_column}; db1_res_t* db_res = NULL; int i; if (parse_sip_msg_uri(_msg) < 0) return -1; db_vals[0].type = DB1_STR; db_vals[0].nul = 0; db_vals[0].val.str_val.s = _msg->parsed_uri.user.s; db_vals[0].val.str_val.len = _msg->parsed_uri.user.len; if (use_domain) { db_vals[1].type = DB1_STR; db_vals[1].nul = 0; db_vals[1].val.str_val.s = _msg->parsed_uri.host.s; db_vals[1].val.str_val.len = _msg->parsed_uri.host.len; if (domain_prefix.s && domain_prefix.len>0 && domain_prefix.len<_msg->parsed_uri.host.len && strncasecmp(_msg->parsed_uri.host.s,domain_prefix.s, domain_prefix.len)==0) { db_vals[1].val.str_val.s += domain_prefix.len; db_vals[1].val.str_val.len -= domain_prefix.len; } } adbf.use_table(db_handle, &table_s); if(adbf.query(db_handle, db_keys, NULL, db_vals, db_cols, (use_domain)?2:1 /*no keys*/, 2 /*no cols*/, NULL, &db_res)!=0) { LM_ERR("failed to query database\n"); goto err_server; } if (RES_ROW_N(db_res)<=0 || RES_ROWS(db_res)[0].values[0].nul != 0) { LM_DBG("no alias found for R-URI\n"); if (db_res!=NULL && adbf.free_result(db_handle, db_res) < 0) LM_DBG("failed to freeing result of query\n"); return -1; } memcpy(useruri_buf, "sip:", 4); for(i=0; i<RES_ROW_N(db_res); i++) { user_s.len = 4; user_s.s = useruri_buf+4; switch(RES_ROWS(db_res)[i].values[0].type) { case DB1_STRING: strcpy(user_s.s, (char*)RES_ROWS(db_res)[i].values[0].val.string_val); user_s.len += strlen(user_s.s); break; case DB1_STR: strncpy(user_s.s, (char*)RES_ROWS(db_res)[i].values[0].val.str_val.s, RES_ROWS(db_res)[i].values[0].val.str_val.len); user_s.len += RES_ROWS(db_res)[i].values[0].val.str_val.len; break; case DB1_BLOB: strncpy(user_s.s, (char*)RES_ROWS(db_res)[i].values[0].val.blob_val.s, RES_ROWS(db_res)[i].values[0].val.blob_val.len); user_s.len += RES_ROWS(db_res)[i].values[0].val.blob_val.len; break; default: LM_ERR("unknown type of DB user column\n"); if (db_res != NULL && adbf.free_result(db_handle, db_res) < 0) { LM_DBG("failed to freeing result of query\n"); } goto err_server; } /* add the @*/ useruri_buf[user_s.len] = '@'; user_s.len++; /* add the domain */ user_s.s = useruri_buf+user_s.len; switch(RES_ROWS(db_res)[i].values[1].type) { case DB1_STRING: strcpy(user_s.s, (char*)RES_ROWS(db_res)[i].values[1].val.string_val); user_s.len += strlen(user_s.s); break; case DB1_STR: strncpy(user_s.s, (char*)RES_ROWS(db_res)[i].values[1].val.str_val.s, RES_ROWS(db_res)[i].values[1].val.str_val.len); user_s.len += RES_ROWS(db_res)[i].values[1].val.str_val.len; useruri_buf[user_s.len] = '\0'; break; case DB1_BLOB: strncpy(user_s.s, (char*)RES_ROWS(db_res)[i].values[1].val.blob_val.s, RES_ROWS(db_res)[i].values[1].val.blob_val.len); user_s.len += RES_ROWS(db_res)[i].values[1].val.blob_val.len; useruri_buf[user_s.len] = '\0'; break; default: LM_ERR("unknown type of DB user column\n"); if (db_res != NULL && adbf.free_result(db_handle, db_res) < 0) { LM_DBG("failed to freeing result of query\n"); } goto err_server; } /* set the URI */ LM_DBG("new URI [%d] is [%s]\n", i, useruri_buf); if(i==0) { if(rewrite_ruri(_msg, useruri_buf)<0) { LM_ERR("cannot replace the R-URI\n"); goto err_server; } if(ald_append_branches==0) break; } else { user_s.s = useruri_buf; if (append_branch(_msg, &user_s, 0, 0, MIN_Q, 0, 0) == -1) { LM_ERR("error while appending branches\n"); goto err_server; } } } /** * Free the DB result */ if (db_res!=NULL && adbf.free_result(db_handle, db_res) < 0) LM_DBG("failed to freeing result of query\n"); return 1; err_server: if (db_res!=NULL && adbf.free_result(db_handle, db_res) < 0) LM_DBG("failed to freeing result of query\n"); return -1; }
int sd_lookup(struct sip_msg* _msg, char* _table, char* _owner) { str user_s, table_s, uri_s; int nr_keys; struct sip_uri *puri; struct sip_uri turi; db_key_t db_keys[4]; db_val_t db_vals[4]; db_key_t db_cols[1]; db1_res_t* db_res = NULL; if(_table==NULL || fixup_get_svalue(_msg, (gparam_p)_table, &table_s)!=0) { LM_ERR("invalid table parameter"); return -1; } /* init */ nr_keys = 0; db_cols[0]=&new_uri_column; if(_owner) { memset(&turi, 0, sizeof(struct sip_uri)); if(fixup_get_svalue(_msg, (gparam_p)_owner, &uri_s)!=0) { LM_ERR("invalid owner uri parameter"); return -1; } if(parse_uri(uri_s.s, uri_s.len, &turi)!=0) { LM_ERR("bad owner SIP address!\n"); goto err_server; } LM_DBG("using user id [%.*s]\n", uri_s.len, uri_s.s); puri = &turi; } else { /* take username@domain from From header */ if ( (puri = parse_from_uri(_msg ))==NULL ) { LM_ERR("failed to parse FROM header\n"); goto err_server; } } db_keys[nr_keys]=&user_column; db_vals[nr_keys].type = DB1_STR; db_vals[nr_keys].nul = 0; db_vals[nr_keys].val.str_val.s = puri->user.s; db_vals[nr_keys].val.str_val.len = puri->user.len; nr_keys++; if(use_domain>=1) { db_keys[nr_keys]=&domain_column; db_vals[nr_keys].type = DB1_STR; db_vals[nr_keys].nul = 0; db_vals[nr_keys].val.str_val.s = puri->host.s; db_vals[nr_keys].val.str_val.len = puri->host.len; nr_keys++; if (dstrip_s.s!=NULL && dstrip_s.len>0 && dstrip_s.len<puri->host.len && strncasecmp(puri->host.s,dstrip_s.s,dstrip_s.len)==0) { db_vals[nr_keys].val.str_val.s += dstrip_s.len; db_vals[nr_keys].val.str_val.len -= dstrip_s.len; } } /* take sd from r-uri */ if (parse_sip_msg_uri(_msg) < 0) { LM_ERR("failed to parsing Request-URI\n"); goto err_server; } db_keys[nr_keys]=&sd_user_column; db_vals[nr_keys].type = DB1_STR; db_vals[nr_keys].nul = 0; db_vals[nr_keys].val.str_val.s = _msg->parsed_uri.user.s; db_vals[nr_keys].val.str_val.len = _msg->parsed_uri.user.len; nr_keys++; if(use_domain>=2) { db_keys[nr_keys]=&sd_domain_column; db_vals[nr_keys].type = DB1_STR; db_vals[nr_keys].nul = 0; db_vals[nr_keys].val.str_val.s = _msg->parsed_uri.host.s; db_vals[nr_keys].val.str_val.len = _msg->parsed_uri.host.len; nr_keys++; if (dstrip_s.s!=NULL && dstrip_s.len>0 && dstrip_s.len<_msg->parsed_uri.host.len && strncasecmp(_msg->parsed_uri.host.s,dstrip_s.s,dstrip_s.len)==0) { db_vals[nr_keys].val.str_val.s += dstrip_s.len; db_vals[nr_keys].val.str_val.len -= dstrip_s.len; } } db_funcs.use_table(db_handle, &table_s); if(db_funcs.query(db_handle, db_keys, NULL, db_vals, db_cols, nr_keys /*no keys*/, 1 /*no cols*/, NULL, &db_res)!=0) { LM_ERR("failed to query database\n"); goto err_server; } if (RES_ROW_N(db_res)<=0 || RES_ROWS(db_res)[0].values[0].nul != 0) { LM_DBG("no sip addres found for R-URI\n"); if (db_res!=NULL && db_funcs.free_result(db_handle, db_res) < 0) LM_DBG("failed to free result of query\n"); return -1; } user_s.s = useruri_buf+4; switch(RES_ROWS(db_res)[0].values[0].type) { case DB1_STRING: strcpy(user_s.s, (char*)RES_ROWS(db_res)[0].values[0].val.string_val); user_s.len = strlen(user_s.s); break; case DB1_STR: strncpy(user_s.s, (char*)RES_ROWS(db_res)[0].values[0].val.str_val.s, RES_ROWS(db_res)[0].values[0].val.str_val.len); user_s.len = RES_ROWS(db_res)[0].values[0].val.str_val.len; user_s.s[user_s.len] = '\0'; break; case DB1_BLOB: strncpy(user_s.s, (char*)RES_ROWS(db_res)[0].values[0].val.blob_val.s, RES_ROWS(db_res)[0].values[0].val.blob_val.len); user_s.len = RES_ROWS(db_res)[0].values[0].val.blob_val.len; user_s.s[user_s.len] = '\0'; default: LM_ERR("unknown type of DB new_uri column\n"); if (db_res != NULL && db_funcs.free_result(db_handle, db_res) < 0) { LM_DBG("failed to free result of query\n"); } goto err_server; } /* check 'sip:' */ if(user_s.len<4 || strncmp(user_s.s, "sip:", 4)) { memcpy(useruri_buf, "sip:", 4); user_s.s -= 4; user_s.len += 4; } /** * Free the result because we don't need it anymore */ if (db_res!=NULL && db_funcs.free_result(db_handle, db_res) < 0) LM_DBG("failed to free result of query\n"); /* set the URI */ LM_DBG("URI of sd from R-URI [%s]\n", user_s.s); if(rewrite_ruri(_msg, user_s.s)<0) { LM_ERR("failed to replace the R-URI\n"); goto err_server; } return 1; err_server: return -1; }