blob: cb576ce42b4c7e4694312be2a4ae262a908d362a [file] [log] [blame] [raw]
package net.glowstone.net.handler.handshake;
import com.flowpowered.networking.MessageHandler;
import net.glowstone.GlowServer;
import net.glowstone.net.ProxyData;
import net.glowstone.net.GlowSession;
import net.glowstone.net.message.handshake.HandshakeMessage;
import net.glowstone.net.protocol.ProtocolType;
import java.util.logging.Level;
public class HandshakeHandler implements MessageHandler<GlowSession, HandshakeMessage> {
@Override
public void handle(GlowSession session, HandshakeMessage message) {
ProtocolType protocol = ProtocolType.getById(message.getState());
if (protocol != ProtocolType.LOGIN && protocol != ProtocolType.STATUS) {
session.disconnect("Invalid state");
return;
}
session.setHostname(message.getAddress() + ":" + message.getPort());
// Proxies modify the hostname in the HandshakeMessage to contain
// the client's UUID and (optionally) properties
if (session.getServer().getProxySupport()) {
try {
session.setProxyData(new ProxyData(session, message.getAddress()));
} catch (IllegalArgumentException ex) {
session.disconnect("Invalid proxy data provided.");
// protocol is still set here and below to prevent errors
// trying to decode packets after this one under the wrong
// protocol, even though client is kicked
session.setProtocol(protocol);
return;
} catch (Exception ex) {
GlowServer.logger.log(Level.SEVERE, "Error parsing proxy data for " + session, ex);
session.disconnect("Failed to parse proxy data.");
session.setProtocol(protocol);
return;
}
}
session.setProtocol(protocol);
if (protocol == ProtocolType.LOGIN) {
if (message.getVersion() < GlowServer.PROTOCOL_VERSION) {
session.disconnect("Outdated client! I'm running " + GlowServer.GAME_VERSION);
} else if (message.getVersion() > GlowServer.PROTOCOL_VERSION) {
session.disconnect("Outdated server! I'm running " + GlowServer.GAME_VERSION);
}
}
}
}