Advertisement
Guest User

Untitled

a guest
Sep 20th, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.76 KB | None | 0 0
  1. package ps.eden.server.net.event;
  2.  
  3. import java.nio.ByteBuffer;
  4.  
  5. import ps.eden.server.cache.Cache;
  6. import ps.eden.server.cache.crypto.ISAACCipher;
  7. import ps.eden.server.cache.misc.buffer.ByteBufferUtils;
  8. import ps.eden.server.engine.GameEngine;
  9. import ps.eden.server.engine.login.LoginEvent;
  10. import ps.eden.server.engine.login.LoginResponse;
  11. import ps.eden.server.game.node.entity.player.info.ClientInfo;
  12. import ps.eden.server.game.node.entity.player.info.UIDInfo;
  13. import ps.eden.server.game.system.registry.AccountRegister;
  14. import ps.eden.server.net.Constants;
  15. import ps.eden.server.net.IoEventHandler;
  16. import ps.eden.server.net.IoSession;
  17. import ps.eden.server.tools.StringUtils;
  18.  
  19. /**
  20. * Handles login event codec.
  21. * @author Emperor
  22. *
  23. */
  24. public final class LoginEventHandler implements IoEventHandler {
  25.  
  26. /**
  27. * The default login opcode.
  28. */
  29. private static final int DEFAULT_LOGIN = 16;
  30.  
  31. /**
  32. * The reconnect login opcode.
  33. */
  34. private static final int RECONNECT_LOGIN = 18;
  35.  
  36. @Override
  37. public void read(IoSession session, ByteBuffer buffer) {
  38. int opcode = buffer.get() & 0xFF;
  39. int length = buffer.getShort() & 0xFFFF;
  40. //System.out.println(opcode + ", " + length);
  41. if (length != buffer.remaining()) {
  42. session.write(LoginResponse.BAD_SESSION_ID);
  43. return;
  44. }
  45. if (buffer.getInt() != Constants.REVISION) {
  46. session.write(LoginResponse.UPDATED);
  47. return;
  48. }
  49.  
  50. /*if (buffer.getLong() != 3847247243492844L) {
  51. session.write(LoginResponse.UPDATED);
  52. return;
  53. }*/
  54.  
  55. String ip = session.getAddress();
  56. int connections = AccountRegister.ipToConnections.getOrDefault(ip, 0);
  57. if (connections >= 10) {
  58. session.write(LoginResponse.LOGIN_LIMIT_EXCEEDED);
  59. return;
  60. }
  61. AccountRegister.ipToConnections.put(ip, connections + 1);
  62.  
  63. switch (opcode) {
  64. case DEFAULT_LOGIN:
  65. decodeLogin(session, buffer, false);
  66. break;
  67. case RECONNECT_LOGIN:
  68. decodeLogin(session, buffer, true);
  69. break;
  70. default:
  71. System.out.println("Invalid login opcode " + opcode + "!");
  72. session.write(LoginResponse.BAD_SESSION_ID);
  73. }
  74. }
  75.  
  76. /**
  77. * Decodes the login request.
  78. * @param session The session.
  79. * @param buffer The buffer containing the request data.
  80. * @param reconnect If this is a reconnect login request.
  81. */
  82. private void decodeLogin(IoSession session, ByteBuffer buffer, boolean reconnect) {
  83. //System.out.println("Decode login attempt (reconnect=" + reconnect + ") " + session.getAddress());
  84. buffer.get(); // Memory?
  85. buffer.get();// no advertisement = 1
  86. buffer.get();// 1
  87. int windowMode = buffer.get();// Screen size mode
  88. int screenWidth = buffer.getShort(); // Screen size Width
  89. int screenHeight = buffer.getShort(); // Screen size Height
  90. int displayMode = buffer.get(); // Display mode
  91. byte[] data = new byte[24]; // random.dat data.
  92. buffer.get(data);
  93. String something = ByteBufferUtils.getString(buffer);
  94. int affiliate = buffer.getInt();// Affiliate id
  95. buffer.getInt(); // Hash containing a bunch of settings
  96. short interfacePacketCounter = buffer.getShort();//Current interface packet counter.
  97. //System.out.println(Cache.getIndexes().length + " total indexes");
  98. for (int i = 0; i < 29/*Cache.getIndexes().length*/; i++) {
  99. int crc = Cache.getIndexes()[i] == null ? 0
  100. : Cache.getIndexes()[i].getInformation().getInformationContainer().getCrc();
  101. if (crc != buffer.getInt() && crc != 0) {
  102. session.write(LoginResponse.UPDATED);
  103. return;
  104. //continue;
  105. }
  106. }
  107. buffer = ByteBufferUtils.getRSABlock(buffer);
  108. int[] seed = ByteBufferUtils.getISAACSeed(buffer);
  109. session.setCipherIn(new ISAACCipher(seed));
  110. for (int i = 0; i < seed.length; i++) {
  111. seed[i] += 50;
  112. }
  113. session.setCipherOut(new ISAACCipher(seed));
  114. String username = StringUtils.longToString(buffer.getLong());
  115. String lowered = username.toLowerCase();
  116. if (lowered.contains("kratos") || lowered.contains("krat0s") || lowered.contains("kr4t0s")) {
  117. System.err.println(session.getAddress() + " is a Kratos skiddy");
  118. session.write(LoginResponse.BAD_SESSION_ID);
  119. return;
  120. }
  121. if (affiliate != 38472812) {
  122. System.err.println(session.getAddress() + " is a Kratos skiddy");
  123. session.write(LoginResponse.UPDATED);
  124. return;
  125. }
  126. String password = ByteBufferUtils.getString(buffer);
  127. byte b = buffer.get();
  128. if (b != 4) {
  129. System.err.println(session.getAddress() + " is using an old client :)");
  130. session.write(LoginResponse.BAD_SESSION_ID);
  131. return;
  132. }
  133. /* if (!"stopsnoopingkid".equals(something)) {
  134. session.write(LoginResponse.UPDATED);
  135. return;
  136. }*/
  137. if (interfacePacketCounter != 23300) {
  138. System.err.println(session.getAddress() + " is a Kratos skiddy");
  139. session.write(LoginResponse.UPDATED);
  140. return;
  141. }
  142. UIDInfo info = new UIDInfo(session.getAddress(), ByteBufferUtils.getString(buffer),
  143. ByteBufferUtils.getString(buffer), ByteBufferUtils.getString(buffer));
  144. LoginEvent event = new LoginEvent(session, username, password, info);
  145. event.setReconnect(reconnect);
  146. event.setDisplayInfo(new ClientInfo(displayMode, windowMode, screenWidth, screenHeight));
  147. GameEngine.getLoginSchedule().schedule(event);
  148. }
  149.  
  150. @Override
  151. public void write(IoSession session, Object... args) {
  152. if (args[0] instanceof LoginResponse) {
  153. LoginResponse response = (LoginResponse) args[0];
  154. ByteBuffer buffer = ByteBuffer.allocate(1);
  155. int opcode = response.opcode();
  156. buffer.put((byte) opcode);
  157. if (opcode == LoginResponse.MOVING_WORLD.opcode()) {
  158. buffer = ByteBuffer.allocate(2);
  159. buffer.put((byte) opcode);
  160. buffer.put((byte) 20);
  161. }
  162. session.write(buffer);
  163. } else {
  164. System.err.println("LoginEventHandler: " + args[0] + ", "
  165. + (session == null ? "null" : session.getRemoteAddress()));
  166. }
  167. }
  168.  
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement