Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package zeus.rs2.net.codec;
- import java.security.SecureRandom;
- import java.util.logging.Logger;
- import org.jboss.netty.buffer.ChannelBuffer;
- import org.jboss.netty.channel.Channel;
- import org.jboss.netty.channel.ChannelHandlerContext;
- import org.jboss.netty.handler.codec.frame.FrameDecoder;
- import zeus.rs2.model.player.Player;
- import zeus.rs2.net.packet.MessageBuilder;
- import zeus.rs2.util.BufferUtils;
- /**
- *
- * @author Karl
- *
- */
- public class RS2LoginDecoder extends FrameDecoder {
- private static final Logger logger = Logger.getLogger(RS2LoginDecoder.class.getName());
- private SecureRandom random = new SecureRandom();
- public enum State {
- STATE_OPCODE, STATE_RESPONSE, STATE_UPDATE, STATE_LOGIN;
- }
- private State state = State.STATE_OPCODE;
- private static final int GAME_OPCODE = 14;
- private static final int UPDATE_OPCODE = 15;
- private static final byte[] INITIAL_RESPONSE = new byte[] {
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
- };
- @Override
- protected Object decode(ChannelHandlerContext chc, Channel channel,
- ChannelBuffer channelBuffer) throws Exception {
- switch(state) {
- case STATE_OPCODE:
- if(channelBuffer.readableBytes() >= 1) {
- int opcode = channelBuffer.readByte();
- switch(opcode) {
- case GAME_OPCODE:
- state = State.STATE_RESPONSE;
- return true;
- case UPDATE_OPCODE:
- state = State.STATE_UPDATE;
- return true;
- default:
- logger.info("Invalid opcode:" + opcode);
- channel.close();
- return false;
- }
- } else {
- return false;
- }
- case STATE_RESPONSE:
- if(channelBuffer.readableBytes() >= 1) {
- long serverKey = random.nextLong();
- channel.write(new MessageBuilder().writeBytes(INITIAL_RESPONSE).writeByte((byte) 0).writeLong(serverKey).toMessage());
- state = State.STATE_LOGIN;
- return true;
- } else {
- return false;
- }
- case STATE_UPDATE:
- if(channelBuffer.readableBytes() >= 4) {
- return true;
- } else {
- return false;
- }
- case STATE_LOGIN:
- if(channelBuffer.readableBytes() >= 1) {
- long clientKey = channelBuffer.readLong();
- long serverKey = channelBuffer.readLong();
- int isaacSeed[] = new int[4];
- isaacSeed[0] = (int) (clientKey >> 32);
- isaacSeed[1] = (int) clientKey;
- isaacSeed[2] = (int) (serverKey >> 32);
- isaacSeed[3] = (int) serverKey;
- int rsaOpcode = channelBuffer.readByte() & 0xFF;
- if(rsaOpcode != 10) {
- logger.info("Invalid rsa opcode:" + rsaOpcode);
- channel.close();
- return false;
- }
- int connectionType = channelBuffer.readByte() & 0xFF;
- if(connectionType != 16 && connectionType != 18) {
- logger.info("Invalid connection type:" + connectionType);
- channel.close();
- return false;
- }
- int loginPacket = channelBuffer.readByte() & 0xFF;
- if(loginPacket != 255) {
- logger.info("Invalid login packet:" + loginPacket);
- channel.close();
- return false;
- }
- int clientVersion = channelBuffer.readShort() & 0xFF;
- if(clientVersion != 319) {
- logger.info("Invalid client version:" + clientVersion);
- channel.close();
- return false;
- }
- for(int i = 0; i < 9; i++) {
- channelBuffer.readInt();
- }
- for(int i = 0; i < 4; i++) {
- isaacSeed[2] += 50;
- }
- String username = BufferUtils.readRS2String(channelBuffer);
- String password = BufferUtils.readRS2String(channelBuffer);
- Player player = new Player(username, password);
- player.addPlayer(player);
- logger.info("Registered player: username: "+username+" password: "+password+".");
- return true;
- } else {
- return false;
- }
- }
- return null;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement