Advertisement
Guest User

Untitled

a guest
Jun 11th, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.87 KB | None | 0 0
  1. package org.hyperion.rs2.net.codec;
  2.  
  3. import java.security.SecureRandom;
  4. import java.util.logging.Logger;
  5.  
  6. import org.apache.mina.core.buffer.IoBuffer;
  7. import org.apache.mina.core.session.IoSession;
  8. import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
  9. import org.apache.mina.filter.codec.ProtocolDecoderOutput;
  10. import org.hyperion.rs2.model.Player;
  11. import org.hyperion.rs2.model.PlayerDetails;
  12. import org.hyperion.rs2.model.World;
  13. import org.hyperion.rs2.net.PacketBuilder;
  14. import org.hyperion.rs2.util.IoBufferUtils;
  15. import org.hyperion.rs2.util.NameUtils;
  16.  
  17. public class RS2LoginDecoder extends CumulativeProtocolDecoder {
  18.  
  19.  
  20. /**
  21. * Logger instance.
  22. */
  23. @SuppressWarnings("unused")
  24. private static final Logger logger = Logger.getLogger(RS2LoginDecoder.class.getName());
  25.  
  26. /**
  27. * The player class.
  28. */
  29. private Player player;
  30.  
  31. /**
  32. * Opcode stage.
  33. */
  34. public static final int STATE_OPCODE = 0;
  35.  
  36. /**
  37. * Login start.
  38. */
  39. public static final int LOGIN_START = 1;
  40.  
  41. /**
  42. * The login cyption.
  43. */
  44. private static final int LOGIN_CYPTION = 2;
  45.  
  46. /**
  47. * Secure random number generator.
  48. */
  49. private static final SecureRandom RANDOM = new SecureRandom();
  50.  
  51. @Override
  52. protected boolean doDecode(IoSession session, IoBuffer in,
  53. ProtocolDecoderOutput out) throws Exception {
  54. final int state = (Integer) session.getAttribute("state", STATE_OPCODE);
  55. switch (state) {
  56. case LOGIN_START:
  57. if(in.remaining() == LOGIN_START) {
  58.  
  59. /*
  60. * We generated the server session key using a SecureRandom
  61. * class for security.
  62. */
  63. long serverKey = RANDOM.nextLong();
  64.  
  65. session.write(new PacketBuilder().put((byte) 0).putLong(serverKey).toPacket());
  66. session.setAttribute("state", 2);
  67. session.setAttribute("serverKey", serverKey);
  68. }
  69. case LOGIN_CYPTION:
  70. if(3 > in.remaining()) {
  71. return true;
  72. }
  73. int loginType = in.get();
  74. if (loginType != 16 && loginType != 18) {
  75. session.close(false);
  76. }
  77.  
  78. int loginPacketSize = in.getShort();
  79. if (loginPacketSize > in.remaining()) {
  80. return true;
  81. }
  82.  
  83. int clientVersion = in.getInt();
  84. if (clientVersion != 614) {
  85. session.close(false);
  86. return true;
  87. }
  88.  
  89. @SuppressWarnings("unused")
  90. int unknown0 = in.get();
  91.  
  92. @SuppressWarnings("unused")
  93. int displayMode = in.get();
  94.  
  95. @SuppressWarnings("unused")
  96. int screenSizeX = in.getShort();
  97.  
  98. @SuppressWarnings("unused")
  99. int screenSizeY = in.getShort();
  100.  
  101. @SuppressWarnings("unused")
  102. int unknown3 = in.get();
  103.  
  104. in.skip(24);
  105.  
  106. @SuppressWarnings("unused")
  107. String settings = in.toString();
  108.  
  109. @SuppressWarnings("unused")
  110. int unknown4 = in.getInt();
  111.  
  112. int size = in.get();
  113. in.skip(size);
  114. in.skip(14);
  115. in.getShort();
  116. in.getLong();
  117. int[] idxSizes = new int[33];
  118. for(int index = 0; index < idxSizes.length; index++)
  119. idxSizes[index] = in.getInt();
  120. in.skip(6);
  121.  
  122. if(in.get() != 10) {
  123. session.close(false);
  124. return true;
  125. }
  126.  
  127. int nameHash = 0;
  128.  
  129. int sessionKey[] = new int[4];
  130. for (int i = 0; i < 4; i++)
  131. sessionKey[i] = in.getInt();
  132. long l = in.getLong();
  133. int hash = (int) (31 & l >> 16);
  134. if (hash != nameHash) {
  135. session.close(false);
  136. return true;
  137. }
  138.  
  139. String Username = NameUtils.formatName(IoBufferUtils.getRS2String(in));
  140. String Password = IoBufferUtils.getRS2String(in);
  141.  
  142. for (int i = 0; i < 4; i++) sessionKey[i] += 50;
  143. byte OpCode = 0;
  144.  
  145. if (Username == null || Password == null) {
  146. OpCode = 3;
  147. } else {
  148. if (!Password.equals(player.getPassword())) {
  149. OpCode = 3;
  150. }
  151. }
  152. if(OpCode == 2) {
  153. in.put((byte) OpCode);
  154. }
  155.  
  156. if(OpCode == 21) {
  157. player.write(new PacketBuilder().toPacket());
  158. }
  159.  
  160. if (OpCode != 2) {
  161. session.close(false);
  162. return true;
  163. }
  164. boolean hd = false;
  165. byte hdType = 0;
  166. PlayerDetails pd = new PlayerDetails(session, Username, Password, hd, hdType);
  167. World.getWorld().load(pd);
  168. }
  169. in.rewind();
  170. return false;
  171. }
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement