Advertisement
Abdallah_Wahidi

Untitled

Aug 28th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.94 KB | None | 0 0
  1.     @Override
  2.     public void decode(InputStream stream) {
  3.         session.setDecoder(-1);
  4.         int packetId = stream.readUnsignedByte();
  5.         if (World.exiting_start != 0) {
  6.             System.err.println("Login Decoder [Decode] -> Mismatch in the existing start!");
  7.             session.getLoginPackets().sendClientPacket(14);
  8.             return;
  9.         }
  10.         int packetSize = stream.readUnsignedShort();
  11.         if (packetSize != stream.getRemaining()) {
  12.             System.err.println("Login Decoder [Decode] -> Insufficient amount of bytes in the buffer!");
  13.             session.getChannel().close();
  14.             return;
  15.         }
  16.         if (stream.readInt() != Settings.MAJOR_BUILD || stream.readInt() != Settings.MINOR_BUILD) {
  17.             System.err.println("Login Decoder -> Invalid major or minor builds!");
  18.             session.getLoginPackets().sendClientPacket(6);
  19.             return;
  20.         }
  21.         if (packetId == 16 || packetId == 18) {
  22.             decodeWorldLogin(stream);
  23.         } else {
  24.             if (Settings.DEBUG) {
  25.                 Logger.log(this, "PacketId " + packetId);
  26.             }
  27.             session.getChannel().close();
  28.         }
  29.     }
  30.  
  31.     @SuppressWarnings("unused")
  32.     public void decodeWorldLogin(InputStream stream) {
  33.         boolean unknownEquals14 = stream.readUnsignedByte() == 1;
  34.         int rsaBlockSize = stream.readUnsignedShort();
  35.         if (rsaBlockSize > stream.getRemaining()) {
  36.             System.err.println("Login Decoder -> Insufficient amount of bytes in the buffer!");
  37.             session.getLoginPackets().sendClientPacket(10);
  38.             return;
  39.         }
  40.         byte[] data = new byte[rsaBlockSize];
  41.         stream.readBytes(data, 0, rsaBlockSize);
  42.         InputStream rsaStream = new InputStream(Utilities.cryptRSA(data, Settings.GAME_SERVER_PRIVATE_EXPONENT, Settings.GAME_SERVER_PRIVATE_MODULUS));
  43.         if (rsaStream.readUnsignedByte() != 10) {
  44.             System.err.println("Login Decoder -> Block opcode mismatch!");
  45.             session.getLoginPackets().sendClientPacket(10);
  46.             return;
  47.         }
  48.         int[] isaacKeys = new int[4];
  49.         for (int i = 0; i < isaacKeys.length; i++) {
  50.             isaacKeys[i] = rsaStream.readInt();
  51.         }
  52.         if (rsaStream.readLong() != 0L) {
  53.             System.err.println("Login Decoder -> Login hash mismatch!");
  54.             session.getLoginPackets().sendClientPacket(10);
  55.             return;
  56.         }
  57.         String password = rsaStream.readString();
  58.         if (password.length() > 30 || password.length() < 3) {
  59.             session.getLoginPackets().sendClientPacket(3);
  60.             return;
  61.         }
  62.         password = Encrypt.encryptSHA1(password);
  63.         rsaStream.readLong();
  64.         rsaStream.readLong();
  65.         stream.decodeXTEA(isaacKeys, stream.getOffset(), stream.getLength());
  66.         boolean stringUsername = stream.readUnsignedByte() == 1;
  67.         String username = Utilities.formatPlayerNameForProtocol(stringUsername ? stream.readString() : Utilities.longToString(stream.readLong()));
  68.         int displayMode = stream.readUnsignedByte();
  69.         int screenWidth = stream.readUnsignedShort();
  70.         int screenHeight = stream.readUnsignedShort();
  71.         stream.readUnsignedByte();
  72.         stream.skip(24);
  73.         stream.readString();
  74.         stream.readInt();
  75.         stream.skip(stream.readUnsignedByte());
  76.         stream.skip(stream.readUnsignedByte());
  77.         stream.readInt();
  78.         stream.readLong();
  79.         stream.readString();
  80.         if (stream.readUnsignedByte() == 1) {
  81.             stream.readString();
  82.         }
  83.         stream.readUnsignedByte();
  84.         stream.readUnsignedByte();
  85.         stream.readUnsignedByte();
  86.         stream.readByte();
  87.         stream.readInt();
  88.         stream.readString();
  89.         stream.readUnsignedByte();
  90. /*      for (int index = 0; index < Cache.STORE.getIndexes().length; index++) {
  91.             if (index == 34) {
  92.                 continue;
  93.             }
  94.             int crc = Cache.STORE.getIndexes()[index] == null ? -1011863738 : Cache.STORE.getIndexes()[index].getCRC();
  95.             int receivedCRC = stream.readInt();
  96.             if (crc != receivedCRC && index < 32) {
  97.                 System.err.println("Decode Login -> CRC received is not equal to the one in indexes...");
  98.                 session.getLoginPackets().sendClientPacket(6);
  99.                 return;
  100.             }
  101.         }*/
  102.         for (int index = 0; index < Cache.STORE.getIndexes().length; index++) {
  103.             int receivedCRC = stream.readInt();
  104.         }
  105.         if (Utilities.invalidAccountName(username)) {
  106.             session.getLoginPackets().sendClientPacket(3);
  107.             return;
  108.         }
  109.         if (World.getPlayers().size() >= Settings.PLAYERS_LIMIT - 10) {
  110.             session.getLoginPackets().sendClientPacket(7);
  111.             return;
  112.         }
  113.         if (World.containsPlayer(username)) {
  114.             session.getLoginPackets().sendClientPacket(5);
  115.             return;
  116.         }
  117.         if (AntiFlood.getSessionsIP(session.getIP()) > 2) {
  118.             session.getLoginPackets().sendClientPacket(9);
  119.             return;
  120.         }
  121.         Player player;
  122.         if (!SerializableFilesManager.containsPlayer(username)) {
  123.             player = new Player(password);
  124.         } else {
  125.             player = SerializableFilesManager.loadPlayer(username);
  126.             if (player == null) {
  127.                 session.getLoginPackets().sendClientPacket(20);
  128.                 return;
  129.             }
  130.             if (!password.equals(player.getPassword())) {
  131.                 session.getLoginPackets().sendClientPacket(3);
  132.                 return;
  133.             }
  134.         }
  135.         player.init(session, username, displayMode, screenWidth, screenHeight, new IsaacKeyPair(isaacKeys));
  136.         session.getLoginPackets().sendLoginDetails(player);
  137.         session.setDecoder(3, player);
  138.         session.setEncoder(2, player);
  139.         player.start();
  140.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement