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.GameServer;
|
||||||
import brainwine.gameserver.server.pipeline.Connection;
|
import brainwine.gameserver.server.pipeline.Connection;
|
||||||
import brainwine.gameserver.zone.Zone;
|
|
||||||
import brainwine.shared.JsonHelper;
|
import brainwine.shared.JsonHelper;
|
||||||
|
|
||||||
public class PlayerManager {
|
public class PlayerManager {
|
||||||
|
@ -139,35 +138,8 @@ public class PlayerManager {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onPlayerAuthenticate(Connection connection, String version, String name, String authToken) {
|
public void onPlayerConnect(Player player) {
|
||||||
if(!SUPPORTED_VERSIONS.contains(version)) {
|
playersByConnection.put(player.getConnection(), player);
|
||||||
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 onPlayerDisconnect(Player player) {
|
public void onPlayerDisconnect(Player player) {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package brainwine.gameserver.server.pipeline;
|
||||||
|
|
||||||
import java.net.SocketAddress;
|
import java.net.SocketAddress;
|
||||||
import java.nio.channels.ClosedChannelException;
|
import java.nio.channels.ClosedChannelException;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
@ -17,6 +18,8 @@ import io.netty.channel.ChannelFuture;
|
||||||
import io.netty.channel.ChannelFutureListener;
|
import io.netty.channel.ChannelFutureListener;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.SimpleChannelInboundHandler;
|
import io.netty.channel.SimpleChannelInboundHandler;
|
||||||
|
import io.netty.util.concurrent.Future;
|
||||||
|
import io.netty.util.concurrent.FutureListener;
|
||||||
|
|
||||||
public class Connection extends SimpleChannelInboundHandler<Request> {
|
public class Connection extends SimpleChannelInboundHandler<Request> {
|
||||||
|
|
||||||
|
@ -60,6 +63,14 @@ public class Connection extends SimpleChannelInboundHandler<Request> {
|
||||||
//kick(error);
|
//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) {
|
public ChannelFuture sendMessage(Message message) {
|
||||||
return channel.writeAndFlush(message).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
|
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.GameServer;
|
||||||
import brainwine.gameserver.server.OptionalField;
|
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.Request;
|
||||||
import brainwine.gameserver.server.pipeline.Connection;
|
import brainwine.gameserver.server.pipeline.Connection;
|
||||||
|
import brainwine.gameserver.zone.Zone;
|
||||||
|
|
||||||
public class AuthenticateRequest extends Request {
|
public class AuthenticateRequest extends Request {
|
||||||
|
|
||||||
|
@ -16,6 +19,40 @@ public class AuthenticateRequest extends Request {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process(Connection connection) {
|
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