Optimize performance and thread-safety

This commit is contained in:
games647
2016-03-21 15:45:51 +01:00
parent 8cb4621055
commit 0967f31b9a
8 changed files with 87 additions and 32 deletions

View File

@ -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/)

View File

@ -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);
}
});
}
}

View File

@ -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

View File

@ -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);

View File

@ -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 {

View File

@ -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);
}
}

View File

@ -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);
}
}
}

View File

@ -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 ;(