#857 Create event for failed authentication
This commit is contained in:
parent
dbb8ea7f38
commit
d65556d893
45
src/main/java/fr/xephi/authme/events/FailedLoginEvent.java
Normal file
45
src/main/java/fr/xephi/authme/events/FailedLoginEvent.java
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -18,7 +18,6 @@ import fr.xephi.authme.service.PluginHookService;
|
|||||||
import fr.xephi.authme.service.ValidationService;
|
import fr.xephi.authme.service.ValidationService;
|
||||||
import fr.xephi.authme.settings.commandconfig.CommandManager;
|
import fr.xephi.authme.settings.commandconfig.CommandManager;
|
||||||
import fr.xephi.authme.settings.properties.HooksSettings;
|
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.RegistrationSettings;
|
||||||
import fr.xephi.authme.settings.properties.RestrictionSettings;
|
import fr.xephi.authme.settings.properties.RestrictionSettings;
|
||||||
import fr.xephi.authme.util.PlayerUtils;
|
import fr.xephi.authme.util.PlayerUtils;
|
||||||
@ -115,9 +114,8 @@ public class AsynchronousJoin implements AsynchronousProcess {
|
|||||||
|
|
||||||
// Protect inventory
|
// Protect inventory
|
||||||
if (service.getProperty(PROTECT_INVENTORY_BEFORE_LOGIN)) {
|
if (service.getProperty(PROTECT_INVENTORY_BEFORE_LOGIN)) {
|
||||||
final boolean isAsync = service.getProperty(PluginSettings.USE_ASYNC_TASKS);
|
ProtectInventoryEvent ev = bukkitService.createAndCallEvent(
|
||||||
ProtectInventoryEvent ev = new ProtectInventoryEvent(player, isAsync);
|
isAsync -> new ProtectInventoryEvent(player, isAsync));
|
||||||
bukkitService.callEvent(ev);
|
|
||||||
if (ev.isCancelled()) {
|
if (ev.isCancelled()) {
|
||||||
player.updateInventory();
|
player.updateInventory();
|
||||||
ConsoleLogger.fine("ProtectInventoryEvent has been cancelled for " + player.getName() + "...");
|
ConsoleLogger.fine("ProtectInventoryEvent has been cancelled for " + player.getName() + "...");
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import fr.xephi.authme.data.auth.PlayerCache;
|
|||||||
import fr.xephi.authme.data.limbo.LimboService;
|
import fr.xephi.authme.data.limbo.LimboService;
|
||||||
import fr.xephi.authme.datasource.DataSource;
|
import fr.xephi.authme.datasource.DataSource;
|
||||||
import fr.xephi.authme.events.AuthMeAsyncPreLoginEvent;
|
import fr.xephi.authme.events.AuthMeAsyncPreLoginEvent;
|
||||||
|
import fr.xephi.authme.events.FailedLoginEvent;
|
||||||
import fr.xephi.authme.mail.EmailService;
|
import fr.xephi.authme.mail.EmailService;
|
||||||
import fr.xephi.authme.message.MessageKey;
|
import fr.xephi.authme.message.MessageKey;
|
||||||
import fr.xephi.authme.permission.AdminPermission;
|
import fr.xephi.authme.permission.AdminPermission;
|
||||||
@ -180,6 +181,8 @@ public class AsynchronousLogin implements AsynchronousProcess {
|
|||||||
*/
|
*/
|
||||||
private void handleWrongPassword(Player player, String ip) {
|
private void handleWrongPassword(Player player, String ip) {
|
||||||
ConsoleLogger.fine(player.getName() + " used the wrong password");
|
ConsoleLogger.fine(player.getName() + " used the wrong password");
|
||||||
|
|
||||||
|
bukkitService.createAndCallEvent(isAsync -> new FailedLoginEvent(player, isAsync));
|
||||||
if (tempbanManager.shouldTempban(ip)) {
|
if (tempbanManager.shouldTempban(ip)) {
|
||||||
tempbanManager.tempbanPlayer(player);
|
tempbanManager.tempbanPlayer(player);
|
||||||
} else if (service.getProperty(RestrictionSettings.KICK_ON_WRONG_PASSWORD)) {
|
} else if (service.getProperty(RestrictionSettings.KICK_ON_WRONG_PASSWORD)) {
|
||||||
|
|||||||
@ -25,6 +25,7 @@ import java.util.Collection;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Service for operations requiring the Bukkit API, such as for scheduling.
|
* Service for operations requiring the Bukkit API, such as for scheduling.
|
||||||
@ -263,6 +264,20 @@ public class BukkitService implements SettingsDependent {
|
|||||||
Bukkit.getPluginManager().callEvent(event);
|
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 <E> the event type
|
||||||
|
* @return the event that was created and emitted
|
||||||
|
*/
|
||||||
|
public <E extends Event> E createAndCallEvent(Function<Boolean, E> eventSupplier) {
|
||||||
|
E event = eventSupplier.apply(useAsyncTasks);
|
||||||
|
callEvent(event);
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the world with the given name.
|
* Gets the world with the given name.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package fr.xephi.authme.service;
|
|||||||
|
|
||||||
import fr.xephi.authme.AuthMe;
|
import fr.xephi.authme.AuthMe;
|
||||||
import fr.xephi.authme.ReflectionTestUtils;
|
import fr.xephi.authme.ReflectionTestUtils;
|
||||||
|
import fr.xephi.authme.events.FailedLoginEvent;
|
||||||
import fr.xephi.authme.settings.Settings;
|
import fr.xephi.authme.settings.Settings;
|
||||||
import fr.xephi.authme.settings.properties.PluginSettings;
|
import fr.xephi.authme.settings.properties.PluginSettings;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@ -9,6 +10,7 @@ import org.bukkit.Server;
|
|||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.command.ConsoleCommandSender;
|
import org.bukkit.command.ConsoleCommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.plugin.PluginManager;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
import org.bukkit.scheduler.BukkitScheduler;
|
import org.bukkit.scheduler.BukkitScheduler;
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
@ -48,11 +50,14 @@ public class BukkitServiceTest {
|
|||||||
private Server server;
|
private Server server;
|
||||||
@Mock
|
@Mock
|
||||||
private BukkitScheduler scheduler;
|
private BukkitScheduler scheduler;
|
||||||
|
@Mock
|
||||||
|
private PluginManager pluginManager;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void constructBukkitService() {
|
public void constructBukkitService() {
|
||||||
ReflectionTestUtils.setField(Bukkit.class, null, "server", server);
|
ReflectionTestUtils.setField(Bukkit.class, null, "server", server);
|
||||||
given(server.getScheduler()).willReturn(scheduler);
|
given(server.getScheduler()).willReturn(scheduler);
|
||||||
|
given(server.getPluginManager()).willReturn(pluginManager);
|
||||||
given(settings.getProperty(PluginSettings.USE_ASYNC_TASKS)).willReturn(true);
|
given(settings.getProperty(PluginSettings.USE_ASYNC_TASKS)).willReturn(true);
|
||||||
bukkitService = new BukkitService(authMe, settings);
|
bukkitService = new BukkitService(authMe, settings);
|
||||||
}
|
}
|
||||||
@ -297,6 +302,36 @@ public class BukkitServiceTest {
|
|||||||
verify(server).broadcastMessage(message);
|
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
|
// Note: This method is used through reflections
|
||||||
public static Player[] onlinePlayersImpl() {
|
public static Player[] onlinePlayersImpl() {
|
||||||
return new Player[]{
|
return new Player[]{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user