Advertisement
Guest User

Untitled

a guest
Jul 2nd, 2016
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.29 KB | None | 0 0
  1. package com.ruse.net.login;
  2.  
  3. import java.math.BigInteger;
  4. import java.net.InetSocketAddress;
  5. import java.security.SecureRandom;
  6.  
  7. import org.jboss.netty.buffer.ChannelBuffer;
  8. import org.jboss.netty.buffer.ChannelBuffers;
  9. import org.jboss.netty.channel.Channel;
  10. import org.jboss.netty.channel.ChannelFuture;
  11. import org.jboss.netty.channel.ChannelFutureListener;
  12. import org.jboss.netty.channel.ChannelHandlerContext;
  13. import org.jboss.netty.handler.codec.frame.FrameDecoder;
  14.  
  15. import com.ruse.GameSettings;
  16. import com.ruse.net.PlayerSession;
  17. import com.ruse.net.packet.PacketBuilder;
  18. import com.ruse.net.packet.codec.PacketDecoder;
  19. import com.ruse.net.packet.codec.PacketEncoder;
  20. import com.ruse.net.security.IsaacRandom;
  21. import com.ruse.util.Misc;
  22. import com.ruse.util.NameUtils;
  23. import com.ruse.world.World;
  24. import com.ruse.world.content.bots.Bot;
  25. import com.ruse.world.content.bots.BotHandler;
  26. import com.ruse.world.content.clan.ClanChatManager;
  27. import com.ruse.world.entity.impl.player.Player;
  28.  
  29. /**
  30. * A {@link org.niobe.net.StatefulFrameDecoder} which decodes
  31. * the login requests.
  32. *
  33. * @author Gabriel Hannason
  34. */
  35. public final class LoginDecoder extends FrameDecoder {
  36.  
  37. private static final int CONNECTED = 0;
  38. private static final int LOGGING_IN = 1;
  39. private int state = CONNECTED;
  40. private long seed;
  41.  
  42. @Override
  43. protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {
  44. if(!channel.isConnected()) {
  45. return null;
  46. }
  47. switch (state) {
  48. case CONNECTED:
  49. if (buffer.readableBytes() < 1) {
  50. return null;
  51. }
  52. int request = buffer.readUnsignedByte();
  53. if (request != 14) {
  54. System.out.println("Invalid login request: " + request);
  55. channel.close();
  56. return null;
  57. }
  58. seed = new SecureRandom().nextLong();
  59. channel.write(new PacketBuilder().put((byte) 0).putLong(seed).toPacket());
  60. state = LOGGING_IN;
  61. return null;
  62. case LOGGING_IN:
  63. if (buffer.readableBytes() < 2) {
  64. System.out.println("no readable bytes");
  65. return null;
  66. }
  67. int loginType = buffer.readByte();
  68. if (loginType != 16 && loginType != 18) {
  69. System.out.println("Invalid login type: " + loginType);
  70. channel.close();
  71. return null;
  72. }
  73. int blockLength = buffer.readByte() & 0xff;
  74. if (buffer.readableBytes() < blockLength) {
  75. channel.close();
  76. return null;
  77. }
  78. int magicId = buffer.readUnsignedByte();
  79. if(magicId != 0xFF) {
  80. System.out.println("Invalid magic id! magicId: "+magicId);
  81. channel.close();
  82. return null;
  83. }
  84. int clientVersion = buffer.readShort();
  85. int memory = buffer.readByte();
  86. if (memory != 0 && memory != 1) {
  87. System.out.println("Unhandled memory byte value");
  88. channel.close();
  89. return null;
  90. }
  91. /*int[] archiveCrcs = new int[9];
  92. for (int i = 0; i < 9; i++) {
  93. archiveCrcs[i] = buffer.readInt();
  94. }*/
  95. int length = buffer.readUnsignedByte();
  96. /**
  97. * Our RSA components.
  98. */
  99. ChannelBuffer rsaBuffer = buffer.readBytes(length);
  100. BigInteger bigInteger = new BigInteger(rsaBuffer.array());
  101. bigInteger = bigInteger.modPow(GameSettings.SERVER_RSA_EXPONENT, GameSettings.SERVER_RSA_MODULUS);
  102. rsaBuffer = ChannelBuffers.wrappedBuffer(bigInteger.toByteArray());
  103.  
  104. int securityId = rsaBuffer.readByte();
  105. if(securityId != 10) {
  106. System.out.println("securityId id is not 10. It is "+securityId);
  107. channel.close();
  108. return null;
  109. }
  110. long clientSeed = rsaBuffer.readLong();
  111. long seedReceived = rsaBuffer.readLong();
  112. if (seedReceived != seed) {
  113. System.out.println("Unhandled seed read: [seed, seedReceived] : [" + seed + ", " + seedReceived + "");
  114. channel.close();
  115. return null;
  116. }
  117. int[] seed = new int[4];
  118. seed[0] = (int) (clientSeed >> 32);
  119. seed[1] = (int) clientSeed;
  120. seed[2] = (int) (this.seed >> 32);
  121. seed[3] = (int) this.seed;
  122. IsaacRandom decodingRandom = new IsaacRandom(seed);
  123. for (int i = 0; i < seed.length; i++) {
  124. seed[i] += 50;
  125. }
  126. int uid = rsaBuffer.readInt();
  127. String username = Misc.readString(rsaBuffer);
  128. String password = Misc.readString(rsaBuffer);
  129. //String serial = Misc.readString(rsaBuffer);
  130. if (username.length() > 12 || password.length() > 20) {
  131. System.out.println("Username or password length too long");
  132. return null;
  133. }
  134. username = Misc.formatText(username.toLowerCase());
  135. channel.getPipeline().replace("encoder", "encoder", new PacketEncoder(new IsaacRandom(seed)));
  136. channel.getPipeline().replace("decoder", "decoder", new PacketDecoder(decodingRandom));
  137. return login(channel, new LoginDetailsMessage(username, password, ((InetSocketAddress) channel.getRemoteAddress()).getAddress().getHostAddress(), "", clientVersion, uid));
  138. }
  139. return null;
  140. }
  141.  
  142. public Player login(Channel channel, LoginDetailsMessage msg) {
  143.  
  144. PlayerSession session = new PlayerSession(channel);
  145.  
  146. Player player = new Player(session).setUsername(msg.getUsername())
  147. .setLongUsername(NameUtils.stringToLong(msg.getUsername()))
  148. .setPassword(msg.getPassword())
  149. .setHostAddress(msg.getHost())
  150. .setSerialNumber(msg.getSerialNumber());
  151.  
  152. session.setPlayer(player);
  153.  
  154. int response = LoginResponses.getResponse(player, msg);
  155.  
  156. final boolean bot = msg.getUid() == GameSettings.BOT_UID;
  157. final boolean newAccount = response == LoginResponses.NEW_ACCOUNT;
  158.  
  159. if(newAccount) {
  160. player.setNewPlayer(!bot);
  161. response = LoginResponses.LOGIN_SUCCESSFUL;
  162. }
  163.  
  164. if (response == LoginResponses.LOGIN_SUCCESSFUL) {
  165. channel.write(new PacketBuilder().put((byte)2).put((byte)player.getRights().ordinal()).put((byte)0).toPacket());
  166.  
  167. World.getLoginQueue().add(player);
  168.  
  169. if(bot) {
  170. player.setBot(true);
  171. player.getPacketSender().sendInterfaceRemoval();
  172. ClanChatManager.join(player, "Testinghshsh");
  173. BotHandler.onLogin(player);
  174. }
  175.  
  176. return player;
  177. } else {
  178. sendReturnCode(channel, response);
  179. return null;
  180. }
  181. }
  182.  
  183. public static void sendReturnCode(final Channel channel, final int code) {
  184. channel.write(new PacketBuilder().put((byte) code).toPacket()).addListener(new ChannelFutureListener() {
  185. @Override
  186. public void operationComplete(final ChannelFuture arg0) throws Exception {
  187. arg0.getChannel().close();
  188. }
  189. });
  190. }
  191.  
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement