diff options
author | David <david@panic.tk> | 2018-11-07 23:50:06 +0100 |
---|---|---|
committer | David <david@panic.tk> | 2018-11-07 23:50:06 +0100 |
commit | 604cf01967ede98bf5024e4926bb0777fc4e8eee (patch) | |
tree | e2fa63d7e683769ee3bf3eddc75280648e92eb04 /src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java | |
parent | e86c52ef7c0e1e33c6af0e8674b038976bec11cc (diff) |
Converted Modules to gradle
Diffstat (limited to 'src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java')
-rw-r--r-- | src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java b/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java new file mode 100644 index 0000000..7bcb89a --- /dev/null +++ b/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java @@ -0,0 +1,263 @@ +package com.redstoner.modules.loginsecurity; + +import java.io.Serializable; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.scheduler.BukkitScheduler; + +import com.nemez.cmdmgr.Command; +import com.redstoner.annotations.AutoRegisterListener; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.misc.CommandHolderType; +import com.redstoner.misc.Main; +import com.redstoner.misc.mysql.JSONManager; +import com.redstoner.misc.mysql.MysqlHandler; +import com.redstoner.misc.mysql.elements.ConstraintOperator; +import com.redstoner.misc.mysql.elements.MysqlConstraint; +import com.redstoner.misc.mysql.elements.MysqlDatabase; +import com.redstoner.misc.mysql.elements.MysqlField; +import com.redstoner.misc.mysql.elements.MysqlTable; +import com.redstoner.misc.mysql.types.text.VarChar; +import com.redstoner.modules.Module; + +@Commands(CommandHolderType.File) +@AutoRegisterListener +@Version(major = 4, minor = 1, revision = 0, compatible = 4) +public class LoginSecurity implements Module, Listener +{ + protected static Map<UUID, Location> loggingIn; + private MysqlTable table; + + @Override + public boolean onEnable() + { + Map<Serializable, Serializable> config = JSONManager.getConfiguration("loginsecurity.json"); + if (config == null || !config.containsKey("database") || !config.containsKey("table")) + { + getLogger().message(Bukkit.getConsoleSender(), true, + "Could not load the LoginSecurity config file, disabling!"); + return false; + } + try + { + MysqlDatabase database = MysqlHandler.INSTANCE.getDatabase((String) config.get("database")); + MysqlField uuid = new MysqlField("uuid", new VarChar(36), true); + MysqlField pass = new MysqlField("pass", new VarChar(88), true); + database.createTableIfNotExists((String) config.get("table"), uuid, pass); + table = database.getTable((String) config.get("table")); + } + catch (NullPointerException e) + { + getLogger().message(Bukkit.getConsoleSender(), true, "Could not use the LoginSecurity config, disabling!"); + return false; + } + loggingIn = new HashMap<>(); + Bukkit.getServer().getPluginManager().registerEvents(new CancelledEventsHandler(this), Main.plugin); + return true; + } + + public static Map<UUID, Location> getLoggingIn() + { + return loggingIn; + } + + @Command(hook = "register") + public void register(CommandSender sender, String password) + { + Player player = (Player) sender; + if (isRegistered(player)) + { + player.sendMessage(ChatColor.GREEN + "You are already registered!"); + return; + } + try + { + if (registerPlayer(player, password)) + { + player.sendMessage(ChatColor.GREEN + "Succesfully registered!"); + return; + } + } + catch (NoSuchAlgorithmException | NoSuchProviderException e) + { + e.printStackTrace(); + } + player.sendMessage(ChatColor.RED + "Failed to register, please contact an admin!"); + } + + @Command(hook = "login") + public void login(CommandSender sender, String password) + { + Player player = (Player) sender; + if (!isRegistered(player)) + { + player.sendMessage(ChatColor.RED + "You are not registered!"); + return; + } + if (CryptographyHandler.verify(password, getHash(player))) + { + loggingIn.remove(player.getUniqueId()); + } + else + { + player.sendMessage(ChatColor.RED + "Wrong password!"); + } + } + + @Command(hook = "cgpass") + public void cgpass(CommandSender sender, String oldPassword, String newPassword) + { + Player player = (Player) sender; + if (!isRegistered(player)) + { + player.sendMessage(ChatColor.RED + "You are not registered!"); + return; + } + if (!CryptographyHandler.verify(oldPassword, getHash(player))) + { + player.sendMessage(ChatColor.RED + "The old password you entered is wrong!"); + return; + } + if (oldPassword.equals(newPassword)) + { + player.sendMessage(ChatColor.RED + "You entered the same password!"); + return; + } + if (table.delete(getUuidConstraint(player))) + { + try + { + registerPlayer(player, newPassword); + player.sendMessage(ChatColor.GREEN + "Succesfully changed password!"); + } + catch (NoSuchAlgorithmException | NoSuchProviderException e) + { + e.printStackTrace(); + player.sendMessage(ChatColor.RED + "Failed to set new password!"); + } + } + else + { + player.sendMessage(ChatColor.RED + "Failed to remove old password from database!"); + } + } + + @Command(hook = "rmpass") + public void rmpass(CommandSender sender, String oldPassword) + { + Player player = (Player) sender; + if (!isRegistered(player)) + { + player.sendMessage(ChatColor.RED + "You are not registered!"); + return; + } + if (!CryptographyHandler.verify(oldPassword, getHash(player))) + { + player.sendMessage(ChatColor.RED + "The old password you entered is wrong!"); + return; + } + if (table.delete(getUuidConstraint(player))) + { + player.sendMessage(ChatColor.GREEN + "Succesfully removed password!"); + } + else + { + player.sendMessage(ChatColor.RED + "Failed to remove old password from database!"); + } + } + + @Command(hook = "rmotherpass") + public void rmotherpass(CommandSender sender, String playerName) + { + if (playerName.equals("")) + { + sender.sendMessage(ChatColor.RED + "That's not a valid player!"); + return; + } + @SuppressWarnings("deprecation") + OfflinePlayer player = Bukkit.getOfflinePlayer(playerName); + if (!isRegistered(player)) + { + sender.sendMessage(ChatColor.RED + "That player is not registered!"); + return; + } + if (table.delete(getUuidConstraint(player))) + { + sender.sendMessage(ChatColor.GREEN + "Successfully removed " + playerName + "'s password!"); + } + else + { + sender.sendMessage(ChatColor.RED + "Failed to remove " + playerName + "'s password!"); + } + } + + @EventHandler + public void onJoin(PlayerJoinEvent e) + { + Player player = e.getPlayer(); + if (!isRegistered(player)) + { + return; + } + getLogger().message(player, "You'll have to log in within 60s or you'll be kicked!"); + loggingIn.put(player.getUniqueId(), player.getLocation()); + BukkitScheduler scheduler = Bukkit.getScheduler(); + RepeatingLoginRunnable repeatingRunnable = new RepeatingLoginRunnable(this, player); + repeatingRunnable.setId(scheduler.scheduleSyncRepeatingTask(Main.plugin, repeatingRunnable, 0L, 2L)); + scheduler.scheduleSyncDelayedTask(Main.plugin, new Runnable() + { + @Override + public void run() + { + if (isLoggingIn(player)) + { + scheduler.cancelTask(repeatingRunnable.getId()); + player.kickPlayer("You didn't login in time!"); + } + } + }, 1200L); + } + + public boolean isLoggingIn(Player player) + { + return loggingIn.containsKey(player.getUniqueId()); + } + + public MysqlConstraint getUuidConstraint(OfflinePlayer player) + { + return new MysqlConstraint("uuid", ConstraintOperator.EQUAL, player.getUniqueId().toString()); + } + + public boolean isRegistered(OfflinePlayer player) + { + return table.get("uuid", getUuidConstraint(player)).length > 0; + } + + public String getHash(OfflinePlayer player) + { + return (String) table.get("pass", getUuidConstraint(player))[0]; + } + + public boolean registerPlayer(Player player, String password) + throws NoSuchAlgorithmException, NoSuchProviderException + { + String salt = CryptographyHandler.generateSalt(); + String hash = CryptographyHandler.hash(password, salt); + String toInsert = "$pbkdf2-sha256$200000$" + salt + "$" + hash; + return table.insert(player.getUniqueId().toString(), toInsert); + } +} |