/* * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ package com.l2jserver.communityserver; import java.math.BigInteger; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.spec.RSAKeyGenParameterSpec; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Arrays; import java.util.Map; import java.util.logging.Logger; import javolution.util.FastMap; import com.l2jserver.communityserver.util.Rnd; public final class GameServerRegistrationTable { private static Logger _log = Logger.getLogger(GameServerRegistrationTable.class.getName()); private static final int KEYS_SIZE = 10; private static GameServerRegistrationTable _instance; public static GameServerRegistrationTable getInstance() { if (_instance == null) _instance = new GameServerRegistrationTable(); return _instance; } private final Map _registeredGameServers; private final KeyPair[] _keyPairs; public GameServerRegistrationTable() { _registeredGameServers = loadRegisteredGameServers(); _log.info("Loaded "+_registeredGameServers.size()+" registered GameServers"); _keyPairs = loadRSAKeys(); _log.info("Cached "+_keyPairs.length+" RSA keys for GameServer communication."); } private final KeyPair[] loadRSAKeys() { final KeyPair[] keyPairs = new KeyPair[KEYS_SIZE]; try { final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); final RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(512, RSAKeyGenParameterSpec.F4); keyGen.initialize(spec); for (int i = 0; i < KEYS_SIZE; i++) { keyPairs[i] = keyGen.genKeyPair(); } } catch (Exception e) { } return keyPairs; } private final Map loadRegisteredGameServers() { final Map registeredGameServers = new FastMap(); Connection con = null; PreparedStatement statement = null; ResultSet rset = null; try { con = L2DatabaseFactory.getInstance().getConnection(); statement = con.prepareStatement("SELECT hex_id FROM registered_gameservers"); rset = statement.executeQuery(); while (rset.next()) { // for (byte b : stringToHex(rset.getString("hex_id"))) registeredGameServers.put(stringToHex(rset.getString("hex_id")), false); } } catch (SQLException e) { } finally { try { con.close(); statement.close(); rset.close(); } catch (Exception e) { } } return registeredGameServers; } private final byte[] stringToHex(final String string) { return new BigInteger(string, 16).toByteArray(); } public final KeyPair getRandomKeyPair() { return _keyPairs[Rnd.get(_keyPairs.length)]; } public final boolean isHexIdOk(final byte[] hexId) { for (final byte[] hex : _registeredGameServers.keySet()) { if (Arrays.equals(hex, hexId)) return true; } return false; } public final boolean isHexIdInUse(final byte[] hexId) { for (Map.Entry entry : _registeredGameServers.entrySet()) { if (entry.getValue() && Arrays.equals(entry.getKey(), hexId)) return true; } return false; } public final void setHexIdInUse(final byte[] hexId) { for (Map.Entry entry : _registeredGameServers.entrySet()) { if (Arrays.equals(entry.getKey(), hexId)) { entry.setValue(false); return; } } } }