Validate auth tokens asynchronously (#9)

This commit is contained in:
kuroppoi 2022-04-29 01:14:28 +02:00
parent d75d34d5f0
commit f49f0a57e5
3 changed files with 51 additions and 31 deletions

View file

@ -16,7 +16,6 @@ import com.fasterxml.jackson.databind.InjectableValues;
import brainwine.gameserver.GameServer;
import brainwine.gameserver.server.pipeline.Connection;
import brainwine.gameserver.zone.Zone;
import brainwine.shared.JsonHelper;
public class PlayerManager {
@ -139,35 +138,8 @@ public class PlayerManager {
return false;
}
public void onPlayerAuthenticate(Connection connection, String version, String name, String authToken) {
if(!SUPPORTED_VERSIONS.contains(version)) {
connection.kick("Sorry, this version of Deepworld is not supported.", false);
return;
}
Player player = getPlayer(name);
if(!verifyAuthToken(name, authToken)) {
connection.kick("The session token is either invalid or has expired. Please try relogging.");
return;
}
player.setConnection(connection);
player.setClientVersion(version);
playersByConnection.put(connection, player);
Zone zone = player.getZone();
if(zone == null) {
// TODO default zone 'n stuff.
zone = GameServer.getInstance().getZoneManager().getRandomZone();
}
if(zone == null) {
player.kick("No default zone could be found.");
return;
}
zone.addPlayer(player);
public void onPlayerConnect(Player player) {
playersByConnection.put(player.getConnection(), player);
}
public void onPlayerDisconnect(Player player) {

View file

@ -2,6 +2,7 @@ package brainwine.gameserver.server.pipeline;
import java.net.SocketAddress;
import java.nio.channels.ClosedChannelException;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import org.apache.logging.log4j.LogManager;
@ -17,6 +18,8 @@ import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.FutureListener;
public class Connection extends SimpleChannelInboundHandler<Request> {
@ -60,6 +63,14 @@ public class Connection extends SimpleChannelInboundHandler<Request> {
//kick(error);
}
public Future<?> submitTask(Runnable task) {
return channel.eventLoop().submit(task);
}
public <T> Future<T> submitTask(Callable<T> task) {
return channel.eventLoop().submit(task);
}
public ChannelFuture sendMessage(Message message) {
return channel.writeAndFlush(message).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
}

View file

@ -2,8 +2,11 @@ package brainwine.gameserver.server.requests;
import brainwine.gameserver.GameServer;
import brainwine.gameserver.server.OptionalField;
import brainwine.gameserver.entity.player.Player;
import brainwine.gameserver.entity.player.PlayerManager;
import brainwine.gameserver.server.Request;
import brainwine.gameserver.server.pipeline.Connection;
import brainwine.gameserver.zone.Zone;
public class AuthenticateRequest extends Request {
@ -16,6 +19,40 @@ public class AuthenticateRequest extends Request {
@Override
public void process(Connection connection) {
GameServer.getInstance().getPlayerManager().onPlayerAuthenticate(connection, version, name, authToken);
GameServer server = GameServer.getInstance();
PlayerManager playerManager = server.getPlayerManager();
if(!PlayerManager.SUPPORTED_VERSIONS.contains(version)) {
connection.kick("Sorry, this version of Deepworld is not supported.");
return;
}
connection.submitTask(() -> playerManager.verifyAuthToken(name, authToken)).addListener(future -> {
// TODO can this err?
if(!(boolean)future.get()) {
connection.kick("The provided session token is invalid or has expired. Please try relogging.");
return;
}
server.queueSynchronousTask(() -> {
Player player = playerManager.getPlayer(name);
player.setConnection(connection);
player.setClientVersion(version);
playerManager.onPlayerConnect(player);
Zone zone = player.getZone();
if(zone == null) {
// TODO default zone 'n stuff.
zone = server.getZoneManager().getRandomZone();
}
if(zone == null) {
player.kick("No default zone could be found.");
return;
}
zone.addEntity(player);
});
});
}
}