1
0
mirror of https://github.com/Rogiel/l2jserver2 synced 2025-12-06 07:32:46 +00:00

Fixed cryptography issue preventing connection to the game

Signed-off-by: Rogiel <rogiel@rogiel.com>
This commit is contained in:
2011-05-17 23:03:47 -03:00
parent 8b5a601ea4
commit 230e28a775
18 changed files with 44 additions and 43 deletions

View File

@@ -29,7 +29,7 @@ import com.l2jserver.db.dao.mysql5.MySQL5ItemDAO;
* *
* @author <a href="http://www.rogiel.com">Rogiel</a> * @author <a href="http://www.rogiel.com">Rogiel</a>
*/ */
public class DAOModuleMySQL5 extends AbstractModule { public class MySQL5DAOModule extends AbstractModule {
@Override @Override
protected void configure() { protected void configure() {
bind(CharacterDAO.class).to(MySQL5CharacterDAO.class).in( bind(CharacterDAO.class).to(MySQL5CharacterDAO.class).in(

View File

@@ -18,7 +18,7 @@ package com.l2jserver;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;
import com.google.inject.Module; import com.google.inject.Module;
import com.l2jserver.db.dao.DAOModuleMySQL5; import com.l2jserver.db.dao.MySQL5DAOModule;
import com.l2jserver.model.id.factory.IDFactoryModule; import com.l2jserver.model.id.factory.IDFactoryModule;
import com.l2jserver.service.ServiceModule; import com.l2jserver.service.ServiceModule;
@@ -32,6 +32,6 @@ public class GameServerModule extends AbstractModule {
protected void configure() { protected void configure() {
install(new ServiceModule()); install(new ServiceModule());
install(new IDFactoryModule()); install(new IDFactoryModule());
install(new DAOModuleMySQL5()); install(new MySQL5DAOModule());
} }
} }

View File

@@ -16,6 +16,8 @@
*/ */
package com.l2jserver.game.net; package com.l2jserver.game.net;
import java.util.Arrays;
/** /**
* Manages the cryptography key used to write/read packets. This class also * Manages the cryptography key used to write/read packets. This class also
* updates the key once data has been sent/received. * updates the key once data has been sent/received.
@@ -77,6 +79,6 @@ public class Lineage2CryptographyKey {
} }
public Lineage2CryptographyKey copy() { public Lineage2CryptographyKey copy() {
return new Lineage2CryptographyKey(key); return new Lineage2CryptographyKey(Arrays.copyOf(key, key.length));
} }
} }

View File

@@ -54,12 +54,12 @@ public class Lineage2Encrypter extends OneToOneEncoder {
final int offset = buffer.readerIndex() + 2; // skip header final int offset = buffer.readerIndex() + 2; // skip header
final int size = buffer.readableBytes() - 2; final int size = buffer.readableBytes() - 2;
int temp = 0; int temp = 0, temp2 = 0;
synchronized (key) { synchronized (key) {
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
int temp2 = buffer.getByte(offset + i) & 0xFF; temp2 = buffer.getByte(offset + i) & 0xFF;
buffer.setByte(offset + i, (byte) (temp2 ^ key.get(i) ^ temp)); temp = temp2 ^ key.get(i) ^ temp;
temp = temp2; buffer.setByte(offset + i, (byte) temp);
} }
key.update(size); key.update(size);
} }

View File

@@ -61,10 +61,10 @@ public class Lineage2PacketWriter extends OneToOneEncoder {
final ChannelBuffer buffer = ChannelBuffers.dynamicBuffer( final ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(
ByteOrder.LITTLE_ENDIAN, 10); ByteOrder.LITTLE_ENDIAN, 10);
final ServerPacket packet = (ServerPacket) msg; final ServerPacket packet = (ServerPacket) msg;
buffer.writeShort(0x0000); buffer.writeShort(0);
buffer.writeByte(packet.getOpcode()); // packet opcode buffer.writeByte(packet.getOpcode()); // packet opcode
packet.write(null, buffer); packet.write(connection, buffer);
log.debug("Writing message {}", ChannelBuffers.hexDump(buffer)); log.debug("Writing message {}", ChannelBuffers.hexDump(buffer));
return buffer; return buffer;

View File

@@ -25,7 +25,7 @@ import com.l2jserver.db.dao.CharacterDAO;
import com.l2jserver.game.net.Lineage2Connection; import com.l2jserver.game.net.Lineage2Connection;
import com.l2jserver.game.net.Lineage2Session; import com.l2jserver.game.net.Lineage2Session;
import com.l2jserver.game.net.packet.AbstractClientPacket; import com.l2jserver.game.net.packet.AbstractClientPacket;
import com.l2jserver.game.net.packet.server.CharacterEnterWorldPacket; import com.l2jserver.game.net.packet.server.CharacterSelectionListPacket;
import com.l2jserver.model.id.AccountID; import com.l2jserver.model.id.AccountID;
import com.l2jserver.model.id.factory.AccountIDFactory; import com.l2jserver.model.id.factory.AccountIDFactory;
import com.l2jserver.model.world.L2Character; import com.l2jserver.model.world.L2Character;
@@ -86,10 +86,10 @@ public class AuthLoginPacket extends AbstractClientPacket {
loginKey1, loginKey2)); loginKey1, loginKey2));
final List<L2Character> chars = characterDao.selectByAccount(accountId); final List<L2Character> chars = characterDao.selectByAccount(accountId);
// conn.write(CharacterSelectionListPacket.fromL2Session( conn.write(CharacterSelectionListPacket.fromL2Session(
// conn.getSession(), chars.toArray(new L2Character[0]))); conn.getSession(), chars.get(0)));
conn.setCharacterID(chars.get(0).getID()); // conn.setCharacterID(chars.get(0).getID());
conn.write(new CharacterEnterWorldPacket(chars.get(0), playKey1)); // conn.write(new CharacterEnterWorldPacket(chars.get(0), playKey1));
} }
/** /**

View File

@@ -48,7 +48,6 @@ import com.l2jserver.game.net.Lineage2Session;
import com.l2jserver.game.net.packet.AbstractServerPacket; import com.l2jserver.game.net.packet.AbstractServerPacket;
import com.l2jserver.model.world.Item; import com.l2jserver.model.world.Item;
import com.l2jserver.model.world.L2Character; import com.l2jserver.model.world.L2Character;
import com.l2jserver.model.world.actor.ActorExperience;
import com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll; import com.l2jserver.model.world.character.CharacterInventory.InventoryPaperdoll;
import com.l2jserver.util.BufferUtils; import com.l2jserver.util.BufferUtils;
@@ -100,7 +99,7 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
// Can prevent players from creating new characters (if 0); // Can prevent players from creating new characters (if 0);
// if 1 the client will ask if chars may be created // if 1 the client will ask if chars may be created
// (RequestCharacterTemplatesPacket) Response: (CharacterTemplatePacket) // (RequestCharacterTemplatesPacket) Response: (CharacterTemplatePacket)
buffer.writeInt(0x07); // max chars buffer.writeInt(7); // max chars
buffer.writeByte(0x00); buffer.writeByte(0x00);
// int i = 0; // int i = 0;
@@ -116,7 +115,7 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
// } // }
buffer.writeInt(0x00); // ?? buffer.writeInt(0x00); // ??
buffer.writeInt(0x01); // sex buffer.writeInt(character.getSex().option); // sex
buffer.writeInt(character.getRace().id); // race buffer.writeInt(character.getRace().id); // race
// if (character.getClassId() == character.getBaseClassId()) // if (character.getClassId() == character.getBaseClassId())
@@ -125,7 +124,7 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
// else // else
// buffer.writeInt(character.getBaseClassId()); // buffer.writeInt(character.getBaseClassId());
buffer.writeInt(0x01); // active ?? buffer.writeInt(1); // active ??
buffer.writeInt(-71338); // x buffer.writeInt(-71338); // x
buffer.writeInt(258271); // y buffer.writeInt(258271); // y
@@ -134,9 +133,9 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
buffer.writeDouble(20); // hp cur buffer.writeDouble(20); // hp cur
buffer.writeDouble(20); // mp cur buffer.writeDouble(20); // mp cur
buffer.writeInt(0x00); // sp buffer.writeInt(320); // sp
buffer.writeLong(ActorExperience.LEVEL_1.experience); // exp buffer.writeLong(4640); // exp
buffer.writeInt(ActorExperience.LEVEL_1.level); // level buffer.writeInt(5); // level
buffer.writeInt(0x00); // karma buffer.writeInt(0x00); // karma
buffer.writeInt(0x00); // pk buffer.writeInt(0x00); // pk
@@ -181,10 +180,10 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
// hair style // hair style
// buffer.writeInt(character.getAppearance().getHairStyle().option); // buffer.writeInt(character.getAppearance().getHairStyle().option);
buffer.writeInt(0x02); buffer.writeInt(0x00);
// hair color // hair color
// buffer.writeInt(character.getAppearance().getHairColor().option); // buffer.writeInt(character.getAppearance().getHairColor().option);
buffer.writeInt(0x03); buffer.writeInt(0x00);
// face // face
// buffer.writeInt(character.getAppearance().getFace().option); // buffer.writeInt(character.getAppearance().getFace().option);
buffer.writeInt(0x00); buffer.writeInt(0x00);
@@ -194,7 +193,7 @@ public class CharacterSelectionListPacket extends AbstractServerPacket {
buffer.writeInt(0x0); // seconds left before delete buffer.writeInt(0x0); // seconds left before delete
buffer.writeInt(character.getCharacterClass().id); // class buffer.writeInt(character.getCharacterClass().id); // class
buffer.writeInt(0x01); // c3 auto-select char buffer.writeInt(1); // c3 auto-select char
buffer.writeByte(0x00); // enchant effect buffer.writeByte(0x00); // enchant effect

View File

@@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>. * along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/ */
package com.l2jserver.model.world.actor; package com.l2jserver.model.world.actor.event;
import com.l2jserver.model.world.capability.Actor; import com.l2jserver.model.world.capability.Actor;
import com.l2jserver.service.game.world.event.WorldEvent; import com.l2jserver.service.game.world.event.WorldEvent;

View File

@@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with l2jserver. If not, see <http://www.gnu.org/licenses/>. * along with l2jserver. If not, see <http://www.gnu.org/licenses/>.
*/ */
package com.l2jserver.model.world.actor; package com.l2jserver.model.world.actor.event;
import com.l2jserver.model.world.capability.Actor; import com.l2jserver.model.world.capability.Actor;
import com.l2jserver.service.game.world.event.WorldListener; import com.l2jserver.service.game.world.event.WorldListener;

View File

@@ -19,9 +19,9 @@ package com.l2jserver.model.world.capability;
import com.l2jserver.model.id.object.ActorID; import com.l2jserver.model.id.object.ActorID;
import com.l2jserver.model.world.AbstractObject; import com.l2jserver.model.world.AbstractObject;
import com.l2jserver.model.world.actor.ActorEffects; import com.l2jserver.model.world.actor.ActorEffects;
import com.l2jserver.model.world.actor.ActorEvent;
import com.l2jserver.model.world.actor.ActorListener;
import com.l2jserver.model.world.actor.ActorSkillContainer; import com.l2jserver.model.world.actor.ActorSkillContainer;
import com.l2jserver.model.world.actor.event.ActorEvent;
import com.l2jserver.model.world.actor.event.ActorListener;
/** /**
* Defines an {@link AbstractObject} that defines an Actor (NPC, player, pet, * Defines an {@link AbstractObject} that defines an Actor (NPC, player, pet,

View File

@@ -17,7 +17,7 @@
package com.l2jserver.model.world.player.event; package com.l2jserver.model.world.player.event;
import com.l2jserver.model.world.Player; import com.l2jserver.model.world.Player;
import com.l2jserver.model.world.actor.ActorEvent; import com.l2jserver.model.world.actor.event.ActorEvent;
/** /**
* Base event for {@link Player} objects * Base event for {@link Player} objects

View File

@@ -16,8 +16,8 @@
*/ */
package com.l2jserver.model.world.player.event; package com.l2jserver.model.world.player.event;
import com.l2jserver.model.world.actor.ActorEvent; import com.l2jserver.model.world.actor.event.ActorEvent;
import com.l2jserver.model.world.actor.ActorListener; import com.l2jserver.model.world.actor.event.ActorListener;
import com.l2jserver.service.game.world.event.WorldEvent; import com.l2jserver.service.game.world.event.WorldEvent;
import com.l2jserver.service.game.world.event.WorldListener; import com.l2jserver.service.game.world.event.WorldListener;

View File

@@ -24,5 +24,5 @@ import com.l2jserver.service.Service;
* @author <a href="http://www.rogiel.com">Rogiel</a> * @author <a href="http://www.rogiel.com">Rogiel</a>
*/ */
public interface GMService extends Service { public interface GMService extends Service {
} }

View File

@@ -58,6 +58,6 @@ public class BufferUtils {
buffer.writeChar(str.charAt(i)); buffer.writeChar(str.charAt(i));
} }
} }
buffer.writeChar('\000'); buffer.writeShort(0);
} }
} }

