/*! * \brief Check if username in specified header field is in a table * \param _msg SIP message * \param _hf Header field * \param _grp checked table * \return 1 on success, negative on failure */ int is_user_in(struct sip_msg* _msg, char* _hf, char* _grp) { db_key_t keys[3]; db_val_t vals[3]; db_key_t col[1]; db1_res_t* res = NULL; keys[0] = &user_column; keys[1] = &group_column; keys[2] = &domain_column; col[0] = &group_column; if ( get_username_domain( _msg, (group_check_p)_hf, &(VAL_STR(vals)), &(VAL_STR(vals+2)))!=0) { LM_ERR("failed to get username@domain\n"); return -1; } if (VAL_STR(vals).s==NULL || VAL_STR(vals).len==0 ) { LM_DBG("no username part\n"); return -1; } VAL_TYPE(vals) = VAL_TYPE(vals + 1) = VAL_TYPE(vals + 2) = DB1_STR; VAL_NULL(vals) = VAL_NULL(vals + 1) = VAL_NULL(vals + 2) = 0; VAL_STR(vals + 1) = *((str*)_grp); if (group_dbf.use_table(group_dbh, &table) < 0) { LM_ERR("failed to use_table\n"); return -5; } if (group_dbf.query(group_dbh, keys, 0, vals, col, (use_domain) ? (3): (2), 1, 0, &res) < 0) { LM_ERR("failed to query database\n"); return -5; } if (RES_ROW_N(res) == 0) { LM_DBG("user is not in group '%.*s'\n", ((str*)_grp)->len, ZSW(((str*)_grp)->s)); group_dbf.free_result(group_dbh, res); return -6; } else { LM_DBG("user is in group '%.*s'\n", ((str*)_grp)->len, ZSW(((str*)_grp)->s)); group_dbf.free_result(group_dbh, res); return 1; } }
/* * Check if username in specified header field is in a table */ int db_is_user_in(struct sip_msg* _msg, char* _hf, char* _grp) { static db_ps_t my_ps = NULL; db_key_t keys[3]; db_val_t vals[3]; db_key_t col[1]; db_res_t* res = NULL; keys[0] = &user_column; keys[1] = &group_column; keys[2] = &domain_column; col[0] = &group_column; str hf_s = { NULL, 0 }; str grp_s = { NULL, 0 }; if(_hf == NULL || fixup_get_svalue(_msg, (gparam_p)_hf, &hf_s) != 0) { LM_ERR("Invalid parameter URI\n"); return -1; } if(_grp == NULL || fixup_get_svalue(_msg, (gparam_p)_grp, &grp_s) != 0) { LM_ERR("Invalid parameter grp\n"); return -1; } if ( get_username_domain( _msg, &hf_s, &(VAL_STR(vals)), &(VAL_STR(vals+2)))!=0) { LM_ERR("failed to get username@domain\n"); return -1; } if (VAL_STR(vals).s==NULL || VAL_STR(vals).len==0 ) { LM_DBG("no username part\n"); return -1; } VAL_TYPE(vals) = VAL_TYPE(vals + 1) = VAL_TYPE(vals + 2) = DB_STR; VAL_NULL(vals) = VAL_NULL(vals + 1) = VAL_NULL(vals + 2) = 0; VAL_STR(vals + 1) = *(&grp_s); group_dbf.use_table(group_dbh, &table); CON_PS_REFERENCE(group_dbh) = &my_ps; if (group_dbf.query(group_dbh, keys, 0, vals, col, (use_domain) ? (3): (2), 1, 0, &res) < 0) { LM_ERR("failed to query database\n"); return -5; } if (RES_ROW_N(res) == 0) { LM_DBG("user is not in group '%.*s'\n", (grp_s.len), ZSW((grp_s.s))); group_dbf.free_result(group_dbh, res); return -6; } else { LM_DBG("user is in group '%.*s'\n", (grp_s.len), ZSW((grp_s.s))); group_dbf.free_result(group_dbh, res); return 1; } }
int get_user_group(struct sip_msg *req, char *user, char *avp) { static char uri_buf[MAX_URI_SIZE]; str user_str; str username; str domain; pv_spec_t *pvs; pv_value_t val; struct re_grp *rg; regmatch_t pmatch; char *c; int n; if(user == NULL || fixup_get_svalue(req, (gparam_p)user, &user_str) != 0){ LM_ERR("Invalid parameter URI\n"); return -1; } if (get_username_domain( req, &user_str, &username, &domain)!=0){ LM_ERR("failed to get username@domain\n"); goto error; } if (username.s==NULL || username.len==0 ) { LM_DBG("no username part\n"); return -1; } if ( 4 + username.len + 1 + domain.len + 1 > MAX_URI_SIZE ) { LM_ERR("URI to large!!\n"); goto error; } *(int*)uri_buf = htonl(('s'<<24) + ('i'<<16) + ('p'<<8) + ':'); c = uri_buf + 4; memcpy( c, username.s, username.len); c += username.len; *(c++) = '@'; memcpy( c, domain.s, domain.len); c += domain.len; *c = 0; LM_DBG("getting groups for <%s>\n",uri_buf); pvs = (pv_spec_t*)avp; memset(&val, 0, sizeof(pv_value_t)); val.flags = PV_VAL_INT|PV_TYPE_INT; /* check against all re groups */ for( rg=re_list,n=0 ; rg ; rg=rg->next ) { if (regexec( &rg->re, uri_buf, 1, &pmatch, 0)==0) { LM_DBG("user matched to group %d!\n", rg->gid.n); /* match -> add the gid as AVP */ val.ri = rg->gid.n; if(pv_set_value(req, pvs, (int)EQ_T, &val)<0) { LM_ERR("setting PV AVP failed\n"); goto error; } n++; /* continue? */ if (multiple_gid==0) break; } } return n?n:-1; error: return -1; }