Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package ps.eden.server.net.event;
- import java.nio.ByteBuffer;
- import ps.eden.server.cache.Cache;
- import ps.eden.server.cache.crypto.ISAACCipher;
- import ps.eden.server.cache.misc.buffer.ByteBufferUtils;
- import ps.eden.server.engine.GameEngine;
- import ps.eden.server.engine.login.LoginEvent;
- import ps.eden.server.engine.login.LoginResponse;
- import ps.eden.server.game.node.entity.player.info.ClientInfo;
- import ps.eden.server.game.node.entity.player.info.UIDInfo;
- import ps.eden.server.game.system.registry.AccountRegister;
- import ps.eden.server.net.Constants;
- import ps.eden.server.net.IoEventHandler;
- import ps.eden.server.net.IoSession;
- import ps.eden.server.tools.StringUtils;
- /**
- * Handles login event codec.
- * @author Emperor
- *
- */
- public final class LoginEventHandler implements IoEventHandler {
- /**
- * The default login opcode.
- */
- private static final int DEFAULT_LOGIN = 16;
- /**
- * The reconnect login opcode.
- */
- private static final int RECONNECT_LOGIN = 18;
- @Override
- public void read(IoSession session, ByteBuffer buffer) {
- int opcode = buffer.get() & 0xFF;
- int length = buffer.getShort() & 0xFFFF;
- //System.out.println(opcode + ", " + length);
- if (length != buffer.remaining()) {
- session.write(LoginResponse.BAD_SESSION_ID);
- return;
- }
- if (buffer.getInt() != Constants.REVISION) {
- session.write(LoginResponse.UPDATED);
- return;
- }
- /*if (buffer.getLong() != 3847247243492844L) {
- session.write(LoginResponse.UPDATED);
- return;
- }*/
- String ip = session.getAddress();
- int connections = AccountRegister.ipToConnections.getOrDefault(ip, 0);
- if (connections >= 10) {
- session.write(LoginResponse.LOGIN_LIMIT_EXCEEDED);
- return;
- }
- AccountRegister.ipToConnections.put(ip, connections + 1);
- switch (opcode) {
- case DEFAULT_LOGIN:
- decodeLogin(session, buffer, false);
- break;
- case RECONNECT_LOGIN:
- decodeLogin(session, buffer, true);
- break;
- default:
- System.out.println("Invalid login opcode " + opcode + "!");
- session.write(LoginResponse.BAD_SESSION_ID);
- }
- }
- /**
- * Decodes the login request.
- * @param session The session.
- * @param buffer The buffer containing the request data.
- * @param reconnect If this is a reconnect login request.
- */
- private void decodeLogin(IoSession session, ByteBuffer buffer, boolean reconnect) {
- //System.out.println("Decode login attempt (reconnect=" + reconnect + ") " + session.getAddress());
- buffer.get(); // Memory?
- buffer.get();// no advertisement = 1
- buffer.get();// 1
- int windowMode = buffer.get();// Screen size mode
- int screenWidth = buffer.getShort(); // Screen size Width
- int screenHeight = buffer.getShort(); // Screen size Height
- int displayMode = buffer.get(); // Display mode
- byte[] data = new byte[24]; // random.dat data.
- buffer.get(data);
- String something = ByteBufferUtils.getString(buffer);
- int affiliate = buffer.getInt();// Affiliate id
- buffer.getInt(); // Hash containing a bunch of settings
- short interfacePacketCounter = buffer.getShort();//Current interface packet counter.
- //System.out.println(Cache.getIndexes().length + " total indexes");
- for (int i = 0; i < 29/*Cache.getIndexes().length*/; i++) {
- int crc = Cache.getIndexes()[i] == null ? 0
- : Cache.getIndexes()[i].getInformation().getInformationContainer().getCrc();
- if (crc != buffer.getInt() && crc != 0) {
- session.write(LoginResponse.UPDATED);
- return;
- //continue;
- }
- }
- buffer = ByteBufferUtils.getRSABlock(buffer);
- int[] seed = ByteBufferUtils.getISAACSeed(buffer);
- session.setCipherIn(new ISAACCipher(seed));
- for (int i = 0; i < seed.length; i++) {
- seed[i] += 50;
- }
- session.setCipherOut(new ISAACCipher(seed));
- String username = StringUtils.longToString(buffer.getLong());
- String lowered = username.toLowerCase();
- if (lowered.contains("kratos") || lowered.contains("krat0s") || lowered.contains("kr4t0s")) {
- System.err.println(session.getAddress() + " is a Kratos skiddy");
- session.write(LoginResponse.BAD_SESSION_ID);
- return;
- }
- if (affiliate != 38472812) {
- System.err.println(session.getAddress() + " is a Kratos skiddy");
- session.write(LoginResponse.UPDATED);
- return;
- }
- String password = ByteBufferUtils.getString(buffer);
- byte b = buffer.get();
- if (b != 4) {
- System.err.println(session.getAddress() + " is using an old client :)");
- session.write(LoginResponse.BAD_SESSION_ID);
- return;
- }
- /* if (!"stopsnoopingkid".equals(something)) {
- session.write(LoginResponse.UPDATED);
- return;
- }*/
- if (interfacePacketCounter != 23300) {
- System.err.println(session.getAddress() + " is a Kratos skiddy");
- session.write(LoginResponse.UPDATED);
- return;
- }
- UIDInfo info = new UIDInfo(session.getAddress(), ByteBufferUtils.getString(buffer),
- ByteBufferUtils.getString(buffer), ByteBufferUtils.getString(buffer));
- LoginEvent event = new LoginEvent(session, username, password, info);
- event.setReconnect(reconnect);
- event.setDisplayInfo(new ClientInfo(displayMode, windowMode, screenWidth, screenHeight));
- GameEngine.getLoginSchedule().schedule(event);
- }
- @Override
- public void write(IoSession session, Object... args) {
- if (args[0] instanceof LoginResponse) {
- LoginResponse response = (LoginResponse) args[0];
- ByteBuffer buffer = ByteBuffer.allocate(1);
- int opcode = response.opcode();
- buffer.put((byte) opcode);
- if (opcode == LoginResponse.MOVING_WORLD.opcode()) {
- buffer = ByteBuffer.allocate(2);
- buffer.put((byte) opcode);
- buffer.put((byte) 20);
- }
- session.write(buffer);
- } else {
- System.err.println("LoginEventHandler: " + args[0] + ", "
- + (session == null ? "null" : session.getRemoteAddress()));
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement