If a player is not registered then we send a LOGIN plugin message on join (#2275)

* If a player is not registered then we send a LOGIN plugin message on join

* Make looking up a profile optionally quiet

This prevents an issue where a forcedLogin of a player that doesn't exist occurring when an unregistered player switches a server. The first login would tell AuthBungee that the player is logged in, and subsequent switches would have AuthBungee send a performLogin back that would then send an unregistered player error message to the player.

Co-authored-by: bundabrg <bundabrg@grieve.com.au>
Co-authored-by: Gabriele C <sgdc3.mail@gmail.com>
This commit is contained in:
bundabrg 2021-08-30 17:35:36 +08:00 committed by GitHub
parent 5426ada8f3
commit 80e37578b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 49 additions and 5 deletions

View File

@ -57,6 +57,10 @@ public class Management {
runTask(() -> asynchronousLogin.forceLogin(player)); runTask(() -> asynchronousLogin.forceLogin(player));
} }
public void forceLogin(Player player, boolean quiet) {
runTask(() -> asynchronousLogin.forceLogin(player, quiet));
}
public void performLogout(Player player) { public void performLogout(Player player) {
runTask(() -> asynchronousLogout.logout(player)); runTask(() -> asynchronousLogout.logout(player));
} }

View File

@ -15,6 +15,8 @@ import fr.xephi.authme.service.CommonService;
import fr.xephi.authme.service.PluginHookService; import fr.xephi.authme.service.PluginHookService;
import fr.xephi.authme.service.SessionService; import fr.xephi.authme.service.SessionService;
import fr.xephi.authme.service.ValidationService; import fr.xephi.authme.service.ValidationService;
import fr.xephi.authme.service.bungeecord.BungeeSender;
import fr.xephi.authme.service.bungeecord.MessageType;
import fr.xephi.authme.settings.WelcomeMessageConfiguration; import fr.xephi.authme.settings.WelcomeMessageConfiguration;
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;
@ -73,6 +75,9 @@ public class AsynchronousJoin implements AsynchronousProcess {
@Inject @Inject
private SessionService sessionService; private SessionService sessionService;
@Inject
private BungeeSender bungeeSender;
@Inject @Inject
private ProxySessionManager proxySessionManager; private ProxySessionManager proxySessionManager;
@ -148,6 +153,7 @@ public class AsynchronousJoin implements AsynchronousProcess {
}); });
// Skip if registration is optional // Skip if registration is optional
bungeeSender.sendAuthMeBungeecordMessage(MessageType.LOGIN, name);
return; return;
} }

View File

@ -118,6 +118,19 @@ public class AsynchronousLogin implements AsynchronousProcess {
} }
} }
/**
* Logs a player in without requiring a password.
*
* @param player the player to log in
* @param quiet if true no messages will be sent
*/
public void forceLogin(Player player, boolean quiet) {
PlayerAuth auth = getPlayerAuth(player, quiet);
if (auth != null) {
performLogin(player, auth);
}
}
/** /**
* Checks the precondition for authentication (like user known) and returns * Checks the precondition for authentication (like user known) and returns
* the player's {@link PlayerAuth} object. * the player's {@link PlayerAuth} object.
@ -127,15 +140,32 @@ public class AsynchronousLogin implements AsynchronousProcess {
* (e.g. because he is already logged in) * (e.g. because he is already logged in)
*/ */
private PlayerAuth getPlayerAuth(Player player) { private PlayerAuth getPlayerAuth(Player player) {
return getPlayerAuth(player, false);
}
/**
* Checks the precondition for authentication (like user known) and returns
* the player's {@link PlayerAuth} object.
*
* @param player the player to check
* @param quiet don't send messages
* @return the PlayerAuth object, or {@code null} if the player doesn't exist or may not log in
* (e.g. because he is already logged in)
*/
private PlayerAuth getPlayerAuth(Player player, boolean quiet) {
final String name = player.getName().toLowerCase(); final String name = player.getName().toLowerCase();
if (playerCache.isAuthenticated(name)) { if (playerCache.isAuthenticated(name)) {
if (!quiet) {
service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR); service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR);
}
return null; return null;
} }
PlayerAuth auth = dataSource.getAuth(name); PlayerAuth auth = dataSource.getAuth(name);
if (auth == null) { if (auth == null) {
if (!quiet) {
service.send(player, MessageKey.UNKNOWN_USER); service.send(player, MessageKey.UNKNOWN_USER);
}
// Recreate the message task to immediately send the message again as response // Recreate the message task to immediately send the message again as response
limboService.resetMessageTask(player, LimboMessageType.REGISTER); limboService.resetMessageTask(player, LimboMessageType.REGISTER);
return null; return null;
@ -143,13 +173,17 @@ public class AsynchronousLogin implements AsynchronousProcess {
if (!service.getProperty(DatabaseSettings.MYSQL_COL_GROUP).isEmpty() if (!service.getProperty(DatabaseSettings.MYSQL_COL_GROUP).isEmpty()
&& auth.getGroupId() == service.getProperty(HooksSettings.NON_ACTIVATED_USERS_GROUP)) { && auth.getGroupId() == service.getProperty(HooksSettings.NON_ACTIVATED_USERS_GROUP)) {
if (!quiet) {
service.send(player, MessageKey.ACCOUNT_NOT_ACTIVATED); service.send(player, MessageKey.ACCOUNT_NOT_ACTIVATED);
}
return null; return null;
} }
final String ip = PlayerUtils.getPlayerIp(player); final String ip = PlayerUtils.getPlayerIp(player);
if (hasReachedMaxLoggedInPlayersForIp(player, ip)) { if (hasReachedMaxLoggedInPlayersForIp(player, ip)) {
if (!quiet) {
service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR); service.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR);
}
return null; return null;
} }

View File

@ -152,7 +152,7 @@ public class BungeeReceiver implements PluginMessageListener, SettingsDependent
private void performLogin(final String name) { private void performLogin(final String name) {
Player player = bukkitService.getPlayerExact(name); Player player = bukkitService.getPlayerExact(name);
if (player != null && player.isOnline()) { if (player != null && player.isOnline()) {
management.forceLogin(player); management.forceLogin(player, true);
logger.info("The user " + player.getName() + " has been automatically logged in, " logger.info("The user " + player.getName() + " has been automatically logged in, "
+ "as requested via plugin messaging."); + "as requested via plugin messaging.");
} else { } else {