1
0
mirror of https://github.com/Rogiel/l2jserver2 synced 2025-12-09 17:02:53 +00:00

Change-Id: If18611eb0a6296da808aead8f1da54be094db2a9

This commit is contained in:
rogiel
2011-04-29 20:17:45 -03:00
parent 43403d9a1e
commit 0662150229
48 changed files with 612 additions and 513 deletions

View File

@@ -4,6 +4,8 @@ import static org.jboss.netty.channel.Channels.pipeline;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.handler.logging.LoggingHandler;
import org.jboss.netty.logging.InternalLogLevel;
import com.google.inject.Inject;
import com.google.inject.Injector;
@@ -28,20 +30,22 @@ public class Lineage2PipelineFactory implements ChannelPipelineFactory {
public ChannelPipeline getPipeline() throws Exception {
final ChannelPipeline pipeline = pipeline();
pipeline.addLast("header.encoder", new Lineage2Encoder());
pipeline.addLast("header.decoder", new Lineage2Decoder());
pipeline.addLast(Lineage2Encrypter.HANDLER_NAME,
new Lineage2Encrypter());
pipeline.addLast(Lineage2Decrypter.HANDLER_NAME,
new Lineage2Decrypter());
pipeline.addLast("header.encoder", new Lineage2Encoder());
pipeline.addLast("header.decoder", new Lineage2Decoder());
pipeline.addLast("packet.writer", new Lineage2PacketWriter());
pipeline.addLast("packet.reader", new Lineage2PacketReader(injector,
injector.getInstance(LoggingService.class)));
pipeline.addLast("packet.handler", new Lineage2PacketHandler());
pipeline.addLast("logger", new LoggingHandler(InternalLogLevel.WARN));
return pipeline;
}
}

View File

