Refactor MapleClient constructor, fix issue with multiclient check

This commit is contained in:
P0nk
2021-07-18 16:27:41 +02:00
parent 850d44d549
commit 435cafd381
4 changed files with 42 additions and 12 deletions

View File

@@ -25,8 +25,9 @@ public class ChannelServerInitializer extends ServerChannelInitializer {
log.debug("Client connecting to world {}, channel {} from {}", world, channel, clientIp);
PacketProcessor packetProcessor = PacketProcessor.getChannelServerProcessor(world, channel);
final MapleClient client = new MapleClient(MapleClient.Type.CHANNEL, packetProcessor, world, channel);
client.setSessionId(sessionId.getAndIncrement());
final long clientSessionId = sessionId.getAndIncrement();
final String remoteAddress = getRemoteAddress(socketChannel);
final MapleClient client = MapleClient.createChannelClient(clientSessionId, remoteAddress, packetProcessor, world, channel);
if (Server.getInstance().getChannel(world, channel) == null) {
MapleSessionCoordinator.getInstance().closeSession(client, true);

View File

@@ -16,8 +16,9 @@ public class LoginServerInitializer extends ServerChannelInitializer {
log.debug("Client connected to login server from {} ", clientIp);
PacketProcessor packetProcessor = PacketProcessor.getLoginServerProcessor();
final MapleClient client = new MapleClient(MapleClient.Type.LOGIN, packetProcessor, LoginServer.WORLD_ID, LoginServer.CHANNEL_ID);
client.setSessionId(sessionId.getAndIncrement());
final long clientSessionId = sessionId.getAndIncrement();
final String remoteAddress = getRemoteAddress(socketChannel);
final MapleClient client = MapleClient.createLoginClient(clientSessionId, remoteAddress, packetProcessor, LoginServer.WORLD_ID, LoginServer.CHANNEL_ID);
if (!MapleSessionCoordinator.getInstance().canStartLoginSession(client)) {
socketChannel.close();

View File

@@ -4,6 +4,7 @@ import client.MapleClient;
import config.YamlConfig;
import constants.net.ServerConstants;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
@@ -14,11 +15,16 @@ import net.encryption.InitializationVector;
import net.encryption.PacketCodec;
import net.packet.logging.InPacketLogger;
import net.packet.logging.OutPacketLogger;
import net.server.coordinator.session.IpAddresses;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tools.MaplePacketCreator;
import java.net.InetSocketAddress;
import java.util.concurrent.atomic.AtomicLong;
public abstract class ServerChannelInitializer extends ChannelInitializer<SocketChannel> {
private static final Logger log = LoggerFactory.getLogger(ServerChannelInitializer.class);
private static final int IDLE_TIME_SECONDS = 30;
private static final boolean LOG_PACKETS = YamlConfig.config.server.USE_DEBUG_SHOW_PACKET;
private static final ChannelHandler sendPacketLogger = new OutPacketLogger();
@@ -26,6 +32,20 @@ public abstract class ServerChannelInitializer extends ChannelInitializer<Socket
static final AtomicLong sessionId = new AtomicLong(7777);
String getRemoteAddress(Channel channel) {
String remoteAddress = "null";
try {
String hostAddress = ((InetSocketAddress) channel.remoteAddress()).getAddress().getHostAddress();
if (hostAddress != null) {
remoteAddress = IpAddresses.evaluateRemoteAddress(hostAddress); // thanks dyz for noticing Local/LAN/WAN connections not interacting properly
}
} catch (NullPointerException npe) {
log.warn("Unable to get remote address from netty Channel: {}", channel, npe);
}
return remoteAddress;
}
void initPipeline(SocketChannel socketChannel, MapleClient client) {
final InitializationVector sendIv = InitializationVector.generateSend();
final InitializationVector recvIv = InitializationVector.generateReceive();