package net.scapeemulator.game.net.register; import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; import java.io.IOException; import java.net.InetSocketAddress; import java.util.Calendar; import net.scapeemulator.game.GameServer; import net.scapeemulator.game.net.Session; public final class RegisterSession extends Session { public RegisterSession(GameServer server, Channel channel) { super(server, channel); } @Override public void messageReceived(Object message) throws IOException { if (message instanceof RegisterPersonalDetailsRequest) { RegisterPersonalDetailsRequest req = (RegisterPersonalDetailsRequest) message; int age = Calendar.getInstance().get(Calendar.YEAR) - req.getDateOfBirth().get(Calendar.YEAR); if (age < 0) { channel.write(new RegisterResponse(RegisterResponse.STATUS_DOB_FUTURE)).addListener(ChannelFutureListener.CLOSE); } else if (age == 0) { channel.write(new RegisterResponse(RegisterResponse.STATUS_DOB_THIS_YEAR)).addListener(ChannelFutureListener.CLOSE); } else if (age == 1) { channel.write(new RegisterResponse(RegisterResponse.STATUS_DOB_LAST_YEAR)).addListener(ChannelFutureListener.CLOSE); } else if (age < 12 || age > 100) { channel.write(new RegisterResponse(RegisterResponse.STATUS_DOB_INVALID)).addListener(ChannelFutureListener.CLOSE); } else { channel.write(new RegisterResponse(RegisterResponse.STATUS_OK)); } } else if (message instanceof RegisterUsernameRequest) { RegisterUsernameRequest req = (RegisterUsernameRequest) message; // TODO maybe remove trailing/leading spaces? String username = req.getUsername(); if (username.matches("^[a-z0-9_]{3,12}$")) { if (server.getSerializer().usernameAvailable(username)) { channel.write(new RegisterResponse(RegisterResponse.STATUS_OK)).addListener(ChannelFutureListener.CLOSE); } else { channel.write(new RegisterResponse(RegisterResponse.STATUS_USERNAME_UNAVAILABLE)).addListener(ChannelFutureListener.CLOSE); } } else { channel.write(new RegisterResponse(RegisterResponse.STATUS_USERNAME_INVALID)).addListener(ChannelFutureListener.CLOSE); } } else if (message instanceof RegisterCommitRequest) { RegisterCommitRequest req = (RegisterCommitRequest) message; /* * We check the username again in case its manipulated. Since it shouldn't happen with * the actual client, we aren't scared to just dispose without sending a response. */ String username = req.getUsername(); if (!username.matches("^[a-z0-9_]{3,12}$")) { return; } if (!server.getSerializer().usernameAvailable(username)) { return; } String password = req.getPassword(); if (password.matches("^[a-zA-Z0-9_]{5,20}$")) { if (server.getSerializer().register(((InetSocketAddress) channel.remoteAddress()).getAddress().getHostAddress(), username, password)) { channel.write(new RegisterResponse(RegisterResponse.STATUS_OK)).addListener(ChannelFutureListener.CLOSE); } else { channel.write(new RegisterResponse(RegisterResponse.STATUS_ERROR_CONTACTING_CREATE_SYSTEM)).addListener(ChannelFutureListener.CLOSE); } } else { if (password.length() < 5 || password.length() > 20) { channel.write(new RegisterResponse(RegisterResponse.STATUS_PASSWORD_INVALID_LENGTH)).addListener(ChannelFutureListener.CLOSE); } else { channel.write(new RegisterResponse(RegisterResponse.STATUS_PASSWORD_INVALID_CHARS)).addListener(ChannelFutureListener.CLOSE); } } } else { // invalid request } } }