|
@@ -125,7 +125,6 @@ static int online_check = 1; //If one, it won't let players connect when their a
|
|
|
|
|
|
// Advanced subnet check [LuzZza]
|
|
// Advanced subnet check [LuzZza]
|
|
struct s_subnet {
|
|
struct s_subnet {
|
|
- uint32 subnet;
|
|
|
|
uint32 mask;
|
|
uint32 mask;
|
|
uint32 char_ip;
|
|
uint32 char_ip;
|
|
uint32 map_ip;
|
|
uint32 map_ip;
|
|
@@ -2799,20 +2798,14 @@ int char_mapif_init(int fd)
|
|
int lan_subnetcheck(uint32 ip)
|
|
int lan_subnetcheck(uint32 ip)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
-
|
|
|
|
- for(i = 0; i < subnet_count; i++) {
|
|
|
|
-
|
|
|
|
- if((subnet[i].subnet & subnet[i].mask) == (ip & subnet[i].mask)) {
|
|
|
|
-
|
|
|
|
- ShowInfo("Subnet check [%u.%u.%u.%u]: Matches "CL_CYAN"%u.%u.%u.%u/%u.%u.%u.%u"CL_RESET"\n",
|
|
|
|
- CONVIP(ip), CONVIP(subnet[i].subnet), CONVIP(subnet[i].mask));
|
|
|
|
-
|
|
|
|
- return subnet[i].map_ip;
|
|
|
|
- }
|
|
|
|
|
|
+ ARR_FIND( 0, subnet_count, i, (subnet[i].char_ip & subnet[i].mask) == (ip & subnet[i].mask) );
|
|
|
|
+ if( i < subnet_count ) {
|
|
|
|
+ ShowInfo("Subnet check [%u.%u.%u.%u]: Matches "CL_CYAN"%u.%u.%u.%u/%u.%u.%u.%u"CL_RESET"\n", CONVIP(ip), CONVIP(subnet[i].char_ip & subnet[i].mask), CONVIP(subnet[i].mask));
|
|
|
|
+ return subnet[i].char_ip;
|
|
|
|
+ } else {
|
|
|
|
+ ShowInfo("Subnet check [%u.%u.%u.%u]: "CL_CYAN"WAN"CL_RESET"\n", CONVIP(ip));
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
-
|
|
|
|
- ShowInfo("Subnet check [%u.%u.%u.%u]: "CL_CYAN"WAN"CL_RESET"\n", CONVIP(ip));
|
|
|
|
- return 0;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
int parse_char(int fd)
|
|
int parse_char(int fd)
|
|
@@ -3005,22 +2998,6 @@ int parse_char(int fd)
|
|
WFIFOL(fd,22) = htonl((subnet_map_ip) ? subnet_map_ip : server[i].ip);
|
|
WFIFOL(fd,22) = htonl((subnet_map_ip) ? subnet_map_ip : server[i].ip);
|
|
WFIFOW(fd,26) = ntows(htons(server[i].port)); // [!] LE byte order here [!]
|
|
WFIFOW(fd,26) = ntows(htons(server[i].port)); // [!] LE byte order here [!]
|
|
WFIFOSET(fd,28);
|
|
WFIFOSET(fd,28);
|
|
- }
|
|
|
|
- {
|
|
|
|
- //Send player to map
|
|
|
|
- uint32 subnet_map_ip;
|
|
|
|
- char map_name[MAP_NAME_LENGTH_EXT];
|
|
|
|
- snprintf(map_name, MAP_NAME_LENGTH_EXT, "%s.gat", mapindex_id2name(char_dat.last_point.map));
|
|
|
|
- WFIFOHEAD(fd,28);
|
|
|
|
- WFIFOW(fd,0) = 0x71;
|
|
|
|
- WFIFOL(fd,2) = char_dat.char_id;
|
|
|
|
- memcpy(WFIFOP(fd,6), map_name, MAP_NAME_LENGTH_EXT);
|
|
|
|
-
|
|
|
|
- // Advanced subnet check [LuzZza]
|
|
|
|
- subnet_map_ip = lan_subnetcheck(ipl);
|
|
|
|
- WFIFOL(fd,22) = htonl((subnet_map_ip) ? subnet_map_ip : server[i].ip);
|
|
|
|
- WFIFOW(fd,26) = ntows(htons(server[i].port)); // [!] LE byte order here [!]
|
|
|
|
- WFIFOSET(fd,28);
|
|
|
|
}
|
|
}
|
|
if (auth_fifo_pos >= AUTH_FIFO_SIZE)
|
|
if (auth_fifo_pos >= AUTH_FIFO_SIZE)
|
|
auth_fifo_pos = 0;
|
|
auth_fifo_pos = 0;
|
|
@@ -3490,13 +3467,14 @@ int char_lan_config_read(const char *lancfgName)
|
|
remove_control_chars(w3);
|
|
remove_control_chars(w3);
|
|
remove_control_chars(w4);
|
|
remove_control_chars(w4);
|
|
|
|
|
|
- if(strcmpi(w1, "subnet") == 0) {
|
|
|
|
-
|
|
|
|
|
|
+ if( strcmpi(w1, "subnet") == 0 )
|
|
|
|
+ {
|
|
subnet[subnet_count].mask = str2ip(w2);
|
|
subnet[subnet_count].mask = str2ip(w2);
|
|
subnet[subnet_count].char_ip = str2ip(w3);
|
|
subnet[subnet_count].char_ip = str2ip(w3);
|
|
subnet[subnet_count].map_ip = str2ip(w4);
|
|
subnet[subnet_count].map_ip = str2ip(w4);
|
|
- subnet[subnet_count].subnet = subnet[subnet_count].char_ip&subnet[subnet_count].mask;
|
|
|
|
- if (subnet[subnet_count].subnet != (subnet[subnet_count].map_ip&subnet[subnet_count].mask)) {
|
|
|
|
|
|
+
|
|
|
|
+ if( (subnet[subnet_count].char_ip & subnet[subnet_count].mask) != (subnet[subnet_count].map_ip & subnet[subnet_count].mask) )
|
|
|
|
+ {
|
|
ShowError("%s: Configuration Error: The char server (%s) and map server (%s) belong to different subnetworks!\n", lancfgName, w3, w4);
|
|
ShowError("%s: Configuration Error: The char server (%s) and map server (%s) belong to different subnetworks!\n", lancfgName, w3, w4);
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|