Advertisement
Guest User

Untitled

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