mirror of
https://github.com/PaperMC/Paper.git
synced 2024-09-03 02:20:51 +02:00
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: fde5602a PR-927: Add PlayerRecipeBookSettingsChangeEvent 949ff217 PR-930: Add methods to get/set evoker fang attack delay f6f7c79d SPIGOT-7514, PR-929: Add "Enchantment Roll" API to enchant items according to Minecraft mechanics d40e22da PR-712: Add API to get full result of crafting items CraftBukkit Changes: c8feb0629 PR-1291: Improve precondition message in Entity#playEffect 482c56a00 PR-1285: Add PlayerRecipeBookSettingsChangeEvent cdf798800 PR-1290: Add methods to get/set evoker fang attack delay 2c1b5f78f SPIGOT-7514, PR-1289: Add "Enchantment Roll" API to enchant items according to Minecraft mechanics 6aa644ae9 PR-992: Add API to get full result of crafting items ffb1319bc PR-1287: Fix scoreboards not updating in Player#setStatistic
144 lines
9.3 KiB
Diff
144 lines
9.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Andrew Steinborn <git@steinborn.me>
|
|
Date: Tue, 11 May 2021 17:39:22 -0400
|
|
Subject: [PATCH] Add Unix domain socket support
|
|
|
|
For Windows and ARM support, JEP-380 is required:
|
|
https://inside.java/2021/02/03/jep380-unix-domain-sockets-channels/
|
|
This will be possible as of the Minecraft 1.17 Java version bump.
|
|
|
|
Tested-by: Mariell Hoversholm <proximyst@proximyst.com>
|
|
Reviewed-by: Mariell Hoversholm <proximyst@proximyst.com>
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
|
index 3c751c98de1d5a9b41ebd832be0ae317d4ac9362..51c924f051c25cac8172b0ddab83f3b7a69adfe6 100644
|
|
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
|
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
|
@@ -219,6 +219,20 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
|
|
this.setEnforceWhitelist(dedicatedserverproperties.enforceWhitelist);
|
|
// this.worldData.setGameType(dedicatedserverproperties.gamemode); // CraftBukkit - moved to world loading
|
|
DedicatedServer.LOGGER.info("Default game type: {}", dedicatedserverproperties.gamemode);
|
|
+ // Paper start - Unix domain socket support
|
|
+ java.net.SocketAddress bindAddress;
|
|
+ if (this.getLocalIp().startsWith("unix:")) {
|
|
+ if (!io.netty.channel.epoll.Epoll.isAvailable()) {
|
|
+ DedicatedServer.LOGGER.error("**** INVALID CONFIGURATION!");
|
|
+ DedicatedServer.LOGGER.error("You are trying to use a Unix domain socket but you're not on a supported OS.");
|
|
+ return false;
|
|
+ } else if (!io.papermc.paper.configuration.GlobalConfiguration.get().proxies.velocity.enabled && !org.spigotmc.SpigotConfig.bungee) {
|
|
+ DedicatedServer.LOGGER.error("**** INVALID CONFIGURATION!");
|
|
+ DedicatedServer.LOGGER.error("Unix domain sockets require IPs to be forwarded from a proxy.");
|
|
+ return false;
|
|
+ }
|
|
+ bindAddress = new io.netty.channel.unix.DomainSocketAddress(this.getLocalIp().substring("unix:".length()));
|
|
+ } else {
|
|
InetAddress inetaddress = null;
|
|
|
|
if (!this.getLocalIp().isEmpty()) {
|
|
@@ -228,12 +242,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
|
|
if (this.getPort() < 0) {
|
|
this.setPort(dedicatedserverproperties.serverPort);
|
|
}
|
|
+ bindAddress = new java.net.InetSocketAddress(inetaddress, this.getPort());
|
|
+ }
|
|
+ // Paper end
|
|
|
|
this.initializeKeyPair();
|
|
DedicatedServer.LOGGER.info("Starting Minecraft server on {}:{}", this.getLocalIp().isEmpty() ? "*" : this.getLocalIp(), this.getPort());
|
|
|
|
try {
|
|
- this.getConnection().startTcpServerListener(inetaddress, this.getPort());
|
|
+ this.getConnection().bind(bindAddress); // Paper - Unix domain socket support
|
|
} catch (IOException ioexception) {
|
|
DedicatedServer.LOGGER.warn("**** FAILED TO BIND TO PORT!");
|
|
DedicatedServer.LOGGER.warn("The exception was: {}", ioexception.toString());
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerConnectionListener.java b/src/main/java/net/minecraft/server/network/ServerConnectionListener.java
|
|
index 6641fd04821240b1bbeff1bd8d996a8f2fff8385..5f625acf04ddb56e3596d086252f9bfccfdb95f2 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerConnectionListener.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerConnectionListener.java
|
|
@@ -78,7 +78,12 @@ public class ServerConnectionListener {
|
|
this.running = true;
|
|
}
|
|
|
|
+ // Paper start
|
|
public void startTcpServerListener(@Nullable InetAddress address, int port) throws IOException {
|
|
+ bind(new java.net.InetSocketAddress(address, port));
|
|
+ }
|
|
+ public void bind(java.net.SocketAddress address) throws IOException {
|
|
+ // Paper end
|
|
List list = this.channels;
|
|
|
|
synchronized (this.channels) {
|
|
@@ -86,7 +91,13 @@ public class ServerConnectionListener {
|
|
EventLoopGroup eventloopgroup;
|
|
|
|
if (Epoll.isAvailable() && this.server.isEpollEnabled()) {
|
|
+ // Paper start
|
|
+ if (address instanceof io.netty.channel.unix.DomainSocketAddress) {
|
|
+ oclass = io.netty.channel.epoll.EpollServerDomainSocketChannel.class;
|
|
+ } else {
|
|
oclass = EpollServerSocketChannel.class;
|
|
+ }
|
|
+ // Paper end
|
|
eventloopgroup = (EventLoopGroup) ServerConnectionListener.SERVER_EPOLL_EVENT_GROUP.get();
|
|
ServerConnectionListener.LOGGER.info("Using epoll channel type");
|
|
} else {
|
|
@@ -118,7 +129,7 @@ public class ServerConnectionListener {
|
|
((Connection) object).setListenerForServerboundHandshake(new ServerHandshakePacketListenerImpl(ServerConnectionListener.this.server, (Connection) object));
|
|
io.papermc.paper.network.ChannelInitializeListenerHolder.callListeners(channel); // Paper
|
|
}
|
|
- }).group(eventloopgroup).localAddress(address, port)).option(ChannelOption.AUTO_READ, false).bind().syncUninterruptibly()); // CraftBukkit
|
|
+ }).group(eventloopgroup).localAddress(address)).option(ChannelOption.AUTO_READ, false).bind().syncUninterruptibly()); // CraftBukkit // Paper
|
|
}
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
index e579a249e3d441458aa05ea99787b668fae78021..b35f4ab4ff034f7b59f3970fc18af2f777ec2a40 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -2461,6 +2461,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
// Spigot Start
|
|
public SocketAddress getRawAddress()
|
|
{
|
|
+ // Paper start - this can be nullable in the case of a Unix domain socket, so if it is, fake something
|
|
+ if (connection.channel.remoteAddress() == null) {
|
|
+ return new java.net.InetSocketAddress(java.net.InetAddress.getLoopbackAddress(), 0);
|
|
+ }
|
|
+ // Paper end
|
|
return this.connection.channel.remoteAddress();
|
|
}
|
|
// Spigot End
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java
|
|
index bb8ba0ba5c70f321d4fd195f14cfb4d75ec0e42f..0b3d6b309ea653d44bcfcd6dd418f692e040c87b 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java
|
|
@@ -45,6 +45,7 @@ public class ServerHandshakePacketListenerImpl implements ServerHandshakePacketL
|
|
this.connection.setClientboundProtocolAfterHandshake(ClientIntent.LOGIN);
|
|
// CraftBukkit start - Connection throttle
|
|
try {
|
|
+ if (!(this.connection.channel.localAddress() instanceof io.netty.channel.unix.DomainSocketAddress)) { // Paper - the connection throttle is useless when you have a Unix domain socket
|
|
long currentTime = System.currentTimeMillis();
|
|
long connectionThrottle = this.server.server.getConnectionThrottle();
|
|
InetAddress address = ((java.net.InetSocketAddress) this.connection.getRemoteAddress()).getAddress();
|
|
@@ -73,6 +74,7 @@ public class ServerHandshakePacketListenerImpl implements ServerHandshakePacketL
|
|
}
|
|
}
|
|
}
|
|
+ } // Paper - add closing bracket for if check above
|
|
} catch (Throwable t) {
|
|
org.apache.logging.log4j.LogManager.getLogger().debug("Failed to check connection throttle", t);
|
|
}
|
|
@@ -129,8 +131,11 @@ public class ServerHandshakePacketListenerImpl implements ServerHandshakePacketL
|
|
// Paper end
|
|
// if (org.spigotmc.SpigotConfig.bungee) { // Paper - comment out, we check above!
|
|
if ( ( split.length == 3 || split.length == 4 ) && ( ServerHandshakePacketListenerImpl.BYPASS_HOSTCHECK || ServerHandshakePacketListenerImpl.HOST_PATTERN.matcher( split[1] ).matches() ) ) { // Paper
|
|
+ // Paper start - Unix domain socket support
|
|
+ java.net.SocketAddress socketAddress = this.connection.getRemoteAddress();
|
|
this.connection.hostname = split[0];
|
|
- this.connection.address = new java.net.InetSocketAddress(split[1], ((java.net.InetSocketAddress) this.connection.getRemoteAddress()).getPort());
|
|
+ this.connection.address = new java.net.InetSocketAddress(split[1], socketAddress instanceof java.net.InetSocketAddress ? ((java.net.InetSocketAddress) socketAddress).getPort() : 0);
|
|
+ // Paper end
|
|
this.connection.spoofedUUID = com.mojang.util.UndashedUuid.fromStringLenient( split[2] );
|
|
} else
|
|
{
|