multiple origins supported

This commit is contained in:
mom040267 2014-06-29 05:33:13 +00:00
parent 0657709ec1
commit 6477fcdcee
4 changed files with 29 additions and 19 deletions

View File

@ -1,5 +1,6 @@
06/25/2014 Oleg Moskalenko <mom040267@gmail.com>
Version 4.0.1.4 'Severard':
- multiple origins supported.
- working on compilation warnings.
06/13/2014 Oleg Moskalenko <mom040267@gmail.com>

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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;
}