Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ A list of small tweaks I made:
- Mapping between online / offline uuid will be updated on player connected
- The sqlite database file can be shared between multiple velocity instances
- UUID rewrite can be disabled by setting `enabled = false`
- Added advanced proxy setting to forward client virtual host
- setting to overwrite handshake packet host and port between virtual host or backend server

# Velocity

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -460,6 +460,11 @@ public boolean isForceKeyAuthentication() {
return forceKeyAuthentication;
}

// [kahzerx's fork] forward client virtual host
public boolean isForwardClientVirtualHost() {
return this.advanced.forwardClientVirtualHost;
}

@Override
public String toString() {
return MoreObjects.toStringHelper(this)
Expand Down Expand Up @@ -773,6 +778,8 @@ private static class Advanced {
private boolean logPlayerConnections = true;
@Expose
private boolean acceptTransfers = false;
@Expose
private boolean forwardClientVirtualHost = true; // [kahzerx's fork] forward client virtual host

private Advanced() {
}
Expand All @@ -798,6 +805,7 @@ private Advanced(CommentedConfig config) {
this.logCommandExecutions = config.getOrElse("log-command-executions", false);
this.logPlayerConnections = config.getOrElse("log-player-connections", true);
this.acceptTransfers = config.getOrElse("accepts-transfers", false);
this.forwardClientVirtualHost = config.getOrElse("forward-client-virtual-host", true);
}
}

Expand Down Expand Up @@ -861,6 +869,10 @@ public boolean isAcceptTransfers() {
return this.acceptTransfers;
}

public boolean isForwardClientVirtualHost() {
return forwardClientVirtualHost;
}

@Override
public String toString() {
return "Advanced{"
Expand All @@ -878,6 +890,7 @@ public String toString() {
+ ", logCommandExecutions=" + logCommandExecutions
+ ", logPlayerConnections=" + logPlayerConnections
+ ", acceptTransfers=" + acceptTransfers
+ ", forwardClientVirtualHost=" + forwardClientVirtualHost
+ '}';
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,18 +140,28 @@ String getPlayerRemoteAddressAsString() {
}

private String createLegacyForwardingAddress() {
String host;
if (server.getConfiguration().isForwardClientVirtualHost()) {
host = proxyPlayer.getVirtualHost().orElseGet(() -> registeredServer.getServerInfo().getAddress()).getHostString();
} else {
host = registeredServer.getServerInfo().getAddress().getHostString();
}
return PlayerDataForwarding.createLegacyForwardingAddress(
proxyPlayer.getVirtualHost().orElseGet(() ->
registeredServer.getServerInfo().getAddress()).getHostString(),
host,
getPlayerRemoteAddressAsString(),
proxyPlayer.getGameProfile()
);
}

private String createBungeeGuardForwardingAddress(byte[] forwardingSecret) {
String host;
if (server.getConfiguration().isForwardClientVirtualHost()) {
host = proxyPlayer.getVirtualHost().orElseGet(() -> registeredServer.getServerInfo().getAddress()).getHostString();
} else {
host = registeredServer.getServerInfo().getAddress().getHostString();
}
return PlayerDataForwarding.createBungeeGuardForwardingAddress(
proxyPlayer.getVirtualHost().orElseGet(() ->
registeredServer.getServerInfo().getAddress()).getHostString(),
host,
getPlayerRemoteAddressAsString(),
proxyPlayer.getGameProfile(),
forwardingSecret
Expand All @@ -160,14 +170,19 @@ private String createBungeeGuardForwardingAddress(byte[] forwardingSecret) {

private void startHandshake() {
final MinecraftConnection mc = ensureConnected();
PlayerInfoForwarding forwardingMode = server.getConfiguration().getPlayerInfoForwardingMode();

// Initiate the handshake.
ProtocolVersion protocolVersion = proxyPlayer.getConnection().getProtocolVersion();
String playerVhost = proxyPlayer.getVirtualHost()
.orElseGet(() -> registeredServer.getServerInfo().getAddress())
.getHostString();
String playerVhost;
if (server.getConfiguration().isForwardClientVirtualHost()) {
playerVhost = proxyPlayer.getVirtualHost()
.orElseGet(() -> registeredServer.getServerInfo().getAddress())
.getHostString();
} else {
playerVhost = registeredServer.getServerInfo().getAddress().getHostString();
}

PlayerInfoForwarding forwardingMode = server.getConfiguration().getPlayerInfoForwardingMode();
HandshakePacket handshake = new HandshakePacket();
handshake.setIntent(HandshakeIntent.LOGIN);
handshake.setProtocolVersion(protocolVersion);
Expand All @@ -185,9 +200,13 @@ private void startHandshake() {
handshake.setServerAddress(playerVhost);
}

handshake.setPort(proxyPlayer.getVirtualHost()
.orElseGet(() -> registeredServer.getServerInfo().getAddress())
.getPort());
if (server.getConfiguration().isForwardClientVirtualHost()) {
handshake.setPort(proxyPlayer.getVirtualHost()
.orElseGet(() -> registeredServer.getServerInfo().getAddress())
.getPort());
} else {
handshake.setPort(registeredServer.getServerInfo().getAddress().getPort());
}
mc.delayedWrite(handshake);

mc.setProtocolVersion(protocolVersion);
Expand Down
5 changes: 5 additions & 0 deletions proxy/src/main/resources/default-velocity.toml
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,11 @@ log-player-connections = true
# Transfer packet (Minecraft 1.20.5) to be received.
accepts-transfers = false

# [kahzerx's fork]
# If set to false, modifies the virtual host to match the server address in the handshake.
# Useful when backends require players to connect with a specific dns.
forward-client-virtual-host = true

# [fallen's fork] mojang auth proxy
# See readme for more information
[auth-proxy]
Expand Down