Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package org.hyperion.rs2.net.codec;
- import java.security.SecureRandom;
- import java.util.logging.Logger;
- import org.apache.mina.core.buffer.IoBuffer;
- import org.apache.mina.core.session.IoSession;
- import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
- import org.apache.mina.filter.codec.ProtocolDecoderOutput;
- import org.hyperion.rs2.model.Player;
- import org.hyperion.rs2.model.PlayerDetails;
- import org.hyperion.rs2.model.World;
- import org.hyperion.rs2.net.PacketBuilder;
- import org.hyperion.rs2.util.IoBufferUtils;
- import org.hyperion.rs2.util.NameUtils;
- public class RS2LoginDecoder extends CumulativeProtocolDecoder {
- /**
- * Logger instance.
- */
- @SuppressWarnings("unused")
- private static final Logger logger = Logger.getLogger(RS2LoginDecoder.class.getName());
- /**
- * The player class.
- */
- private Player player;
- /**
- * Opcode stage.
- */
- public static final int STATE_OPCODE = 0;
- /**
- * Login start.
- */
- public static final int LOGIN_START = 1;
- /**
- * The login cyption.
- */
- private static final int LOGIN_CYPTION = 2;
- /**
- * Secure random number generator.
- */
- private static final SecureRandom RANDOM = new SecureRandom();
- @Override
- protected boolean doDecode(IoSession session, IoBuffer in,
- ProtocolDecoderOutput out) throws Exception {
- final int state = (Integer) session.getAttribute("state", STATE_OPCODE);
- switch (state) {
- case LOGIN_START:
- if(in.remaining() == LOGIN_START) {
- /*
- * We generated the server session key using a SecureRandom
- * class for security.
- */
- long serverKey = RANDOM.nextLong();
- session.write(new PacketBuilder().put((byte) 0).putLong(serverKey).toPacket());
- session.setAttribute("state", 2);
- session.setAttribute("serverKey", serverKey);
- }
- case LOGIN_CYPTION:
- if(3 > in.remaining()) {
- return true;
- }
- int loginType = in.get();
- if (loginType != 16 && loginType != 18) {
- session.close(false);
- }
- int loginPacketSize = in.getShort();
- if (loginPacketSize > in.remaining()) {
- return true;
- }
- int clientVersion = in.getInt();
- if (clientVersion != 614) {
- session.close(false);
- return true;
- }
- @SuppressWarnings("unused")
- int unknown0 = in.get();
- @SuppressWarnings("unused")
- int displayMode = in.get();
- @SuppressWarnings("unused")
- int screenSizeX = in.getShort();
- @SuppressWarnings("unused")
- int screenSizeY = in.getShort();
- @SuppressWarnings("unused")
- int unknown3 = in.get();
- in.skip(24);
- @SuppressWarnings("unused")
- String settings = in.toString();
- @SuppressWarnings("unused")
- int unknown4 = in.getInt();
- int size = in.get();
- in.skip(size);
- in.skip(14);
- in.getShort();
- in.getLong();
- int[] idxSizes = new int[33];
- for(int index = 0; index < idxSizes.length; index++)
- idxSizes[index] = in.getInt();
- in.skip(6);
- if(in.get() != 10) {
- session.close(false);
- return true;
- }
- int nameHash = 0;
- int sessionKey[] = new int[4];
- for (int i = 0; i < 4; i++)
- sessionKey[i] = in.getInt();
- long l = in.getLong();
- int hash = (int) (31 & l >> 16);
- if (hash != nameHash) {
- session.close(false);
- return true;
- }
- String Username = NameUtils.formatName(IoBufferUtils.getRS2String(in));
- String Password = IoBufferUtils.getRS2String(in);
- for (int i = 0; i < 4; i++) sessionKey[i] += 50;
- byte OpCode = 0;
- if (Username == null || Password == null) {
- OpCode = 3;
- } else {
- if (!Password.equals(player.getPassword())) {
- OpCode = 3;
- }
- }
- if(OpCode == 2) {
- in.put((byte) OpCode);
- }
- if(OpCode == 21) {
- player.write(new PacketBuilder().toPacket());
- }
- if (OpCode != 2) {
- session.close(false);
- return true;
- }
- boolean hd = false;
- byte hdType = 0;
- PlayerDetails pd = new PlayerDetails(session, Username, Password, hd, hdType);
- World.getWorld().load(pd);
- }
- in.rewind();
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement