Advertisement
Guest User

Untitled

a guest
Jul 2nd, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.67 KB | None | 0 0
  1. package org.server.net.codec;
  2.  
  3. import java.util.Random;
  4.  
  5. import org.jboss.netty.buffer.ChannelBuffer;
  6. import org.jboss.netty.buffer.ChannelBuffers;
  7. import org.jboss.netty.channel.Channel;
  8. import org.jboss.netty.channel.ChannelHandlerContext;
  9. import org.jboss.netty.handler.codec.serialization.ObjectDecoder;
  10. import org.server.Engine;
  11. import org.server.net.Session;
  12.  
  13. /**
  14.  * Decodes the rs2 login protocol.
  15.  * @author PrimaDude.
  16.  */
  17. public class LoginDecoder extends ObjectDecoder {
  18.  
  19.     private ChannelHandlerContext context;
  20.  
  21.     public ChannelHandlerContext getContext() {
  22.         return context;
  23.     }
  24.  
  25.     public LoginDecoder(ChannelHandlerContext context) {
  26.         this.context = context;
  27.     }
  28.    
  29.     public void setContext(ChannelHandlerContext context) {
  30.         this.context = context;
  31.     }
  32.    
  33.     public static String readRS2String(ChannelBuffer buffer) {
  34.         StringBuffer stringBuffer = new StringBuffer();
  35.         byte b;
  36.         while((b = buffer.readByte()) != 10) {
  37.             stringBuffer.append((char) b);
  38.         }
  39.         return stringBuffer.toString();
  40.     }
  41.  
  42.     @Override
  43.     protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {
  44.         Session session = (Session) getContext().getAttachment();
  45.         Object loginStageObj = session.getAttribute("LOGIN_STAGE");
  46.         int loginStage = 0;
  47.         if (loginStageObj != null) {
  48.             loginStage = (Integer) loginStageObj;
  49.         }
  50.         Engine.print("Session loginStage: [" + loginStage + "]");
  51.         switch (loginStage) {
  52.             case 0:
  53.                 if (buffer.readableBytes() >= 2) {
  54.                     int loginId = buffer.readByte() & 0xFF;
  55.                     if (loginId != 14) {
  56.                         Engine.print("Invalid login id: " + loginId);
  57.                         return false;
  58.                     }
  59.                     @SuppressWarnings("unused")
  60.                     int namePart = buffer.readByte() & 0xFF;
  61.  
  62.                     long sessionKey = new Random().nextLong();
  63.                     ChannelBuffer out = ChannelBuffers.dynamicBuffer();
  64.                     for (int i = 0; i < 9; i++) {
  65.                         out.writeByte(0);
  66.                     }
  67.                     out.writeLong(sessionKey);
  68.                     channel.write(out);
  69.                     session.putAttribute("LOGIN_STAGE", 1);
  70.                 }
  71.                 return false;
  72.             case 1:
  73.                 int loginType = -1,
  74.                 loginPacketSize = -1;
  75.                 if (buffer.readableBytes() >= 2) {
  76.                     loginType = buffer.readByte() & 0xff;
  77.                     loginPacketSize = buffer.readByte() & 0xff;
  78.                     if (loginType != 16 && loginType != 18) {
  79.                         Engine.print("Invalid login type: " + loginType);
  80.                         return false;
  81.                     }
  82.                 } else {
  83.                     buffer.resetReaderIndex();
  84.                     return false;
  85.                 }
  86.                 if (buffer.readableBytes() >= loginPacketSize) {
  87.                     if (buffer.readUnsignedByte() != 255) {
  88.                         return false;
  89.                     }
  90.                     short revision = buffer.readShort();
  91.                     if (revision != 317) {
  92.                         Engine.print("Invalid client revision: " + revision);
  93.                         return false;
  94.                     }
  95.                     @SuppressWarnings("unused")
  96.                     int memoryVersionType = buffer.readByte();
  97.                     for (int i = 0; i < 9; i ++) {
  98.                         buffer.readInt();
  99.                     }
  100.                     @SuppressWarnings("unused")
  101.                     int encryptedPacketSize = buffer.readByte();
  102.                     @SuppressWarnings("unused")
  103.                     int encryptedPacketId = buffer.readByte();
  104.                    
  105.                     long clientSessionKey = buffer.readLong();
  106.                     long serverSessionKey = buffer.readLong();
  107.                     if (clientSessionKey != serverSessionKey) {
  108.                         Engine.print("Invalid server or client session key: Server["
  109.                                 + serverSessionKey +"], Client["+ clientSessionKey +"]");
  110.                         return false;
  111.                     }
  112.                     @SuppressWarnings("unused")
  113.                     int uid = buffer.readInt();
  114.                     String username = readRS2String(buffer);
  115.                     String password = readRS2String(buffer);
  116.                     Engine.print("Player login: Username["+ username +"], Password["+ password +"].");
  117.                 } else {
  118.                     buffer.resetReaderIndex();
  119.                     return false;
  120.                 }
  121.         }
  122.         return this;
  123.     }
  124.  
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement