From 7e5a216c31a1f17739a02f15344107a1576d7846 Mon Sep 17 00:00:00 2001 From: darkk1138 Date: Mon, 25 Nov 2013 22:12:34 +0100 Subject: [PATCH] fix session handling --- src/main/NGECore.java | 1 - src/protocol/Message.java | 9 ++- .../swg/ClientVerifyAndLockNameRequest.java | 4 +- src/services/CharacterService.java | 79 ++++++++++--------- src/services/ConnectionService.java | 13 ++- src/services/LoginService.java | 1 + 6 files changed, 59 insertions(+), 48 deletions(-) diff --git a/src/main/NGECore.java b/src/main/NGECore.java index 9df9967b..4ff941df 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -186,7 +186,6 @@ public class NGECore { databaseConnection2.connect(config.getString("DB2.URL"), config.getString("DB2.NAME"), config.getString("DB2.USER"), config.getString("DB2.PASS"), "mysql"); } - databaseConnection2 = new DatabaseConnection(); setGalaxyStatus(1); creatureODB = new ObjectDatabase("creature", true, false, true); mailODB = new ObjectDatabase("mails", true, false, true); diff --git a/src/protocol/Message.java b/src/protocol/Message.java index 5085a975..9792eaec 100644 --- a/src/protocol/Message.java +++ b/src/protocol/Message.java @@ -103,6 +103,7 @@ public abstract class Message { } + //TODO: Verify if character position is set correctly after reading a UTF-16 string buffer.position(bufferPosition + length); return result; @@ -146,8 +147,8 @@ public abstract class Message { return result.array(); } - - + + //FIXME: this is redundant and was also bugged. At some point, get rid of the redundant functions. /** * Reads the next string in. It gets the length of the * string from the short/int at the beginning of it @@ -161,7 +162,7 @@ public abstract class Message { if (charset.equals("US-ASCII") || charset.equals("UTF-8")) { length = bb.getShort(); } else { - length = bb.getInt(); + length = bb.getInt() * 2; } if (length > bb.remaining()) return ""; @@ -201,4 +202,4 @@ public abstract class Message { return getNextString(buffer, "UTF-16LE"); } -} +} diff --git a/src/protocol/swg/ClientVerifyAndLockNameRequest.java b/src/protocol/swg/ClientVerifyAndLockNameRequest.java index 7d9c9722..ea0011f5 100644 --- a/src/protocol/swg/ClientVerifyAndLockNameRequest.java +++ b/src/protocol/swg/ClientVerifyAndLockNameRequest.java @@ -38,8 +38,8 @@ public class ClientVerifyAndLockNameRequest extends SWGMessage { public void deserialize(IoBuffer buffer) { buffer.position(6); // Skips SOE and SWG opcodes raceTemplate = getNextAsciiString(buffer); - name = getNextUnicodeString(buffer);; - + name = getNextUnicodeString(buffer); + System.out.println("msg: " + name); // Gets the first and last names String [] splitName = name.split(" "); firstName = splitName[0]; diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index 7b805c2f..7797d46d 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -87,7 +87,6 @@ public class CharacterService implements INetworkDispatch { public void handlePacket(IoSession session, IoBuffer data) throws Exception { - Client client = core.getClient((Integer) session.getAttribute("connectionId")); ClientRandomNameRequest randomNameRequest = new ClientRandomNameRequest(); ClientRandomNameResponse response; String name = null; @@ -96,16 +95,23 @@ public class CharacterService implements INetworkDispatch { data.position(0); randomNameRequest.deserialize(data); + while (name == null) { + + String firstName =""; + String lastName = ""; if (randomNameRequest.getSharedRaceTemplate().contains("wookie")) { - name = nameGenerator.compose(4); + firstName = nameGenerator.compose(4); + } else { - name = nameGenerator.compose(2) + " " + nameGenerator.compose(3); + firstName = nameGenerator.compose(2); + lastName = nameGenerator.compose(3); } try { - if (checkForDuplicateName(getfirstName(name, randomNameRequest.getSharedRaceTemplate()), client.getAccountId())) { - name = null; + //it's fine here to just use 0 as accountId because we don't want reserved names to be random generated for anyone. + if (!checkForDuplicateName(firstName, 0)) { + name = firstName + ((lastName.length() > 0 ) ? " " + lastName : ""); } } catch (SQLException e2) { e2.printStackTrace(); @@ -132,7 +138,7 @@ public class CharacterService implements INetworkDispatch { boolean isDeclined = false; String firstName = getfirstName(message.getName(), message.getRaceTemplate()); String lastName = getlastName(message.getName(), message.getRaceTemplate()); - if(message.getName() != null) System.out.println(message.getName()); + //if(message.getName() != null) System.out.println(message.getName()); int length = firstName.length(); try { @@ -317,67 +323,66 @@ public class CharacterService implements INetworkDispatch { firstName = firstName.toLowerCase(); PreparedStatement ps = databaseConnection.preparedStatement("SELECT id FROM characters WHERE LOWER(\"firstName\")=?"); ps.setString(1, firstName); + //System.out.println(ps.toString()); ResultSet resultSet = ps.executeQuery(); boolean isDuplicate = resultSet.next(); resultSet.getStatement().close(); + if (isDuplicate) { return true; } //FIXME: this is a bit lazy... but it's only temporary :p - PreparedStatement ps2 = databaseConnection.preparedStatement("SELECT id FROM temp_reserved_char_names WHERE \"accountId\"!=? AND LOWER(\"firstName\")=?"); + PreparedStatement psc = databaseConnection.preparedStatement("SELECT * FROM pg_tables WHERE \"tablename\"=?"); + psc.setString(1, "temp_reserved_char_names"); + ResultSet resultSetC = psc.executeQuery(); + boolean tableExists = resultSetC.next(); + resultSetC.getStatement().close(); + if (!tableExists) { return false; } + + PreparedStatement ps2 = databaseConnection.preparedStatement("SELECT \"accountId\" FROM temp_reserved_char_names WHERE \"accountId\"!=? AND LOWER(\"firstName\")=?"); ps2.setLong(1, accountId); ps2.setString(2, firstName); ResultSet resultSet2 = ps2.executeQuery(); - boolean isReserved = resultSet.next(); + boolean isReserved = resultSet2.next(); resultSet2.getStatement().close(); - return isDuplicate && isReserved; + return isReserved; } private String getfirstName(String Name, String RaceTemplate) { - String[] splitName; - if (RaceTemplate != "object/creature/player/wookiee_male.iff" | RaceTemplate != "object/creature/player/wookiee_female.iff") + if (RaceTemplate.contains("/wookiee_") || + !Name.contains(" ")) { // wookies don't have lastNames - if (Name.contains(" ")) - { - splitName = Name.split(" ", 2); - return splitName[0]; - } - else - { return Name; - } - } - else - { - return Name; } + + return Name.split(" ", 2)[0]; + } private String getlastName(String Name, String RaceTemplate) { - String[] splitName; - if (RaceTemplate != "object/creature/player/wookiee_male.iff" && RaceTemplate != "object/creature/player/wookiee_female.iff") + if (RaceTemplate.contains("/wookiee_") || + !Name.contains(" ")) { // wookies don't have lastNames - if (Name.contains(" ")) - { - splitName = Name.split(" ", 2); - return splitName[1]; - } - else - { - return ""; - } - } - else - { return ""; } + + return Name.split(" ", 2)[1]; + } private String checkForReservedName(String firstName, String lastName) throws SQLException { + + PreparedStatement psc = databaseConnection.preparedStatement("SELECT * FROM pg_tables WHERE \"tablename\"=?"); + psc.setString(1, "reservednames"); + ResultSet rsc = psc.executeQuery(); + if (!rsc.next()) { + return null; + } + firstName = firstName.toLowerCase(); lastName = lastName.toLowerCase(); diff --git a/src/services/ConnectionService.java b/src/services/ConnectionService.java index b094b647..a2f291ed 100644 --- a/src/services/ConnectionService.java +++ b/src/services/ConnectionService.java @@ -69,6 +69,8 @@ public class ConnectionService implements INetworkDispatch { @Override public void handlePacket(IoSession session, IoBuffer data) throws Exception { + + System.out.println("xx"); data = data.order(ByteOrder.LITTLE_ENDIAN); ClientIdMsg clientIdMsg = new ClientIdMsg(); data.position(0); @@ -84,19 +86,22 @@ public class ConnectionService implements INetworkDispatch { PreparedStatement preparedStatement; try { - + preparedStatement = databaseConnection.preparedStatement("SELECT * FROM sessions WHERE key=?"); preparedStatement.setBytes(1, clientIdMsg.getSessionKey()); resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { - client.setAccountId(resultSet.getInt("accountId")); + client.setAccountId(resultSet.getLong("accountId")); + client.setSessionKey(clientIdMsg.getSessionKey()); AccountFeatureBits accountFeatureBits = new AccountFeatureBits(); ClientPermissionsMessage clientPermissionsMessage = new ClientPermissionsMessage(); session.write(new HeartBeatMessage().serialize()); session.write(accountFeatureBits.serialize()); session.write(clientPermissionsMessage.serialize()); preparedStatement.close(); + + System.out.println("zyx"); } else { System.out.println("Cant get login session"); } @@ -105,8 +110,8 @@ public class ConnectionService implements INetworkDispatch { e.printStackTrace(); - } - + } + } diff --git a/src/services/LoginService.java b/src/services/LoginService.java index 1c0a5b64..a4904be8 100644 --- a/src/services/LoginService.java +++ b/src/services/LoginService.java @@ -212,6 +212,7 @@ public class LoginService implements INetworkDispatch{ PreparedStatement ps = databaseConnection1.preparedStatement("INSERT INTO sessions (\"key\", \"accountId\") VALUES (?, ?)"); ps.setBytes(1, client.getSessionKey()); + ps.setLong(2, client.getAccountId()); ps.executeUpdate(); ps.close();