Mirror von
https://github.com/PaperMC/Velocity.git
synchronisiert 2024-12-24 23:30:26 +01:00
Expose connecting player's UUID in the PreLoginEvent (#1009)
* feature: Expose connecting player's UUID in the PreLoginEvent * Applied suggestions * Updated the javadocs compatible version to Java 17 --------- Co-authored-by: Adrian <adriangonzalesval@gmail.com>
Dieser Commit ist enthalten in:
Ursprung
53923ed857
Commit
e1f3b6b66f
@ -59,7 +59,7 @@ tasks {
|
|||||||
|
|
||||||
val o = options as StandardJavadocDocletOptions
|
val o = options as StandardJavadocDocletOptions
|
||||||
o.encoding = "UTF-8"
|
o.encoding = "UTF-8"
|
||||||
o.source = "8"
|
o.source = "17"
|
||||||
|
|
||||||
o.links(
|
o.links(
|
||||||
"https://www.slf4j.org/apidocs/",
|
"https://www.slf4j.org/apidocs/",
|
||||||
|
@ -12,6 +12,7 @@ import com.velocitypowered.api.event.ResultedEvent;
|
|||||||
import com.velocitypowered.api.event.annotation.AwaitingEvent;
|
import com.velocitypowered.api.event.annotation.AwaitingEvent;
|
||||||
import com.velocitypowered.api.proxy.InboundConnection;
|
import com.velocitypowered.api.proxy.InboundConnection;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
|
|
||||||
@ -33,17 +34,32 @@ public final class PreLoginEvent implements ResultedEvent<PreLoginEvent.PreLogin
|
|||||||
|
|
||||||
private final InboundConnection connection;
|
private final InboundConnection connection;
|
||||||
private final String username;
|
private final String username;
|
||||||
|
private final @Nullable UUID uuid;
|
||||||
private PreLoginComponentResult result;
|
private PreLoginComponentResult result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance, without an associated UUID.
|
||||||
|
*
|
||||||
|
* @param connection the connection logging into the proxy
|
||||||
|
* @param username the player's username
|
||||||
|
* @deprecated use {@link #PreLoginEvent(InboundConnection, String, UUID)}
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public PreLoginEvent(final InboundConnection connection, final String username) {
|
||||||
|
this(connection, username, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new instance.
|
* Creates a new instance.
|
||||||
*
|
*
|
||||||
* @param connection the connection logging into the proxy
|
* @param connection the connection logging into the proxy
|
||||||
* @param username the player's username
|
* @param username the player's username
|
||||||
|
* @param uuid the player's uuid, if known
|
||||||
*/
|
*/
|
||||||
public PreLoginEvent(InboundConnection connection, String username) {
|
public PreLoginEvent(final InboundConnection connection, final String username, final @Nullable UUID uuid) {
|
||||||
this.connection = Preconditions.checkNotNull(connection, "connection");
|
this.connection = Preconditions.checkNotNull(connection, "connection");
|
||||||
this.username = Preconditions.checkNotNull(username, "username");
|
this.username = Preconditions.checkNotNull(username, "username");
|
||||||
|
this.uuid = uuid;
|
||||||
this.result = PreLoginComponentResult.allowed();
|
this.result = PreLoginComponentResult.allowed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,13 +71,22 @@ public final class PreLoginEvent implements ResultedEvent<PreLoginEvent.PreLogin
|
|||||||
return username;
|
return username;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the UUID of the connecting player. This value is {@code null} on 1.19.1 and lower.
|
||||||
|
*
|
||||||
|
* @return the uuid
|
||||||
|
*/
|
||||||
|
public @Nullable UUID getUniqueId() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PreLoginComponentResult getResult() {
|
public PreLoginComponentResult getResult() {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setResult(@NonNull PreLoginComponentResult result) {
|
public void setResult(final @NonNull PreLoginComponentResult result) {
|
||||||
this.result = Preconditions.checkNotNull(result, "result");
|
this.result = Preconditions.checkNotNull(result, "result");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,16 +140,12 @@ public final class PreLoginEvent implements ResultedEvent<PreLoginEvent.PreLogin
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
switch (result) {
|
return switch (result) {
|
||||||
case ALLOWED:
|
case ALLOWED -> "allowed";
|
||||||
return "allowed";
|
case FORCE_OFFLINE -> "allowed with force offline mode";
|
||||||
case FORCE_OFFLINE:
|
case FORCE_ONLINE -> "allowed with online mode";
|
||||||
return "allowed with force offline mode";
|
default -> "denied";
|
||||||
case FORCE_ONLINE:
|
};
|
||||||
return "allowed with online mode";
|
|
||||||
default:
|
|
||||||
return "denied";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -74,7 +74,7 @@ public class InitialLoginSessionHandler implements MinecraftSessionHandler {
|
|||||||
private @MonotonicNonNull ServerLoginPacket login;
|
private @MonotonicNonNull ServerLoginPacket login;
|
||||||
private byte[] verify = EMPTY_BYTE_ARRAY;
|
private byte[] verify = EMPTY_BYTE_ARRAY;
|
||||||
private LoginState currentState = LoginState.LOGIN_PACKET_EXPECTED;
|
private LoginState currentState = LoginState.LOGIN_PACKET_EXPECTED;
|
||||||
private boolean forceKeyAuthentication;
|
private final boolean forceKeyAuthentication;
|
||||||
|
|
||||||
InitialLoginSessionHandler(VelocityServer server, MinecraftConnection mcConnection,
|
InitialLoginSessionHandler(VelocityServer server, MinecraftConnection mcConnection,
|
||||||
LoginInboundConnection inbound) {
|
LoginInboundConnection inbound) {
|
||||||
@ -100,8 +100,7 @@ public class InitialLoginSessionHandler implements MinecraftSessionHandler {
|
|||||||
|
|
||||||
boolean isKeyValid;
|
boolean isKeyValid;
|
||||||
if (playerKey.getKeyRevision() == IdentifiedKey.Revision.LINKED_V2
|
if (playerKey.getKeyRevision() == IdentifiedKey.Revision.LINKED_V2
|
||||||
&& playerKey instanceof IdentifiedKeyImpl) {
|
&& playerKey instanceof final IdentifiedKeyImpl keyImpl) {
|
||||||
IdentifiedKeyImpl keyImpl = (IdentifiedKeyImpl) playerKey;
|
|
||||||
isKeyValid = keyImpl.internalAddHolder(packet.getHolderUuid());
|
isKeyValid = keyImpl.internalAddHolder(packet.getHolderUuid());
|
||||||
} else {
|
} else {
|
||||||
isKeyValid = playerKey.isSignatureValid();
|
isKeyValid = playerKey.isSignatureValid();
|
||||||
@ -120,7 +119,7 @@ public class InitialLoginSessionHandler implements MinecraftSessionHandler {
|
|||||||
inbound.setPlayerKey(playerKey);
|
inbound.setPlayerKey(playerKey);
|
||||||
this.login = packet;
|
this.login = packet;
|
||||||
|
|
||||||
PreLoginEvent event = new PreLoginEvent(inbound, login.getUsername());
|
final PreLoginEvent event = new PreLoginEvent(inbound, login.getUsername(), login.getHolderUuid());
|
||||||
server.getEventManager().fire(event).thenRunAsync(() -> {
|
server.getEventManager().fire(event).thenRunAsync(() -> {
|
||||||
if (mcConnection.isClosed()) {
|
if (mcConnection.isClosed()) {
|
||||||
// The player was disconnected
|
// The player was disconnected
|
||||||
@ -245,8 +244,7 @@ public class InitialLoginSessionHandler implements MinecraftSessionHandler {
|
|||||||
// Not so fast, now we verify the public key for 1.19.1+
|
// Not so fast, now we verify the public key for 1.19.1+
|
||||||
if (inbound.getIdentifiedKey() != null
|
if (inbound.getIdentifiedKey() != null
|
||||||
&& inbound.getIdentifiedKey().getKeyRevision() == IdentifiedKey.Revision.LINKED_V2
|
&& inbound.getIdentifiedKey().getKeyRevision() == IdentifiedKey.Revision.LINKED_V2
|
||||||
&& inbound.getIdentifiedKey() instanceof IdentifiedKeyImpl) {
|
&& inbound.getIdentifiedKey() instanceof final IdentifiedKeyImpl key) {
|
||||||
IdentifiedKeyImpl key = (IdentifiedKeyImpl) inbound.getIdentifiedKey();
|
|
||||||
if (!key.internalAddHolder(profile.getId())) {
|
if (!key.internalAddHolder(profile.getId())) {
|
||||||
inbound.disconnect(
|
inbound.disconnect(
|
||||||
Component.translatable("multiplayer.disconnect.invalid_public_key"));
|
Component.translatable("multiplayer.disconnect.invalid_public_key"));
|
||||||
|
@ -74,7 +74,11 @@ public class ServerLoginPacket implements MinecraftPacket {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "ServerLogin{" + "username='" + username + '\'' + "playerKey='" + playerKey + '\'' + '}';
|
return "ServerLogin{"
|
||||||
|
+ "username='" + username + '\''
|
||||||
|
+ "uuid='" + holderUuid + '\''
|
||||||
|
+ "playerKey='" + playerKey + '\''
|
||||||
|
+ '}';
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren