2
0

GameServerAuth.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /*
  2. * Copyright (C) 2004-2015 L2J Server
  3. *
  4. * This file is part of L2J Server.
  5. *
  6. * L2J Server is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * L2J Server is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. package com.l2jserver.loginserver.network.gameserverpackets;
  20. import java.util.Arrays;
  21. import java.util.logging.Logger;
  22. import com.l2jserver.Config;
  23. import com.l2jserver.loginserver.GameServerTable;
  24. import com.l2jserver.loginserver.GameServerTable.GameServerInfo;
  25. import com.l2jserver.loginserver.GameServerThread;
  26. import com.l2jserver.loginserver.network.L2JGameServerPacketHandler.GameServerState;
  27. import com.l2jserver.loginserver.network.loginserverpackets.AuthResponse;
  28. import com.l2jserver.loginserver.network.loginserverpackets.LoginServerFail;
  29. import com.l2jserver.util.network.BaseRecievePacket;
  30. /**
  31. * <pre>
  32. * Format: cccddb
  33. * c desired ID
  34. * c accept alternative ID
  35. * c reserve Host
  36. * s ExternalHostName
  37. * s InetranlHostName
  38. * d max players
  39. * d hexid size
  40. * b hexid
  41. * </pre>
  42. * @author -Wooden-
  43. */
  44. public class GameServerAuth extends BaseRecievePacket
  45. {
  46. protected static Logger _log = Logger.getLogger(GameServerAuth.class.getName());
  47. GameServerThread _server;
  48. private final byte[] _hexId;
  49. private final int _desiredId;
  50. @SuppressWarnings("unused")
  51. private final boolean _hostReserved;
  52. private final boolean _acceptAlternativeId;
  53. private final int _maxPlayers;
  54. private final int _port;
  55. private final String[] _hosts;
  56. /**
  57. * @param decrypt
  58. * @param server
  59. */
  60. public GameServerAuth(byte[] decrypt, GameServerThread server)
  61. {
  62. super(decrypt);
  63. _server = server;
  64. _desiredId = readC();
  65. _acceptAlternativeId = (readC() == 0 ? false : true);
  66. _hostReserved = (readC() == 0 ? false : true);
  67. _port = readH();
  68. _maxPlayers = readD();
  69. int size = readD();
  70. _hexId = readB(size);
  71. size = 2 * readD();
  72. _hosts = new String[size];
  73. for (int i = 0; i < size; i++)
  74. {
  75. _hosts[i] = readS();
  76. }
  77. if (Config.DEBUG)
  78. {
  79. _log.info("Auth request received");
  80. }
  81. if (handleRegProcess())
  82. {
  83. AuthResponse ar = new AuthResponse(server.getGameServerInfo().getId());
  84. server.sendPacket(ar);
  85. if (Config.DEBUG)
  86. {
  87. _log.info("Authed: id: " + server.getGameServerInfo().getId());
  88. }
  89. server.broadcastToTelnet("GameServer [" + server.getServerId() + "] " + GameServerTable.getInstance().getServerNameById(server.getServerId()) + " is connected");
  90. server.setLoginConnectionState(GameServerState.AUTHED);
  91. }
  92. }
  93. private boolean handleRegProcess()
  94. {
  95. GameServerTable gameServerTable = GameServerTable.getInstance();
  96. int id = _desiredId;
  97. byte[] hexId = _hexId;
  98. GameServerInfo gsi = gameServerTable.getRegisteredGameServerById(id);
  99. // is there a gameserver registered with this id?
  100. if (gsi != null)
  101. {
  102. // does the hex id match?
  103. if (Arrays.equals(gsi.getHexId(), hexId))
  104. {
  105. // check to see if this GS is already connected
  106. synchronized (gsi)
  107. {
  108. if (gsi.isAuthed())
  109. {
  110. _server.forceClose(LoginServerFail.REASON_ALREADY_LOGGED8IN);
  111. return false;
  112. }
  113. _server.attachGameServerInfo(gsi, _port, _hosts, _maxPlayers);
  114. }
  115. }
  116. else
  117. {
  118. // there is already a server registered with the desired id and different hex id
  119. // try to register this one with an alternative id
  120. if (Config.ACCEPT_NEW_GAMESERVER && _acceptAlternativeId)
  121. {
  122. gsi = new GameServerInfo(id, hexId, _server);
  123. if (gameServerTable.registerWithFirstAvailableId(gsi))
  124. {
  125. _server.attachGameServerInfo(gsi, _port, _hosts, _maxPlayers);
  126. gameServerTable.registerServerOnDB(gsi);
  127. }
  128. else
  129. {
  130. _server.forceClose(LoginServerFail.REASON_NO_FREE_ID);
  131. return false;
  132. }
  133. }
  134. else
  135. {
  136. // server id is already taken, and we cant get a new one for you
  137. _server.forceClose(LoginServerFail.REASON_WRONG_HEXID);
  138. return false;
  139. }
  140. }
  141. }
  142. else
  143. {
  144. // can we register on this id?
  145. if (Config.ACCEPT_NEW_GAMESERVER)
  146. {
  147. gsi = new GameServerInfo(id, hexId, _server);
  148. if (gameServerTable.register(id, gsi))
  149. {
  150. _server.attachGameServerInfo(gsi, _port, _hosts, _maxPlayers);
  151. gameServerTable.registerServerOnDB(gsi);
  152. }
  153. else
  154. {
  155. // some one took this ID meanwhile
  156. _server.forceClose(LoginServerFail.REASON_ID_RESERVED);
  157. return false;
  158. }
  159. }
  160. else
  161. {
  162. _server.forceClose(LoginServerFail.REASON_WRONG_HEXID);
  163. return false;
  164. }
  165. }
  166. return true;
  167. }
  168. }