diff --git a/Server/src/main/java/net/simon987/server/GameServer.java b/Server/src/main/java/net/simon987/server/GameServer.java index 6c0700e..93e19d9 100644 --- a/Server/src/main/java/net/simon987/server/GameServer.java +++ b/Server/src/main/java/net/simon987/server/GameServer.java @@ -1,12 +1,12 @@ package net.simon987.server; - import com.mongodb.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.ReplaceOptions; import net.simon987.server.crypto.CryptoProvider; +import net.simon987.server.crypto.SecretKeyGenerator; import net.simon987.server.event.GameEvent; import net.simon987.server.event.GameEventDispatcher; import net.simon987.server.event.TickEvent; @@ -54,6 +54,8 @@ public class GameServer implements Runnable { private GameRegistry gameRegistry; + private String secretKey; + public GameServer() { this.config = new ServerConfiguration("config.properties"); @@ -76,6 +78,13 @@ public class GameServer implements Runnable { dayNightCycle = new DayNightCycle(); + SecretKeyGenerator keyGenerator = new SecretKeyGenerator(); + secretKey = config.getString("secret_key"); + if (secretKey == null) { + secretKey = keyGenerator.generate(); + config.setString("secret_key", secretKey); + } + //Load all plugins in plugins folder, if it doesn't exist, create it File pluginDir = new File("plugins/"); File[] pluginDirListing = pluginDir.listFiles(); @@ -123,7 +132,7 @@ public class GameServer implements Runnable { return eventDispatcher; } - public CryptoProvider getCryptoProvider(){ + public CryptoProvider getCryptoProvider() { return cryptoProvider; } @@ -176,12 +185,10 @@ public class GameServer implements Runnable { user.getControlledUnit().getCpu().reset(); int cost = user.getControlledUnit().getCpu().execute(timeout); user.getControlledUnit().spendEnergy(cost); - } catch (Exception e) { LogManager.LOGGER.severe("Error executing " + user.getUsername() + "'s code"); e.printStackTrace(); } - } } @@ -219,7 +226,7 @@ public class GameServer implements Runnable { MongoCursor cursor = worlds.find(whereQuery).iterator(); GameUniverse universe = GameServer.INSTANCE.getGameUniverse(); while (cursor.hasNext()) { - World w = World.deserialize(cursor.next()); + World w = World.deserialize(cursor.next()); universe.addWorld(w); } @@ -243,38 +250,38 @@ public class GameServer implements Runnable { public void save() { LogManager.LOGGER.info("Saving to MongoDB | W:" + gameUniverse.getWorldCount() + " | U:" + gameUniverse.getUserCount()); - try{ + try { MongoDatabase db = mongo.getDatabase(config.getString("mongo_dbname")); ReplaceOptions updateOptions = new ReplaceOptions(); updateOptions.upsert(true); - int unloaded_worlds = 0; + int unloaded_worlds = 0; MongoCollection worlds = db.getCollection("world"); MongoCollection users = db.getCollection("user"); MongoCollection server = db.getCollection("server"); - int insertedWorlds = 0; - GameUniverse universe = GameServer.INSTANCE.getGameUniverse(); + int insertedWorlds = 0; + GameUniverse universe = GameServer.INSTANCE.getGameUniverse(); for (World w : universe.getWorlds()) { insertedWorlds++; worlds.replaceOne(new Document("_id", w.getId()), w.mongoSerialise(), updateOptions); //If the world should unload, it is removed from the Universe after having been saved. - if (w.shouldUnload()){ - unloaded_worlds++; + if (w.shouldUnload()) { + unloaded_worlds++; universe.removeWorld(w); - } - } + } + } for (User u : GameServer.INSTANCE.getGameUniverse().getUsers()) { - if (!u.isGuest()) { + if (!u.isGuest()) { users.replaceOne(new Document("_id", u.getUsername()), u.mongoSerialise(), updateOptions); - } - } + } + } Document serverObj = new Document(); - serverObj.put("time", gameUniverse.getTime()); + serverObj.put("time", gameUniverse.getTime()); //A constant id ensures only one entry is kept and updated, instead of a new entry created every save. server.replaceOne(new Document("_id", "serverinfo"), serverObj, updateOptions); @@ -312,4 +319,13 @@ public class GameServer implements Runnable { public GameRegistry getRegistry() { return gameRegistry; } + + public String getSecretKey() { + return secretKey; + } + + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; + config.setString("secret_key", secretKey); + } } diff --git a/Server/src/main/java/net/simon987/server/crypto/SecretKeyGenerator.java b/Server/src/main/java/net/simon987/server/crypto/SecretKeyGenerator.java new file mode 100644 index 0000000..a40dd27 --- /dev/null +++ b/Server/src/main/java/net/simon987/server/crypto/SecretKeyGenerator.java @@ -0,0 +1,27 @@ +package net.simon987.server.crypto; + +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Base64; + +public class SecretKeyGenerator { + + private static final String KEY_GENERATION_ALGORITHM = "HmacSHA1"; + private KeyGenerator keyGen; + + public SecretKeyGenerator() { + try { + keyGen = KeyGenerator.getInstance(KEY_GENERATION_ALGORITHM); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("Error creating Key generator", e); + } + keyGen.init(new SecureRandom(SecureRandom.getSeed(32))); + } + + public String generate() { + SecretKey secretKey = keyGen.generateKey(); + return Base64.getEncoder().encodeToString(secretKey.getEncoded()); + } +} diff --git a/Server/src/main/resources/config.properties b/Server/src/main/resources/config.properties index aa5374f..17598c4 100644 --- a/Server/src/main/resources/config.properties +++ b/Server/src/main/resources/config.properties @@ -82,4 +82,7 @@ electric_box_respawnTime=256 electric_box_damage=5 electric_box_energy_given=70 #RadioactiveObstacle -radioactive_obstacle_corruption_block_size=10 \ No newline at end of file +radioactive_obstacle_corruption_block_size=10 + +#SecretKey +secret_key=