|
|
@@ -250,8 +250,10 @@ static int send_turn_message_to(turn_turnserver *server, ioa_network_buffer_hand
|
|
|
|
|
|
/////////////////// Peer addr check /////////////////////////////
|
|
|
|
|
|
-static int good_peer_addr(turn_turnserver *server, ioa_addr *peer_addr)
|
|
|
+static int good_peer_addr(turn_turnserver *server, const char* realm, ioa_addr *peer_addr)
|
|
|
{
|
|
|
+#define CHECK_REALM(r) if((r)[0] && realm && realm[0] && strcmp((r),realm)) continue
|
|
|
+
|
|
|
if(server && peer_addr) {
|
|
|
if(*(server->no_multicast_peers) && ioa_addr_is_multicast(peer_addr))
|
|
|
return 0;
|
|
|
@@ -264,7 +266,8 @@ static int good_peer_addr(turn_turnserver *server, ioa_addr *peer_addr)
|
|
|
if(server->ip_whitelist) {
|
|
|
// White listing of addr ranges
|
|
|
for (i = server->ip_whitelist->ranges_number - 1; i >= 0; --i) {
|
|
|
- if (ioa_addr_in_range(server->ip_whitelist->encaddrsranges[i], peer_addr))
|
|
|
+ CHECK_REALM(server->ip_whitelist->rs[i].realm);
|
|
|
+ if (ioa_addr_in_range(&(server->ip_whitelist->rs[i].enc), peer_addr))
|
|
|
return 1;
|
|
|
}
|
|
|
}
|
|
|
@@ -276,7 +279,8 @@ static int good_peer_addr(turn_turnserver *server, ioa_addr *peer_addr)
|
|
|
if(wl) {
|
|
|
// White listing of addr ranges
|
|
|
for (i = wl->ranges_number - 1; i >= 0; --i) {
|
|
|
- if (ioa_addr_in_range(wl->encaddrsranges[i], peer_addr)) {
|
|
|
+ CHECK_REALM(wl->rs[i].realm);
|
|
|
+ if (ioa_addr_in_range(&(wl->rs[i].enc), peer_addr)) {
|
|
|
ioa_unlock_whitelist(server->e);
|
|
|
return 1;
|
|
|
}
|
|
|
@@ -289,10 +293,11 @@ static int good_peer_addr(turn_turnserver *server, ioa_addr *peer_addr)
|
|
|
if(server->ip_blacklist) {
|
|
|
// Black listing of addr ranges
|
|
|
for (i = server->ip_blacklist->ranges_number - 1; i >= 0; --i) {
|
|
|
- if (ioa_addr_in_range(server->ip_blacklist->encaddrsranges[i], peer_addr)) {
|
|
|
+ CHECK_REALM(server->ip_blacklist->rs[i].realm);
|
|
|
+ if (ioa_addr_in_range(&(server->ip_blacklist->rs[i].enc), peer_addr)) {
|
|
|
char saddr[129];
|
|
|
addr_to_string_no_port(peer_addr,(u08bits*)saddr);
|
|
|
- TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "A peer IP %s denied in the range: %s\n",saddr,server->ip_blacklist->ranges[i]);
|
|
|
+ TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "A peer IP %s denied in the range: %s\n",saddr,server->ip_blacklist->rs[i].str);
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
@@ -305,11 +310,12 @@ static int good_peer_addr(turn_turnserver *server, ioa_addr *peer_addr)
|
|
|
if(bl) {
|
|
|
// Black listing of addr ranges
|
|
|
for (i = bl->ranges_number - 1; i >= 0; --i) {
|
|
|
- if (ioa_addr_in_range(bl->encaddrsranges[i], peer_addr)) {
|
|
|
+ CHECK_REALM(bl->rs[i].realm);
|
|
|
+ if (ioa_addr_in_range(&(bl->rs[i].enc), peer_addr)) {
|
|
|
ioa_unlock_blacklist(server->e);
|
|
|
char saddr[129];
|
|
|
addr_to_string_no_port(peer_addr,(u08bits*)saddr);
|
|
|
- TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "A peer IP %s denied in the range: %s\n",saddr,bl->ranges[i]);
|
|
|
+ TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "A peer IP %s denied in the range: %s\n",saddr,bl->rs[i].str);
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
@@ -320,6 +326,8 @@ static int good_peer_addr(turn_turnserver *server, ioa_addr *peer_addr)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#undef CHECK_REALM
|
|
|
+
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
@@ -2076,7 +2084,7 @@ static void tcp_peer_accept_connection(ioa_socket_handle s, void *arg)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if(!good_peer_addr(server, peer_addr)) {
|
|
|
+ if(!good_peer_addr(server, ss->realm_options.name, peer_addr)) {
|
|
|
u08bits saddr[256];
|
|
|
addr_to_string(peer_addr, saddr);
|
|
|
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: an attempt to connect from a peer with forbidden address: %s\n", __FUNCTION__,saddr);
|
|
|
@@ -2226,7 +2234,7 @@ static int handle_turn_connect(turn_turnserver *server,
|
|
|
*reason = (const u08bits *)"Where is Peer Address ?";
|
|
|
|
|
|
} else {
|
|
|
- if(!good_peer_addr(server,&peer_addr)) {
|
|
|
+ if(!good_peer_addr(server,ss->realm_options.name,&peer_addr)) {
|
|
|
*err_code = 403;
|
|
|
*reason = (const u08bits *) "Forbidden IP";
|
|
|
} else {
|
|
|
@@ -2588,7 +2596,7 @@ static int handle_turn_channel_bind(turn_turnserver *server,
|
|
|
*err_code = 400;
|
|
|
*reason = (const u08bits *)"You cannot use the same peer with different channel number";
|
|
|
} else {
|
|
|
- if(!good_peer_addr(server,&peer_addr)) {
|
|
|
+ if(!good_peer_addr(server,ss->realm_options.name,&peer_addr)) {
|
|
|
*err_code = 403;
|
|
|
*reason = (const u08bits *) "Forbidden IP";
|
|
|
} else {
|
|
|
@@ -3015,7 +3023,7 @@ static int handle_turn_create_permission(turn_turnserver *server,
|
|
|
if(!get_relay_socket(a,peer_addr.ss.sa_family)) {
|
|
|
*err_code = 443;
|
|
|
*reason = (const u08bits *)"Peer Address Family Mismatch";
|
|
|
- } else if(!good_peer_addr(server, &peer_addr)) {
|
|
|
+ } else if(!good_peer_addr(server, ss->realm_options.name, &peer_addr)) {
|
|
|
*err_code = 403;
|
|
|
*reason = (const u08bits *) "Forbidden IP";
|
|
|
} else {
|