Skip to content

Commit 0f148bf

Browse files
strobilXephi
authored andcommitted
fix(premium): reject proxy premium claims and notify proxy while premium is disabled
ProxyLoginRequestValidator.validate() had no enablePremium gate, unlike canBypassWithPremium: a proxy-verified claim for a player whose row still carries a premiumUuid was accepted while the feature was disabled. Reject it and answer with premium.unset so the proxy drops the stale entry and persists its cache. State now converges per player on first contact, without waiting for a proxy restart to trigger the full premium.list resync. Refs #3127
1 parent 5bae6ee commit 0f148bf

2 files changed

Lines changed: 36 additions & 0 deletions

File tree

authme-core/src/main/java/fr/xephi/authme/service/ProxyLoginRequestValidator.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import fr.xephi.authme.message.Messages;
99
import fr.xephi.authme.output.ConsoleLoggerFactory;
1010
import fr.xephi.authme.service.bungeecord.BungeeSender;
11+
import fr.xephi.authme.settings.Settings;
12+
import fr.xephi.authme.settings.properties.PremiumSettings;
1113
import org.bukkit.entity.Player;
1214

1315
import javax.inject.Inject;
@@ -43,6 +45,9 @@ public class ProxyLoginRequestValidator {
4345
@Inject
4446
private Messages messages;
4547

48+
@Inject
49+
private Settings settings;
50+
4651
ProxyLoginRequestValidator() {
4752
}
4853

@@ -60,6 +65,14 @@ public boolean validate(Player player, UUID verifiedPremiumUuid) {
6065
}
6166

6267
String playerName = player.getName();
68+
if (!settings.getProperty(PremiumSettings.ENABLE_PREMIUM)) {
69+
// The proxy still holds this name in its premium cache; tell it to drop the entry so the
70+
// player is not forced through Mojang verification again while the feature is disabled.
71+
logger.info("Rejected proxy premium login for " + playerName + ": premium is disabled");
72+
bungeeSender.sendPremiumUnset(playerName);
73+
return false;
74+
}
75+
6376
PlayerAuth auth = playerCache.getAuth(playerName);
6477
if (auth == null) {
6578
auth = dataSource.getAuth(playerName.toLowerCase(Locale.ROOT));

authme-core/src/test/java/fr/xephi/authme/service/ProxyLoginRequestValidatorTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import fr.xephi.authme.message.MessageKey;
66
import fr.xephi.authme.message.Messages;
77
import fr.xephi.authme.service.bungeecord.BungeeSender;
8+
import fr.xephi.authme.settings.Settings;
9+
import fr.xephi.authme.settings.properties.PremiumSettings;
810
import org.bukkit.entity.Player;
911
import org.junit.jupiter.api.Test;
1012
import org.junit.jupiter.api.extension.ExtendWith;
@@ -19,6 +21,7 @@
1921
import static org.mockito.BDDMockito.given;
2022
import static org.mockito.Mockito.never;
2123
import static org.mockito.Mockito.verify;
24+
import static org.mockito.Mockito.verifyNoInteractions;
2225

2326
/**
2427
* Test for {@link ProxyLoginRequestValidator}.
@@ -47,6 +50,9 @@ class ProxyLoginRequestValidatorTest {
4750
@Mock
4851
private Messages messages;
4952

53+
@Mock
54+
private Settings settings;
55+
5056
@Mock
5157
private Player player;
5258

@@ -55,6 +61,7 @@ void shouldAcceptStoredPremiumUuidFromProxy() {
5561
UUID premiumUuid = UUID.randomUUID();
5662
PlayerAuth auth = PlayerAuth.builder().name("bobby").premiumUuid(premiumUuid).build();
5763
given(player.getName()).willReturn("Bobby");
64+
given(settings.getProperty(PremiumSettings.ENABLE_PREMIUM)).willReturn(true);
5865
given(playerCache.getAuth("Bobby")).willReturn(auth);
5966

6067
assertTrue(validator.validate(player, premiumUuid));
@@ -67,6 +74,7 @@ void shouldRejectStoredPremiumUuidMismatch() {
6774
UUID forwardedUuid = UUID.randomUUID();
6875
PlayerAuth auth = PlayerAuth.builder().name("bobby").premiumUuid(storedUuid).build();
6976
given(player.getName()).willReturn("Bobby");
77+
given(settings.getProperty(PremiumSettings.ENABLE_PREMIUM)).willReturn(true);
7078
given(playerCache.getAuth("Bobby")).willReturn(auth);
7179

7280
assertFalse(validator.validate(player, forwardedUuid));
@@ -78,6 +86,7 @@ void shouldFinalizeMatchingPendingPremiumUuid() {
7886
UUID pendingUuid = UUID.randomUUID();
7987
PlayerAuth auth = PlayerAuth.builder().name("bobby").build();
8088
given(player.getName()).willReturn("Bobby");
89+
given(settings.getProperty(PremiumSettings.ENABLE_PREMIUM)).willReturn(true);
8190
given(playerCache.getAuth("Bobby")).willReturn(auth);
8291
given(pendingPremiumCache.removePending("Bobby")).willReturn(pendingUuid);
8392

@@ -92,6 +101,7 @@ void shouldStaySilentWhenPendingAlreadyConsumed() {
92101
UUID forwardedUuid = UUID.randomUUID();
93102
PlayerAuth auth = PlayerAuth.builder().name("bobby").build();
94103
given(player.getName()).willReturn("Bobby");
104+
given(settings.getProperty(PremiumSettings.ENABLE_PREMIUM)).willReturn(true);
95105
given(playerCache.getAuth("Bobby")).willReturn(auth);
96106
given(pendingPremiumCache.removePending("Bobby")).willReturn(null);
97107

@@ -107,6 +117,7 @@ void shouldRejectPendingPremiumUuidMismatchAndNotifyPlayer() {
107117
UUID forwardedUuid = UUID.randomUUID();
108118
PlayerAuth auth = PlayerAuth.builder().name("bobby").build();
109119
given(player.getName()).willReturn("Bobby");
120+
given(settings.getProperty(PremiumSettings.ENABLE_PREMIUM)).willReturn(true);
110121
given(playerCache.getAuth("Bobby")).willReturn(auth);
111122
given(pendingPremiumCache.removePending("Bobby")).willReturn(pendingUuid);
112123

@@ -115,4 +126,16 @@ void shouldRejectPendingPremiumUuidMismatchAndNotifyPlayer() {
115126
verify(messages).send(player, MessageKey.PREMIUM_PENDING_FAIL);
116127
verify(premiumService, never()).finalizePendingPremium(player, forwardedUuid);
117128
}
129+
130+
@Test
131+
void shouldRejectProxyPremiumClaimAndNotifyProxyWhenPremiumIsDisabled() {
132+
UUID forwardedUuid = UUID.randomUUID();
133+
given(player.getName()).willReturn("Bobby");
134+
given(settings.getProperty(PremiumSettings.ENABLE_PREMIUM)).willReturn(false);
135+
136+
assertFalse(validator.validate(player, forwardedUuid));
137+
verify(bungeeSender).sendPremiumUnset("Bobby");
138+
verify(messages, never()).send(player, MessageKey.PREMIUM_PENDING_FAIL);
139+
verifyNoInteractions(playerCache, dataSource, pendingPremiumCache, premiumService);
140+
}
118141
}

0 commit comments

Comments
 (0)