Changeset 706:4ffbc9f1e922 in freeDiameter for extensions/app_radgw/rgwx_sip.c
- Timestamp:
- Feb 9, 2011, 3:26:58 PM (13 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
extensions/app_radgw/rgwx_sip.c
r705 r706 58 58 /* This macro converts a RADIUS attribute to a Diameter AVP of type OctetString */ 59 59 #define CONV2DIAM_STR( _dictobj_ ) \ 60 CHECK_PARAMS( attr->length >= 2 );\60 CHECK_PARAMS( attr->length >= sizeof(struct radius_attr_hdr) ); \ 61 61 /* Create the AVP with the specified dictionary model */ \ 62 62 CHECK_FCT( fd_msg_avp_new ( cs->dict._dictobj_, 0, &avp ) ); \ 63 value.os.len = attr->length - 2;\64 value.os.data = ( unsigned char *)(attr + 1);\63 value.os.len = attr->length - sizeof(struct radius_attr_hdr); \ 64 value.os.data = (os0_t)(attr + 1); \ 65 65 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); \ 66 66 /* Add the AVP in the Diameter message. */ \ … … 68 68 69 69 #define CONV2DIAM_STR_AUTH( _dictobj_ ) \ 70 CHECK_PARAMS( attr->length >= 2 );\70 CHECK_PARAMS( attr->length >= sizeof(struct radius_attr_hdr) ); \ 71 71 /* Create the AVP with the specified dictionary model */ \ 72 72 CHECK_FCT( fd_msg_avp_new ( cs->dict._dictobj_, 0, &avp ) ); \ 73 value.os.len = attr->length - 2;\74 value.os.data = ( unsigned char *)(attr + 1);\73 value.os.len = attr->length - sizeof(struct radius_attr_hdr); \ 74 value.os.data = (os0_t)(attr + 1); \ 75 75 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); \ 76 76 /* Add the AVP in the Diameter message. */ \ 77 CHECK_FCT( fd_msg_avp_add ( auth, MSG_BRW_LAST_CHILD, avp) ); \77 CHECK_FCT( fd_msg_avp_add ( auth, MSG_BRW_LAST_CHILD, avp) ); \ 78 78 79 79 /* Same thing, for scalar AVPs of 32 bits */ 80 80 #define CONV2DIAM_32B( _dictobj_ ) \ 81 CHECK_PARAMS( attr->length == 6 );\81 CHECK_PARAMS( attr->length == sizeof(struct radius_attr_hdr)+sizeof(uint32_t) );\ 82 82 CHECK_FCT( fd_msg_avp_new ( cs->dict._dictobj_, 0, &avp ) ); \ 83 83 { \ 84 84 uint8_t * v = (uint8_t *)(attr + 1); \ 85 85 value.u32 = (v[0] << 24) \ 86 87 88 86 | (v[1] << 16) \ 87 | (v[2] << 8) \ 88 | v[3] ; \ 89 89 } \ 90 90 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); \ 91 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_LAST_CHILD, avp) ); 91 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_LAST_CHILD, avp) ); \ 92 92 93 93 … … 145 145 { 146 146 struct fd_list chain; 147 char *sid;147 os0_t sid; 148 148 size_t sidlen; 149 char *nonce;149 os0_t nonce; 150 150 size_t noncelen; 151 151 152 152 }; 153 153 154 static int nonce_add_element( char * nonce, size_t noncelen,char *sid, size_t sidlen, struct rgwp_config * state)154 static int nonce_add_element(os0_t nonce, size_t noncelen, os0_t sid, size_t sidlen, struct rgwp_config * state) 155 155 { 156 156 CHECK_PARAMS(nonce && state && sid && sidlen && noncelen); … … 159 159 CHECK_MALLOC(newelt=malloc(sizeof(noncechain))); 160 160 161 CHECK_MALLOC(newelt->nonce=malloc(noncelen)); 162 memcpy(newelt->nonce,nonce,noncelen); 161 CHECK_MALLOC(newelt->nonce= os0dup(nonce, noncelen)); 163 162 newelt->noncelen=noncelen; 164 163 165 CHECK_MALLOC(newelt->sid=malloc(sidlen)); 166 memcpy(newelt->sid,sid,sidlen); 164 CHECK_MALLOC(newelt->sid=os0dup(sid, sidlen)); 167 165 newelt->sidlen=sidlen; 168 166 … … 198 196 */ 199 197 //Retrieve sid from nonce 200 static char * nonce_get_sid(char *nonce, size_t noncelen, size_t * sidlen, struct rgwp_config *state)198 static os0_t nonce_get_sid(os0_t nonce, size_t noncelen, size_t * sidlen, struct rgwp_config *state) 201 199 { 202 200 struct fd_list * li; 203 char *sid=NULL;201 os0_t sid=NULL; 204 202 205 203 CHECK_PARAMS_DO(nonce && state && noncelen && sidlen, return NULL); 206 204 *sidlen=0; 207 205 208 // **Start mutex206 // **Start mutex 209 207 CHECK_POSIX_DO(pthread_mutex_lock(&state->nonce_mutex),); 210 208 for(li=state->listnonce.next;li!=&state->listnonce;li=li->next) … … 212 210 noncechain *temp=(noncechain *)li; 213 211 214 if (temp->noncelen==noncelen && strncmp(temp->nonce,nonce, noncelen)==0)212 if (!fd_os_cmp(temp->nonce, temp->noncelen, nonce, noncelen)) 215 213 { 216 214 fd_list_unlink (li); … … 224 222 } 225 223 CHECK_POSIX_DO(pthread_mutex_unlock(&state->nonce_mutex),); 226 // ***Stop mutex224 // ***Stop mutex 227 225 return sid; 228 226 } … … 230 228 static void nonce_deletelistnonce(struct rgwp_config *state) 231 229 { 232 // **Start mutex230 // **Start mutex 233 231 CHECK_POSIX_DO(pthread_mutex_lock(&state->nonce_mutex),); 234 232 while(!(FD_IS_LIST_EMPTY(&state->listnonce)) ) … … 243 241 } 244 242 CHECK_POSIX_DO(pthread_mutex_unlock(&state->nonce_mutex),); 245 // ***Stop mutex243 // ***Stop mutex 246 244 } 247 245 … … 338 336 int got_Dresponse = 0; 339 337 int got_Dalgorithm = 0; 340 char * sid = NULL; 341 char * un=NULL; 338 os0_t sid = NULL; 339 size_t sidlen; 340 os0_t un=NULL; 342 341 size_t un_len; 343 342 size_t nattr_used = 0; … … 352 351 if(*session) 353 352 { 354 TRACE_DEBUG(INFO," We are not supposed to receive a session in radSIP plugin.");353 TRACE_DEBUG(INFO,"INTERNAL ERROR: We are not supposed to receive a session in radSIP plugin."); 355 354 return EINVAL; 356 355 } … … 371 370 { 372 371 TRACE_DEBUG(ANNOYING, "Found a User-Name attribute: '%.*s'", attr->length- sizeof(struct radius_attr_hdr), (char *)(attr+1)); 373 un = ( char *)(attr + 1);372 un = (os0_t)(attr + 1); 374 373 un_len =attr->length - sizeof(struct radius_attr_hdr); 375 374 } … … 396 395 got_Dnonce = 1; 397 396 398 size_t sidlen; 399 400 sid=nonce_get_sid((char *)(attr+1),attr->length-2,&sidlen,cs); 397 sid=nonce_get_sid((os0_t)(attr+1), attr->length - sizeof(struct radius_attr_hdr), &sidlen, cs); 401 398 if(!sid) 402 399 { … … 406 403 CHECK_FCT(fd_sess_fromsid (sid, sidlen, session, NULL)); 407 404 free(sid); 408 405 409 406 410 407 break; … … 432 429 if (!*session) { 433 430 434 char * fqdn; 435 char * realm; 431 DiamId_t fqdn; 432 size_t fqdn_len; 433 DiamId_t realm; 434 size_t realm_len; 436 435 437 436 … … 439 438 440 439 /* Get information on the RADIUS client */ 441 CHECK_FCT( rgw_clients_get_origin(cli, &fqdn, &realm) ); 442 443 int len; 440 CHECK_FCT( rgw_clients_get_origin(cli, &fqdn, &fqdn_len, &realm, &realm_len) ); 441 444 442 /* Create a new Session-Id. The format is: {fqdn;hi32;lo32;username;diamid} */ 445 443 CHECK_MALLOC( sid = malloc(un_len + 1 /* ';' */ + fd_g_config->cnf_diamid_len + 1 /* '\0' */) ); 446 len = sprintf(sid, "%.*s;%s", (int)un_len, un, fd_g_config->cnf_diamid);447 CHECK_FCT( fd_sess_new(session, fqdn, sid,len) );444 sidlen = sprintf((char *)sid, "%.*s;%s", (int)un_len, un, fd_g_config->cnf_diamid); 445 CHECK_FCT( fd_sess_new(session, fqdn, fqdn_len, sid, sidlen) ); 448 446 free(sid); 449 447 } … … 453 451 454 452 int i = 0; 455 if (un) { 456 /* Is there an '@' in the user name? We don't care for decorated NAI here */ 457 for (i = un_len - 2; i > 0; i--) { 458 if (un[i] == '@') { 459 i++; 460 break; 461 } 453 454 /* Is there an '@' in the user name? We don't care for decorated NAI here */ 455 for (i = un_len - 2; i > 0; i--) { 456 if (un[i] == '@') { 457 i++; 458 break; 462 459 } 463 460 } 461 464 462 if (i == 0) { 465 463 /* Not found in the User-Name => we use the local domain of this gateway */ 466 value.os.data = ( unsigned char *)fd_g_config->cnf_diamrlm;464 value.os.data = (os0_t)fd_g_config->cnf_diamrlm; 467 465 value.os.len = fd_g_config->cnf_diamrlm_len; 468 466 } else { 469 value.os.data = (unsigned char *)(un + i);467 value.os.data = un + i; 470 468 value.os.len = un_len - i; 471 469 } … … 475 473 476 474 /* Now, add the Session-Id AVP at beginning of Diameter message */ 477 CHECK_FCT( fd_sess_getsid(*session, &sid ) );475 CHECK_FCT( fd_sess_getsid(*session, &sid, &sidlen) ); 478 476 479 477 TRACE_DEBUG(FULL, "[sip.rgwx] Translating new message for session '%s'...", sid); … … 481 479 /* Add the Session-Id AVP as first AVP */ 482 480 CHECK_FCT( fd_msg_avp_new ( cs->dict.Session_Id, 0, &avp ) ); 483 value.os.data = (unsigned char *)sid;484 value.os.len = s trlen(sid);481 value.os.data = sid; 482 value.os.len = sidlen; 485 483 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); 486 484 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_FIRST_CHILD, avp) ); … … 552 550 CHECK_FCT( fd_msg_avp_add ( auth_data, MSG_BRW_LAST_CHILD, auth) ); 553 551 } 554 char * temp=NULL,*sipuri=NULL;555 552 556 553 for (idx = 0; idx < rad_req->attr_used; idx++) … … 597 594 { 598 595 //We extract Realm from Digest_URI 599 char *realm=NULL; 600 601 CHECK_MALLOC(temp=malloc(attr->length -1)); 602 strncpy(temp, (char *)(attr + 1), attr->length -2); 603 temp[attr->length-2] = '\0'; 604 605 realm = strtok( (char *)(temp), "@" ); 606 realm = strtok( NULL, "@" ); 607 free(temp); 608 temp=NULL; 596 DiamId_t realm=NULL; 597 size_t realm_len; 598 os0_t temp; 599 600 temp = (os0_t)(attr + 1); 601 602 for (i=attr->length - sizeof(struct radius_attr_hdr) - 1; i>=0; i--) { 603 if (temp[i] == '@') { 604 realm = (DiamId_t)temp + i + 1; 605 CHECK_FCT_DO( fd_os_validate_DiameterIdentity(&realm, &realm_len, 1), 606 realm = NULL ); 607 break; 608 } 609 } 610 609 611 if(realm!=NULL) 610 612 { 611 613 CHECK_FCT( fd_msg_avp_new ( cs->dict.Digest_Realm, 0, &avp ) ); 612 value.os.data=( unsigned char *)realm;613 value.os.len= strlen(realm);614 value.os.data=(os0_t)realm; 615 value.os.len=realm_len; 614 616 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); 615 617 CHECK_FCT( fd_msg_avp_add ( auth, MSG_BRW_LAST_CHILD, avp) ); … … 617 619 //We add SIP-Server-URI AVP because SIP server is registrar (through gateway) 618 620 CHECK_FCT( fd_msg_avp_new ( cs->dict.SIP_Server_URI, 0, &avp ) ); 619 value.os.data=( unsigned char *)realm;620 value.os.len= strlen(realm);621 value.os.data=(os0_t)realm; 622 value.os.len=realm_len; 621 623 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); 622 624 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_LAST_CHILD, avp) ); 623 625 626 free(realm); 624 627 } 625 628 else … … 641 644 //We add SIP-Server-URI AVP because SIP server is registrar (through gateway) 642 645 CHECK_FCT( fd_msg_avp_new ( cs->dict.SIP_Server_URI, 0, &avp ) ); 643 644 645 CHECK_MALLOC(temp=malloc(attr->length -1)); 646 strncpy(temp, (char *)(attr + 1), attr->length -2); 647 648 649 CHECK_MALLOC(sipuri=malloc(attr->length +3)); 650 strcpy(sipuri,"sip:"); 651 strcat(sipuri,(const char *)temp); 652 value.os.data=(unsigned char *)sipuri; 653 value.os.len=attr->length +2; 646 os0_t temp; 647 #define SIP_PREFIX "sip:" 648 size_t temp_len = attr->length - sizeof(struct radius_attr_hdr) + CONSTSTRLEN(SIP_PREFIX) + 1; 649 CHECK_MALLOC( temp = malloc(temp_len) ); 650 temp_len = snprintf((char *)temp, temp_len, SIP_PREFIX "%.*s", attr->length - sizeof(struct radius_attr_hdr), (char *)(attr + 1)); 651 652 value.os.data=temp; 653 value.os.len=temp_len; 654 654 655 655 free(temp); 656 temp=NULL;656 657 657 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); 658 658 CHECK_FCT( fd_msg_avp_add ( *diam_fw, MSG_BRW_LAST_CHILD, avp) ); … … 689 689 { 690 690 //[Note 3] If Digest-Algorithm is missing, 'MD5' is assumed. 691 #define DIGEST_ALGO_MD5 "MD5" 691 692 692 693 CHECK_FCT( fd_msg_avp_new ( cs->dict.Digest_Algorithm, 0, &avp ) ); 693 694 694 value.os.data = ( unsigned char *)"MD5";695 value.os.len = strlen((const char *)value.os.data);695 value.os.data = (os0_t)DIGEST_ALGO_MD5; 696 value.os.len = CONSTSTRLEN(DIGEST_ALGO_MD5) - 1; 696 697 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); 697 698 CHECK_FCT( fd_msg_avp_add ( auth, MSG_BRW_LAST_CHILD, avp) ); … … 831 832 /* Retrieve the request identified which was stored in the session */ 832 833 if (session) { 833 char *sid=NULL;834 os0_t sid=NULL; 834 835 size_t sidlen; 835 fd_sess_getsid (session, &sid ); 836 sidlen=strlen(sid); 836 fd_sess_getsid (session, &sid, &sidlen ); 837 837 838 nonce_add_element( (char *)ahdr->avp_value->os.data,ahdr->avp_value->os.len, sid,sidlen, cs);838 nonce_add_element(ahdr->avp_value->os.data, ahdr->avp_value->os.len, sid, sidlen, cs); 839 839 } 840 840 break;
Note: See TracChangeset
for help on using the changeset viewer.