From 0967f31b9ae019ed8b79b346cd4dbc22ade44c42 Mon Sep 17 00:00:00 2001 From: games647 Date: Mon, 21 Mar 2016 15:45:51 +0100 Subject: [PATCH] Optimize performance and thread-safety --- README.md | 5 +- .../bukkit/hooks/CrazyLoginHook.java | 12 +++- .../bukkit/hooks/LoginSecurityHook.java | 3 +- .../fastlogin/bukkit/hooks/RoyalAuthHook.java | 4 ++ .../fastlogin/bukkit/hooks/UltraAuthHook.java | 12 +++- .../fastlogin/bukkit/hooks/xAuthHook.java | 5 +- .../bungee/PlayerConnectionListener.java | 6 ++ .../bungee/hooks/BungeeAuthHook.java | 72 +++++++++++++------ 8 files changed, 87 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index f6a36608..d6d5b02a 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,11 @@ So they don't need to enter passwords. This is also called auto login (auto-logi *** ###Commands: -* /premium Label the invoker as paid account + * /premium [player] Label the invoker as paid account + * /cracked [player] Label the invoker as cracked account ###Permissions: -* fastlogin.bukkit.command.premium + * fastlogin.bukkit.command.premium ###Requirements: * Plugin: [ProtocolLib](http://www.spigotmc.org/resources/protocollib.1997/) diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/CrazyLoginHook.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/CrazyLoginHook.java index 78cf52b1..8556a2f0 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/CrazyLoginHook.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/CrazyLoginHook.java @@ -26,9 +26,9 @@ public class CrazyLoginHook implements BukkitAuthPlugin { @Override public void forceLogin(Player player) { - CrazyLogin crazyLoginPlugin = CrazyLogin.getPlugin(); + final CrazyLogin crazyLoginPlugin = CrazyLogin.getPlugin(); - LoginPlayerData playerData = crazyLoginPlugin.getPlayerData(player.getName()); + final LoginPlayerData playerData = crazyLoginPlugin.getPlayerData(player.getName()); if (playerData != null) { //mark the account as logged in playerData.setLoggedIn(true); @@ -50,9 +50,15 @@ public class CrazyLoginHook implements BukkitAuthPlugin { //illegalCommandUsesPerIP.remove(IP); //tempBans.remove(IP); playerData.addIP(ip); - crazyLoginPlugin.getCrazyDatabase().saveWithoutPassword(playerData); player.setMetadata("Authenticated", new Authenticated(crazyLoginPlugin, player)); crazyLoginPlugin.unregisterDynamicHooks(); + Bukkit.getScheduler().runTaskAsynchronously(crazyLoginPlugin, new Runnable() { + @Override + public void run() { + //SQL-Queries should run async + crazyLoginPlugin.getCrazyDatabase().saveWithoutPassword(playerData); + } + }); } } diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/LoginSecurityHook.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/LoginSecurityHook.java index 04501cb9..c1cf8447 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/LoginSecurityHook.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/LoginSecurityHook.java @@ -58,12 +58,13 @@ public class LoginSecurityHook implements BukkitAuthPlugin { UUID playerUUID = player.getUniqueId(); final String uuidString = playerUUID.toString().replace("-", ""); final InetAddress ipAddress = player.getAddress().getAddress(); + final String passwordHash = securityPlugin.hasher.hash(password); //this executes a sql query without interacting with other parts so we can run it async. Bukkit.getScheduler().runTaskAsynchronously(securityPlugin, new Runnable() { @Override public void run() { - dataManager.register(uuidString, password, securityPlugin.hasher.getTypeId(), ipAddress.toString()); + dataManager.register(uuidString, passwordHash, securityPlugin.hasher.getTypeId(), ipAddress.toString()); //run forcelogin only if it was successfull Bukkit.getScheduler().runTask(securityPlugin, new Runnable() { @Override diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/RoyalAuthHook.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/RoyalAuthHook.java index 3c1c9ede..1d1168ba 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/RoyalAuthHook.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/RoyalAuthHook.java @@ -16,6 +16,9 @@ public class RoyalAuthHook implements BukkitAuthPlugin { @Override public void forceLogin(Player player) { AuthPlayer authPlayer = AuthPlayer.getAuthPlayer(player); + +//https://github.com/RoyalDev/RoyalAuth/blob/master/src/main/java/org/royaldev/royalauth/commands/CmdLogin.java#L62 + //not thread-safe authPlayer.login(); } @@ -27,6 +30,7 @@ public class RoyalAuthHook implements BukkitAuthPlugin { @Override public void forceRegister(Player player, String password) { +//https://github.com/RoyalDev/RoyalAuth/blob/master/src/main/java/org/royaldev/royalauth/commands/CmdRegister.java#L50 AuthPlayer authPlayer = AuthPlayer.getAuthPlayer(player); authPlayer.setPassword(password, Config.passwordHashType); diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/UltraAuthHook.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/UltraAuthHook.java index 8f3285c6..2ff0d8e6 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/UltraAuthHook.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/UltraAuthHook.java @@ -9,6 +9,7 @@ import java.util.Set; import java.util.UUID; import org.bukkit.Achievement; +import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.EntityEffect; import org.bukkit.GameMode; @@ -54,6 +55,7 @@ import org.bukkit.scoreboard.Scoreboard; import org.bukkit.util.Vector; import ultraauth.api.UltraAuthAPI; +import ultraauth.main.Main; /** * Project page: @@ -74,8 +76,14 @@ public class UltraAuthHook implements BukkitAuthPlugin { } @Override - public void forceRegister(Player player, String password) { - UltraAuthAPI.setPlayerPasswordOnline(player, password); + public void forceRegister(final Player player, final String password) { + Bukkit.getScheduler().runTaskAsynchronously(Main.main, new Runnable() { + @Override + public void run() { + UltraAuthAPI.setPlayerPasswordOnline(player, password); + forceLogin(player); + } + }); } class FakePlayer implements Player { diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/xAuthHook.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/xAuthHook.java index 8c8c23ec..4c96c9d5 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/xAuthHook.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/hooks/xAuthHook.java @@ -20,11 +20,12 @@ public class xAuthHook implements BukkitAuthPlugin { xAuthPlayer xAuthPlayer = xAuthPlugin.getPlayerManager().getPlayer(player); if (xAuthPlayer != null) { - xAuthPlugin.getPlayerManager().doLogin(xAuthPlayer); - //we checked that the player is premium (paid account) //unprotect the inventory, op status... xAuthPlayer.setPremium(true); + + //not thread-safe + xAuthPlugin.getPlayerManager().doLogin(xAuthPlayer); } } diff --git a/bungee/src/main/java/com/github/games647/fastlogin/bungee/PlayerConnectionListener.java b/bungee/src/main/java/com/github/games647/fastlogin/bungee/PlayerConnectionListener.java index da18457e..e96a86e0 100644 --- a/bungee/src/main/java/com/github/games647/fastlogin/bungee/PlayerConnectionListener.java +++ b/bungee/src/main/java/com/github/games647/fastlogin/bungee/PlayerConnectionListener.java @@ -6,6 +6,9 @@ import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import java.util.UUID; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -67,6 +70,9 @@ public class PlayerConnectionListener implements Listener { BungeeAuthPlugin authPlugin = plugin.getBungeeAuthPlugin(); if (authPlugin != null) { authPlugin.forceLogin(player); + BaseComponent loginMessage = new TextComponent("Auto login"); + loginMessage.setColor(ChatColor.DARK_GREEN); + player.sendMessage(loginMessage); } } } diff --git a/bungee/src/main/java/com/github/games647/fastlogin/bungee/hooks/BungeeAuthHook.java b/bungee/src/main/java/com/github/games647/fastlogin/bungee/hooks/BungeeAuthHook.java index 7e8e0665..8f7bdde0 100644 --- a/bungee/src/main/java/com/github/games647/fastlogin/bungee/hooks/BungeeAuthHook.java +++ b/bungee/src/main/java/com/github/games647/fastlogin/bungee/hooks/BungeeAuthHook.java @@ -4,11 +4,13 @@ import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; +import java.util.concurrent.TimeUnit; import me.vik1395.BungeeAuth.ListenerClass; import me.vik1395.BungeeAuth.Main; import me.vik1395.BungeeAuth.Password.PasswordHandler; import me.vik1395.BungeeAuth.Tables; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -25,22 +27,34 @@ public class BungeeAuthHook implements BungeeAuthPlugin { private final Tables databaseConnection = new Tables(); @Override - public void forceLogin(ProxiedPlayer player) { + public void forceLogin(final ProxiedPlayer player) { //https://github.com/MatteCarra/BungeeAuth/blob/master/src/me/vik1395/BungeeAuth/Login.java#L92-95 Main.plonline.add(player.getName()); - try { - //renamed from ct to databaseConnection + + //renamed from ct to databaseConnection // databaseConnection.setStatus(player.getName(), "online"); + final Class[] parameterTypes = new Class[]{String.class, String.class}; + final Object[] arguments = new Object[]{player.getName(), "online"}; - Class[] parameterTypes = new Class[] {String.class, String.class}; - Object[] arguments = new Object[] {player.getName(), "online"}; - callProtected("setStatus", parameterTypes, arguments); + ProxyServer.getInstance().getScheduler().runAsync(Main.plugin, new Runnable() { + @Override + public void run() { + try { + callProtected("setStatus", parameterTypes, arguments); + ListenerClass.movePlayer(player, false); - ListenerClass.movePlayer(player, false); - ListenerClass.prelogin.get(player.getName()).cancel(); - } catch (Exception ex) { - Main.plugin.getLogger().severe("[BungeeAuth] Error force loging in player"); - } + ProxyServer.getInstance().getScheduler().schedule(Main.plugin, new Runnable() { + @Override + public void run() { + //not thread-safe + ListenerClass.prelogin.get(player.getName()).cancel(); + } + }, 0, TimeUnit.SECONDS); + } catch (Exception ex) { + Main.plugin.getLogger().severe("[BungeeAuth] Error force loging in player"); + } + } + }); } @Override @@ -51,7 +65,7 @@ public class BungeeAuthHook implements BungeeAuthPlugin { } @Override - public void forceRegister(ProxiedPlayer player, String password) { + public void forceRegister(final ProxiedPlayer player, String password) { //https://github.com/MatteCarra/BungeeAuth/blob/master/src/me/vik1395/BungeeAuth/Register.java#L102 PasswordHandler ph = new PasswordHandler(); Random rand = new Random(); @@ -68,18 +82,32 @@ public class BungeeAuthHook implements BungeeAuthPlugin { String hash = ph.newHash(Pw, pType); //creates a new SQL entry with the player's details. - try { - //renamed t to databaseConnection + + //renamed t to databaseConnection // databaseConnection.newPlayerEntry(player.getName(), hash, pType, "", lastip, regdate, lastip, lastseen); - Class[] parameterTypes = new Class[] {String.class, String.class, String.class, String.class - , String.class, String.class, String.class, String.class}; - Object[] arguments = new Object[] {player.getName(), hash, pType, "", lastip, regdate, lastip, lastseen}; - callProtected("newPlayerEntry", parameterTypes, arguments); - forceLogin(player); - } catch (Exception ex) { - Main.plugin.getLogger().severe("[BungeeAuth] Error when creating a new player in the MySQL Database"); - } + final Class[] parameterTypes = new Class[] {String.class, String.class, String.class, String.class + , String.class, String.class, String.class, String.class}; + final Object[] arguments = new Object[] {player.getName(), hash, pType, "", lastip, regdate, lastip, lastseen}; + + ProxyServer.getInstance().getScheduler().runAsync(Main.plugin, new Runnable() { + @Override + public void run() { + try { + callProtected("newPlayerEntry", parameterTypes, arguments); + + ProxyServer.getInstance().getScheduler().schedule(Main.plugin, new Runnable() { + @Override + public void run() { + //proparly not thread-safe + forceLogin(player); + } + }, 0, TimeUnit.SECONDS); + } catch (Exception ex) { + Main.plugin.getLogger().severe("[BungeeAuth] Error when creating a new player in the Database"); + } + } + }); } //pail ;(