00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "../../str.h"
00035 #include "../../radius.h"
00036 #include "../../usr_avp.h"
00037 #include "../../dprint.h"
00038 #include "../../ut.h"
00039 #include "../../radius.h"
00040 #include "../../cmpapi.h"
00041 #include "../../parser/parse_uri.h"
00042 #include "../../parser/parse_from.h"
00043 #include "peering.h"
00044
00045
00046
00047
00048
00049 static inline int extract_avp(VALUE_PAIR* vp, unsigned short *flags,
00050 int_str *name, int_str *value)
00051 {
00052 static str names, values;
00053 unsigned int r;
00054 char *p;
00055 char *end;
00056
00057
00058 if (vp->lvalue==0 || vp->strvalue==0)
00059 goto error;
00060
00061 p = vp->strvalue;
00062 end = vp->strvalue + vp->lvalue;
00063
00064
00065 if (*p!='#') {
00066
00067 *flags |= AVP_NAME_STR;
00068 names.s = p;
00069 } else {
00070 names.s = ++p;
00071 }
00072
00073 names.len = 0;
00074 while( p<end && *p!=':' && *p!='#')
00075 p++;
00076 if (names.s==p || p==end) {
00077 LM_ERR("empty AVP name\n");
00078 goto error;
00079 }
00080 names.len = p - names.s;
00081 LM_DBG("AVP name is <%.*s>\n", names.len, names.s);
00082
00083
00084 if (*p!='#') {
00085
00086 *flags |= AVP_VAL_STR;
00087 }
00088 values.s = ++p;
00089 values.len = end-values.s;
00090 if (values.len==0) {
00091 LM_ERR("Empty AVP value\n");
00092 goto error;
00093 }
00094 LM_DBG("AVP val is <%.*s>\n", values.len, values.s);
00095
00096 if ( !((*flags)&AVP_NAME_STR) ) {
00097
00098 if (str2int(&names,&r)!=0 ) {
00099 LM_ERR("invalid AVP ID '%.*s'\n", names.len,names.s);
00100 goto error;
00101 }
00102 name->n = (int)r;
00103 } else {
00104 name->s = names;
00105 }
00106
00107 if ( !((*flags)&AVP_VAL_STR) ) {
00108
00109 if (str2int(&values,&r)!=0 ) {
00110 LM_ERR("invalid AVP numerical value '%.*s'\n",
00111 values.len,values.s);
00112 goto error;
00113 }
00114 value->n = (int)r;
00115 } else {
00116 value->s = values;
00117 }
00118
00119 return 0;
00120 error:
00121 return -1;
00122 }
00123
00124
00125
00126
00127
00128 static int generate_avps(VALUE_PAIR* received)
00129 {
00130 int_str name, val;
00131 unsigned short flags;
00132 VALUE_PAIR *vp;
00133
00134 vp = received;
00135
00136 LM_DBG("getting SIP AVPs from avpair %d\n", attrs[A_SIP_AVP].v);
00137
00138 for(; (vp=rc_avpair_get(vp,attrs[A_SIP_AVP].v,0)); vp=vp->next) {
00139 flags = 0;
00140 if (extract_avp(vp, &flags, &name, &val) != 0)
00141 continue;
00142 if (add_avp( flags, name, val) < 0) {
00143 LM_ERR("unable to add a new AVP\n");
00144 } else {
00145 LM_DBG("AVP '%.*s'/%d='%.*s'/%d has been added\n",
00146 (flags&AVP_NAME_STR)?name.s.len:4,
00147 (flags&AVP_NAME_STR)?name.s.s:"null",
00148 (flags&AVP_NAME_STR)?0:name.n,
00149 (flags&AVP_VAL_STR)?val.s.len:4,
00150 (flags&AVP_VAL_STR)?val.s.s:"null",
00151 (flags&AVP_VAL_STR)?0:val.n );
00152 }
00153 }
00154
00155 return 0;
00156 }
00157
00158
00159
00160
00161
00162
00163 int verify_destination(struct sip_msg* _msg, char* s1, char* s2)
00164 {
00165 VALUE_PAIR* send, *received;
00166 uint32_t service;
00167 static char rad_msg[4096];
00168 int i;
00169
00170 send = received = 0;
00171
00172
00173 if (parse_sip_msg_uri(_msg) < 0) {
00174 LM_ERR("error while parsing Request-URI\n");
00175 return -1;
00176 }
00177
00178 if (!rc_avpair_add(rh, &send, attrs[A_USER_NAME].v,
00179 _msg->parsed_uri.host.s,
00180 _msg->parsed_uri.host.len, 0)) {
00181 LM_ERR("error adding PW_USER_NAME\n");
00182 goto err;
00183 }
00184
00185 if (!rc_avpair_add(rh, &send, attrs[A_SIP_URI_USER].v,
00186 _msg->parsed_uri.user.s,
00187 _msg->parsed_uri.user.len, 0)) {
00188 LM_ERR("error adding PW_SIP_URI_USER\n");
00189 goto err;
00190 }
00191
00192
00193 if (parse_from_header(_msg) < 0) {
00194 LM_ERR("error while parsing From header field\n");
00195 goto err;
00196 }
00197
00198 if ((_msg->from==NULL) || (get_from(_msg) == NULL) ||
00199 (get_from(_msg)->tag_value.s == NULL) ||
00200 (get_from(_msg)->tag_value.len <= 0)) {
00201 LM_ERR("error while accessing From header tag\n");
00202 goto err;
00203 }
00204
00205 if (!rc_avpair_add(rh, &send, attrs[A_SIP_FROM_TAG].v,
00206 get_from(_msg)->tag_value.s,
00207 get_from(_msg)->tag_value.len, 0)) {
00208 LM_ERR("error adding PW_SIP_FROM_TAG\n");
00209 goto err;
00210 }
00211
00212
00213 if ((parse_headers(_msg, HDR_CALLID_F, 0) == -1) ||
00214 (_msg->callid == NULL) || (_msg->callid->body.s == NULL) ||
00215 (_msg->callid->body.len <= 0)) {
00216 LM_ERR("error while accessing Call-Id\n");
00217 goto err;
00218 }
00219
00220 if (!rc_avpair_add(rh, &send, attrs[A_SIP_CALL_ID].v,
00221 _msg->callid->body.s,
00222 _msg->callid->body.len, 0)) {
00223 LM_ERR("error adding PW_SIP_CALL_ID\n");
00224 goto err;
00225 }
00226
00227
00228 service = vals[V_SIP_VERIFY_DESTINATION].v;
00229 if (!rc_avpair_add(rh, &send, attrs[A_SERVICE_TYPE].v,
00230 &service, -1, 0)) {
00231 LM_ERR("error adding PW_SERVICE_TYPE\n");
00232 goto err;
00233 }
00234
00235
00236 if ((i = rc_auth(rh, SIP_PORT, send, &received, rad_msg)) == OK_RC) {
00237 LM_DBG("success\n");
00238 rc_avpair_free(send);
00239 generate_avps(received);
00240 rc_avpair_free(received);
00241 return 1;
00242 } else {
00243 #ifdef REJECT_RC
00244 if (i == REJECT_RC) {
00245 LM_DBG("rejected\n");
00246 } else {
00247 LM_ERR("failure\n");
00248 }
00249 goto err;
00250 #else
00251 LM_DBG("failure\n");
00252 goto err;
00253 #endif
00254 }
00255
00256 err:
00257 if (send) rc_avpair_free(send);
00258 if (received) rc_avpair_free(received);
00259 return -1;
00260 }
00261
00262
00263
00264
00265
00266 int verify_source(struct sip_msg* _msg, char* s1, char* s2)
00267 {
00268 VALUE_PAIR* send, *received;
00269 struct hdr_field *hf;
00270 uint32_t service;
00271 static char rad_msg[4096];
00272 int i;
00273
00274 send = received = 0;
00275
00276
00277 if (parse_sip_msg_uri(_msg) < 0) {
00278 LM_ERR("error while parsing Request-URI\n");
00279 return -1;
00280 }
00281
00282 if (!rc_avpair_add(rh, &send, attrs[A_USER_NAME].v,
00283 _msg->parsed_uri.host.s,
00284 _msg->parsed_uri.host.len, 0)) {
00285 LM_ERR("error adding PW_USER_NAME\n");
00286 goto err;
00287 }
00288
00289 if (!rc_avpair_add(rh, &send, attrs[A_SIP_URI_USER].v,
00290 _msg->parsed_uri.user.s,
00291 _msg->parsed_uri.user.len, 0)) {
00292 LM_ERR("error adding PW_SIP_URI_USER\n");
00293 goto err;
00294 }
00295
00296
00297 if (parse_from_header(_msg) < 0) {
00298 LM_ERR("error while parsing From header field\n");
00299 goto err;
00300 }
00301
00302 if ((_msg->from==NULL) || (get_from(_msg) == NULL) ||
00303 (get_from(_msg)->tag_value.s == NULL) ||
00304 (get_from(_msg)->tag_value.len <= 0)) {
00305 LM_ERR("error while accessing From header tag\n");
00306 goto err;
00307 }
00308
00309 if (!rc_avpair_add(rh, &send, attrs[A_SIP_FROM_TAG].v,
00310 get_from(_msg)->tag_value.s,
00311 get_from(_msg)->tag_value.len, 0)) {
00312 LM_ERR("error adding PW_SIP_FROM_TAG\n");
00313 goto err;
00314 }
00315
00316
00317 if ((parse_headers(_msg, HDR_CALLID_F, 0) == -1) ||
00318 (_msg->callid == NULL) || (_msg->callid->body.s == NULL) ||
00319 (_msg->callid->body.len <= 0)) {
00320 LM_ERR("error while accessing Call-Id\n");
00321 goto err;
00322 }
00323
00324 if (!rc_avpair_add(rh, &send, attrs[A_SIP_CALL_ID].v,
00325 _msg->callid->body.s,
00326 _msg->callid->body.len, 0)) {
00327 LM_ERR("error adding PW_SIP_CALL_ID\n");
00328 goto err;
00329 }
00330
00331
00332 parse_headers(_msg, HDR_EOH_F, 0);
00333 for (hf = _msg->headers; hf; hf = hf->next) {
00334 if(cmp_hdrname_strzn(&hf->name, "P-Request-Hash",
00335 sizeof("P-Request-Hash") - 1) == 0)
00336 break;
00337 }
00338 if (!hf) {
00339 LM_ERR("no P-Request-Hash header field\n");
00340 goto err;
00341 }
00342 if ((hf->body.s == NULL) || (hf->body.len <= 0)) {
00343 LM_ERR("error while accessing P-Request-Hash body\n");
00344 goto err;
00345 }
00346 if (!rc_avpair_add(rh, &send, attrs[A_SIP_REQUEST_HASH].v,
00347 hf->body.s, hf->body.len, 0)) {
00348 LM_ERR("error adding PW_SIP_REQUEST_HASH\n");
00349 goto err;
00350 }
00351
00352
00353 service = vals[V_SIP_VERIFY_SOURCE].v;
00354 if (!rc_avpair_add(rh, &send, attrs[A_SERVICE_TYPE].v,
00355 &service, -1, 0)) {
00356 LM_ERR("error adding PW_SERVICE_TYPE\n");
00357 goto err;
00358 }
00359
00360
00361 if ((i = rc_auth(rh, SIP_PORT, send, &received, rad_msg)) == OK_RC) {
00362 LM_DBG("success\n");
00363 rc_avpair_free(send);
00364 rc_avpair_free(received);
00365 return 1;
00366 } else {
00367 #ifdef REJECT_RC
00368 if (i == REJECT_RC) {
00369 LM_DBG("rejected\n");
00370 } else {
00371 LM_ERR("failure\n");
00372 }
00373 goto err;
00374 #else
00375 LM_DBG("failure\n");
00376 goto err;
00377 #endif
00378 }
00379
00380 err:
00381 if (send) rc_avpair_free(send);
00382 if (received) rc_avpair_free(received);
00383 return -1;
00384 }