diff --git a/src/main/java/fr/xephi/authme/AuthMe.java b/src/main/java/fr/xephi/authme/AuthMe.java index 267dcc7d..047cf408 100644 --- a/src/main/java/fr/xephi/authme/AuthMe.java +++ b/src/main/java/fr/xephi/authme/AuthMe.java @@ -42,6 +42,7 @@ import fr.xephi.authme.output.Messages; import fr.xephi.authme.permission.PermissionsManager; import fr.xephi.authme.permission.PlayerStatePermission; import fr.xephi.authme.process.Management; +import fr.xephi.authme.process.ProcessService; import fr.xephi.authme.security.PasswordSecurity; import fr.xephi.authme.security.crypts.SHA256; import fr.xephi.authme.settings.NewSetting; @@ -304,7 +305,8 @@ public class AuthMe extends JavaPlugin { setupApi(); // Set up the management - management = new Management(this, newSettings); + ProcessService processService = new ProcessService(newSettings, messages, this); + management = new Management(this, processService, database, PlayerCache.getInstance()); // Set up the BungeeCord hook setupBungeeCordHook(); @@ -859,15 +861,6 @@ public class AuthMe extends JavaPlugin { return count >= Settings.getMaxLoginPerIp; } - public boolean hasJoinedIp(String name, String ip) { - int count = 0; - for (Player player : Utils.getOnlinePlayers()) { - if (ip.equalsIgnoreCase(getIP(player)) && !player.getName().equalsIgnoreCase(name)) - count++; - } - return count >= Settings.getMaxJoinPerIp; - } - /** * Handle Bukkit commands. * diff --git a/src/main/java/fr/xephi/authme/process/Management.java b/src/main/java/fr/xephi/authme/process/Management.java index 597d927e..a42884ae 100644 --- a/src/main/java/fr/xephi/authme/process/Management.java +++ b/src/main/java/fr/xephi/authme/process/Management.java @@ -2,6 +2,7 @@ package fr.xephi.authme.process; import fr.xephi.authme.AuthMe; import fr.xephi.authme.cache.auth.PlayerCache; +import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.process.email.AsyncAddEmail; import fr.xephi.authme.process.email.AsyncChangeEmail; import fr.xephi.authme.process.join.AsynchronousJoin; @@ -20,18 +21,25 @@ public class Management { private final AuthMe plugin; private final BukkitScheduler sched; + private final ProcessService processService; + private final DataSource dataSource; + private final PlayerCache playerCache; private final NewSetting settings; /** * Constructor for Management. * * @param plugin AuthMe - * @param settings The plugin settings */ - public Management(AuthMe plugin, NewSetting settings) { + public Management(AuthMe plugin, ProcessService processService, DataSource dataSource, PlayerCache playerCache) { this.plugin = plugin; this.sched = this.plugin.getServer().getScheduler(); - this.settings = settings; + this.processService = processService; + this.dataSource = dataSource; + this.playerCache = playerCache; + + // FIXME don't pass settings anymore -> go through the service in the processes + this.settings = processService.getSettings(); } public void performLogin(final Player player, final String password, final boolean forceLogin) { @@ -39,7 +47,7 @@ public class Management { @Override public void run() { - new AsynchronousLogin(player, password, forceLogin, plugin, plugin.getDataSource(), settings) + new AsynchronousLogin(player, password, forceLogin, plugin, dataSource, settings) .process(); } }); @@ -60,7 +68,7 @@ public class Management { @Override public void run() { - new AsyncRegister(player, password, email, plugin, plugin.getDataSource(), settings).process(); + new AsyncRegister(player, password, email, plugin, dataSource, settings).process(); } }); } @@ -76,14 +84,7 @@ public class Management { } public void performJoin(final Player player) { - sched.runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - new AsynchronousJoin(player, plugin, plugin.getDataSource()).process(); - } - - }); + runTask(new AsynchronousJoin(player, plugin, dataSource, playerCache, processService)); } public void performQuit(final Player player, final boolean isKick) { @@ -91,28 +92,26 @@ public class Management { @Override public void run() { - new AsynchronousQuit(player, plugin, plugin.getDataSource(), isKick).process(); + new AsynchronousQuit(player, plugin, dataSource, isKick).process(); } }); } public void performAddEmail(final Player player, final String newEmail) { - sched.runTaskAsynchronously(plugin, new Runnable() { - @Override - public void run() { - new AsyncAddEmail(player, plugin, newEmail, plugin.getDataSource(), - PlayerCache.getInstance(), settings).process(); - } - }); + runTask(new AsyncAddEmail(player, newEmail, dataSource, playerCache, processService)); } public void performChangeEmail(final Player player, final String oldEmail, final String newEmail) { sched.runTaskAsynchronously(plugin, new Runnable() { @Override public void run() { - new AsyncChangeEmail(player, plugin, oldEmail, newEmail, plugin.getDataSource(), PlayerCache.getInstance(), settings).process(); + new AsyncChangeEmail(player, plugin, oldEmail, newEmail, dataSource, playerCache, settings).process(); } }); } + + private void runTask(Process process) { + sched.runTaskAsynchronously(plugin, process); + } } diff --git a/src/main/java/fr/xephi/authme/process/Process.java b/src/main/java/fr/xephi/authme/process/Process.java new file mode 100644 index 00000000..d6efd2b2 --- /dev/null +++ b/src/main/java/fr/xephi/authme/process/Process.java @@ -0,0 +1,8 @@ +package fr.xephi.authme.process; + +/** + * Common interface for AuthMe processes. + */ +public interface Process extends Runnable { + +} diff --git a/src/main/java/fr/xephi/authme/process/ProcessService.java b/src/main/java/fr/xephi/authme/process/ProcessService.java new file mode 100644 index 00000000..e52e4235 --- /dev/null +++ b/src/main/java/fr/xephi/authme/process/ProcessService.java @@ -0,0 +1,63 @@ +package fr.xephi.authme.process; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.output.MessageKey; +import fr.xephi.authme.output.Messages; +import fr.xephi.authme.settings.NewSetting; +import fr.xephi.authme.settings.domain.Property; +import org.bukkit.command.CommandSender; +import org.bukkit.event.Event; +import org.bukkit.scheduler.BukkitTask; + +/** + * Service for asynchronous and synchronous processes. + */ +public class ProcessService { + + private final NewSetting settings; + private final Messages messages; + private final AuthMe authMe; + + public ProcessService(NewSetting settings, Messages messages, AuthMe authMe) { + this.settings = settings; + this.messages = messages; + this.authMe = authMe; + } + + public T getProperty(Property property) { + return settings.getProperty(property); + } + + public NewSetting getSettings() { + return settings; + } + + public void send(CommandSender sender, MessageKey key) { + messages.send(sender, key); + } + + public String retrieveMessage(MessageKey key) { + return messages.retrieveSingle(key); + } + + public BukkitTask runTask(Runnable task) { + return authMe.getServer().getScheduler().runTask(authMe, task); + } + + public BukkitTask runTaskLater(Runnable task, long delay) { + return authMe.getServer().getScheduler().runTaskLater(authMe, task, delay); + } + + public int scheduleSyncDelayedTask(Runnable task) { + return authMe.getServer().getScheduler().scheduleSyncDelayedTask(authMe, task); + } + + public void callEvent(Event event) { + authMe.getServer().getPluginManager().callEvent(event); + } + + public AuthMe getAuthMe() { + return authMe; + } + +} diff --git a/src/main/java/fr/xephi/authme/process/email/AsyncAddEmail.java b/src/main/java/fr/xephi/authme/process/email/AsyncAddEmail.java index d5908820..d1e49b93 100644 --- a/src/main/java/fr/xephi/authme/process/email/AsyncAddEmail.java +++ b/src/main/java/fr/xephi/authme/process/email/AsyncAddEmail.java @@ -1,40 +1,38 @@ package fr.xephi.authme.process.email; -import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.output.MessageKey; -import fr.xephi.authme.output.Messages; -import fr.xephi.authme.settings.NewSetting; -import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.process.Process; +import fr.xephi.authme.process.ProcessService; +import fr.xephi.authme.settings.properties.RegistrationSettings; import fr.xephi.authme.util.Utils; import org.bukkit.entity.Player; /** * Async task to add an email to an account. */ -public class AsyncAddEmail { +public class AsyncAddEmail implements Process { private final Player player; private final String email; - private final Messages messages; + private final ProcessService service; private final DataSource dataSource; private final PlayerCache playerCache; - private final NewSetting settings; - public AsyncAddEmail(Player player, AuthMe plugin, String email, DataSource dataSource, - PlayerCache playerCache, NewSetting settings) { - this.messages = plugin.getMessages(); + public AsyncAddEmail(Player player, String email, DataSource dataSource, PlayerCache playerCache, + ProcessService service) { this.player = player; this.email = email; this.dataSource = dataSource; this.playerCache = playerCache; - this.settings = settings; + this.service = service; } - public void process() { + @Override + public void run() { String playerName = player.getName().toLowerCase(); if (playerCache.isAuthenticated(playerName)) { @@ -42,19 +40,19 @@ public class AsyncAddEmail { final String currentEmail = auth.getEmail(); if (currentEmail != null && !"your@email.com".equals(currentEmail)) { - messages.send(player, MessageKey.USAGE_CHANGE_EMAIL); - } else if (!Utils.isEmailCorrect(email, settings)) { - messages.send(player, MessageKey.INVALID_EMAIL); + service.send(player, MessageKey.USAGE_CHANGE_EMAIL); + } else if (!Utils.isEmailCorrect(email, service.getSettings())) { + service.send(player, MessageKey.INVALID_EMAIL); } else if (dataSource.isEmailStored(email)) { - messages.send(player, MessageKey.EMAIL_ALREADY_USED_ERROR); + service.send(player, MessageKey.EMAIL_ALREADY_USED_ERROR); } else { auth.setEmail(email); if (dataSource.updateEmail(auth)) { playerCache.updatePlayer(auth); - messages.send(player, MessageKey.EMAIL_ADDED_SUCCESS); + service.send(player, MessageKey.EMAIL_ADDED_SUCCESS); } else { ConsoleLogger.showError("Could not save email for player '" + player + "'"); - messages.send(player, MessageKey.ERROR); + service.send(player, MessageKey.ERROR); } } } else { @@ -64,11 +62,11 @@ public class AsyncAddEmail { private void sendUnloggedMessage(DataSource dataSource) { if (dataSource.isAuthAvailable(player.getName())) { - messages.send(player, MessageKey.LOGIN_MESSAGE); - } else if (Settings.emailRegistration) { - messages.send(player, MessageKey.REGISTER_EMAIL_MESSAGE); + service.send(player, MessageKey.LOGIN_MESSAGE); + } else if (service.getProperty(RegistrationSettings.USE_EMAIL_REGISTRATION)) { + service.send(player, MessageKey.REGISTER_EMAIL_MESSAGE); } else { - messages.send(player, MessageKey.REGISTER_MESSAGE); + service.send(player, MessageKey.REGISTER_MESSAGE); } } diff --git a/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java b/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java index e1b6096b..455c7683 100644 --- a/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java +++ b/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java @@ -11,66 +11,71 @@ import fr.xephi.authme.events.ProtectInventoryEvent; import fr.xephi.authme.events.SpawnTeleportEvent; import fr.xephi.authme.listener.AuthMePlayerListener; import fr.xephi.authme.output.MessageKey; -import fr.xephi.authme.output.Messages; import fr.xephi.authme.permission.PlayerStatePermission; +import fr.xephi.authme.process.Process; +import fr.xephi.authme.process.ProcessService; +import fr.xephi.authme.settings.NewSetting; import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Spawn; +import fr.xephi.authme.settings.properties.HooksSettings; +import fr.xephi.authme.settings.properties.PluginSettings; +import fr.xephi.authme.settings.properties.RegistrationSettings; +import fr.xephi.authme.settings.properties.RestrictionSettings; import fr.xephi.authme.task.MessageTask; import fr.xephi.authme.task.TimeoutTask; import fr.xephi.authme.util.Utils; import fr.xephi.authme.util.Utils.GroupType; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitTask; /** */ -public class AsynchronousJoin { +public class AsynchronousJoin implements Process { private final AuthMe plugin; private final Player player; private final DataSource database; private final String name; - private final Messages m; - private final BukkitScheduler sched; + private final ProcessService service; + private final PlayerCache playerCache; - public AsynchronousJoin(Player player, AuthMe plugin, DataSource database) { - this.m = plugin.getMessages(); + public AsynchronousJoin(Player player, AuthMe plugin, DataSource database, PlayerCache playerCache, + ProcessService service) { this.player = player; this.plugin = plugin; - this.sched = plugin.getServer().getScheduler(); this.database = database; this.name = player.getName().toLowerCase(); + this.service = service; + this.playerCache = playerCache; } - public void process() { + @Override + public void run() { if (Utils.isUnrestricted(player)) { return; } - if (Settings.checkVeryGames) { + if (service.getProperty(HooksSettings.ENABLE_VERYGAMES_IP_CHECK)) { plugin.getVerygamesIp(player); } - if (plugin.ess != null && Settings.disableSocialSpy) { + if (plugin.ess != null && service.getProperty(HooksSettings.DISABLE_SOCIAL_SPY)) { plugin.ess.getUser(player).setSocialSpyEnabled(false); } final String ip = plugin.getIP(player); - if (Settings.isAllowRestrictedIp && isNameRestricted(name, ip, player.getAddress().getHostName())) { - sched.scheduleSyncDelayedTask(plugin, new Runnable() { - + if (isNameRestricted(name, ip, player.getAddress().getHostName(), service.getSettings())) { + service.scheduleSyncDelayedTask(new Runnable() { @Override public void run() { AuthMePlayerListener.causeByAuthMe.putIfAbsent(name, true); - player.kickPlayer(m.retrieveSingle(MessageKey.NOT_OWNER_ERROR)); + player.kickPlayer(service.retrieveMessage(MessageKey.NOT_OWNER_ERROR)); if (Settings.banUnsafeIp) { plugin.getServer().banIP(ip); } @@ -78,38 +83,34 @@ public class AsynchronousJoin { }); return; } - if (Settings.getMaxJoinPerIp > 0 + if (service.getProperty(RestrictionSettings.MAX_JOIN_PER_IP) > 0 && !plugin.getPermissionsManager().hasPermission(player, PlayerStatePermission.ALLOW_MULTIPLE_ACCOUNTS) - && !ip.equalsIgnoreCase("127.0.0.1") - && !ip.equalsIgnoreCase("localhost") - && plugin.hasJoinedIp(player.getName(), ip)) { - sched.scheduleSyncDelayedTask(plugin, new Runnable() { - + && !"127.0.0.1".equalsIgnoreCase(ip) + && !"localhost".equalsIgnoreCase(ip) + && hasJoinedIp(player.getName(), ip, service.getSettings(), service.getAuthMe())) { + service.scheduleSyncDelayedTask(new Runnable() { @Override public void run() { player.kickPlayer("A player with the same IP is already in game!"); } - }); return; } - final Location spawnLoc = plugin.getSpawnLocation(player); + final Location spawnLoc = Spawn.getInstance().getSpawnLocation(player); final boolean isAuthAvailable = database.isAuthAvailable(name); if (isAuthAvailable) { if (!Settings.noTeleport) { if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) { - sched.scheduleSyncDelayedTask(plugin, new Runnable() { - + service.scheduleSyncDelayedTask(new Runnable() { @Override public void run() { - SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name)); - plugin.getServer().getPluginManager().callEvent(tpEvent); + SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, playerCache.isAuthenticated(name)); + service.callEvent(tpEvent); if (!tpEvent.isCancelled() && player.isOnline() && tpEvent.getTo() != null && tpEvent.getTo().getWorld() != null) { player.teleport(tpEvent.getTo()); } } - }); } } @@ -123,12 +124,12 @@ public class AsynchronousJoin { if (ev.isCancelled()) { plugin.inventoryProtector.sendInventoryPacket(player); if (!Settings.noConsoleSpam) { - ConsoleLogger.info("ProtectInventoryEvent has been cancelled for " + player.getName() + " ..."); + ConsoleLogger.info("ProtectInventoryEvent has been cancelled for " + player.getName() + "..."); } } } - if (Settings.isSessionsEnabled && (PlayerCache.getInstance().isAuthenticated(name) || database.isLogged(name))) { + if (service.getProperty(PluginSettings.SESSIONS_ENABLED) && (playerCache.isAuthenticated(name) || database.isLogged(name))) { if (plugin.sessions.containsKey(name)) { plugin.sessions.get(name).cancel(); plugin.sessions.remove(name); @@ -137,11 +138,11 @@ public class AsynchronousJoin { database.setUnlogged(name); PlayerCache.getInstance().removePlayer(name); if (auth != null && auth.getIp().equals(ip)) { - m.send(player, MessageKey.SESSION_RECONNECTION); + service.send(player, MessageKey.SESSION_RECONNECTION); plugin.getManagement().performLogin(player, "dontneed", true); return; } else if (Settings.sessionExpireOnIpChange) { - m.send(player, MessageKey.SESSION_EXPIRED); + service.send(player, MessageKey.SESSION_EXPIRED); } } } else { @@ -154,21 +155,18 @@ public class AsynchronousJoin { if (!Settings.noTeleport && !needFirstSpawn() && Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) { - sched.scheduleSyncDelayedTask(plugin, new Runnable() { - + service.scheduleSyncDelayedTask(new Runnable() { @Override public void run() { - SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name)); - plugin.getServer().getPluginManager().callEvent(tpEvent); - if (!tpEvent.isCancelled() && player.isOnline() && tpEvent.getTo() != null - && tpEvent.getTo().getWorld() != null) { - player.teleport(tpEvent.getTo()); + SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name)); + service.callEvent(tpEvent); + if (!tpEvent.isCancelled() && player.isOnline() && tpEvent.getTo() != null + && tpEvent.getTo().getWorld() != null) { + player.teleport(tpEvent.getTo()); + } } - } - }); } - } if (!LimboCache.getInstance().hasLimboPlayer(name)) { @@ -176,9 +174,9 @@ public class AsynchronousJoin { } Utils.setGroup(player, isAuthAvailable ? GroupType.NOTLOGGEDIN : GroupType.UNREGISTERED); - final int timeOut = Settings.getRegistrationTimeout * 20; + final int registrationTimeout = service.getProperty(RestrictionSettings.TIMEOUT) * 20; - sched.scheduleSyncDelayedTask(plugin, new Runnable() { + service.scheduleSyncDelayedTask(new Runnable() { @Override public void run() { player.setOp(false); @@ -186,27 +184,22 @@ public class AsynchronousJoin { player.setFlySpeed(0.0f); player.setWalkSpeed(0.0f); } - player.setNoDamageTicks(timeOut); - if (Settings.useEssentialsMotd) { + player.setNoDamageTicks(registrationTimeout); + if (service.getProperty(HooksSettings.USE_ESSENTIALS_MOTD)) { player.performCommand("motd"); } - if (Settings.applyBlindEffect) { - int blindTimeOut; + if (service.getProperty(RegistrationSettings.APPLY_BLIND_EFFECT)) { // Allow infinite blindness effect - if (timeOut <= 0) { - blindTimeOut = 99999; - } else { - blindTimeOut = timeOut; - } + int blindTimeOut = (registrationTimeout <= 0) ? 99999 : registrationTimeout; player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, blindTimeOut, 2)); } } }); - int msgInterval = Settings.getWarnMessageInterval; - if (timeOut > 0) { - BukkitTask id = sched.runTaskLater(plugin, new TimeoutTask(plugin, name, player), timeOut); + int msgInterval = service.getProperty(RegistrationSettings.MESSAGE_INTERVAL); + if (registrationTimeout > 0) { + BukkitTask id = service.runTaskLater(new TimeoutTask(plugin, name, player), registrationTimeout); LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id); } @@ -219,7 +212,7 @@ public class AsynchronousJoin { : MessageKey.REGISTER_MESSAGE; } if (msgInterval > 0 && LimboCache.getInstance().getLimboPlayer(name) != null) { - BukkitTask msgTask = sched.runTask(plugin, new MessageTask(plugin, name, msg, msgInterval)); + BukkitTask msgTask = service.runTask(new MessageTask(plugin, name, msg, msgInterval)); LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(msgTask); } } @@ -235,13 +228,11 @@ public class AsynchronousJoin { if (!tpEvent.isCancelled()) { if (player.isOnline() && tpEvent.getTo() != null && tpEvent.getTo().getWorld() != null) { final Location fLoc = tpEvent.getTo(); - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { - + service.scheduleSyncDelayedTask(new Runnable() { @Override public void run() { player.teleport(fLoc); } - }); } } @@ -249,25 +240,23 @@ public class AsynchronousJoin { } private void placePlayerSafely(final Player player, final Location spawnLoc) { - if (spawnLoc == null) - return; - if (!Settings.noTeleport) + if (spawnLoc == null || service.getProperty(RestrictionSettings.NO_TELEPORT)) return; if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) return; if (!player.hasPlayedBefore()) return; - sched.scheduleSyncDelayedTask(plugin, new Runnable() { + service.scheduleSyncDelayedTask(new Runnable() { @Override public void run() { if (spawnLoc.getWorld() == null) { return; } Material cur = player.getLocation().getBlock().getType(); - Material top = player.getLocation().add(0D, 1D, 0D).getBlock().getType(); + Material top = player.getLocation().add(0, 1, 0).getBlock().getType(); if (cur == Material.PORTAL || cur == Material.ENDER_PORTAL || top == Material.PORTAL || top == Material.ENDER_PORTAL) { - m.send(player, MessageKey.UNSAFE_QUIT_LOCATION); + service.send(player, MessageKey.UNSAFE_QUIT_LOCATION); player.teleport(spawnLoc); } } @@ -281,12 +270,17 @@ public class AsynchronousJoin { * @param name The name to check * @param ip The IP address of the player * @param domain The hostname of the IP address + * @param settings The settings instance * @return True if the name is restricted (IP/domain is not allowed for the given name), * false if the restrictions are met or if the name has no restrictions to it */ - private static boolean isNameRestricted(String name, String ip, String domain) { + private static boolean isNameRestricted(String name, String ip, String domain, NewSetting settings) { + if (!settings.getProperty(RestrictionSettings.ENABLE_RESTRICTED_USERS)) { + return false; + } + boolean nameFound = false; - for (String entry : Settings.getRestrictedIp) { + for (String entry : settings.getProperty(RestrictionSettings.ALLOWED_RESTRICTED_USERS)) { String[] args = entry.split(";"); String testName = args[0]; String testIp = args[1]; @@ -301,4 +295,12 @@ public class AsynchronousJoin { return nameFound; } + private boolean hasJoinedIp(String name, String ip, NewSetting settings, AuthMe authMe) { + int count = 0; + for (Player player : Utils.getOnlinePlayers()) { + if (ip.equalsIgnoreCase(authMe.getIP(player)) && !player.getName().equalsIgnoreCase(name)) + count++; + } + return count >= settings.getProperty(RestrictionSettings.MAX_JOIN_PER_IP); + } } diff --git a/src/main/java/fr/xephi/authme/settings/Settings.java b/src/main/java/fr/xephi/authme/settings/Settings.java index 839e3737..591e55a0 100644 --- a/src/main/java/fr/xephi/authme/settings/Settings.java +++ b/src/main/java/fr/xephi/authme/settings/Settings.java @@ -60,7 +60,7 @@ public final class Settings { useCaptcha, emailRegistration, multiverse, bungee, banUnsafeIp, doubleEmailCheck, sessionExpireOnIpChange, disableSocialSpy, useEssentialsMotd, usePurge, - purgePlayerDat, purgeEssentialsFile, supportOldPassword, + purgePlayerDat, purgeEssentialsFile, purgeLimitedCreative, purgeAntiXray, purgePermissions, enableProtection, enableAntiBot, recallEmail, useWelcomeMessage, broadcastWelcomeMessage, forceRegKick, forceRegLogin, @@ -72,18 +72,16 @@ public final class Settings { getMySQLColumnGroup, unRegisteredGroup, backupWindowsPath, getRegisteredGroup, rakamakUsers, rakamakUsersIp, getmailAccount, defaultWorld, - getPhpbbPrefix, getWordPressPrefix, spawnPriority, crazyloginFileName, getPassRegex, sendPlayerTo; public static int getWarnMessageInterval, getSessionTimeout, getRegistrationTimeout, getMaxNickLength, getMinNickLength, getPasswordMinLen, getMovementRadius, getmaxRegPerIp, getNonActivatedGroup, passwordMaxLength, getRecoveryPassLength, getMailPort, maxLoginTry, captchaLength, saltLength, - getmaxRegPerEmail, bCryptLog2Rounds, getPhpbbGroup, + getmaxRegPerEmail, bCryptLog2Rounds, antiBotSensibility, antiBotDuration, delayRecall, getMaxLoginPerIp, getMaxJoinPerIp; protected static FileConfiguration configFile; - private static AuthMe plugin; /** * Constructor for Settings. @@ -91,28 +89,27 @@ public final class Settings { * @param pl AuthMe */ public Settings(AuthMe pl) { - plugin = pl; - configFile = plugin.getConfig(); + configFile = pl.getConfig(); loadVariables(); } - public static void loadVariables() { + private static void loadVariables() { isPermissionCheckEnabled = load(PluginSettings.ENABLE_PERMISSION_CHECK); isForcedRegistrationEnabled = configFile.getBoolean("settings.registration.force", true); isRegistrationEnabled = configFile.getBoolean("settings.registration.enabled", true); - isTeleportToSpawnEnabled = configFile.getBoolean("settings.restrictions.teleportUnAuthedToSpawn", false); - getWarnMessageInterval = configFile.getInt("settings.registration.messageInterval", 5); - isSessionsEnabled = configFile.getBoolean("settings.sessions.enabled", false); + isTeleportToSpawnEnabled = load(RestrictionSettings.TELEPORT_UNAUTHED_TO_SPAWN); + getWarnMessageInterval = load(RegistrationSettings.MESSAGE_INTERVAL); + isSessionsEnabled = load(PluginSettings.SESSIONS_ENABLED); getSessionTimeout = configFile.getInt("settings.sessions.timeout", 10); - getRegistrationTimeout = configFile.getInt("settings.restrictions.timeout", 30); - isChatAllowed = configFile.getBoolean("settings.restrictions.allowChat", false); + getRegistrationTimeout = load(RestrictionSettings.TIMEOUT); + isChatAllowed = load(RestrictionSettings.ALLOW_CHAT); getMaxNickLength = configFile.getInt("settings.restrictions.maxNicknameLength", 20); getMinNickLength = configFile.getInt("settings.restrictions.minNicknameLength", 3); getPasswordMinLen = configFile.getInt("settings.security.minPasswordLength", 4); getNickRegex = configFile.getString("settings.restrictions.allowedNicknameCharacters", "[a-zA-Z0-9_?]*"); nickPattern = Pattern.compile(getNickRegex); - isAllowRestrictedIp = configFile.getBoolean("settings.restrictions.AllowRestrictedUser", false); - getRestrictedIp = configFile.getStringList("settings.restrictions.AllowedRestrictedUser"); + isAllowRestrictedIp = load(RestrictionSettings.ENABLE_RESTRICTED_USERS); + getRestrictedIp = load(RestrictionSettings.ALLOWED_RESTRICTED_USERS); isMovementAllowed = configFile.getBoolean("settings.restrictions.allowMovement", false); isRemoveSpeedEnabled = configFile.getBoolean("settings.restrictions.removeSpeed", true); getMovementRadius = configFile.getInt("settings.restrictions.allowedMovementRadius", 100); @@ -170,7 +167,7 @@ public final class Settings { useCaptcha = configFile.getBoolean("Security.captcha.useCaptcha", false); maxLoginTry = configFile.getInt("Security.captcha.maxLoginTry", 5); captchaLength = configFile.getInt("Security.captcha.captchaLength", 5); - emailRegistration = configFile.getBoolean("settings.registration.enableEmailRegistrationSystem", false); + emailRegistration = load(RegistrationSettings.USE_EMAIL_REGISTRATION); saltLength = configFile.getInt("settings.security.doubleMD5SaltLength", 8); getmaxRegPerEmail = configFile.getInt("Email.maxRegPerEmail", 1); multiverse = load(HooksSettings.MULTIVERSE); @@ -188,10 +185,6 @@ public final class Settings { purgePlayerDat = configFile.getBoolean("Purge.removePlayerDat", false); purgeEssentialsFile = configFile.getBoolean("Purge.removeEssentialsFile", false); defaultWorld = configFile.getString("Purge.defaultWorld", "world"); - getPhpbbPrefix = configFile.getString("ExternalBoardOptions.phpbbTablePrefix", "phpbb_"); - getPhpbbGroup = configFile.getInt("ExternalBoardOptions.phpbbActivatedGroupId", 2); - supportOldPassword = configFile.getBoolean("settings.security.supportOldPasswordHash", false); - getWordPressPrefix = configFile.getString("ExternalBoardOptions.wordpressTablePrefix", "wp_"); purgeLimitedCreative = configFile.getBoolean("Purge.removeLimitedCreativesInventories", false); purgeAntiXray = configFile.getBoolean("Purge.removeAntiXRayFile", false); purgePermissions = configFile.getBoolean("Purge.removePermissions", false); @@ -211,13 +204,13 @@ public final class Settings { forceRegKick = configFile.getBoolean("settings.registration.forceKickAfterRegister", false); forceRegLogin = load(RegistrationSettings.FORCE_LOGIN_AFTER_REGISTER); spawnPriority = load(RestrictionSettings.SPAWN_PRIORITY); - getMaxLoginPerIp = configFile.getInt("settings.restrictions.maxLoginPerIp", 0); - getMaxJoinPerIp = configFile.getInt("settings.restrictions.maxJoinPerIp", 0); - checkVeryGames = configFile.getBoolean("VeryGames.enableIpCheck", false); + getMaxLoginPerIp = load(RestrictionSettings.MAX_LOGIN_PER_IP); + getMaxJoinPerIp = load(RestrictionSettings.MAX_JOIN_PER_IP); + checkVeryGames = load(HooksSettings.ENABLE_VERYGAMES_IP_CHECK); removeJoinMessage = load(RegistrationSettings.REMOVE_JOIN_MESSAGE); removeLeaveMessage = load(RegistrationSettings.REMOVE_LEAVE_MESSAGE); delayJoinMessage = load(RegistrationSettings.DELAY_JOIN_MESSAGE); - noTeleport = configFile.getBoolean("settings.restrictions.noTeleport", false); + noTeleport = load(RestrictionSettings.NO_TELEPORT); crazyloginFileName = configFile.getString("Converter.CrazyLogin.fileName", "accounts.db"); getPassRegex = configFile.getString("settings.restrictions.allowedPasswordCharacters", "[\\x21-\\x7E]*"); applyBlindEffect = configFile.getBoolean("settings.applyBlindEffect", false); diff --git a/src/main/java/fr/xephi/authme/settings/properties/RestrictionSettings.java b/src/main/java/fr/xephi/authme/settings/properties/RestrictionSettings.java index 4025c0be..dd26b9e7 100644 --- a/src/main/java/fr/xephi/authme/settings/properties/RestrictionSettings.java +++ b/src/main/java/fr/xephi/authme/settings/properties/RestrictionSettings.java @@ -64,7 +64,7 @@ public class RestrictionSettings implements SettingsClass { @Comment({ "To activate the restricted user feature you need", - "to enable this option and configure the AllowedRestrctedUser field."}) + "to enable this option and configure the AllowedRestrictedUser field."}) public static final Property ENABLE_RESTRICTED_USERS = newProperty("settings.restrictions.AllowRestrictedUser", false); diff --git a/src/main/java/fr/xephi/authme/task/ChangePasswordTask.java b/src/main/java/fr/xephi/authme/task/ChangePasswordTask.java index 0551b8ca..c5ff5b95 100644 --- a/src/main/java/fr/xephi/authme/task/ChangePasswordTask.java +++ b/src/main/java/fr/xephi/authme/task/ChangePasswordTask.java @@ -53,12 +53,12 @@ public class ChangePasswordTask implements Runnable { @Override public void run() { - ByteArrayDataOutput out = ByteStreams.newDataOutput(); - out.writeUTF("Forward"); - out.writeUTF("ALL"); - out.writeUTF("AuthMe"); - out.writeUTF("changepassword;" + name + ";" + hash + ";" + salt); - player.sendPluginMessage(plugin, "BungeeCord", out.toByteArray()); + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("Forward"); + out.writeUTF("ALL"); + out.writeUTF("AuthMe"); + out.writeUTF("changepassword;" + name + ";" + hash + ";" + salt); + player.sendPluginMessage(plugin, "BungeeCord", out.toByteArray()); } }); } diff --git a/src/main/java/fr/xephi/authme/util/Utils.java b/src/main/java/fr/xephi/authme/util/Utils.java index f12c8b34..a39ef756 100644 --- a/src/main/java/fr/xephi/authme/util/Utils.java +++ b/src/main/java/fr/xephi/authme/util/Utils.java @@ -154,8 +154,7 @@ public final class Utils { public static boolean isUnrestricted(Player player) { return Settings.isAllowRestrictedIp - && !Settings.getUnrestrictedName.isEmpty() - && (Settings.getUnrestrictedName.contains(player.getName().toLowerCase())); + && Settings.getUnrestrictedName.contains(player.getName().toLowerCase()); } public static void packCoords(double x, double y, double z, String w, final Player pl) { @@ -216,8 +215,7 @@ public final class Utils { ConsoleLogger.showError("Unknown list of online players of type " + type); } } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - ConsoleLogger.showError("Could not retrieve list of online players: [" - + e.getClass().getName() + "] " + e.getMessage()); + ConsoleLogger.logException("Could not retrieve list of online players:", e); } return Collections.emptyList(); } diff --git a/src/test/java/fr/xephi/authme/process/email/AsyncAddEmailTest.java b/src/test/java/fr/xephi/authme/process/email/AsyncAddEmailTest.java index 7cc7c55d..5c165039 100644 --- a/src/test/java/fr/xephi/authme/process/email/AsyncAddEmailTest.java +++ b/src/test/java/fr/xephi/authme/process/email/AsyncAddEmailTest.java @@ -1,14 +1,13 @@ package fr.xephi.authme.process.email; -import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLoggerTestInitializer; import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.output.MessageKey; -import fr.xephi.authme.output.Messages; +import fr.xephi.authme.process.ProcessService; import fr.xephi.authme.settings.NewSetting; -import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.RegistrationSettings; import fr.xephi.authme.util.WrapperMock; import org.bukkit.entity.Player; import org.junit.After; @@ -27,11 +26,10 @@ import static org.mockito.Mockito.when; */ public class AsyncAddEmailTest { - private Messages messages; private Player player; private DataSource dataSource; private PlayerCache playerCache; - private NewSetting settings; + private ProcessService service; @BeforeClass public static void setUp() { @@ -42,10 +40,10 @@ public class AsyncAddEmailTest { // Clean up the fields to ensure that no test uses elements of another test @After public void removeFieldValues() { - messages = null; player = null; dataSource = null; playerCache = null; + service = null; } @Test @@ -61,11 +59,11 @@ public class AsyncAddEmailTest { given(dataSource.updateEmail(any(PlayerAuth.class))).willReturn(true); // when - process.process(); + process.run(); // then verify(dataSource).updateEmail(auth); - verify(messages).send(player, MessageKey.EMAIL_ADDED_SUCCESS); + verify(service).send(player, MessageKey.EMAIL_ADDED_SUCCESS); verify(auth).setEmail("my.mail@example.org"); verify(playerCache).updatePlayer(auth); } @@ -83,11 +81,11 @@ public class AsyncAddEmailTest { given(dataSource.updateEmail(any(PlayerAuth.class))).willReturn(false); // when - process.process(); + process.run(); // then verify(dataSource).updateEmail(auth); - verify(messages).send(player, MessageKey.ERROR); + verify(service).send(player, MessageKey.ERROR); } @Test @@ -102,10 +100,10 @@ public class AsyncAddEmailTest { given(dataSource.isEmailStored("some.mail@example.org")).willReturn(false); // when - process.process(); + process.run(); // then - verify(messages).send(player, MessageKey.USAGE_CHANGE_EMAIL); + verify(service).send(player, MessageKey.USAGE_CHANGE_EMAIL); verify(playerCache, never()).updatePlayer(any(PlayerAuth.class)); } @@ -121,10 +119,10 @@ public class AsyncAddEmailTest { given(dataSource.isEmailStored("invalid_mail")).willReturn(false); // when - process.process(); + process.run(); // then - verify(messages).send(player, MessageKey.INVALID_EMAIL); + verify(service).send(player, MessageKey.INVALID_EMAIL); verify(playerCache, never()).updatePlayer(any(PlayerAuth.class)); } @@ -140,10 +138,10 @@ public class AsyncAddEmailTest { given(dataSource.isEmailStored("player@mail.tld")).willReturn(true); // when - process.process(); + process.run(); // then - verify(messages).send(player, MessageKey.EMAIL_ALREADY_USED_ERROR); + verify(service).send(player, MessageKey.EMAIL_ALREADY_USED_ERROR); verify(playerCache, never()).updatePlayer(any(PlayerAuth.class)); } @@ -156,10 +154,10 @@ public class AsyncAddEmailTest { given(dataSource.isAuthAvailable("Username12")).willReturn(true); // when - process.process(); + process.run(); // then - verify(messages).send(player, MessageKey.LOGIN_MESSAGE); + verify(service).send(player, MessageKey.LOGIN_MESSAGE); verify(playerCache, never()).updatePlayer(any(PlayerAuth.class)); } @@ -170,13 +168,13 @@ public class AsyncAddEmailTest { given(player.getName()).willReturn("user"); given(playerCache.isAuthenticated("user")).willReturn(false); given(dataSource.isAuthAvailable("user")).willReturn(false); - Settings.emailRegistration = true; + given(service.getProperty(RegistrationSettings.USE_EMAIL_REGISTRATION)).willReturn(true); // when - process.process(); + process.run(); // then - verify(messages).send(player, MessageKey.REGISTER_EMAIL_MESSAGE); + verify(service).send(player, MessageKey.REGISTER_EMAIL_MESSAGE); verify(playerCache, never()).updatePlayer(any(PlayerAuth.class)); } @@ -187,13 +185,13 @@ public class AsyncAddEmailTest { given(player.getName()).willReturn("user"); given(playerCache.isAuthenticated("user")).willReturn(false); given(dataSource.isAuthAvailable("user")).willReturn(false); - Settings.emailRegistration = false; + given(service.getProperty(RegistrationSettings.USE_EMAIL_REGISTRATION)).willReturn(false); // when - process.process(); + process.run(); // then - verify(messages).send(player, MessageKey.REGISTER_MESSAGE); + verify(service).send(player, MessageKey.REGISTER_MESSAGE); verify(playerCache, never()).updatePlayer(any(PlayerAuth.class)); } @@ -204,14 +202,12 @@ public class AsyncAddEmailTest { * @return The created process */ private AsyncAddEmail createProcess(String email) { - messages = mock(Messages.class); - AuthMe authMe = mock(AuthMe.class); - when(authMe.getMessages()).thenReturn(messages); player = mock(Player.class); dataSource = mock(DataSource.class); playerCache = mock(PlayerCache.class); - settings = mock(NewSetting.class); - return new AsyncAddEmail(player, authMe, email, dataSource, playerCache, settings); + service = mock(ProcessService.class); + when(service.getSettings()).thenReturn(mock(NewSetting.class)); + return new AsyncAddEmail(player, email, dataSource, playerCache, service); } }