Avoid additional db query to get login state during login
This commit is contained in:
@@ -40,7 +40,6 @@ import net.server.channel.Channel;
|
|||||||
import net.server.coordinator.login.LoginBypassCoordinator;
|
import net.server.coordinator.login.LoginBypassCoordinator;
|
||||||
import net.server.coordinator.session.Hwid;
|
import net.server.coordinator.session.Hwid;
|
||||||
import net.server.coordinator.session.SessionCoordinator;
|
import net.server.coordinator.session.SessionCoordinator;
|
||||||
import net.server.coordinator.session.SessionCoordinator.AntiMulticlientResult;
|
|
||||||
import net.server.world.Party;
|
import net.server.world.Party;
|
||||||
import net.server.world.World;
|
import net.server.world.World;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -53,7 +52,6 @@ import scripting.quest.QuestActionManager;
|
|||||||
import scripting.quest.QuestScriptManager;
|
import scripting.quest.QuestScriptManager;
|
||||||
import server.TimerManager;
|
import server.TimerManager;
|
||||||
import server.life.Monster;
|
import server.life.Monster;
|
||||||
import tools.BCrypt;
|
|
||||||
import tools.DatabaseConnection;
|
import tools.DatabaseConnection;
|
||||||
import tools.PacketCreator;
|
import tools.PacketCreator;
|
||||||
|
|
||||||
@@ -65,6 +63,7 @@ import java.sql.ResultSet;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -110,7 +109,7 @@ public class Client extends ChannelInboundHandlerAdapter {
|
|||||||
private String accountName = null;
|
private String accountName = null;
|
||||||
private int world;
|
private int world;
|
||||||
private volatile long lastPong;
|
private volatile long lastPong;
|
||||||
private int gmlevel;
|
private int gmlevel; // TODO: remove? There's a gmlevel in Character too.
|
||||||
private Set<String> macs = new HashSet<>();
|
private Set<String> macs = new HashSet<>();
|
||||||
private Map<String, ScriptEngine> engines = new HashMap<>();
|
private Map<String, ScriptEngine> engines = new HashMap<>();
|
||||||
private byte characterSlots = 3;
|
private byte characterSlots = 3;
|
||||||
@@ -531,85 +530,6 @@ public class Client extends ChannelInboundHandlerAdapter {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: load account outside in LoginPasswordHandler (from service).
|
|
||||||
//
|
|
||||||
public int login(String login, String pwd, Hwid hwid) {
|
|
||||||
int loginok = 5;
|
|
||||||
|
|
||||||
try (Connection con = DatabaseConnection.getConnection();
|
|
||||||
PreparedStatement ps = con.prepareStatement("SELECT id, password, gender, banned, pin, pic, characterslots, tos FROM accounts WHERE name = ?")) {
|
|
||||||
ps.setString(1, login);
|
|
||||||
|
|
||||||
try (ResultSet rs = ps.executeQuery()) {
|
|
||||||
accId = -2;
|
|
||||||
if (rs.next()) {
|
|
||||||
accId = rs.getInt("id");
|
|
||||||
if (accId <= 0) {
|
|
||||||
log.warn("Tried to log in with accId {}", accId);
|
|
||||||
return 15;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean banned = (rs.getByte("banned") == 1);
|
|
||||||
gmlevel = 0;
|
|
||||||
pin = rs.getString("pin");
|
|
||||||
pic = rs.getString("pic");
|
|
||||||
gender = rs.getByte("gender");
|
|
||||||
characterSlots = rs.getByte("characterslots");
|
|
||||||
String passhash = rs.getString("password");
|
|
||||||
byte tos = rs.getByte("tos");
|
|
||||||
|
|
||||||
if (banned) {
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getLoginState() > LOGIN_NOTLOGGEDIN) { // already loggedin
|
|
||||||
loggedIn = false;
|
|
||||||
loginok = 7;
|
|
||||||
} else if (BCrypt.checkpw(pwd, passhash)) {
|
|
||||||
loginok = (tos == 0) ? 23 : 0;
|
|
||||||
} else {
|
|
||||||
loggedIn = false;
|
|
||||||
loginok = 4;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
accId = -3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (loginok == 0 || loginok == 4) {
|
|
||||||
AntiMulticlientResult res = SessionCoordinator.getInstance().attemptLoginSession(this, hwid, accId, loginok == 4);
|
|
||||||
|
|
||||||
switch (res) {
|
|
||||||
case SUCCESS:
|
|
||||||
if (loginok == 0) {
|
|
||||||
loginattempt = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return loginok;
|
|
||||||
|
|
||||||
case REMOTE_LOGGEDIN:
|
|
||||||
return 17;
|
|
||||||
|
|
||||||
case REMOTE_REACHED_LIMIT:
|
|
||||||
return 13;
|
|
||||||
|
|
||||||
case REMOTE_PROCESSING:
|
|
||||||
return 10;
|
|
||||||
|
|
||||||
case MANY_ACCOUNT_ATTEMPTS:
|
|
||||||
return 16;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return 8;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return loginok;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: check tempban directly on loaded account
|
// TODO: check tempban directly on loaded account
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public Calendar getTempBanCalendarFromDB() {
|
public Calendar getTempBanCalendarFromDB() {
|
||||||
@@ -705,12 +625,44 @@ public class Client extends ChannelInboundHandlerAdapter {
|
|||||||
loggedIn = false;
|
loggedIn = false;
|
||||||
serverTransition = false;
|
serverTransition = false;
|
||||||
setAccID(0);
|
setAccID(0);
|
||||||
|
} else if (newState == LoginState.SERVER_TRANSITION) {
|
||||||
|
loggedIn = false;
|
||||||
|
serverTransition = true;
|
||||||
} else {
|
} else {
|
||||||
serverTransition = (newState == LOGIN_SERVER_TRANSITION);
|
loggedIn = true;
|
||||||
loggedIn = !serverTransition;
|
serverTransition = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public byte getLoginState(Account account) {
|
||||||
|
byte loginState = account.loginState();
|
||||||
|
if (loginState == LoginState.SERVER_TRANSITION && lastLoginOverThirtySecondsAgo(account)) {
|
||||||
|
loginState = LoginState.NOT_LOGGED_IN;
|
||||||
|
updateLoginState(LoginState.NOT_LOGGED_IN);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loginState == LoginState.LOGGED_IN) {
|
||||||
|
loggedIn = true;
|
||||||
|
} else if (loginState == LoginState.SERVER_TRANSITION) {
|
||||||
|
try (Connection con = DatabaseConnection.getConnection();
|
||||||
|
PreparedStatement ps2 = con.prepareStatement("UPDATE accounts SET loggedin = 0 WHERE id = ?")) {
|
||||||
|
ps2.setInt(1, getAccID());
|
||||||
|
ps2.executeUpdate();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return loginState;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean lastLoginOverThirtySecondsAgo(Account account) {
|
||||||
|
if (account.lastLogin() == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return account.lastLogin().isBefore(LocalDateTime.now().minusSeconds(30));
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: move to LoginPasswordHandler
|
// TODO: move to LoginPasswordHandler
|
||||||
public int getLoginState() { // 0 = LOGIN_NOTLOGGEDIN, 1= LOGIN_SERVER_TRANSITION, 2 = LOGIN_LOGGEDIN
|
public int getLoginState() { // 0 = LOGIN_NOTLOGGEDIN, 1= LOGIN_SERVER_TRANSITION, 2 = LOGIN_LOGGEDIN
|
||||||
try (Connection con = DatabaseConnection.getConnection()) {
|
try (Connection con = DatabaseConnection.getConnection()) {
|
||||||
|
|||||||
10
src/main/java/client/LoginState.java
Normal file
10
src/main/java/client/LoginState.java
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package client;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Ponk
|
||||||
|
*/
|
||||||
|
public class LoginState {
|
||||||
|
public static final byte NOT_LOGGED_IN = 0;
|
||||||
|
public static final byte SERVER_TRANSITION = 1;
|
||||||
|
public static final byte LOGGED_IN = 2;
|
||||||
|
}
|
||||||
@@ -110,7 +110,7 @@ public final class LoginPasswordHandler implements PacketHandler {
|
|||||||
|
|
||||||
c.setAccount(account);
|
c.setAccount(account);
|
||||||
|
|
||||||
if (c.getLoginState() > Client.LOGIN_NOTLOGGEDIN) {
|
if (c.getLoginState(account) > Client.LOGIN_NOTLOGGEDIN) {
|
||||||
c.sendPacket(PacketCreator.getLoginFailed(7));
|
c.sendPacket(PacketCreator.getLoginFailed(7));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user