Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jul 21st, 2012  |  syntax: Java  |  size: 4.76 KB  |  hits: 14  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1.         public void handleLogin(Player player, ByteBuffer inData) throws Exception {
  2.                 switch (player.getLoginStage()) {
  3.                 case CONNECTED:
  4.                         if (inData.remaining() < 2) {
  5.                                 inData.compact();
  6.                                 return;
  7.                         }
  8.  
  9.                         // Validate the request.
  10.                         int request = inData.get() & 0xff;
  11.                         inData.get(); // Name hash.
  12.                         if (request != 14) {
  13.                                 System.err.println("Invalid login request: " + request);
  14.                                 player.disconnect();
  15.                                 return;
  16.                         }
  17.  
  18.                         // Write the response.
  19.                         StreamBuffer.OutBuffer out = StreamBuffer.newOutBuffer(17);
  20.                         out.writeLong(0); // First 8 bytes are ignored by the client.
  21.                         out.writeByte(0); // The response opcode, 0 for logging in.
  22.                         out.writeLong(new SecureRandom().nextLong()); // SSK.
  23.                         player.send(out.getBuffer());
  24.  
  25.                         player.setLoginStage(LoginStages.LOGGING_IN);
  26.                         break;
  27.                 case LOGGING_IN:
  28.                         if (inData.remaining() < 2) {
  29.                                 inData.compact();
  30.                                 return;
  31.                         }
  32.  
  33.                         // Validate the login type.
  34.                         int loginType = inData.get();
  35.                         if (loginType != 16 && loginType != 18) {
  36.                                 System.err.println("Invalid login type: " + loginType);
  37.                                 player.disconnect();
  38.                                 return;
  39.                         }
  40.  
  41.                         // Ensure that we can read all of the login block.
  42.                         int blockLength = inData.get() & 0xff;
  43.                         int loginEncryptSize = blockLength - (36 + 1 + 1 + 2);
  44.                         if (inData.remaining() < blockLength) {
  45.                                 inData.compact();
  46.                                 return;
  47.                         }
  48.  
  49.                         // Read the login block.
  50.                         StreamBuffer.InBuffer in = StreamBuffer.newInBuffer(inData);
  51.                        
  52.                         // Set the magic id
  53.                         player.setMagicId(in.readByte());
  54.  
  55.                         // Set the client version.
  56.                         player.setClientVersion(in.readShort());
  57.  
  58.                         in.readByte(); // Skip the high/low memory version.
  59.  
  60.                         // Skip the CRC keys.
  61.                         for (int i = 0; i < 9; i++) {
  62.                                 in.readInt();
  63.                         }
  64.                         if (Constants.RSA_CHECK) {
  65.                                 loginEncryptSize--;
  66.                                 int reportedSize = inData.get() & 0xFF;
  67.                                 if (reportedSize != loginEncryptSize) {
  68.                                         System.err.println("Encrypted packet size zero or negative : " + loginEncryptSize);
  69.                                         player.disconnect();
  70.                                         return;
  71.                                 }
  72.                                 byte[] encryptionBytes = new byte[loginEncryptSize];
  73.                                 inData.get(encryptionBytes);
  74.                                 ByteBuffer rsaBuffer = ByteBuffer.wrap(new BigInteger(encryptionBytes).modPow(RSA_EXPONENT, RSA_MODULUS).toByteArray());
  75.                                 int rsaOpcode = rsaBuffer.get() & 0xFF;
  76.                                 // Validate that the RSA block was decoded properly.
  77.                                 if (rsaOpcode != 10) {
  78.                                         System.err.println("Unable to decode RSA block properly!");
  79.                                         player.disconnect();
  80.                                         return;
  81.                                 }
  82.                                 long clientHalf = rsaBuffer.getLong();
  83.                                 long serverHalf = rsaBuffer.getLong();
  84.                                 int[] isaacSeed = { (int) (clientHalf >> 32), (int) clientHalf,
  85.                                                 (int) (serverHalf >> 32), (int) serverHalf };
  86.                                 player.setDecryptor(new ISAACCipher(isaacSeed));
  87.                                 for (int i = 0; i < isaacSeed.length; i++) {
  88.                                         isaacSeed[i] += 50;
  89.                                 }
  90.                                 player.setEncryptor(new ISAACCipher(isaacSeed));
  91.                                 rsaBuffer.getInt();
  92.                                 String username = NameUtil.getRS2String(rsaBuffer).trim();
  93.                                 String password = NameUtil.getRS2String(rsaBuffer).trim();
  94.                                 player.setPassword(password);
  95.                                 player.setUsername(NameUtil.uppercaseFirstLetter(username));
  96.                         } else {
  97.                                 in.readByte(); // Skip RSA block length.
  98.                                 // Validate that the RSA block was decoded properly.
  99.                                 int rsaOpcode = in.readByte();
  100.                                 if (rsaOpcode != 10) {
  101.                                         System.err.println("Unable to decode RSA block properly!");
  102.                                         player.disconnect();
  103.                                         return;
  104.                                 }
  105.                                 // Set up the ISAAC ciphers.
  106.                                 long clientHalf = in.readLong();
  107.                                 long serverHalf = in.readLong();
  108.                                 int[] isaacSeed = { (int) (clientHalf >> 32), (int) clientHalf, (int) (serverHalf >> 32), (int) serverHalf };
  109.                                 player.setDecryptor(new ISAACCipher(isaacSeed));
  110.                                 for (int i = 0; i < isaacSeed.length; i++) {
  111.                                         isaacSeed[i] += 50;
  112.                                 }
  113.                                 player.setEncryptor(new ISAACCipher(isaacSeed));
  114.  
  115.                                 // Read the user authentication.
  116.                                 in.readInt(); // Skip the user ID.
  117.                                 String username = in.readString().trim();
  118.                                 String password = in.readString().toLowerCase().trim();
  119.                                 player.setPassword(password);
  120.                                 player.setUsername(NameUtil.uppercaseFirstLetter(username));
  121.                         }
  122.                        
  123.             player.setUsernameAsLong(NameUtil.nameToLong(player.getUsername().toLowerCase()));
  124.             player.setLoginStage(LoginStages.AWAITING_LOGIN_COMPLETE);
  125.  
  126.             if (player.beginLogin()) {
  127.                 // Switch the player to the cycled reactor.
  128.                 synchronized (DedicatedReactor.getInstance()) {
  129.                     DedicatedReactor.getInstance().getSelector().wakeup();
  130.                     player.getKey().interestOps(player.getKey().interestOps() & ~SelectionKey.OP_READ);
  131.                     player.getSocketChannel().register(Server.getSingleton().getSelector(), SelectionKey.OP_READ, player);
  132.                 }
  133.             }
  134.                         break;
  135.                 }
  136.         }