From 7a3d5d2b9413144bca4dcacd53531b39c6a14af1 Mon Sep 17 00:00:00 2001 From: ronancpl Date: Fri, 9 Apr 2021 20:54:53 -0300 Subject: [PATCH] Allow local/LAN/WAN login-phase connections Allow clients connecting from different IP domains (local/LAN/WAN) to get past login phase and clean unnecessary local server check. --- config.yaml | 5 ++- src/main/java/client/MapleClient.java | 2 +- src/main/java/config/ServerConfig.java | 3 +- src/main/java/net/MapleServerHandler.java | 2 + src/main/java/net/server/Server.java | 12 +++++- .../session/MapleSessionCoordinator.java | 40 +++++++++++++++++++ .../handlers/login/CharSelectedHandler.java | 2 +- .../login/CharSelectedWithPicHandler.java | 2 +- .../handlers/login/LoginPasswordHandler.java | 16 +------- .../handlers/login/RegisterPicHandler.java | 2 +- .../login/ViewAllCharRegisterPicHandler.java | 2 +- .../login/ViewAllCharSelectedHandler.java | 2 +- .../ViewAllCharSelectedWithPicHandler.java | 2 +- 13 files changed, 66 insertions(+), 26 deletions(-) diff --git a/config.yaml b/config.yaml index 4caedb49ea..34a13ef794 100644 --- a/config.yaml +++ b/config.yaml @@ -199,8 +199,9 @@ server: LOGIN_ATTEMPT_DURATION: 120 #Period in seconds the login attempt remains registered on the system. #Ip Configuration - HOST: 127.0.0.1 - LOCALSERVER: true + HOST: 127.0.0.1 #WAN IPv4 address + LANHOST: 127.0.0.1 #LAN IPv4 address + LOCALHOST: 127.0.0.1 #Loopback IPv4 address GMSERVER: false #Other configuration diff --git a/src/main/java/client/MapleClient.java b/src/main/java/client/MapleClient.java index c4342a0a3d..77edc0401f 100644 --- a/src/main/java/client/MapleClient.java +++ b/src/main/java/client/MapleClient.java @@ -1341,7 +1341,7 @@ public class MapleClient { return; } - String[] socket = Server.getInstance().getInetSocket(getWorld(), channel); + String[] socket = Server.getInstance().getInetSocket(this.getSession(), getWorld(), channel); if(socket == null) { announce(MaplePacketCreator.serverNotice(1, "Channel " + channel + " is currently disabled. Try another channel.")); announce(MaplePacketCreator.enableActions()); diff --git a/src/main/java/config/ServerConfig.java b/src/main/java/config/ServerConfig.java index 721c577e16..dbdd9e0a76 100644 --- a/src/main/java/config/ServerConfig.java +++ b/src/main/java/config/ServerConfig.java @@ -44,7 +44,8 @@ public class ServerConfig { //Ip Configuration public String HOST; - public boolean LOCALSERVER; + public String LANHOST; + public String LOCALHOST; public boolean GMSERVER; //Other configuration diff --git a/src/main/java/net/MapleServerHandler.java b/src/main/java/net/MapleServerHandler.java index af5654c5c9..edca4bfda8 100644 --- a/src/main/java/net/MapleServerHandler.java +++ b/src/main/java/net/MapleServerHandler.java @@ -103,6 +103,8 @@ public class MapleServerHandler extends IoHandlerAdapter { if (remoteHost == null) { remoteHost = "null"; + } else { + remoteHost = MapleSessionCoordinator.fetchRemoteAddress(remoteHost); // thanks dyz for noticing Local/LAN/WAN connections not interacting properly } } catch (NullPointerException npe) { // thanks Agassy, Alchemist for pointing out possibility of remoteHost = null. remoteHost = "null"; diff --git a/src/main/java/net/server/Server.java b/src/main/java/net/server/Server.java index 7b674b1b7f..5009b48923 100644 --- a/src/main/java/net/server/Server.java +++ b/src/main/java/net/server/Server.java @@ -286,8 +286,18 @@ public class Server { } public String[] getInetSocket(int world, int channel) { + public String[] getInetSocket(IoSession session, int world, int channel) { + String remoteIp = MapleSessionCoordinator.getSessionRemoteAddress(session); + + String[] hostAddress = getIP(world, channel).split(":"); + if (MapleSessionCoordinator.isLocalAddress(remoteIp)) { + hostAddress[0] = YamlConfig.config.server.LOCALHOST; + } else if (MapleSessionCoordinator.isLanAddress(remoteIp)) { + hostAddress[0] = YamlConfig.config.server.LANHOST; + } + try { - return getIP(world, channel).split(":"); + return hostAddress; } catch (Exception e) { return null; } diff --git a/src/main/java/net/server/coordinator/session/MapleSessionCoordinator.java b/src/main/java/net/server/coordinator/session/MapleSessionCoordinator.java index 207d0ec6d6..78361d066c 100644 --- a/src/main/java/net/server/coordinator/session/MapleSessionCoordinator.java +++ b/src/main/java/net/server/coordinator/session/MapleSessionCoordinator.java @@ -206,7 +206,47 @@ public class MapleSessionCoordinator { private Lock getCoodinatorLock(String remoteHost) { return poolLock.get(Math.abs(remoteHost.hashCode()) % 100); } + + private static List localComms = loadLocalCommPatterns(); + + private static List loadLocalCommPatterns() { + String[] localComms = {"10\\.", "192\\.168\\.", "172\\.(1[6-9]|2[0-9]|3[0-1])\\."}; + List llc = new ArrayList<>(localComms.length); + for (String lc : localComms) { + llc.add(Pattern.compile(lc)); + } + + return llc; + } + + private static boolean matchesLanAddress(Pattern inetPattern, String inetAddress) { + Matcher searchM = inetPattern.matcher(inetAddress); + return searchM.find(); + } + + public static boolean isLanAddress(String inetAddress) { + for (Pattern lanPattern : localComms) { + if (matchesLanAddress(lanPattern, inetAddress)) { + return true; + } + } + + return false; + } + + public static boolean isLocalAddress(String inetAddress) { + return inetAddress.startsWith("127."); + } + + public static String fetchRemoteAddress(String inetAddress) { + if (isLocalAddress(inetAddress) || isLanAddress(inetAddress)) { + return YamlConfig.config.server.HOST; + } else { + return inetAddress; + } + } + public static String getSessionRemoteAddress(IoSession session) { return (String) session.getAttribute(MapleClient.CLIENT_REMOTE_ADDRESS); } diff --git a/src/main/java/net/server/handlers/login/CharSelectedHandler.java b/src/main/java/net/server/handlers/login/CharSelectedHandler.java index e378ad1b6c..9dfe1f5dad 100644 --- a/src/main/java/net/server/handlers/login/CharSelectedHandler.java +++ b/src/main/java/net/server/handlers/login/CharSelectedHandler.java @@ -94,7 +94,7 @@ public final class CharSelectedHandler extends AbstractMaplePacketHandler { return; } - String[] socket = server.getInetSocket(c.getWorld(), c.getChannel()); + String[] socket = server.getInetSocket(session, c.getWorld(), c.getChannel()); if(socket == null) { c.announce(MaplePacketCreator.getAfterLoginError(10)); return; diff --git a/src/main/java/net/server/handlers/login/CharSelectedWithPicHandler.java b/src/main/java/net/server/handlers/login/CharSelectedWithPicHandler.java index 26f89ccd21..7b8005e41a 100644 --- a/src/main/java/net/server/handlers/login/CharSelectedWithPicHandler.java +++ b/src/main/java/net/server/handlers/login/CharSelectedWithPicHandler.java @@ -71,7 +71,7 @@ public class CharSelectedWithPicHandler extends AbstractMaplePacketHandler { return; } - String[] socket = server.getInetSocket(c.getWorld(), c.getChannel()); + String[] socket = server.getInetSocket(session, c.getWorld(), c.getChannel()); if(socket == null) { c.announce(MaplePacketCreator.getAfterLoginError(10)); return; diff --git a/src/main/java/net/server/handlers/login/LoginPasswordHandler.java b/src/main/java/net/server/handlers/login/LoginPasswordHandler.java index fa0cca8fa3..5a2094bcb7 100644 --- a/src/main/java/net/server/handlers/login/LoginPasswordHandler.java +++ b/src/main/java/net/server/handlers/login/LoginPasswordHandler.java @@ -61,21 +61,7 @@ public final class LoginPasswordHandler implements MaplePacketHandler { @Override public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { String remoteHost = getRemoteIp(c.getSession()); - if (!remoteHost.contentEquals("null")) { - if (YamlConfig.config.server.USE_IP_VALIDATION) { // thanks Alex-0000 (CanIGetaPR) for suggesting IP validation as a server flag - if (remoteHost.startsWith("127.")) { - if (!YamlConfig.config.server.LOCALSERVER) { // thanks Mills for noting HOST can also have a field named "localhost" - c.announce(MaplePacketCreator.getLoginFailed(13)); // cannot login as localhost if it's not a local server - return; - } - } else { - if (YamlConfig.config.server.LOCALSERVER) { - c.announce(MaplePacketCreator.getLoginFailed(13)); // cannot login as non-localhost if it's a local server - return; - } - } - } - } else { + if (remoteHost.contentEquals("null")) { c.announce(MaplePacketCreator.getLoginFailed(14)); // thanks Alchemist for noting remoteHost could be null return; } diff --git a/src/main/java/net/server/handlers/login/RegisterPicHandler.java b/src/main/java/net/server/handlers/login/RegisterPicHandler.java index 4de8d673fe..f32fac4579 100644 --- a/src/main/java/net/server/handlers/login/RegisterPicHandler.java +++ b/src/main/java/net/server/handlers/login/RegisterPicHandler.java @@ -79,7 +79,7 @@ public final class RegisterPicHandler extends AbstractMaplePacketHandler { return; } - String[] socket = server.getInetSocket(c.getWorld(), c.getChannel()); + String[] socket = server.getInetSocket(session, c.getWorld(), c.getChannel()); if(socket == null) { c.announce(MaplePacketCreator.getAfterLoginError(10)); return; diff --git a/src/main/java/net/server/handlers/login/ViewAllCharRegisterPicHandler.java b/src/main/java/net/server/handlers/login/ViewAllCharRegisterPicHandler.java index a4a9f5235b..f6fc999fd3 100644 --- a/src/main/java/net/server/handlers/login/ViewAllCharRegisterPicHandler.java +++ b/src/main/java/net/server/handlers/login/ViewAllCharRegisterPicHandler.java @@ -82,7 +82,7 @@ public final class ViewAllCharRegisterPicHandler extends AbstractMaplePacketHand String pic = slea.readMapleAsciiString(); c.setPic(pic); - String[] socket = server.getInetSocket(c.getWorld(), channel); + String[] socket = server.getInetSocket(session, c.getWorld(), channel); if (socket == null) { c.announce(MaplePacketCreator.getAfterLoginError(10)); return; diff --git a/src/main/java/net/server/handlers/login/ViewAllCharSelectedHandler.java b/src/main/java/net/server/handlers/login/ViewAllCharSelectedHandler.java index e2f458b4bb..9bda9fc14b 100644 --- a/src/main/java/net/server/handlers/login/ViewAllCharSelectedHandler.java +++ b/src/main/java/net/server/handlers/login/ViewAllCharSelectedHandler.java @@ -105,7 +105,7 @@ public final class ViewAllCharSelectedHandler extends AbstractMaplePacketHandler c.setChannel(1); } - String[] socket = server.getInetSocket(c.getWorld(), c.getChannel()); + String[] socket = server.getInetSocket(session, c.getWorld(), c.getChannel()); if(socket == null) { c.announce(MaplePacketCreator.getAfterLoginError(10)); return; diff --git a/src/main/java/net/server/handlers/login/ViewAllCharSelectedWithPicHandler.java b/src/main/java/net/server/handlers/login/ViewAllCharSelectedWithPicHandler.java index aeb6e3208b..019ff9f8d5 100644 --- a/src/main/java/net/server/handlers/login/ViewAllCharSelectedWithPicHandler.java +++ b/src/main/java/net/server/handlers/login/ViewAllCharSelectedWithPicHandler.java @@ -77,7 +77,7 @@ public class ViewAllCharSelectedWithPicHandler extends AbstractMaplePacketHandle c.setChannel(channel); if (c.checkPic(pic)) { - String[] socket = server.getInetSocket(c.getWorld(), c.getChannel()); + String[] socket = server.getInetSocket(session, c.getWorld(), c.getChannel()); if(socket == null) { c.announce(MaplePacketCreator.getAfterLoginError(10)); return;