From 6477fcdceeabd44398ef9c47a4a1bdcfa4e12a37 Mon Sep 17 00:00:00 2001 From: mom040267 Date: Sun, 29 Jun 2014 05:33:13 +0000 Subject: [PATCH] multiple origins supported --- ChangeLog | 1 + src/apps/relay/userdb.c | 4 +++- src/server/ns_turn_ioalib.h | 2 +- src/server/ns_turn_server.c | 41 ++++++++++++++++++++++--------------- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index cca9aa7..db1f63c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ 06/25/2014 Oleg Moskalenko Version 4.0.1.4 'Severard': + - multiple origins supported. - working on compilation warnings. 06/13/2014 Oleg Moskalenko diff --git a/src/apps/relay/userdb.c b/src/apps/relay/userdb.c index 5801232..953acd9 100644 --- a/src/apps/relay/userdb.c +++ b/src/apps/relay/userdb.c @@ -186,7 +186,7 @@ int get_realm_data(char* name, realm_params_t* rp) return 0; } -void get_realm_options_by_origin(char *origin, realm_options_t* ro) +int get_realm_options_by_origin(char *origin, realm_options_t* ro) { ur_string_map_value_type value = 0; TURN_MUTEX_LOCK(&o_to_realm_mutex); @@ -197,9 +197,11 @@ void get_realm_options_by_origin(char *origin, realm_options_t* ro) get_realm_data(realm, &rp); ns_bcopy(&(rp.options),ro,sizeof(realm_options_t)); free(realm); + return 1; } else { TURN_MUTEX_UNLOCK(&o_to_realm_mutex); get_default_realm_options(ro); + return 0; } } diff --git a/src/server/ns_turn_ioalib.h b/src/server/ns_turn_ioalib.h index 41ea6d9..73ddf09 100644 --- a/src/server/ns_turn_ioalib.h +++ b/src/server/ns_turn_ioalib.h @@ -260,7 +260,7 @@ unsigned char *base64_decode(const char *data, ///////////// Realm /////////////////// void get_default_realm_options(realm_options_t* ro); -void get_realm_options_by_origin(char *origin, realm_options_t* ro); +int get_realm_options_by_origin(char *origin, realm_options_t* ro); void get_realm_options_by_name(char *realm, realm_options_t* ro); int get_canonic_origin(const char* o, char *co, int sz); int get_default_protocol_port(const char* scheme, size_t slen); diff --git a/src/server/ns_turn_server.c b/src/server/ns_turn_server.c index 1eefd94..2e65ae1 100644 --- a/src/server/ns_turn_server.c +++ b/src/server/ns_turn_server.c @@ -3231,29 +3231,36 @@ static int handle_turn_command(turn_turnserver *server, ts_ur_super_session *ss, } if(!(ss->realm_set) && (method == STUN_METHOD_ALLOCATE)) { - stun_attr_ref sar = stun_attr_get_first_by_type_str(ioa_network_buffer_data(in_buffer->nbh), - ioa_network_buffer_get_size(in_buffer->nbh), - STUN_ATTRIBUTE_ORIGIN); - if(sar) { - int sarlen = stun_attr_get_len(sar); - if(sarlen>0) { - char *o = (char*)turn_malloc(sarlen+1); - ns_bcopy(stun_attr_get_value(sar),o,sarlen); - o[sarlen]=0; - char *corigin = (char*)turn_malloc(STUN_MAX_ORIGIN_SIZE+1); - corigin[0]=0; - if(get_canonic_origin(o,corigin,STUN_MAX_ORIGIN_SIZE)<0) { - TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, + stun_attr_ref sar = stun_attr_get_first_str(ioa_network_buffer_data(in_buffer->nbh), + ioa_network_buffer_get_size(in_buffer->nbh)); + + int origin_found = 0; + + while(sar && !origin_found) { + if(stun_attr_get_type(sar) == STUN_ATTRIBUTE_ORIGIN) { + int sarlen = stun_attr_get_len(sar); + if(sarlen>0) { + char *o = (char*)turn_malloc(sarlen+1); + ns_bcopy(stun_attr_get_value(sar),o,sarlen); + o[sarlen]=0; + char *corigin = (char*)turn_malloc(STUN_MAX_ORIGIN_SIZE+1); + corigin[0]=0; + if(get_canonic_origin(o,corigin,STUN_MAX_ORIGIN_SIZE)<0) { + TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: Wrong origin format: %s\n", __FUNCTION__, o); + } + strncpy(ss->origin,corigin,STUN_MAX_ORIGIN_SIZE); + turn_free(corigin,sarlen+1); + turn_free(o,sarlen+1); + origin_found = get_realm_options_by_origin(ss->origin,&(ss->realm_options)); } - strncpy(ss->origin,corigin,STUN_MAX_ORIGIN_SIZE); - turn_free(corigin,sarlen+1); - turn_free(o,sarlen+1); - get_realm_options_by_origin(ss->origin,&(ss->realm_options)); } + sar = stun_attr_get_next_str(ioa_network_buffer_data(in_buffer->nbh), + ioa_network_buffer_get_size(in_buffer->nbh), sar); } + ss->realm_set = 1; }