diff --git a/pom.xml b/pom.xml index c928c9a6..9e15106c 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ fr.xephi authme - 5.1-SNAPSHOT + 5.2-SNAPSHOT jar AuthMeReloaded @@ -285,7 +285,7 @@ com.zaxxer HikariCP - 2.4.2 + 2.4.3 compile diff --git a/src/main/java/fr/xephi/authme/command/CommandDescription.java b/src/main/java/fr/xephi/authme/command/CommandDescription.java index 55947061..9114ff1a 100644 --- a/src/main/java/fr/xephi/authme/command/CommandDescription.java +++ b/src/main/java/fr/xephi/authme/command/CommandDescription.java @@ -57,25 +57,6 @@ public class CommandDescription { */ private CommandPermissions permissions; - /** - * Constructor. - * - * @param executableCommand The executable command, or null. - * @param labels List of command labels. - * @param description Command description. - * @param detailedDescription Detailed comment description. - * @param parent Parent command. - */ - @Deprecated - public CommandDescription(ExecutableCommand executableCommand, List labels, String description, String detailedDescription, CommandDescription parent) { - setExecutableCommand(executableCommand); - this.labels = labels; - this.description = description; - this.detailedDescription = detailedDescription; - setParent(parent); - this.arguments = new ArrayList<>(); - } - /** * Private constructor. Use {@link CommandDescription#builder()} to create instances of this class. *

diff --git a/src/main/java/fr/xephi/authme/command/CommandInitializer.java b/src/main/java/fr/xephi/authme/command/CommandInitializer.java index 9fa40c1f..9381499c 100644 --- a/src/main/java/fr/xephi/authme/command/CommandInitializer.java +++ b/src/main/java/fr/xephi/authme/command/CommandInitializer.java @@ -184,7 +184,6 @@ public final class CommandInitializer { .withArgument("player", "Player Name", false) .build(); - // Register the spawn command CommandDescription.builder() .executableCommand(new SpawnCommand()) @@ -216,7 +215,6 @@ public final class CommandInitializer { .permissions(OP_ONLY, AdminPermission.FIRST_SPAWN) .build(); - // Register the setfirstspawn command CommandDescription.builder() .executableCommand(new SetFirstSpawnCommand()) @@ -242,7 +240,8 @@ public final class CommandInitializer { CommandDescription.builder() .executableCommand(new PurgeLastPositionCommand()) .parent(AUTHME_BASE) - .labels("resetpos", "purgelastposition", "purgelastpos", "resetposition", "resetlastposition", "resetlastpos") + .labels("resetpos", "purgelastposition", "purgelastpos", "resetposition", + "resetlastposition", "resetlastpos") .description("Purge player's last position") .detailedDescription("Purge the last know position of the specified player.") .permissions(OP_ONLY, AdminPermission.PURGE_LAST_POSITION) @@ -250,7 +249,7 @@ public final class CommandInitializer { .build(); // Register the purgebannedplayers command - CommandDescription purgeBannedPlayersCommand = CommandDescription.builder() + CommandDescription.builder() .executableCommand(new PurgeBannedPlayersCommand()) .parent(AUTHME_BASE) .labels("purgebannedplayers", "purgebannedplayer", "deletebannedplayers", "deletebannedplayer") @@ -260,7 +259,7 @@ public final class CommandInitializer { .build(); // Register the switchantibot command - CommandDescription switchAntiBotCommand = CommandDescription.builder() + CommandDescription.builder() .executableCommand(new SwitchAntiBotCommand()) .parent(AUTHME_BASE) .labels("switchantibot", "toggleantibot", "antibot") @@ -270,26 +269,13 @@ public final class CommandInitializer { .withArgument("mode", "ON / OFF", true) .build(); - // // Register the resetname command - // CommandDescription resetNameCommand = new CommandDescription( - // new ResetNameCommand(), - // new ArrayList() {{ - // add("resetname"); - // add("resetnames"); - // }}, - // "Reset name", - // "Reset name", - // authMeCommand); - // resetNameCommand.setCommandPermissions("authme.admin.resetname", - // CommandPermissions.DefaultPermission.OP_ONLY); - // Register the reload command - CommandDescription reloadCommand = CommandDescription.builder() - .executableCommand(new PurgeLastPositionCommand()) + CommandDescription.builder() + .executableCommand(new ReloadCommand()) .parent(AUTHME_BASE) - .labels("reload", "reload") + .labels("reload", "rld") .description("Reload plugin") - .detailedDescription("Reload the AutheMeReloaded plugin.") + .detailedDescription("Reload the AuthMeReloaded plugin.") .permissions(OP_ONLY, AdminPermission.RELOAD) .build(); @@ -315,13 +301,12 @@ public final class CommandInitializer { .build(); // Register the help command - CommandDescription loginHelpCommand = CommandDescription.builder() + CommandDescription.builder() .executableCommand(helpCommandExecutable) .parent(LOGIN_BASE) .labels(helpCommandLabels) .description("View Help") .detailedDescription("View detailed help pages about AuthMeReloaded login commands.") - .permissions(ALLOWED) .withArgument("query", "The command or query to view help for.", true) .build(); @@ -336,13 +321,12 @@ public final class CommandInitializer { .build(); // Register the help command - CommandDescription logoutHelpCommand = CommandDescription.builder() + CommandDescription.builder() .executableCommand(helpCommandExecutable) .parent(LOGOUT_BASE) .labels(helpCommandLabels) .description("View help") .detailedDescription("View detailed help pages about AuthMeReloaded logout commands.") - .permissions(ALLOWED) .withArgument("query", "The command or query to view help for.", true) .build(); @@ -359,13 +343,12 @@ public final class CommandInitializer { .build(); // Register the help command - CommandDescription registerHelpCommand = CommandDescription.builder() + CommandDescription.builder() .executableCommand(helpCommandExecutable) .parent(REGISTER_BASE) .labels(helpCommandLabels) .description("View help") .detailedDescription("View detailed help pages about AuthMeReloaded register commands.") - .permissions(ALLOWED) .withArgument("query", "The command or query to view help for.", true) .build(); @@ -381,13 +364,12 @@ public final class CommandInitializer { .build(); // Register the help command - CommandDescription unregisterHelpCommand = CommandDescription.builder() + CommandDescription.builder() .executableCommand(helpCommandExecutable) .parent(UNREGISTER_BASE) .labels(helpCommandLabels) .description("View help") .detailedDescription("View detailed help pages about AuthMeReloaded unregister commands.") - .permissions(ALLOWED) .withArgument("query", "The command or query to view help for.", true) .build(); @@ -404,13 +386,12 @@ public final class CommandInitializer { .build(); // Register the help command - CommandDescription changePasswordHelpCommand = CommandDescription.builder() + CommandDescription.builder() .executableCommand(helpCommandExecutable) .parent(CHANGE_PASSWORD_BASE) .labels(helpCommandLabels) .description("View help") .detailedDescription("View detailed help pages about AuthMeReloaded changepassword commands.") - .permissions(ALLOWED) .withArgument("query", "The command or query to view help for.", true) .build(); @@ -421,39 +402,37 @@ public final class CommandInitializer { .labels("email", "mail") .description("Email command") .detailedDescription("The AuthMeReloaded Email command base.") - .permissions(ALLOWED) .build(); // Register the help command - CommandDescription emailHelpCommand = CommandDescription.builder() + CommandDescription.builder() .executableCommand(helpCommandExecutable) .parent(EMAIL_BASE) .labels(helpCommandLabels) .description("View help") .detailedDescription("View detailed help pages about AuthMeReloaded email commands.") - .permissions(ALLOWED) .withArgument("query", "The command or query to view help for.", true) .build(); // Register the add command - CommandDescription addEmailCommand = CommandDescription.builder() + CommandDescription.builder() .executableCommand(new AddEmailCommand()) .parent(EMAIL_BASE) .labels("add", "addemail", "addmail") .description("Add Email") - .detailedDescription("Add a new Email address to your account.") + .detailedDescription("Add a new email address to your account.") .permissions(ALLOWED, PlayerPermission.ADD_EMAIL) .withArgument("email", "Email address", false) .withArgument("verifyEmail", "Email address verification", false) .build(); // Register the change command - CommandDescription changeEmailCommand = CommandDescription.builder() + CommandDescription.builder() .executableCommand(new ChangeEmailCommand()) .parent(EMAIL_BASE) .labels("change", "changeemail", "changemail") .description("Change Email") - .detailedDescription("Change an Email address of your account.") + .detailedDescription("Change an email address of your account.") .permissions(ALLOWED, PlayerPermission.CHANGE_EMAIL) .withArgument("oldEmail", "Old email address", false) .withArgument("newEmail", "New email address", false) @@ -461,12 +440,13 @@ public final class CommandInitializer { // Register the recover command - CommandDescription recoverEmailCommand = CommandDescription.builder() + CommandDescription.builder() .executableCommand(new RecoverEmailCommand()) .parent(EMAIL_BASE) .labels("recover", "recovery", "recoveremail", "recovermail") .description("Recover password using Email") - .detailedDescription("Recover your account using an Email address by sending a mail containing a new password.") + .detailedDescription("Recover your account using an Email address by sending a mail containing " + + "a new password.") .permissions(ALLOWED, PlayerPermission.RECOVER_EMAIL) .withArgument("email", "Email address", false) .build(); @@ -477,19 +457,18 @@ public final class CommandInitializer { .parent(null) .labels("captcha", "capt") .description("Captcha Command") - .detailedDescription("Captcha command for AuthMeRelaoded.") + .detailedDescription("Captcha command for AuthMeReloaded.") .permissions(ALLOWED, PlayerPermission.CAPTCHA) .withArgument("captcha", "The Captcha", false) .build(); // Register the help command - CommandDescription captchaHelpCommand = CommandDescription.builder() + CommandDescription.builder() .executableCommand(helpCommandExecutable) .parent(CAPTCHA_BASE) .labels(helpCommandLabels) .description("View help") .detailedDescription("View detailed help pages about AuthMeReloaded captcha commands.") - .permissions(ALLOWED) .withArgument("query", "The command or query to view help for.", true) .build(); @@ -499,19 +478,19 @@ public final class CommandInitializer { .parent(null) .labels("converter", "convert", "conv") .description("Converter Command") - .detailedDescription("Converter command for AuthMeRelaoded.") + .detailedDescription("Converter command for AuthMeReloaded.") .permissions(OP_ONLY, AdminPermission.CONVERTER) - .withArgument("job", "Conversion job: flattosql / flattosqlite /| xauth / crazylogin / rakamak / royalauth / vauth / sqltoflat", false) + .withArgument("job", "Conversion job: flattosql / flattosqlite /| xauth / crazylogin / rakamak / " + + "royalauth / vauth / sqltoflat", false) .build(); // Register the help command - CommandDescription converterHelpCommand = CommandDescription.builder() + CommandDescription.builder() .executableCommand(helpCommandExecutable) .parent(CONVERTER_BASE) .labels(helpCommandLabels) .description("View help") .detailedDescription("View detailed help pages about AuthMeReloaded converter commands.") - .permissions(OP_ONLY) .withArgument("query", "The command or query to view help for.", true) .build(); diff --git a/src/main/java/fr/xephi/authme/command/CommandPermissions.java b/src/main/java/fr/xephi/authme/command/CommandPermissions.java index 71649f3b..2c52f85a 100644 --- a/src/main/java/fr/xephi/authme/command/CommandPermissions.java +++ b/src/main/java/fr/xephi/authme/command/CommandPermissions.java @@ -7,7 +7,6 @@ import fr.xephi.authme.permission.PermissionNode; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.List; /** diff --git a/src/main/java/fr/xephi/authme/command/CommandUtils.java b/src/main/java/fr/xephi/authme/command/CommandUtils.java index 6903ff7a..6025a5d9 100644 --- a/src/main/java/fr/xephi/authme/command/CommandUtils.java +++ b/src/main/java/fr/xephi/authme/command/CommandUtils.java @@ -1,11 +1,10 @@ package fr.xephi.authme.command; +import java.util.List; + import fr.xephi.authme.util.CollectionUtils; import fr.xephi.authme.util.StringUtils; -import java.util.ArrayList; -import java.util.List; - public final class CommandUtils { public static int getMinNumberOfArguments(CommandDescription command) { diff --git a/src/main/java/fr/xephi/authme/command/help/HelpPrinter.java b/src/main/java/fr/xephi/authme/command/help/HelpPrinter.java index 5b520ea2..56ad48d8 100644 --- a/src/main/java/fr/xephi/authme/command/help/HelpPrinter.java +++ b/src/main/java/fr/xephi/authme/command/help/HelpPrinter.java @@ -1,5 +1,14 @@ package fr.xephi.authme.command.help; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + import fr.xephi.authme.AuthMe; import fr.xephi.authme.command.CommandArgumentDescription; import fr.xephi.authme.command.CommandDescription; @@ -8,15 +17,6 @@ import fr.xephi.authme.command.CommandPermissions; import fr.xephi.authme.permission.PermissionNode; import fr.xephi.authme.util.CollectionUtils; import fr.xephi.authme.util.StringUtils; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; /** */ diff --git a/src/main/java/fr/xephi/authme/listener/AuthMeBlockListener.java b/src/main/java/fr/xephi/authme/listener/AuthMeBlockListener.java index 01cbadc2..56b7916c 100644 --- a/src/main/java/fr/xephi/authme/listener/AuthMeBlockListener.java +++ b/src/main/java/fr/xephi/authme/listener/AuthMeBlockListener.java @@ -32,6 +32,12 @@ public class AuthMeBlockListener implements Listener { if (Utils.checkAuth(event.getPlayer())) { return; } + + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(event.getPlayer())) { + return; + } + event.setCancelled(true); } @@ -45,6 +51,12 @@ public class AuthMeBlockListener implements Listener { if (Utils.checkAuth(event.getPlayer())) { return; } + + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(event.getPlayer())) { + return; + } + event.setCancelled(true); } diff --git a/src/main/java/fr/xephi/authme/listener/AuthMeEntityListener.java b/src/main/java/fr/xephi/authme/listener/AuthMeEntityListener.java index 5e27814e..30b4af72 100644 --- a/src/main/java/fr/xephi/authme/listener/AuthMeEntityListener.java +++ b/src/main/java/fr/xephi/authme/listener/AuthMeEntityListener.java @@ -49,7 +49,12 @@ public class AuthMeEntityListener implements Listener { } Player player = (Player) entity; - if (Utils.checkAuth(player)) { + if (Utils.checkAuth(player) ) { + return; + } + + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(player)) { return; } player.setFireTicks(0); @@ -73,6 +78,11 @@ public class AuthMeEntityListener implements Listener { return; } + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC((Player) entity)) { + return; + } + event.setTarget(null); event.setCancelled(true); } @@ -83,7 +93,7 @@ public class AuthMeEntityListener implements Listener { * @param event EntityDamageByEntityEvent */ @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) - public void onDmg(EntityDamageByEntityEvent event) { + public void onDamage(EntityDamageByEntityEvent event) { Entity entity = event.getDamager(); if (entity == null || !(entity instanceof Player)) { return; @@ -94,6 +104,11 @@ public class AuthMeEntityListener implements Listener { return; } + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(player)) { + return; + } + event.setCancelled(true); } @@ -113,6 +128,11 @@ public class AuthMeEntityListener implements Listener { return; } + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC((Player) entity)) { + return; + } + event.setCancelled(true); } @@ -132,6 +152,11 @@ public class AuthMeEntityListener implements Listener { return; } + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC((Player) entity)) { + return; + } + event.setAmount(0); event.setCancelled(true); } @@ -152,6 +177,11 @@ public class AuthMeEntityListener implements Listener { return; } + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC((Player) entity)) { + return; + } + event.setCancelled(true); } @@ -171,6 +201,11 @@ public class AuthMeEntityListener implements Listener { return; } + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC((Player) entity)) { + return; + } + event.setCancelled(true); } @@ -210,6 +245,11 @@ public class AuthMeEntityListener implements Listener { return; } + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(player)) { + return; + } + event.setCancelled(true); } @@ -230,6 +270,11 @@ public class AuthMeEntityListener implements Listener { return; } + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(player)) { + return; + } + event.setCancelled(true); } diff --git a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java index b2a994ed..7fc36994 100644 --- a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java +++ b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java @@ -28,7 +28,24 @@ import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryOpenEvent; -import org.bukkit.event.player.*; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerBedEnterEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerFishEvent; +import org.bukkit.event.player.PlayerGameModeChangeEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerItemConsumeEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerShearEntityEvent; import java.util.concurrent.ConcurrentHashMap; @@ -53,7 +70,6 @@ public class AuthMePlayerListener implements Listener { } final Player player = event.getPlayer(); - if (Utils.checkAuth(player)) { for (Player p : Utils.getOnlinePlayers()) { if (!PlayerCache.getInstance().isAuthenticated(p.getName())) { @@ -64,6 +80,11 @@ public class AuthMePlayerListener implements Listener { } event.setCancelled(true); + sendLoginRegisterMSG(player); + } + + // TODO: new name + private void sendLoginRegisterMSG(final Player player) { plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { @Override public void run() { @@ -93,6 +114,7 @@ public class AuthMePlayerListener implements Listener { return; } event.setCancelled(true); + sendLoginRegisterMSG(event.getPlayer()); } @EventHandler(ignoreCancelled = true, priority = EventPriority.NORMAL) @@ -169,17 +191,22 @@ public class AuthMePlayerListener implements Listener { @EventHandler(priority = EventPriority.LOWEST) public void onPlayerJoin(PlayerJoinEvent event) { - if (event.getPlayer() == null || Utils.isNPC(event.getPlayer())) { + final Player player = event.getPlayer(); + if (player == null) { return; } - final Player player = event.getPlayer(); + /* IMPOSSIBLE!!!! TODO: check this! + if(Utils.isNPC(player)) { + return; + } + */ + String name = player.getName().toLowerCase(); String joinMsg = event.getJoinMessage(); - boolean delay = Settings.delayJoinLeaveMessages && joinMsg != null; // Remove the join message while the player isn't logging in - if (delay) { + if (Settings.delayJoinLeaveMessages && joinMsg != null) { event.setJoinMessage(null); joinMessage.put(name, joinMsg); } @@ -237,11 +264,16 @@ public class AuthMePlayerListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerLogin(PlayerLoginEvent event) { - if (event.getPlayer() == null || Utils.isUnrestricted(event.getPlayer())) { + final Player player = event.getPlayer(); + if (player == null || Utils.isUnrestricted(player)) { return; } - if (event.getResult() == PlayerLoginEvent.Result.KICK_FULL) { + // Get the permissions manager + PermissionsManager permsMan = plugin.getPermissionsManager(); + + if (event.getResult() == PlayerLoginEvent.Result.KICK_FULL + && permsMan.hasPermission(player, PlayerPermission.IS_VIP)) { int playersOnline = Utils.getOnlinePlayers().size(); if (playersOnline > plugin.getServer().getMaxPlayers()) { event.allow(); @@ -262,10 +294,6 @@ public class AuthMePlayerListener implements Listener { return; } - // Get the permissions manager - PermissionsManager permsMan = plugin.getPermissionsManager(); - - final Player player = event.getPlayer(); if (event.getResult() == PlayerLoginEvent.Result.KICK_FULL && !permsMan.hasPermission(player, PlayerPermission.IS_VIP)) { event.setKickMessage(m.retrieveSingle(MessageKey.KICK_FULL_SERVER)); event.setResult(PlayerLoginEvent.Result.KICK_FULL); @@ -311,12 +339,12 @@ public class AuthMePlayerListener implements Listener { @EventHandler(priority = EventPriority.MONITOR) public void onPlayerQuit(PlayerQuitEvent event) { - if (event.getPlayer() == null) { + Player player = event.getPlayer(); + + if (player == null) { return; } - Player player = event.getPlayer(); - if (Settings.delayJoinLeaveMessages && !Utils.checkAuth(player)) { event.setQuitMessage(null); } @@ -326,7 +354,9 @@ public class AuthMePlayerListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) public void onPlayerKick(PlayerKickEvent event) { - if (event.getPlayer() == null) { + Player player = event.getPlayer(); + + if (player == null) { return; } @@ -336,13 +366,15 @@ public class AuthMePlayerListener implements Listener { return; } - Player player = event.getPlayer(); plugin.getManagement().performQuit(player, true); } @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onPlayerPickupItem(PlayerPickupItemEvent event) { - if (Utils.checkAuth(event.getPlayer())) { + Player player = event.getPlayer(); + + // TODO: npc status can be used to bypass security!!! + if (Utils.checkAuth(player) || Utils.isNPC(player)) { return; } event.setCancelled(true); @@ -350,7 +382,10 @@ public class AuthMePlayerListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onPlayerInteract(PlayerInteractEvent event) { - if (Utils.checkAuth(event.getPlayer())) { + Player player = event.getPlayer(); + + // TODO: npc status can be used to bypass security!!! + if (Utils.checkAuth(player) || Utils.isNPC(player)) { return; } event.setCancelled(true); @@ -358,7 +393,10 @@ public class AuthMePlayerListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.NORMAL) public void onPlayerConsumeItem(PlayerItemConsumeEvent event) { - if (Utils.checkAuth(event.getPlayer())) { + Player player = event.getPlayer(); + + // TODO: npc status can be used to bypass security!!! + if (Utils.checkAuth(player) || Utils.isNPC(player)) { return; } event.setCancelled(true); @@ -367,7 +405,9 @@ public class AuthMePlayerListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onPlayerInventoryOpen(InventoryOpenEvent event) { final Player player = (Player) event.getPlayer(); - if (Utils.checkAuth(player)) { + + // TODO: npc status can be used to bypass security!!! + if (Utils.checkAuth(player) || Utils.isNPC(player)) { return; } event.setCancelled(true); @@ -392,6 +432,10 @@ public class AuthMePlayerListener implements Listener { return; if (Utils.checkAuth((Player) event.getWhoClicked())) return; + + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC((Player) event.getWhoClicked())) + return; event.setCancelled(true); } @@ -404,6 +448,11 @@ public class AuthMePlayerListener implements Listener { if (Utils.checkAuth((Player) damager)) { return; } + + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC((Player) damager)) { + return; + } event.setCancelled(true); } @@ -412,6 +461,11 @@ public class AuthMePlayerListener implements Listener { if (Utils.checkAuth(event.getPlayer())) { return; } + + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(event.getPlayer())) { + return; + } event.setCancelled(true); } @@ -420,6 +474,11 @@ public class AuthMePlayerListener implements Listener { if (Utils.checkAuth(event.getPlayer())) { return; } + + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(event.getPlayer())) { + return; + } event.setCancelled(true); } @@ -428,6 +487,11 @@ public class AuthMePlayerListener implements Listener { if (Utils.checkAuth(event.getPlayer())) { return; } + + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(event.getPlayer())) { + return; + } event.setCancelled(true); } @@ -436,6 +500,11 @@ public class AuthMePlayerListener implements Listener { if (Utils.checkAuth(event.getPlayer())) { return; } + + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(event.getPlayer())) { + return; + } event.setCancelled(true); } @@ -445,6 +514,11 @@ public class AuthMePlayerListener implements Listener { return; } + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(event.getPlayer())) { + return; + } + Player player = event.getPlayer(); String name = player.getName().toLowerCase(); Location spawn = plugin.getSpawnLocation(player); @@ -463,6 +537,11 @@ public class AuthMePlayerListener implements Listener { return; } + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(event.getPlayer())) { + return; + } + Player player = event.getPlayer(); if (plugin.getPermissionsManager().hasPermission(player, PlayerPermission.BYPASS_FORCE_SURVIVAL)) { return; @@ -481,6 +560,11 @@ public class AuthMePlayerListener implements Listener { if (Utils.checkAuth(event.getPlayer())) { return; } + + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(event.getPlayer())) { + return; + } event.setCancelled(true); } @@ -489,6 +573,11 @@ public class AuthMePlayerListener implements Listener { if (Utils.checkAuth(event.getPlayer())) { return; } + + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(event.getPlayer())) { + return; + } event.setCancelled(true); } diff --git a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener16.java b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener16.java index 2a83846b..0975b18a 100644 --- a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener16.java +++ b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener16.java @@ -32,6 +32,11 @@ public class AuthMePlayerListener16 implements Listener { if (Utils.checkAuth(event.getPlayer())) { return; } + + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(event.getPlayer())) { + return; + } event.setCancelled(true); } diff --git a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener18.java b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener18.java index d19fa2df..dbcb1c71 100644 --- a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener18.java +++ b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener18.java @@ -32,6 +32,11 @@ public class AuthMePlayerListener18 implements Listener { if (Utils.checkAuth(event.getPlayer())) { return; } + + // TODO: npc status can be used to bypass security!!! + if (Utils.isNPC(event.getPlayer())) { + return; + } event.setCancelled(true); } diff --git a/src/main/java/fr/xephi/authme/permission/PermissionsManager.java b/src/main/java/fr/xephi/authme/permission/PermissionsManager.java index 52e94226..63d755e8 100644 --- a/src/main/java/fr/xephi/authme/permission/PermissionsManager.java +++ b/src/main/java/fr/xephi/authme/permission/PermissionsManager.java @@ -328,7 +328,8 @@ public class PermissionsManager implements PermissionsService { } public boolean hasPermission(Player player, CommandDescription command) { - if (CollectionUtils.isEmpty(command.getCommandPermissions().getPermissionNodes())) { + if (command.getCommandPermissions() == null + || CollectionUtils.isEmpty(command.getCommandPermissions().getPermissionNodes())) { return true; } diff --git a/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java b/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java index c5269325..025defb2 100644 --- a/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java +++ b/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java @@ -80,15 +80,12 @@ public class AsynchronousLogin { plugin.captcha.remove(name); plugin.captcha.putIfAbsent(name, i); } - if (plugin.captcha.containsKey(name) && plugin.captcha.get(name) >= Settings.maxLoginTry) { - plugin.cap.put(name, rdm.nextString()); + if (plugin.captcha.containsKey(name) && plugin.captcha.get(name) > Settings.maxLoginTry) { + plugin.cap.putIfAbsent(name, rdm.nextString()); for (String s : m.retrieve(MessageKey.USAGE_CAPTCHA)) { player.sendMessage(s.replace("THE_CAPTCHA", plugin.cap.get(name)).replace("", plugin.cap.get(name))); } return true; - } else if (plugin.captcha.containsKey(name) && plugin.captcha.get(name) >= Settings.maxLoginTry) { - plugin.captcha.remove(name); - plugin.cap.remove(name); } } return false; diff --git a/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java b/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java index 540730f5..0cd0397b 100644 --- a/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java +++ b/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java @@ -47,7 +47,7 @@ public class AsynchronousQuit { public void process() { if (player == null) return; - if (Utils.isNPC(player) || Utils.isUnrestricted(player)) { + if (Utils.isUnrestricted(player)) { return; } diff --git a/src/main/java/fr/xephi/authme/util/Utils.java b/src/main/java/fr/xephi/authme/util/Utils.java index 3e3c52a0..e45b04a8 100644 --- a/src/main/java/fr/xephi/authme/util/Utils.java +++ b/src/main/java/fr/xephi/authme/util/Utils.java @@ -137,7 +137,7 @@ public final class Utils { // TODO: Move to a Manager public static boolean checkAuth(Player player) { - if (player == null || Utils.isUnrestricted(player) || Utils.isNPC(player)) { + if (player == null || Utils.isUnrestricted(player)) { return true; } diff --git a/src/test/java/fr/xephi/authme/command/executable/changepassword/ChangePasswordCommandTest.java b/src/test/java/fr/xephi/authme/command/executable/changepassword/ChangePasswordCommandTest.java index 9092205a..5c9c295c 100644 --- a/src/test/java/fr/xephi/authme/command/executable/changepassword/ChangePasswordCommandTest.java +++ b/src/test/java/fr/xephi/authme/command/executable/changepassword/ChangePasswordCommandTest.java @@ -13,19 +13,16 @@ import org.bukkit.Server; import org.bukkit.command.BlockCommandSender; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitScheduler; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.mockito.BDDMockito.given; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.*; diff --git a/src/tools/bathelpers/build_project.bat b/src/tools/bathelpers/build_project.bat index 01b515ba..f30ea024 100644 --- a/src/tools/bathelpers/build_project.bat +++ b/src/tools/bathelpers/build_project.bat @@ -3,4 +3,4 @@ if "%jarfile%" == "" ( call setvars.bat ) -mvn clean install -f "%pomfile%" \ No newline at end of file +mvn clean install -f "%pomfile%" -B