Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package org.server.net.codec;
- import java.util.Random;
- import org.jboss.netty.buffer.ChannelBuffer;
- import org.jboss.netty.buffer.ChannelBuffers;
- import org.jboss.netty.channel.Channel;
- import org.jboss.netty.channel.ChannelHandlerContext;
- import org.jboss.netty.handler.codec.serialization.ObjectDecoder;
- import org.server.Engine;
- import org.server.net.Session;
- /**
- * Decodes the rs2 login protocol.
- * @author PrimaDude.
- */
- public class LoginDecoder extends ObjectDecoder {
- private ChannelHandlerContext context;
- public ChannelHandlerContext getContext() {
- return context;
- }
- public LoginDecoder(ChannelHandlerContext context) {
- this.context = context;
- }
- public void setContext(ChannelHandlerContext context) {
- this.context = context;
- }
- public static String readRS2String(ChannelBuffer buffer) {
- StringBuffer stringBuffer = new StringBuffer();
- byte b;
- while((b = buffer.readByte()) != 10) {
- stringBuffer.append((char) b);
- }
- return stringBuffer.toString();
- }
- @Override
- protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {
- Session session = (Session) getContext().getAttachment();
- Object loginStageObj = session.getAttribute("LOGIN_STAGE");
- int loginStage = 0;
- if (loginStageObj != null) {
- loginStage = (Integer) loginStageObj;
- }
- Engine.print("Session loginStage: [" + loginStage + "]");
- switch (loginStage) {
- case 0:
- if (buffer.readableBytes() >= 2) {
- int loginId = buffer.readByte() & 0xFF;
- if (loginId != 14) {
- Engine.print("Invalid login id: " + loginId);
- return false;
- }
- @SuppressWarnings("unused")
- int namePart = buffer.readByte() & 0xFF;
- long sessionKey = new Random().nextLong();
- ChannelBuffer out = ChannelBuffers.dynamicBuffer();
- for (int i = 0; i < 9; i++) {
- out.writeByte(0);
- }
- out.writeLong(sessionKey);
- channel.write(out);
- session.putAttribute("LOGIN_STAGE", 1);
- }
- return false;
- case 1:
- int loginType = -1,
- loginPacketSize = -1;
- if (buffer.readableBytes() >= 2) {
- loginType = buffer.readByte() & 0xff;
- loginPacketSize = buffer.readByte() & 0xff;
- if (loginType != 16 && loginType != 18) {
- Engine.print("Invalid login type: " + loginType);
- return false;
- }
- } else {
- buffer.resetReaderIndex();
- return false;
- }
- if (buffer.readableBytes() >= loginPacketSize) {
- if (buffer.readUnsignedByte() != 255) {
- return false;
- }
- short revision = buffer.readShort();
- if (revision != 317) {
- Engine.print("Invalid client revision: " + revision);
- return false;
- }
- @SuppressWarnings("unused")
- int memoryVersionType = buffer.readByte();
- for (int i = 0; i < 9; i ++) {
- buffer.readInt();
- }
- @SuppressWarnings("unused")
- int encryptedPacketSize = buffer.readByte();
- @SuppressWarnings("unused")
- int encryptedPacketId = buffer.readByte();
- long clientSessionKey = buffer.readLong();
- long serverSessionKey = buffer.readLong();
- if (clientSessionKey != serverSessionKey) {
- Engine.print("Invalid server or client session key: Server["
- + serverSessionKey +"], Client["+ clientSessionKey +"]");
- return false;
- }
- @SuppressWarnings("unused")
- int uid = buffer.readInt();
- String username = readRS2String(buffer);
- String password = readRS2String(buffer);
- Engine.print("Player login: Username["+ username +"], Password["+ password +"].");
- } else {
- buffer.resetReaderIndex();
- return false;
- }
- }
- return this;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement