Skip to content

Commit c9af716

Browse files
committed
fix: Identify our Dialog and close them on auto login from Proxy or API
1 parent 924998d commit c9af716

12 files changed

Lines changed: 101 additions & 0 deletions

File tree

authme-core/src/main/java/fr/xephi/authme/platform/DialogAdapter.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,13 @@ default void showTotpDialog(Player player, DialogWindowSpec dialog) {
4848
default void showRegisterDialog(Player player, RegistrationType type,
4949
RegisterSecondaryArgument secondArg, DialogWindowSpec dialog) {
5050
}
51+
52+
/**
53+
* Closes any open dialog for the given player (e.g. after a force-login via the API).
54+
* Has no effect if no dialog is currently open or if dialogs are not supported on this platform.
55+
*
56+
* @param player the player whose dialog should be closed
57+
*/
58+
default void closeDialog(Player player) {
59+
}
5160
}

authme-core/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import fr.xephi.authme.process.register.executors.RegistrationMethod;
2121
import fr.xephi.authme.service.BukkitService;
2222
import fr.xephi.authme.service.CommonService;
23+
import fr.xephi.authme.service.DialogStateService;
2324
import fr.xephi.authme.service.DialogWindowService;
2425
import fr.xephi.authme.service.PreJoinDialogService;
2526
import fr.xephi.authme.service.PluginHookService;
@@ -103,6 +104,9 @@ public class AsynchronousJoin implements AsynchronousProcess {
103104
@Inject
104105
private DialogWindowService dialogWindowService;
105106

107+
@Inject
108+
private DialogStateService dialogStateService;
109+
106110
@Inject
107111
private PreJoinDialogService preJoinDialogService;
108112

@@ -266,6 +270,7 @@ private void showPostJoinDialogIfNecessary(Player player, boolean isAuthAvailabl
266270
secondArg,
267271
dialogWindowService.createRegisterDialog(player, registrationType, secondArg));
268272
}
273+
dialogStateService.markDialogOpen(player);
269274
}
270275

271276
private void processPendingRegistration(Player player, PreJoinDialogService.PendingRegistration pendingRegistration) {

authme-core/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import fr.xephi.authme.security.PasswordSecurity;
2525
import fr.xephi.authme.service.BukkitService;
2626
import fr.xephi.authme.service.CommonService;
27+
import fr.xephi.authme.service.DialogStateService;
2728
import fr.xephi.authme.service.DialogWindowService;
2829
import fr.xephi.authme.service.SessionService;
2930
import fr.xephi.authme.service.bungeecord.BungeeSender;
@@ -94,6 +95,9 @@ public class AsynchronousLogin implements AsynchronousProcess {
9495
@Inject
9596
private DialogWindowService dialogWindowService;
9697

98+
@Inject
99+
private DialogStateService dialogStateService;
100+
97101
AsynchronousLogin() {
98102
}
99103

@@ -280,6 +284,7 @@ private void showTotpDialogIfEnabled(Player player) {
280284
return;
281285
}
282286
dialogAdapter.showTotpDialog(player, dialogWindowService.createTotpDialog(player));
287+
dialogStateService.markDialogOpen(player);
283288
}, 1L);
284289
}
285290

authme-core/src/main/java/fr/xephi/authme/process/login/ProcessSyncPlayerLogin.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import fr.xephi.authme.events.RestoreInventoryEvent;
99
import fr.xephi.authme.permission.PermissionsManager;
1010
import fr.xephi.authme.permission.PlayerStatePermission;
11+
import fr.xephi.authme.platform.DialogAdapter;
1112
import fr.xephi.authme.process.SynchronousProcess;
13+
import fr.xephi.authme.service.DialogStateService;
1214
import fr.xephi.authme.service.BukkitService;
1315
import fr.xephi.authme.service.CommonService;
1416
import fr.xephi.authme.service.JoinMessageService;
@@ -28,6 +30,12 @@
2830

2931
public class ProcessSyncPlayerLogin implements SynchronousProcess {
3032

33+
@Inject
34+
private DialogAdapter dialogAdapter;
35+
36+
@Inject
37+
private DialogStateService dialogStateService;
38+
3139
@Inject
3240
private BungeeSender bungeeSender;
3341

@@ -94,6 +102,10 @@ public void processPlayerLoginFromProxy(Player player, boolean isFirstLogin, Lis
94102

95103
private void processPlayerLogin(Player player, boolean isFirstLogin, List<String> authsWithSameIp,
96104
boolean proxyInitiated) {
105+
if (dialogStateService.clearDialogOpen(player)) {
106+
dialogAdapter.closeDialog(player);
107+
}
108+
97109
final String name = player.getName().toLowerCase(Locale.ROOT);
98110
final LimboPlayer limbo = limboService.getLimboPlayer(name);
99111

authme-core/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import fr.xephi.authme.process.AsynchronousProcess;
99
import fr.xephi.authme.process.SyncProcessManager;
1010
import fr.xephi.authme.service.CommonService;
11+
import fr.xephi.authme.service.DialogStateService;
1112
import fr.xephi.authme.service.SessionService;
1213
import fr.xephi.authme.service.TeleportationService;
1314
import fr.xephi.authme.service.ValidationService;
@@ -56,6 +57,9 @@ public class AsynchronousQuit implements AsynchronousProcess {
5657
@Inject
5758
private TeleportationService teleportationService;
5859

60+
@Inject
61+
private DialogStateService dialogStateService;
62+
5963
AsynchronousQuit() {
6064
}
6165

@@ -70,6 +74,7 @@ public void processQuit(Player player) {
7074
}
7175
String name = player.getName().toLowerCase(Locale.ROOT);
7276
teleportationService.clearOriginalJoinLocation(name);
77+
dialogStateService.clearDialogOpen(player);
7378
boolean wasLoggedIn = playerCache.isAuthenticated(name);
7479

7580
if (wasLoggedIn) {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package fr.xephi.authme.service;
2+
3+
import org.bukkit.entity.Player;
4+
5+
import java.util.Set;
6+
import java.util.UUID;
7+
import java.util.concurrent.ConcurrentHashMap;
8+
9+
/**
10+
* Tracks which players currently have an AuthMe-owned dialog open.
11+
* Used to ensure we only close dialogs that we opened, not dialogs from other plugins.
12+
*/
13+
public class DialogStateService {
14+
15+
private final Set<UUID> playersWithOpenDialog = ConcurrentHashMap.newKeySet();
16+
17+
/**
18+
* Records that an AuthMe dialog was shown to the given player.
19+
*
20+
* @param player the player who was shown a dialog
21+
*/
22+
public void markDialogOpen(Player player) {
23+
playersWithOpenDialog.add(player.getUniqueId());
24+
}
25+
26+
/**
27+
* Removes the dialog-open record for the given player.
28+
* Returns {@code true} if the player had an AuthMe dialog tracked (and it was removed),
29+
* or {@code false} if there was no record (i.e. no AuthMe dialog was open for that player).
30+
*
31+
* @param player the player to clear
32+
* @return true if an AuthMe dialog was tracked for this player
33+
*/
34+
public boolean clearDialogOpen(Player player) {
35+
return playersWithOpenDialog.remove(player.getUniqueId());
36+
}
37+
}

authme-core/src/test/java/fr/xephi/authme/process/join/AsynchronousJoinTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import fr.xephi.authme.service.PreJoinDialogService;
1414
import fr.xephi.authme.service.BukkitService;
1515
import fr.xephi.authme.service.CommonService;
16+
import fr.xephi.authme.service.DialogStateService;
1617
import fr.xephi.authme.service.DialogWindowService;
1718
import fr.xephi.authme.service.PluginHookService;
1819
import fr.xephi.authme.service.SessionService;
@@ -88,6 +89,8 @@ public class AsynchronousJoinTest {
8889
@Mock
8990
private DialogWindowService dialogWindowService;
9091
@Mock
92+
private DialogStateService dialogStateService;
93+
@Mock
9194
private PreJoinDialogService preJoinDialogService;
9295

9396
@BeforeAll

authme-core/src/test/java/fr/xephi/authme/process/login/AsynchronousLoginTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import fr.xephi.authme.service.BukkitService;
2424
import fr.xephi.authme.service.CommonService;
2525
import fr.xephi.authme.service.CancellableTask;
26+
import fr.xephi.authme.service.DialogStateService;
2627
import fr.xephi.authme.service.DialogWindowService;
2728
import fr.xephi.authme.service.SessionService;
2829
import fr.xephi.authme.service.bungeecord.BungeeSender;
@@ -92,6 +93,8 @@ public class AsynchronousLoginTest {
9293
private DialogAdapter dialogAdapter;
9394
@Mock
9495
private DialogWindowService dialogWindowService;
96+
@Mock
97+
private DialogStateService dialogStateService;
9598

9699
@BeforeAll
97100
public static void initLogger() {

authme-paper-common/src/main/java/fr/xephi/authme/platform/AbstractPaperPlatformAdapter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ public void showRegisterDialog(Player player, RegistrationType type,
5757
PaperDialogHelper.showRegisterDialog(player, type, secondArg, dialog);
5858
}
5959

60+
@Override
61+
public void closeDialog(Player player) {
62+
if (DIALOG_AVAILABLE) {
63+
PaperDialogHelper.closeDialog(player);
64+
}
65+
}
66+
6067
@Override
6168
public void registerCommands(AuthMe plugin, CommandHandler commandHandler, Collection<CommandDescription> commands) {
6269
new PaperBrigadierCommandRegistrar(commandHandler::processCommand).registerCommands(plugin, commands);

authme-paper-common/src/main/java/fr/xephi/authme/platform/PaperDialogHelper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ public final class PaperDialogHelper {
2525
private PaperDialogHelper() {
2626
}
2727

28+
static void closeDialog(Player player) {
29+
player.closeDialog();
30+
}
31+
2832
static void showLoginDialog(Player player, DialogWindowSpec dialog) {
2933
player.showDialog(createInGameCommandDialog(dialog, "login $(password)"));
3034
}

0 commit comments

Comments
 (0)