Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package org.hannes;
- import java.util.Random;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import org.hannes.Player.LoginState;
- import org.hannes.Player.MemoryVersion;
- public class LoginDecoder {
- public static final int SESSION_KEY_COUNT = 9;
- public static final int EXPECTED_MAGIC_ID = 255;
- public static final int VERSION_ID = 289;
- public static final int UPDATE_REQUEST = 15;
- public static final int LOGIN_REQUEST = 14;
- public static final int CONNECT = 16;
- public static final int RECONNECT = 18;
- private static final Random RANDOM_GENERATOR = new Random();
- private static final Logger logger = Logger.getLogger(LoginDecoder.class.getName());
- @SuppressWarnings("unused")
- public static void decode(final Player player) {
- try {
- player.setLoginState(LoginState.DECODE);
- final int[] sessionKeys = new int[SESSION_KEY_COUNT];
- final long serverSessionKey = RANDOM_GENERATOR.nextLong();
- player.forceRead(2);
- final int request = player.getInBuffer().get() & 0xFF;
- if(request != LOGIN_REQUEST && request != UPDATE_REQUEST) {
- log("Wrong requestId: " + request, player);
- return;
- }
- final int nameHash = player.getInBuffer().get() & 0xFF;
- for(int i = 0; i < 8; i++)
- player.getSocket().getOutputStream().write(0);
- player.getSocket().getOutputStream().write(0); // Don't skip RSA checks.
- player.getOutBuffer().putLong(serverSessionKey);
- player.getSocket().getOutputStream().write(player.getOutBuffer().getBuffer(), 0, player.getOutBuffer().getOffset());
- player.forceRead(2);
- final int connectionType = player.getInBuffer().get() & 0xFF;
- if(connectionType != RECONNECT && connectionType != CONNECT) {
- log("Wrong connectionType: " + connectionType, player);
- return;
- }
- final int loginPacketSize = player.getInBuffer().get() & 0xFF;
- player.forceRead(loginPacketSize);
- final int magicId = player.getInBuffer().get() & 0xFF;
- final int versionId = player.getInBuffer().getShort() & 0xFFFF;
- if(magicId != EXPECTED_MAGIC_ID || versionId != VERSION_ID) {
- log("Wrong client version: (" + magicId + ", " + versionId + ")", player);
- return;
- }
- final boolean lowMemory = (player.getInBuffer().get() & 0xFF) == 1;
- player.setMemoryVersion(lowMemory ? MemoryVersion.LOW : MemoryVersion.HIGH);
- for(int i = 0; i < SESSION_KEY_COUNT; i++) {
- sessionKeys[i] = player.getInBuffer().getInt();
- }
- byte[] bytes = player.getInBuffer().getBuffer();
- for(int i = 0; i < 200; i++) {
- System.out.print((bytes[i] & 0xFF) + ",");
- if(i % 20 == 19) {
- System.out.println();
- }
- }
- /*final int RSACheck = player.getInBuffer().get();
- if(RSACheck != loginPacketSize - 41) {
- log("Wrong RSACheck: " + RSACheck, player);
- return;
- }*/
- final int opcode = player.getInBuffer().get() & 0xFF;
- if(opcode != 10) {
- log("Wrong opcode: " + opcode, player);
- return;
- }
- final int[] clientKeys = new int[2];
- final int[] serverKeys = new int[2];
- clientKeys[0] = player.getInBuffer().getInt();
- clientKeys[1] = player.getInBuffer().getInt();
- serverKeys[0] = player.getInBuffer().getInt();
- serverKeys[1] = player.getInBuffer().getInt();
- final int uid = player.getInBuffer().getInt();
- final String username = player.getInBuffer().getRSString();
- final String password = player.getInBuffer().getRSString();
- log(username + " : " + password, player);
- player.getSocket().getOutputStream().write((byte) 2);
- player.getSocket().getOutputStream().write((byte) 0);
- player.getSocket().getOutputStream().write((byte) 0);
- player.setLoginState(LoginState.LOGGED_IN);
- } catch(Exception ex) {
- logger.log(Level.SEVERE, "Error in playerlogin.", ex);
- } finally {
- logger.info("Login procedure done.");
- }
- }
- public static void log(String string, Player player) {
- logger.info("Player " + player.getPlayerId() + ", " + player.getWorldId() + ": " + string);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement