From d65556d893a0027e1f35cc2ceba705457ede23cd Mon Sep 17 00:00:00 2001 From: ljacqu Date: Sat, 29 Apr 2017 14:46:06 +0200 Subject: [PATCH] #857 Create event for failed authentication --- .../xephi/authme/events/FailedLoginEvent.java | 45 +++++++++++++++++++ .../authme/process/join/AsynchronousJoin.java | 6 +-- .../process/login/AsynchronousLogin.java | 3 ++ .../xephi/authme/service/BukkitService.java | 15 +++++++ .../authme/service/BukkitServiceTest.java | 35 +++++++++++++++ 5 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 src/main/java/fr/xephi/authme/events/FailedLoginEvent.java diff --git a/src/main/java/fr/xephi/authme/events/FailedLoginEvent.java b/src/main/java/fr/xephi/authme/events/FailedLoginEvent.java new file mode 100644 index 00000000..3a1e2d0d --- /dev/null +++ b/src/main/java/fr/xephi/authme/events/FailedLoginEvent.java @@ -0,0 +1,45 @@ +package fr.xephi.authme.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * Event fired when a player enters a wrong password. + */ +public class FailedLoginEvent extends CustomEvent { + + private static final HandlerList handlers = new HandlerList(); + private final Player player; + + /** + * Constructor. + * + * @param player The player + */ + public FailedLoginEvent(Player player, boolean isAsync) { + super(isAsync); + this.player = player; + } + + /** + * @return The player entering a wrong password + */ + public Player getPlayer() { + return player; + } + + /** + * Return the list of handlers, equivalent to {@link #getHandlers()} and required by {@link Event}. + * + * @return The list of handlers + */ + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} 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 53f4d8fd..5fb1b58b 100644 --- a/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java +++ b/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java @@ -18,7 +18,6 @@ import fr.xephi.authme.service.PluginHookService; import fr.xephi.authme.service.ValidationService; import fr.xephi.authme.settings.commandconfig.CommandManager; 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.util.PlayerUtils; @@ -115,9 +114,8 @@ public class AsynchronousJoin implements AsynchronousProcess { // Protect inventory if (service.getProperty(PROTECT_INVENTORY_BEFORE_LOGIN)) { - final boolean isAsync = service.getProperty(PluginSettings.USE_ASYNC_TASKS); - ProtectInventoryEvent ev = new ProtectInventoryEvent(player, isAsync); - bukkitService.callEvent(ev); + ProtectInventoryEvent ev = bukkitService.createAndCallEvent( + isAsync -> new ProtectInventoryEvent(player, isAsync)); if (ev.isCancelled()) { player.updateInventory(); ConsoleLogger.fine("ProtectInventoryEvent has been cancelled for " + player.getName() + "..."); 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 e4b80536..acec4180 100644 --- a/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java +++ b/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java @@ -9,6 +9,7 @@ import fr.xephi.authme.data.auth.PlayerCache; import fr.xephi.authme.data.limbo.LimboService; import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.events.AuthMeAsyncPreLoginEvent; +import fr.xephi.authme.events.FailedLoginEvent; import fr.xephi.authme.mail.EmailService; import fr.xephi.authme.message.MessageKey; import fr.xephi.authme.permission.AdminPermission; @@ -180,6 +181,8 @@ public class AsynchronousLogin implements AsynchronousProcess { */ private void handleWrongPassword(Player player, String ip) { ConsoleLogger.fine(player.getName() + " used the wrong password"); + + bukkitService.createAndCallEvent(isAsync -> new FailedLoginEvent(player, isAsync)); if (tempbanManager.shouldTempban(ip)) { tempbanManager.tempbanPlayer(player); } else if (service.getProperty(RestrictionSettings.KICK_ON_WRONG_PASSWORD)) { diff --git a/src/main/java/fr/xephi/authme/service/BukkitService.java b/src/main/java/fr/xephi/authme/service/BukkitService.java index 6180750a..45ea4b4b 100644 --- a/src/main/java/fr/xephi/authme/service/BukkitService.java +++ b/src/main/java/fr/xephi/authme/service/BukkitService.java @@ -25,6 +25,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.Set; +import java.util.function.Function; /** * Service for operations requiring the Bukkit API, such as for scheduling. @@ -263,6 +264,20 @@ public class BukkitService implements SettingsDependent { Bukkit.getPluginManager().callEvent(event); } + /** + * Creates an event with the provided function and emits it. + * + * @param eventSupplier the event supplier: function taking a boolean specifying whether AuthMe is configured + * in async mode or not + * @param the event type + * @return the event that was created and emitted + */ + public E createAndCallEvent(Function eventSupplier) { + E event = eventSupplier.apply(useAsyncTasks); + callEvent(event); + return event; + } + /** * Gets the world with the given name. * diff --git a/src/test/java/fr/xephi/authme/service/BukkitServiceTest.java b/src/test/java/fr/xephi/authme/service/BukkitServiceTest.java index e53a30b3..232d11ce 100644 --- a/src/test/java/fr/xephi/authme/service/BukkitServiceTest.java +++ b/src/test/java/fr/xephi/authme/service/BukkitServiceTest.java @@ -2,6 +2,7 @@ package fr.xephi.authme.service; import fr.xephi.authme.AuthMe; import fr.xephi.authme.ReflectionTestUtils; +import fr.xephi.authme.events.FailedLoginEvent; import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.properties.PluginSettings; import org.bukkit.Bukkit; @@ -9,6 +10,7 @@ import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; +import org.bukkit.plugin.PluginManager; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitTask; @@ -48,11 +50,14 @@ public class BukkitServiceTest { private Server server; @Mock private BukkitScheduler scheduler; + @Mock + private PluginManager pluginManager; @Before public void constructBukkitService() { ReflectionTestUtils.setField(Bukkit.class, null, "server", server); given(server.getScheduler()).willReturn(scheduler); + given(server.getPluginManager()).willReturn(pluginManager); given(settings.getProperty(PluginSettings.USE_ASYNC_TASKS)).willReturn(true); bukkitService = new BukkitService(authMe, settings); } @@ -297,6 +302,36 @@ public class BukkitServiceTest { verify(server).broadcastMessage(message); } + @Test + public void shouldCreateAndEmitSyncEvent() { + // given + given(settings.getProperty(PluginSettings.USE_ASYNC_TASKS)).willReturn(false); + bukkitService.reload(settings); + Player player = mock(Player.class); + + // when + FailedLoginEvent event = bukkitService.createAndCallEvent(isAsync -> new FailedLoginEvent(player, isAsync)); + + // then + verify(pluginManager).callEvent(event); + assertThat(event.isAsynchronous(), equalTo(false)); + assertThat(event.getPlayer(), equalTo(player)); + } + + @Test + public void shouldCreateAndEmitAsyncEvent() { + // given + Player player = mock(Player.class); + + // when + FailedLoginEvent event = bukkitService.createAndCallEvent(isAsync -> new FailedLoginEvent(player, isAsync)); + + // then + verify(pluginManager).callEvent(event); + assertThat(event.isAsynchronous(), equalTo(true)); + assertThat(event.getPlayer(), equalTo(player)); + } + // Note: This method is used through reflections public static Player[] onlinePlayersImpl() { return new Player[]{