Index: java/net/sf/l2j/loginserver/ClientThread.java =================================================================== --- java\net\sf\l2j\loginserver\ClientThread.java (revision 1346) +++ java\net\sf\l2j\loginserver\ClientThread.java (working copy) @@ -33,6 +33,7 @@ import net.sf.l2j.Config; import net.sf.l2j.gameserver.ClientScheduler; import net.sf.l2j.loginserver.clientpackets.RequestAuthLogin; +import net.sf.l2j.loginserver.clientpackets.RequestAuthLogin2; import net.sf.l2j.loginserver.clientpackets.RequestServerLogin; import net.sf.l2j.loginserver.serverpackets.Init; import net.sf.l2j.loginserver.serverpackets.LoginFail; @@ -41,6 +42,8 @@ import net.sf.l2j.loginserver.serverpackets.ServerBasePacket; import net.sf.l2j.loginserver.serverpackets.ServerList; +import java.io.File; +import java.io.FileInputStream; /** * This class ... * @@ -94,6 +97,7 @@ int lengthLo =0; int length = 0; boolean checksumOk = false; + boolean oldcrypt = false; int sessionKey = -1; String account = null; @@ -148,12 +152,18 @@ decrypt = _crypt.decrypt(decrypt); checksumOk = _crypt.checksum(decrypt); - if (!checksumOk) - { - //_log.warning("Incorrect packet checksum, closing connection.."); - _log.warning("Client is not using latest Authentication method. (Min is 557)"); - break; - } + if (!checksumOk) + { + _crypt = new NewCrypt("[;'.]94-31==-%&@!^+]\000"); + System.arraycopy(incoming, 2, decrypt, 0, decrypt.length); + // decrypt if we have a key + decrypt = _crypt.decrypt(decrypt); + checksumOk = _crypt.checksum(decrypt); + oldcrypt = true; + if (!checksumOk){ + _log.warning("Incorrect packet checksum, closing connection.."); + break;} + } if (Config.DEBUG) _log.warning("[C]\n"+printData(decrypt, decrypt.length)); @@ -163,7 +173,8 @@ { case 00: { - RequestAuthLogin ral = new RequestAuthLogin(decrypt, _logins.getPrivateKey()); + if (!oldcrypt) + {RequestAuthLogin ral = new RequestAuthLogin(decrypt, _logins.getPrivateKey()); account = ral.getUser().toLowerCase(); if (Config.DEBUG) _log.fine("RequestAuthLogin from user:" + account); @@ -226,7 +237,72 @@ break; } - + if (oldcrypt) + { + RequestAuthLogin2 ral = new RequestAuthLogin2(decrypt); + account = ral.getUser().toLowerCase(); + if (Config.DEBUG) _log.fine("RequestAuthLogin from user:" + account); + + LoginController lc = LoginController.getInstance(); + if (_logins.loginValid(account, ral.getPassword(), _csocket.getInetAddress())) + { + if (_logins.loginBanned(account)) + { + //Login BANNED + LoginFail lok = new LoginFail(LoginFail.REASON_ACCOUNT_BANNED); + sendPacket(lok); + } + else + { + //FIXME: this has to be done per server and not on login + if(LoginController.getInstance().getOnlinePlayerCount() >= LoginController.getInstance().getMaxAllowedOnlinePlayers()) + { + if (Config.DEBUG) _log.fine("Player tryed to login but server is full"); + LoginFail lfail = new LoginFail(LoginFail.REASON_ACCESS_FAILED ); + sendPacket(lfail); + } + else if (!lc.isAccountInGameServer(account) && !lc.isAccountInLoginServer(account) ) + { + sessionKey = lc.assignSessionKeyToLogin(account, _csocket); + if (Config.DEBUG) _log.fine("assigned SessionKey:" + Integer.toHexString(sessionKey)); + LoginOk lok = new LoginOk(); + sendPacket(lok); + } + else + { + if (Config.DEBUG) _log.fine("KICKING!"); + if (lc.isAccountInLoginServer(account)) { + _log.warning("account is in use on Login server (kicking off):" + account); + try + { + lc.getLoginServerConnection(account).close(); + lc.removeLoginServerLogin(account); + } + catch(NullPointerException e) + { + _log.warning("Error while kicking loginserver account, lost connection?"); + } + } + if (lc.isAccountInGameServer(account)) { + _log.warning("account is in use on Gamea server (kicking off):" + account); + lc.getClientConnection(account).close(); + lc.removeGameServerLogin(account); + } + LoginFail lok = new LoginFail(LoginFail.REASON_ACCOUNT_IN_USE); + sendPacket(lok); + } + } + } + else + { + LoginFail lok = new LoginFail(LoginFail.REASON_USER_OR_PASS_WRONG); + sendPacket(lok); + if (Config.DEBUG) _log.fine("login failed sent"); + } + + break; + } + } case 02: { if (Config.DEBUG) _log.fine("RequestServerLogin"); @@ -252,7 +328,35 @@ sendPacket(sl); break; } - + case 07: + { + byte[] raw = null; + String filename = "07"; + File file = new File(filename); + if (!file.exists()) + { + + } + else + { + FileInputStream fis = null; + try + { + fis = new FileInputStream(file); + raw = new byte[fis.available()]; + fis.read(raw); + } + catch (Exception e) + { _log.warning("problem with message text "+e); + } + finally + { + try { fis.close(); } catch (Exception e1) {/* ignore this */} + } + } + _out.write(raw); + _out.flush(); + } default: { _log.warning("Unknown Packet:" + packetType);