View File

@@ -23,7 +23,7 @@ import org.junit.Test;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Injector; import com.google.inject.Injector;
import com.l2jserver.db.dao.DAOModuleMySQL5; import com.l2jserver.db.dao.MySQL5DAOModule;
import com.l2jserver.model.id.ID; import com.l2jserver.model.id.ID;
import com.l2jserver.model.id.object.CharacterID; import com.l2jserver.model.id.object.CharacterID;
import com.l2jserver.model.id.object.factory.CharacterIDFactory; import com.l2jserver.model.id.object.factory.CharacterIDFactory;
@@ -36,7 +36,7 @@ import com.l2jserver.service.game.template.TemplateService;
public class IDFactoryTest { public class IDFactoryTest {
private final Injector injector = Guice.createInjector(new ServiceModule(), private final Injector injector = Guice.createInjector(new ServiceModule(),
new DAOModuleMySQL5(), new IDFactoryModule()); new MySQL5DAOModule(), new IDFactoryModule());
private final CharacterIDFactory charIdFactory = injector private final CharacterIDFactory charIdFactory = injector
.getInstance(CharacterIDFactory.class); .getInstance(CharacterIDFactory.class);

View File

@@ -24,7 +24,7 @@ import org.junit.Test;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Injector; import com.google.inject.Injector;
import com.l2jserver.db.dao.CharacterFriendDAO; import com.l2jserver.db.dao.CharacterFriendDAO;
import com.l2jserver.db.dao.DAOModuleMySQL5; import com.l2jserver.db.dao.MySQL5DAOModule;
import com.l2jserver.model.id.factory.IDFactoryModule; import com.l2jserver.model.id.factory.IDFactoryModule;
import com.l2jserver.model.id.object.CharacterID; import com.l2jserver.model.id.object.CharacterID;
import com.l2jserver.model.id.object.factory.CharacterIDFactory; import com.l2jserver.model.id.object.factory.CharacterIDFactory;
@@ -37,7 +37,7 @@ import com.l2jserver.service.game.template.TemplateService;
public class CharacterFriendListTest { public class CharacterFriendListTest {
private final Injector injector = Guice.createInjector(new ServiceModule(), private final Injector injector = Guice.createInjector(new ServiceModule(),
new DAOModuleMySQL5(), new IDFactoryModule()); new MySQL5DAOModule(), new IDFactoryModule());
private final CharacterIDFactory charIdFactory = injector private final CharacterIDFactory charIdFactory = injector
.getInstance(CharacterIDFactory.class); .getInstance(CharacterIDFactory.class);

View File

@@ -22,7 +22,7 @@ import script.template.item.AdenaItemTemplate;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Injector; import com.google.inject.Injector;
import com.l2jserver.db.dao.DAOModuleMySQL5; import com.l2jserver.db.dao.MySQL5DAOModule;
import com.l2jserver.model.id.factory.IDFactoryModule; import com.l2jserver.model.id.factory.IDFactoryModule;
import com.l2jserver.model.id.template.factory.ItemTemplateIDFactory; import com.l2jserver.model.id.template.factory.ItemTemplateIDFactory;
import com.l2jserver.service.ServiceModule; import com.l2jserver.service.ServiceModule;
@@ -30,7 +30,7 @@ import com.l2jserver.service.ServiceStartException;
public class StaticTemplateServiceTest { public class StaticTemplateServiceTest {
private final Injector injector = Guice.createInjector(new ServiceModule(), private final Injector injector = Guice.createInjector(new ServiceModule(),
new IDFactoryModule(), new DAOModuleMySQL5()); new IDFactoryModule(), new MySQL5DAOModule());
private final TemplateService service = injector private final TemplateService service = injector
.getInstance(TemplateService.class); .getInstance(TemplateService.class);
private final ItemTemplateIDFactory factory = injector private final ItemTemplateIDFactory factory = injector

View File

@@ -27,7 +27,7 @@ import com.google.inject.AbstractModule;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Injector; import com.google.inject.Injector;
import com.google.inject.Scopes; import com.google.inject.Scopes;
import com.l2jserver.db.dao.DAOModuleMySQL5; import com.l2jserver.db.dao.MySQL5DAOModule;
import com.l2jserver.model.id.factory.IDFactoryModule; import com.l2jserver.model.id.factory.IDFactoryModule;
import com.l2jserver.model.id.object.factory.CharacterIDFactory; import com.l2jserver.model.id.object.factory.CharacterIDFactory;
import com.l2jserver.model.id.object.factory.ItemIDFactory; import com.l2jserver.model.id.object.factory.ItemIDFactory;
@@ -56,7 +56,7 @@ public class WorldEventDispatcherImplTest {
@Before @Before
public void tearUp() throws ServiceStartException { public void tearUp() throws ServiceStartException {
Injector injector = Guice.createInjector(new ServiceModule(), Injector injector = Guice.createInjector(new ServiceModule(),
new DAOModuleMySQL5(), new IDFactoryModule(), new MySQL5DAOModule(), new IDFactoryModule(),
new AbstractModule() { new AbstractModule() {
@Override @Override
protected void configure() { protected void configure() {