GameServerRegistrationTable.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package com.l2jserver.communityserver;
  16. import java.math.BigInteger;
  17. import java.security.KeyPair;
  18. import java.security.KeyPairGenerator;
  19. import java.security.spec.RSAKeyGenParameterSpec;
  20. import java.sql.Connection;
  21. import java.sql.PreparedStatement;
  22. import java.sql.ResultSet;
  23. import java.sql.SQLException;
  24. import java.util.Arrays;
  25. import java.util.Map;
  26. import java.util.logging.Logger;
  27. import javolution.util.FastMap;
  28. import com.l2jserver.communityserver.util.Rnd;
  29. public final class GameServerRegistrationTable
  30. {
  31. private static Logger _log = Logger.getLogger(GameServerRegistrationTable.class.getName());
  32. private static final int KEYS_SIZE = 10;
  33. private static GameServerRegistrationTable _instance;
  34. public static GameServerRegistrationTable getInstance()
  35. {
  36. if (_instance == null)
  37. _instance = new GameServerRegistrationTable();
  38. return _instance;
  39. }
  40. private final Map<byte[], Boolean> _registeredGameServers;
  41. private final KeyPair[] _keyPairs;
  42. public GameServerRegistrationTable()
  43. {
  44. _registeredGameServers = loadRegisteredGameServers();
  45. _log.info("Loaded "+_registeredGameServers.size()+" registered GameServers");
  46. _keyPairs = loadRSAKeys();
  47. _log.info("Cached "+_keyPairs.length+" RSA keys for GameServer communication.");
  48. }
  49. private final KeyPair[] loadRSAKeys()
  50. {
  51. final KeyPair[] keyPairs = new KeyPair[KEYS_SIZE];
  52. try
  53. {
  54. final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
  55. final RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(512, RSAKeyGenParameterSpec.F4);
  56. keyGen.initialize(spec);
  57. for (int i = 0; i < KEYS_SIZE; i++)
  58. {
  59. keyPairs[i] = keyGen.genKeyPair();
  60. }
  61. }
  62. catch (Exception e)
  63. {
  64. }
  65. return keyPairs;
  66. }
  67. private final Map<byte[], Boolean> loadRegisteredGameServers()
  68. {
  69. final Map<byte[], Boolean> registeredGameServers = new FastMap<byte[], Boolean>();
  70. Connection con = null;
  71. PreparedStatement statement = null;
  72. ResultSet rset = null;
  73. try
  74. {
  75. con = L2DatabaseFactory.getInstance().getConnection();
  76. statement = con.prepareStatement("SELECT hex_id FROM registered_gameservers");
  77. rset = statement.executeQuery();
  78. while (rset.next())
  79. {
  80. // for (byte b : stringToHex(rset.getString("hex_id")))
  81. registeredGameServers.put(stringToHex(rset.getString("hex_id")), false);
  82. }
  83. }
  84. catch (SQLException e)
  85. {
  86. }
  87. finally
  88. {
  89. try
  90. {
  91. con.close();
  92. statement.close();
  93. rset.close();
  94. }
  95. catch (Exception e)
  96. {
  97. }
  98. }
  99. return registeredGameServers;
  100. }
  101. private final byte[] stringToHex(final String string)
  102. {
  103. return new BigInteger(string, 16).toByteArray();
  104. }
  105. public final KeyPair getRandomKeyPair()
  106. {
  107. return _keyPairs[Rnd.get(_keyPairs.length)];
  108. }
  109. public final boolean isHexIdOk(final byte[] hexId)
  110. {
  111. for (final byte[] hex : _registeredGameServers.keySet())
  112. {
  113. if (Arrays.equals(hex, hexId))
  114. return true;
  115. }
  116. return false;
  117. }
  118. public final boolean isHexIdInUse(final byte[] hexId)
  119. {
  120. for (Map.Entry<byte[], Boolean> entry : _registeredGameServers.entrySet())
  121. {
  122. if (entry.getValue() && Arrays.equals(entry.getKey(), hexId))
  123. return true;
  124. }
  125. return false;
  126. }
  127. public final void setHexIdInUse(final byte[] hexId)
  128. {
  129. for (Map.Entry<byte[], Boolean> entry : _registeredGameServers.entrySet())
  130. {
  131. if (Arrays.equals(entry.getKey(), hexId))
  132. {
  133. entry.setValue(false);
  134. return;
  135. }
  136. }
  137. }
  138. }