@@ -1,29 +1,39 @@
package com.l2jserver.game.net.codec;
import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder;
import java.nio.ByteOrder;
public class Lineage2Decoder extends LengthFieldBasedFrameDecoder {
// private static final int HEADER_SIZE = 2;
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.frame.FrameDecoder;
public Lineage2Decoder() {
super(16 * 1024, 0, 2);
public class Lineage2Decoder extends FrameDecoder {
private static final int HEADER_SIZE = 2;
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel,
ChannelBuffer oldBuffer) throws Exception {
if (oldBuffer.readableBytes() < 2)
return null;
ChannelBuffer buffer = ChannelBuffers.wrappedBuffer(oldBuffer
.toByteBuffer().order(ByteOrder.LITTLE_ENDIAN));
buffer.markReaderIndex();
final int pending = buffer.readUnsignedShort() - HEADER_SIZE;
System.out.println(ChannelBuffers.hexDump(buffer));
if (pending == 0) {
return null;
}
if (buffer.readableBytes() < pending) {
buffer.resetReaderIndex();
return null;
}
final ChannelBuffer b = buffer.copy(buffer.readerIndex(), pending);
oldBuffer.skipBytes(pending + HEADER_SIZE);
return ChannelBuffers.wrappedBuffer(b.toByteBuffer().order(
ByteOrder.LITTLE_ENDIAN));
}
// @Override
// protected Object decode(ChannelHandlerContext ctx, Channel channel,
// ChannelBuffer buffer) throws Exception {
// if (buffer.readableBytes() < 2)
// return null;
// buffer.markReaderIndex();
// final int pending = buffer.readUnsignedShort() - HEADER_SIZE;
// if(pending == 0)
// return null;
//
// if (buffer.readableBytes() < pending) {
// buffer.resetReaderIndex();
// return null;
// }
//
// return buffer.slice(buffer.readableBytes(), pending);
// }
}

View File

@@ -5,9 +5,11 @@ import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.oneone.OneToOneDecoder;
import com.l2jserver.util.BlowFishKeygen;
public class Lineage2Decrypter extends OneToOneDecoder {
public static final String HANDLER_NAME = "crypto.decoder";
private boolean enabled = false;
private final byte[] key = new byte[16];
@@ -19,12 +21,14 @@ public class Lineage2Decrypter extends OneToOneDecoder {
if (!enabled)
return msg;
final ChannelBuffer buffer = (ChannelBuffer) msg;
System.out.println("Decrypting...");
final int offset = buffer.readerIndex();
final int size = buffer.readableBytes();
int temp = 0;
for (int i = 0; i < size; i++) {
int temp2 = buffer.getUnsignedByte(offset + i);
int temp2 = buffer.getUnsignedByte(offset + i) & 0xFF;
buffer.setByte(offset + i, (byte) (temp2 ^ key[i & 15] ^ temp));
temp = temp2;
}
@@ -41,7 +45,14 @@ public class Lineage2Decrypter extends OneToOneDecoder {
key[10] = (byte) (old >> 0x10 & 0xff);
key[11] = (byte) (old >> 0x18 & 0xff);
return msg;
return buffer;
}
public byte[] enable() {
byte[] key = BlowFishKeygen.getRandomKey();
this.setKey(key);
this.setEnabled(true);
return key;
}
public void setKey(byte[] key) {

View File

@@ -1,9 +1,18 @@
package com.l2jserver.game.net.codec;
import org.jboss.netty.handler.codec.frame.LengthFieldPrepender;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
public class Lineage2Encoder extends LengthFieldPrepender {
public Lineage2Encoder() {
super(2);
public class Lineage2Encoder extends OneToOneEncoder {
@Override
protected Object encode(ChannelHandlerContext ctx, Channel channel,
Object msg) throws Exception {
if (!(msg instanceof ChannelBuffer))
return msg;
final ChannelBuffer buffer = (ChannelBuffer) msg;
buffer.setShort(0, buffer.readableBytes() - 2);
return buffer;
}
}

View File

@@ -1,10 +1,14 @@
package com.l2jserver.game.net.codec;
import java.util.Arrays;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
import com.l2jserver.util.BlowFishKeygen;
public class Lineage2Encrypter extends OneToOneEncoder {
public static final String HANDLER_NAME = "crypto.encoder";
@@ -16,7 +20,11 @@ public class Lineage2Encrypter extends OneToOneEncoder {
Object msg) throws Exception {
if (!(msg instanceof ChannelBuffer))
return msg;
if (!enabled)
return msg;
final ChannelBuffer buffer = (ChannelBuffer) msg;
System.out.println("Encrypting...");
final int offset = buffer.readerIndex();
final int size = buffer.readableBytes();
@@ -41,6 +49,11 @@ public class Lineage2Encrypter extends OneToOneEncoder {
return msg;
}
public void enable(byte[] key) {
this.setKey(key);
this.setEnabled(true);
}
public void setKey(byte[] key) {
for (int i = 0; i < 16; i++) {

View File

@@ -44,10 +44,8 @@ public class Lineage2PacketReader extends OneToOneDecoder {
switch (opcode) {
case ProtocolVersionPacket.OPCODE:
return ProtocolVersionPacket.class;
case 0x2b:
return null;
default:
logger.info("Unknown opcode: " + opcode);
logger.info("Unknown opcode: " + Integer.toHexString(opcode));
break;
}
return null;

View File

@@ -1,5 +1,7 @@
package com.l2jserver.game.net.codec;
import java.nio.ByteOrder;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
@@ -14,9 +16,12 @@ public class Lineage2PacketWriter extends OneToOneEncoder {
Object msg) throws Exception {
if (!(msg instanceof ServerPacket))
return msg;
final ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
final ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(
ByteOrder.LITTLE_ENDIAN, 10);
final ServerPacket packet = (ServerPacket) msg;
packet.write(buffer);
buffer.writeShort(0x0000);
buffer.writeByte(packet.getOpcode()); // packet opcode
packet.write(buffer);
return buffer;
}
}

View File

@@ -15,6 +15,9 @@ public class Lineage2PacketHandler extends SimpleChannelHandler {
public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e)
throws Exception {
connection = new Lineage2Connection(e.getChannel());
System.out.println(e);
super.channelOpen(ctx, e);
}
@@ -25,7 +28,7 @@ public class Lineage2PacketHandler extends SimpleChannelHandler {
if (!(msg instanceof ClientPacket))
return;
final ClientPacket packet = (ClientPacket) msg;
packet.process(connection, null);
packet.process(connection);
super.messageReceived(ctx, e);
}

View File

@@ -2,7 +2,6 @@ package com.l2jserver.game.net.packet;
import org.jboss.netty.buffer.ChannelBuffer;
import com.google.inject.Injector;
import com.l2jserver.game.net.Lineage2Connection;
public interface ClientPacket extends Packet {
@@ -17,8 +16,8 @@ public interface ClientPacket extends Packet {
/**
* Process the packet
*
* @param injector
* the injector
* @param conn
* The active Lineage2Connection
*/
void process(Lineage2Connection conn, Injector injector);
void process(Lineage2Connection conn);
}

View File

@@ -1,11 +1,13 @@
package com.l2jserver.game.net.packet.client;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelFutureListener;
import com.google.inject.Injector;
import com.l2jserver.L2JConstants;
import com.l2jserver.game.net.Lineage2Connection;
import com.l2jserver.game.net.packet.AbstractClientPacket;
import com.l2jserver.game.net.packet.server.KeyPacket;
import com.l2jserver.service.logging.Logger;
import com.l2jserver.service.logging.guice.InjectLogger;
@@ -17,29 +19,48 @@ public class ProtocolVersionPacket extends AbstractClientPacket {
private final Logger logger = null;
// packet
private int version;
private long version;
@Override
public void read(ChannelBuffer buffer) {
this.version = buffer.readInt();
this.version = buffer.readUnsignedInt();
}
@Override
public void process(Lineage2Connection conn, Injector injector) {
public void process(final Lineage2Connection conn) {
// generate a new key
final byte[] key = conn.getDecrypter().enable();
if (L2JConstants.SUPPORTED_PROTOCOL != version) {
logger.info(
"Incorrect protocol version: {0}. Only {1} is supported.",
version, L2JConstants.SUPPORTED_PROTOCOL);
conn.close();
// notify wrong protocol and close connection
conn.write(new KeyPacket(key, false)).addListener(
new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future)
throws Exception {
// close connection
conn.close();
}
});
return;
}
// activate encrypter once packet has been sent.
conn.write(new KeyPacket(key, true)).addListener(
new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future)
throws Exception {
// enable encrypter
conn.getEncrypter().setKey(key);
conn.getEncrypter().setEnabled(true);
}
});
}
public int getVersion() {
public long getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
}

View File

@@ -1,18 +0,0 @@
package com.l2jserver.game.net.packet.server;
import org.jboss.netty.buffer.ChannelBuffer;
import com.l2jserver.game.net.packet.AbstractServerPacket;
public class TestPacket extends AbstractServerPacket {
public static final int OPCODE = 0x00;
@Override
public void write(ChannelBuffer buffer) {
}
public TestPacket() {
super(OPCODE);
}
}