Advertisement
Guest User

Untitled

a guest
Jun 11th, 2017
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.08 KB | None | 0 0
  1. package com.rs2hd.net.codec;
  2.  
  3. import org.apache.mina.common.ByteBuffer;
  4. import org.apache.mina.common.IdleStatus;
  5. import org.apache.mina.common.IoSession;
  6. import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
  7. import org.apache.mina.filter.codec.ProtocolCodecFilter;
  8. import org.apache.mina.filter.codec.ProtocolDecoderOutput;
  9.  
  10. import com.rs2hd.Constants;
  11. import com.rs2hd.WorkerThread;
  12. import com.rs2hd.model.PlayerDetails;
  13. import com.rs2hd.net.Packet;
  14. import com.rs2hd.packetbuilder.StaticPacketBuilder;
  15. import com.rs2hd.util.Misc;
  16. import com.rs2hd.util.log.Logger;
  17.  
  18. /**
  19. * Login protocol decoder.
  20. * @author Graham
  21. *
  22. */
  23. public class RS2LoginProtocolDecoder extends CumulativeProtocolDecoder {
  24.  
  25. /**
  26. * Logger instance.
  27. */
  28. private Logger logger = Logger.getInstance();
  29.  
  30. private WorkerThread workerThread;
  31.  
  32. public RS2LoginProtocolDecoder(WorkerThread workerThread) {
  33. this.workerThread = workerThread;
  34. }
  35.  
  36. /**
  37. * Parses the data in the provided byte buffer and writes it to
  38. * <code>out</code> as a <code>Packet</code>.
  39. *
  40. * @param session The IoSession the data was read from
  41. * @param in The buffer
  42. * @param out The decoder output stream to which to write the <code>Packet</code>
  43. * @return Whether enough data was available to create a packet
  44. */
  45. @Override
  46. public boolean doDecode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) {
  47. try {
  48. Object loginStageObj = session.getAttribute("LOGIN_STAGE");
  49. int loginStage = 0;
  50. if(loginStageObj != null) {
  51. loginStage = (Integer)loginStageObj;
  52. }
  53. //Logger.log("recv login packet, stage: "+loginStage);
  54. switch(loginStage) {
  55. case -3:
  56. StaticPacketBuilder worldList = new StaticPacketBuilder();
  57. worldList.setBare(true);
  58. for(int data : Constants.WORLD_LIST_DATA) {
  59. worldList.addByte((byte) data);
  60. }
  61. session.write(worldList.toPacket());
  62. session.close();
  63. return true;
  64. case -2:
  65. if(8 <= in.remaining()) {
  66. for(int i = 0; i < 8; i++) {
  67. in.get();
  68. }
  69. StaticPacketBuilder ukeys = new StaticPacketBuilder();
  70. ukeys.setBare(true);
  71. for(int key : Constants.UPDATE_KEYS) {
  72. ukeys.addByte((byte) key);
  73. }
  74. session.write(ukeys.toPacket());
  75. session.close();
  76. return true;
  77. }
  78. in.rewind();
  79. return false;
  80. case -1:
  81. if(3 <= in.remaining()) {
  82. in.get();
  83. int clientVersion = in.getShort();
  84. if(clientVersion == 525) {
  85. StaticPacketBuilder u1Response = new StaticPacketBuilder();
  86. u1Response.setBare(true).addByte((byte) 0);
  87. session.write(u1Response.toPacket());
  88. session.setAttribute("LOGIN_STAGE", -2);
  89. }
  90. return true;
  91. }
  92. in.rewind();
  93. return false;
  94. case 0: //first login packets
  95. if(2 <= in.remaining()) {
  96. int protocolId = in.get() & 0xff;
  97. @SuppressWarnings("unused")
  98. int namePart = in.get() & 0xff;
  99. if(protocolId == 15) {
  100. session.setAttribute("LOGIN_STAGE", -1);
  101. } else if (protocolId == 131) {
  102. session.setAttribute("LOGIN_STAGE", -3);
  103. } else {
  104. long serverSessionKey = ((long) (java.lang.Math.random() * 99999999D) << 32) + (long) (java.lang.Math.random() * 99999999D);
  105. StaticPacketBuilder s1Response = new StaticPacketBuilder();
  106. s1Response.setBare(true).addByte((byte) 0).addLong(serverSessionKey);
  107. session.setAttribute("SERVER_SESSION_KEY", serverSessionKey);
  108. session.write(s1Response.toPacket());
  109. session.setAttribute("LOGIN_STAGE", 1);
  110. //Logger.log("protocolId="+protocolId+"; namePart="+namePart);
  111. }
  112. return true;
  113. } else {
  114. in.rewind();
  115. return false;
  116. }
  117. case 1: //here's where we get the username and password
  118. @SuppressWarnings("unused")
  119. int loginType = -1, loginPacketSize = -1;
  120. if(3 <= in.remaining()) {
  121. loginType = in.get() & 0xff; //should be 16 or 18
  122. loginPacketSize = in.getUnsignedShort();
  123. //Logger.log("loginType="+loginType);
  124. } else {
  125. in.rewind();
  126. return false;
  127. }
  128. if(loginPacketSize <= in.remaining()) {
  129. byte[] payload = new byte[loginPacketSize];
  130. in.get(payload);
  131. Packet p = new Packet(session, -1, payload);
  132. @SuppressWarnings("unused")
  133. int loginEncryptPacketSize = loginPacketSize - (36 + 1 + 1 + 2); // can't be negative
  134. int clientVersion = p.readInt();
  135. if(clientVersion != 525) {
  136. // this is bad
  137. }
  138. for (int byteIdx = 0;byteIdx < 4;byteIdx++) {
  139. p.readByte();
  140. }
  141. p.readShort();
  142. p.readShort();
  143. p.readByte();
  144. for (int byteIdx = 0;byteIdx < 24;byteIdx++)
  145. p.readByte();
  146. p.readRS2String();
  147. for (int byteIdx = 0;byteIdx < 3;byteIdx++)
  148. p.readByte();
  149. for (int it = 0;it < 2;it++)
  150. p.readInt();
  151. p.readShort();
  152. for (int i = 0; i < 26; i++) {
  153. p.readInt();
  154. }/**/
  155.  
  156. int junk29 = p.readShort();
  157. int junk30 = p.readByte();
  158. int junk31 = p.readShort();
  159.  
  160. int encryption = p.readByte();
  161.  
  162. long clientSessionKey = p.readLong();
  163. long serverSessionKey = p.readLong();
  164.  
  165. String user = Misc.longToPlayerName(p.readLong()), //given username
  166. pass = p.readRS2String(); //given password
  167.  
  168.  
  169. int sessionKey[] = new int[4];
  170. sessionKey[0] = (int)(clientSessionKey >> 32);
  171. sessionKey[1] = (int)clientSessionKey;
  172. sessionKey[2] = (int)(serverSessionKey >> 32);
  173. sessionKey[3] = (int)serverSessionKey;
  174.  
  175. //session.setAttribute("CRYPTION_IN", new ISAACCipher(sessionKey));
  176. for(int i = 0; i < 4; i++) sessionKey[i] += 50;
  177. //session.setAttribute("CRYPTION_OUT", new ISAACCipher(sessionKey));
  178.  
  179. session.removeAttribute("LOGIN_STAGE");
  180.  
  181. /**
  182. * Here's where we add the user to the login queue, and if the login is
  183. * accepted, we change their session filter to a standard RS2ProtocolCodec.
  184. */
  185. logger.debug("Login request: [username="+user+",password="+pass+"].");
  186.  
  187. PlayerDetails d = new PlayerDetails(user, pass, session, false);
  188. workerThread.loadPlayer(d);
  189.  
  190. session.setIdleTime(IdleStatus.BOTH_IDLE, Constants.SESSION_IDLE_TIME);
  191.  
  192. session.getFilterChain().remove("protocolFilter");
  193. session.getFilterChain().addLast("protocolFilter", new ProtocolCodecFilter(new CodecFactory()));
  194.  
  195. return true;
  196. } else {
  197. in.rewind();
  198. return false;
  199. }
  200. }
  201. } catch(Exception e) {
  202. logger.stackTrace(e);
  203. }
  204. return false;
  205. }
  206.  
  207.  
  208.  
  209. /**
  210. * Releases the buffer used by the given session.
  211. *
  212. * @param session The session for which to release the buffer
  213. * @throws Exception if failed to dispose all resources
  214. */
  215. @Override
  216. public void dispose(IoSession session) throws Exception {
  217. super.dispose(session);
  218. }
  219.  
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement