int select_uri_type(str* res, select_t* s, struct sip_msg* msg) { trim(res); if (parse_uri(res->s, res->len, &uri)<0) return -1; if (uri.type==ERROR_URI_T) return -1; uri_type_to_str(uri.type, res); return 0; }
int sca_aor_create_from_info( str *aor, uri_type type, str *user, str *domain, str *port ) { str scheme = STR_NULL; int len = 0; assert( aor != NULL ); uri_type_to_str( type, &scheme ); /* +1 for ':', +1 for '@' */ len = scheme.len + 1 + user->len + 1 + domain->len; if ( !SCA_STR_EMPTY( port )) { /* +1 for ':' */ len += 1 + port->len; } aor->s = (char *)pkg_malloc( len ); if ( aor->s == NULL ) { LM_ERR( "sca_aor_create_from_info: pkg_malloc %d bytes failed", len ); return( -1 ); } len = 0; SCA_STR_COPY( aor, &scheme ); len += scheme.len; *(aor->s + len) = ':'; aor->len++; len++; SCA_STR_APPEND( aor, user ); len += user->len; *(aor->s + len) = '@'; aor->len++; len++; SCA_STR_APPEND( aor, domain ); len += domain->len; if ( !SCA_STR_EMPTY( port )) { *(aor->s + len) = ':'; len += 1; SCA_STR_APPEND( aor, port ); len += port->len; } return( aor->len ); }
int select_uri_type(str* res, select_t* s, struct sip_msg* msg) { if (select_uri_p == NULL) { trim(res); if (parse_uri(res->s, res->len, &uri)<0) return -1; select_uri_p = &uri; } if (select_uri_p->type==ERROR_URI_T) return -1; uri_type_to_str(select_uri_p->type, res); return 0; }
static int load_uri_attrs(struct sip_msg* msg, unsigned long flags, fparam_t* fp) { static char rad_msg[4096]; struct sip_uri puri; str uri, did, scheme; UINT4 service; VALUE_PAIR* send, *received; send = NULL; received = NULL; if (get_str_fparam(&uri, msg, (fparam_t*)fp) != 0) { ERR("Unable to get URI\n"); return -1; } if (parse_uri(uri.s, uri.len, &puri) < 0) { ERR("Error while parsing URI '%.*s'\n", uri.len, uri.s); return -1; } if (puri.host.len) { /* domain name is present */ if (dm_get_did(&did, &puri.host) < 0) { DBG("Cannot lookup DID for domain %.*s, using default value\n", puri.host.len, ZSW(puri.host.s)); did.s = DEFAULT_DID; did.len = sizeof(DEFAULT_DID) - 1; } } else { /* domain name is missing -- can be caused by tel: URI */ DBG("There is no domain name, using default value\n"); did.s = DEFAULT_DID; did.len = sizeof(DEFAULT_DID) - 1; } uri_type_to_str(puri.type, &scheme); service = vals[V_GET_URI_ATTRS].v; if (scheme.len) { if (!rc_avpair_add(rh, &send, ATTRID(attrs[A_SER_URI_SCHEME].v), scheme.s, scheme.len, VENDOR(attrs[A_SER_URI_SCHEME].v))) { ERR("Error while adding A_SER_URI_SCHEME\n"); goto error; } } if (!rc_avpair_add(rh, &send, ATTRID(attrs[A_USER_NAME].v), puri.user.s, puri.user.len, VENDOR(attrs[A_USER_NAME].v))) { ERR("Error while adding A_USER_NAME\n"); goto error; } if (!rc_avpair_add(rh, &send, ATTRID(attrs[A_SER_DID].v), did.s, did.len, VENDOR(attrs[A_SER_DID].v))) { ERR("Error while adding A_SER_DID\n"); goto error; } if (!rc_avpair_add(rh, &send, ATTRID(attrs[A_SER_SERVICE_TYPE].v), &vals[V_GET_URI_ATTRS].v, -1, VENDOR(attrs[A_SER_SERVICE_TYPE].v))) { ERR("Error adding A_SERVICE_TYPE\n"); goto error; } if (rc_auth(rh, 0, send, &received, rad_msg) != OK_RC) { DBG("load_uri_attrs: Failure\n"); goto error; } DBG("load_uri_attrs: Success\n"); rc_avpair_free(send); if (generate_avps(flags, received) < 0) { rc_avpair_free(received); goto error; } rc_avpair_free(received); return 1; error: if (send) rc_avpair_free(send); if (received) rc_avpair_free(send); return -1; }
static int load_uri_attrs(struct sip_msg* msg, unsigned long flags, fparam_t* fp) { int_str name, v; str avp_name, avp_val; int i, type, n; db_key_t keys[3], cols[4]; db_res_t* res; db_val_t kv[3], *val; str uri; struct sip_uri puri; keys[0] = username_column; keys[1] = did_column; keys[2] = scheme_column; kv[0].type = DB_STR; kv[0].nul = 0; kv[1].type = DB_STR; kv[1].nul = 0; kv[2].type = DB_STR; kv[2].nul = 0; if (get_str_fparam(&uri, msg, (fparam_t*)fp) != 0) { ERR("Unable to get URI\n"); return -1; } if (parse_uri(uri.s, uri.len, &puri) < 0) { ERR("Error while parsing URI '%.*s'\n", uri.len, uri.s); return -1; } kv[0].val.str_val = puri.user; if (puri.host.len) { /* domain name is present */ if (dm_get_did(&kv[1].val.str_val, &puri.host) < 0) { DBG("Cannot lookup DID for domain %.*s, using default value\n", puri.host.len, ZSW(puri.host.s)); kv[1].val.str_val.s = DEFAULT_DID; kv[1].val.str_val.len = sizeof(DEFAULT_DID) - 1; } } else { /* domain name is missing -- can be caused by tel: URI */ DBG("There is no domain name, using default value\n"); kv[1].val.str_val.s = DEFAULT_DID; kv[1].val.str_val.len = sizeof(DEFAULT_DID) - 1; } uri_type_to_str(puri.type, &(kv[2].val.str_val)); cols[0] = name_column; cols[1] = type_column; cols[2] = val_column; cols[3] = flags_column; if (db.use_table(con, uri_attrs_table) < 0) { ERR("Error in use_table\n"); return -1; } if (db.query(con, keys, 0, kv, cols, 3, 4, 0, &res) < 0) { ERR("Error while quering database\n"); return -1; } n = 0; /* AVP names from DB are always strings */ flags |= AVP_NAME_STR; for(i = 0; i < res->n; i++) { /* reset val_str as the value could be an integer */ flags &= ~AVP_VAL_STR; val = res->rows[i].values; if (val[0].nul || val[1].nul || val[3].nul) { ERR("Skipping row containing NULL entries\n"); continue; } if ((val[3].val.int_val & DB_LOAD_SER) == 0) continue; n++; /* Get AVP name */ avp_name.s = (char*)val[0].val.string_val; avp_name.len = strlen(avp_name.s); name.s = avp_name; /* Get AVP type */ type = val[1].val.int_val; /* Test for NULL value */ if (val[2].nul) { avp_val.s = 0; avp_val.len = 0; } else { avp_val.s = (char*)val[2].val.string_val; avp_val.len = strlen(avp_val.s); } if (type == AVP_VAL_STR) { /* String AVP */ v.s = avp_val; flags |= AVP_VAL_STR; } else { /* Integer AVP */ str2int(&avp_val, (unsigned*)&v.n); } if (add_avp(flags, name, v) < 0) { ERR("Error while adding user attribute %.*s, skipping\n", avp_name.len, ZSW(avp_name.s)); continue; } } DBG("avp_db:load_attrs: %d user attributes found, %d loaded\n", res->n, n); db.free_result(con, res); return 1; }