mirror of
https://github.com/array-in-a-matrix/brainwine.git
synced 2025-04-02 11:11:58 -04:00
Validate auth tokens asynchronously (#9)
This commit is contained in:
parent
d75d34d5f0
commit
f49f0a57e5
3 changed files with 51 additions and 31 deletions
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue