Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update to 1.19.1 #772

Merged
merged 15 commits into from
Jul 30, 2022
Merged

Update to 1.19.1 #772

merged 15 commits into from
Jul 30, 2022

Conversation

Xernium
Copy link
Member

@Xernium Xernium commented Jun 23, 2022

Pull-request to track 1.19.1 changes

Copy link

@xrh0905 xrh0905 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good
I'll try it as soon as I fix my jdk.

@xrh0905
Copy link

xrh0905 commented Jun 26, 2022

Build failed...
Hold on, I'll try again :(

@Xernium
Copy link
Member Author

Xernium commented Jun 26, 2022

After #776 applied, I can't connect with 1.19.1 rc1.

That is not a bug, what kind of server are you testing this with? It works perfectly fine with a supported server version

@Xernium
Copy link
Member Author

Xernium commented Jun 26, 2022

I should note that ViaVersion hasn't implemented 1.19.1-auth support yet

@Xernium
Copy link
Member Author

Xernium commented Jun 26, 2022

As far as I can tell everything works.
Screenshot from 2022-06-26 15-33-54
I used a modified version of Paper 1.19 to test everything including forwarding.
I don't have access to 1.19.1 yet either, this is just a 1.19.1-rc1 client with a modified version.json

I also started on the checkstyle update, see the developers notes
for the rest I haven't gotten around to fixing yet.
@KingTino104
Copy link

KingTino104 commented Jul 9, 2022

As far as I can tell everything works. Screenshot from 2022-06-26 15-33-54 I used a modified version of Paper 1.19 to test everything including forwarding. I don't have access to 1.19.1 yet either, this is just a 1.19.1-rc1 client with a modified version.json

how r u running 1.19.1 on paper

send me it

config.set("force-key-authentication", config.getOrElse("force-key-authentication", true));
config.setComment("force-key-authentication",
"Should the proxy enforce the new public key security standard? By default, this is on.");
config.set("config-version", configVersion == 2.0 ? "2.5" : "1.5");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no reason to move to a .5 version without first having gone through .1, .2, .3 and .4 versions

Also, I think it is unnecessary to continue maintaining an old configuration version 1.x since a single migration can be done by updating the old values and adding new configuration options to the configuration directly #788

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I honestly think that just generally, I wanna rewrite the way the config is handled as there's many oddities we've hit for god knows how long, many people seem to get burned by the fact that we're not writing the config out properly, etc pelican-eggs/eggs#1741 - idk what exactly they're doing but there is defo some oddities induced here

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My egg should be pulling a perfectly valid config. I am not sure why it's doing what it's doing.

I will work on it soon. I have been moving my servers around the last few days.

@Xernium
Copy link
Member Author

Xernium commented Jul 27, 2022

This is still experimental, use at your own risk.

You can find a build to try at
https://fivepb.me/ci/builds/oneshot/velocity-proxy-3.1.2-SNAPSHOT-06f0def.jar
I'd really appreciate the feedback

@blake-tisbury
Copy link

blake-tisbury commented Jul 28, 2022

This is still experimental, use at your own risk.

You can find a build to try at https://fivepb.me/ci/builds/oneshot/velocity-proxy-3.1.2-SNAPSHOT-06f0def.jar I'd really appreciate the feedback

I wasn't able to get this working while using a 1.19.1 client. 1.19 clients connected without issue though. This was the error 1.19.1 clients were triggering:

Caused by: java.net.ConnectException: finishConnect(..) failed: Connection refused
	at io.netty.channel.unix.Errors.newConnectException0(Errors.java:155) ~[velocity.jar:3.1.2-SNAPSHOT (git-09e761db-bunknown)]
	at io.netty.channel.unix.Errors.handleConnectErrno(Errors.java:128) ~[velocity.jar:3.1.2-SNAPSHOT (git-09e761db-bunknown)]
	at io.netty.channel.unix.Socket.finishConnect(Socket.java:321) ~[velocity.jar:3.1.2-SNAPSHOT (git-09e761db-bunknown)]
	at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.doFinishConnect(AbstractEpollChannel.java:710) ~[velocity.jar:3.1.2-SNAPSHOT (git-09e761db-bunknown)]
	at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.finishConnect(AbstractEpollChannel.java:687) ~[velocity.jar:3.1.2-SNAPSHOT (git-09e761db-bunknown)]
	at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.epollOutReady(AbstractEpollChannel.java:567) ~[velocity.jar:3.1.2-SNAPSHOT (git-09e761db-bunknown)]
	at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:477) ~[velocity.jar:3.1.2-SNAPSHOT (git-09e761db-bunknown)]
	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:385) ~[velocity.jar:3.1.2-SNAPSHOT (git-09e761db-bunknown)]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995) ~[velocity.jar:3.1.2-SNAPSHOT (git-09e761db-bunknown)]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[velocity.jar:3.1.2-SNAPSHOT (git-09e761db-bunknown)]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[velocity.jar:3.1.2-SNAPSHOT (git-09e761db-bunknown)]
	at java.lang.Thread.run(Thread.java:833) [?:?]

@Xernium
Copy link
Member Author

Xernium commented Jul 28, 2022

@blake-tisbury any logs from backend? Your backend server has to support 1.19.1 natively for this to work correctly
Fabric 1.19.1 with fabricproxy-lite doesn’t work because I don’t think it’s been updated yet

@blake-tisbury
Copy link

@Xernium I was using the latest build of Via Version (was updated today for 1.19.1) with 1.19 Purpur, the latest build. Let me see if Purpur has any 1.19.1 dev builds and I can test with that.

@Tomographix
Copy link

@blake-tisbury any logs from backend? Your backend server has to support 1.19.1 natively for this to work correctly Fabric 1.19.1 with fabricproxy-lite doesn’t work because I don’t think it’s been updated yet

Do you mean that all servers connected to the proxy also need to run 1.19.1 for players to be able to join using the dev build?

@Xernium
Copy link
Member Author

Xernium commented Jul 28, 2022

Found a bug, ServerData should also shave
previewsChat (Boolean)
enforcesSecureChat (Boolean)
in 1.19.1, didn’t notice while rebasing. Will be fixed later

@Xernium
Copy link
Member Author

Xernium commented Jul 28, 2022

Experimental build 2:

https://fivepb.me/ci/builds/oneshot/velocity-proxy-3.1.2-SNAPSHOT-c57fb48.jar
(May not work with paper until PaperMC/Paper#8199 is addressed)

@CDFN
Copy link

CDFN commented Jul 28, 2022

c57fb48 seems to work flawlessly, for me with git-Purpur-1737 (MC: 1.19.1)

@blake-tisbury
Copy link

Using the same configuration except 1.19.1 players are getting instantly disconnected when typing in anything at all.
Players on 1.18 can type fine as well as players connecting through Geyser. (Players on 1.19 cannot connect, assuming this to be a ViaBackwards issue.)

Notes:
Using ViaVersion and ViaBackwards 4.4.1
Using Latest of Geyser and Floodgate
Using c57fb48
Using Purpur 1.19.1 build #1737

@bitrot-alpha
Copy link

bitrot-alpha commented Jul 29, 2022

I'm having the same issue as @blake-tisbury on the older Build 162 (latest from papermc.io) with force-key-authentication in velocity.toml set to false, and enforce-secure-profile in server.properties set to false. Same error occurs with ViaBackwards 4.3.1.

EDIT: c57fb48 fixed the problem. No issue with NOT verifying keys for chat.

[22:06:49] [Netty epoll Worker #11/INFO]: [connected player] RazpBerrii (/IPADDRESS) has connected
[22:06:49] [Netty epoll Worker #11/INFO]: [server connection] RazpBerrii -> lobby has connected
[22:06:56] [Netty epoll Worker #11/INFO]: [connected player] RazpBerrii (/IP ADDRESS) has disconnected: An internal error occurred in your connection.
[22:06:56] [Netty epoll Worker #11/ERROR]: [connected player] RazpBerrii (/IP ADDRESS): exception encountered in com.velocitypowered.proxy.connection.client.ClientPlaySessionHandler@6b213921
java.lang.NullPointerException: Cannot invoke "com.velocitypowered.api.proxy.crypto.IdentifiedKey.getSignedPublicKey()" because "signer" is null
	at com.velocitypowered.proxy.protocol.packet.chat.PlayerChat.signedContainer(PlayerChat.java:132) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at com.velocitypowered.proxy.connection.client.ClientPlaySessionHandler.handle(ClientPlaySessionHandler.java:257) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at com.velocitypowered.proxy.protocol.packet.chat.PlayerChat.handle(PlayerChat.java:137) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at com.velocitypowered.proxy.connection.MinecraftConnection.channelRead(MinecraftConnection.java:142) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at com.velocitypowered.proxy.protocol.netty.MinecraftDecoder.tryDecode(MinecraftDecoder.java:89) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at com.velocitypowered.proxy.protocol.netty.MinecraftDecoder.channelRead(MinecraftDecoder.java:58) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:327) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:299) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:800) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:487) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:385) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[velocity-3.1.2-SNAPSHOT-162.jar:3.1.2-SNAPSHOT (git-6be344d9-b162)]
	at java.lang.Thread.run(Thread.java:889) [?:?]
[22:06:56] [Netty epoll Worker #11/INFO]: [server connection] RazpBerrii -> lobby has disconnected

Server info:
Velocity 3.1.2-SNAPSHOT (git-6be344d9-b162) (Build 162)
This server is running Paper version git-Paper-66 (MC: 1.19) (Implementing API version 1.19-R0.1-SNAPSHOT) (Git: b7faa65)
Using ViaVersion 4.4.1 and ViaBackwards.

@HarvelsX
Copy link

Hello!

There are some errors that appear with users of modifications No Chat Reports.
This modification kind of removes the ProfileKeyPairManager key itself, so Velocity throws an exception:

io.netty.handler.codec.EncoderException: java.lang.NullPointerException: Cannot invoke "com.velocitypowered.api.proxy.crypto.IdentifiedKey.getSignatureHolder()" because "this.playerKey" is null
        at io.netty.handler.codec.MessageToByteEncoder.write(MessageToByteEncoder.java:125) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:717) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:709) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:792) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:702) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.channel.DefaultChannelPipeline.write(DefaultChannelPipeline.java:1015) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.channel.AbstractChannel.write(AbstractChannel.java:301) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at com.velocitypowered.proxy.connection.MinecraftConnection.delayedWrite(MinecraftConnection.java:230) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at com.velocitypowered.proxy.connection.backend.VelocityServerConnection.startHandshake(VelocityServerConnection.java:193) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at com.velocitypowered.proxy.connection.backend.VelocityServerConnection.lambda$connect$0(VelocityServerConnection.java:113) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:571) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:550) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:605) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:300) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:335) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:710) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at java.lang.Thread.run(Thread.java:833) [?:?]
Caused by: java.lang.NullPointerException: Cannot invoke "com.velocitypowered.api.proxy.crypto.IdentifiedKey.getSignatureHolder()" because "this.playerKey" is null
        at com.velocitypowered.proxy.protocol.packet.ServerLogin.encode(ServerLogin.java:112) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at com.velocitypowered.proxy.protocol.netty.MinecraftEncoder.encode(MinecraftEncoder.java:51) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at com.velocitypowered.proxy.protocol.netty.MinecraftEncoder.encode(MinecraftEncoder.java:29) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        at io.netty.handler.codec.MessageToByteEncoder.write(MessageToByteEncoder.java:107) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
        ... 27 more

I think a lot of players will put this modification, is it worth checking on the side Velocity this or turn to the creator of the mod?

Related to:

byte[] key = ProtocolUtils.readByteArray(buf);

Version: Velocity 3.1.2-SNAPSHOT (git-c57fb489-bunknown)
Game server: git-Paper-87 (MC: 1.19.1) (Implementing API version 1.19.1-R0.1-SNAPSHOT) (Git: 3b895f3)

@HarvelsX
Copy link

Oh, I think I got a LITTLE confused, but thanks for such a quick callback! <3

Copy link
Member

@electronicboy electronicboy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dropping my own approval on this, I generally see no issues rather than maybe a cleanup or so, plus needed API changes for chat but that can probably come over the next week or so

@@ -94,6 +107,15 @@ public void encode(ByteBuf buf, ProtocolUtils.Direction direction, ProtocolVersi
} else {
buf.writeBoolean(false);
}

if (version.compareTo(ProtocolVersion.MINECRAFT_1_19_1) >= 0) {
if (playerKey != null && playerKey.getSignatureHolder() != null) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added a null check here just because it made sense in regards to letting people do whatever they want, but, that signature holder should probably just actually use the field in the packet, as right now you can't just blindly pass this packet through, I guess in part we'll probably never have a case where we have the key and not the UUID, but, some level of "bleh" here

@BBaoVanC
Copy link

BBaoVanC commented Jul 30, 2022

Tried out both 1e8f9ea and c57fb48, I get the same two issues:

First, I get an error when sending a message on a 1.19 client (but the message does send anyways):

java.util.concurrent.CompletionException: java.lang.NullPointerException: Cannot invoke "com.velocitypowered.api.proxy.crypto.IdentifiedKey.getKeyRevision()" because the return value of "com.velocitypowered.proxy.connection.client.ConnectedPlayer.getIdentifiedKey()" is null
	at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:315) ~[?:?]
	at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:320) ~[?:?]
	at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:722) ~[?:?]
	at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?]
	at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174) ~[velocity-proxy-3.1.2-SNAPSHOT-all_1.19.1_branch.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167) ~[velocity-proxy-3.1.2-SNAPSHOT-all_1.19.1_branch.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) ~[velocity-proxy-3.1.2-SNAPSHOT-all_1.19.1_branch.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:391) ~[velocity-proxy-3.1.2-SNAPSHOT-all_1.19.1_branch.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995) ~[velocity-proxy-3.1.2-SNAPSHOT-all_1.19.1_branch.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[velocity-proxy-3.1.2-SNAPSHOT-all_1.19.1_branch.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[velocity-proxy-3.1.2-SNAPSHOT-all_1.19.1_branch.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
	at java.lang.Thread.run(Thread.java:833) [?:?]
Caused by: java.lang.NullPointerException: Cannot invoke "com.velocitypowered.api.proxy.crypto.IdentifiedKey.getKeyRevision()" because the return value of "com.velocitypowered.proxy.connection.client.ConnectedPlayer.getIdentifiedKey()" is null
	at com.velocitypowered.proxy.connection.client.ClientPlaySessionHandler.lambda$processPlayerChat$3(ClientPlaySessionHandler.java:199) ~[velocity-proxy-3.1.2-SNAPSHOT-all_1.19.1_branch.jar:3.1.2-SNAPSHOT (git-c57fb489-bunknown)]
	at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:718) ~[?:?]
	... 9 more

When sending a message from a 1.19.1 client, I get a different error which kicks me: I didn't read the part where it said "A plugin", so I'll take a look into this separately

the stacktrace
[02:43:25 INFO] [gchat-velocity]: [creative] bbaovanc: asdfasdf
[02:43:25 FATAL]: A plugin tried to cancel a signed chat message. This is no longer possible in 1.19.1 and newer. Disconnecting player bbaovanc
[02:43:25 INFO]: [connected player] bbaovanc (/[redacted]:56876) has disconnected: A proxy plugin caused an illegal protocol state. Contact your network administrator.
[02:43:25 INFO]: [server connection] bbaovanc -> creative has disconnected

@ghost
Copy link

ghost commented Jul 30, 2022

Can get newest dev version to 1.19.1?

@arima0k
Copy link

arima0k commented Jul 30, 2022

Can get newest dev version to 1.19.1?

Sure you can (link above). But make it work, I don't know.

@Astralchroma
Copy link

Running Latest Paper on backend, and the lastest commit of this PR on the proxy.

No Chat Reports mod causes a disconnect when switching servers. Stacktrace below.

[16:13:16 INFO]: [connected player] PeterCrawley (<ip address withheld>) has disconnected: An internal error occurred in your connection.
[16:13:16 ERROR]: [connected player] PeterCrawley (<ip address withheld>): exception encountered in com.velocitypowered.proxy.connection.client.ClientPlaySessionHandler@3a363605
java.lang.NullPointerException: Cannot invoke "com.velocitypowered.api.proxy.crypto.IdentifiedKey.getSignedPublicKey()" because "signer" is null
	at com.velocitypowered.proxy.protocol.packet.chat.PlayerCommand.signedContainer(PlayerCommand.java:213) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at com.velocitypowered.proxy.connection.client.ClientPlaySessionHandler.handle(ClientPlaySessionHandler.java:261) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at com.velocitypowered.proxy.protocol.packet.chat.PlayerCommand.handle(PlayerCommand.java:232) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at com.velocitypowered.proxy.connection.MinecraftConnection.channelRead(MinecraftConnection.java:142) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at com.velocitypowered.proxy.protocol.netty.MinecraftDecoder.tryDecode(MinecraftDecoder.java:89) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at com.velocitypowered.proxy.protocol.netty.MinecraftDecoder.channelRead(MinecraftDecoder.java:58) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:327) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:299) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:800) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:487) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:385) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[velocity-proxy-3.1.2-SNAPSHOT-all.jar:3.1.2-SNAPSHOT (git-a8f354df-bunknown)]
	at java.lang.Thread.run(Thread.java:833) [?:?]
[16:13:16 INFO]: [server connection] PeterCrawley -> survival has disconnected

No Chat Reports mod also causes a disconnect when sending a chat message.

[16:16:20 INFO]: [connected player] PeterCrawley (<ip address withheld>) has disconnected: An internal error occurred in your connection.
[16:16:20 ERROR]: [connected player] PeterCrawley (<ip address withheld>): exception encountered in com.velocitypowered.proxy.connection.client.ClientPlaySessionHandler@3d541449
com.velocitypowered.proxy.util.except.QuietRuntimeException: A packet did not decode successfully (invalid data). If you are a developer, launch Velocity with -Dvelocity.packet-decode-logging=true to see more.
[16:16:20 INFO]: [server connection] PeterCrawley -> survival has disconnected

@astei
Copy link
Contributor

astei commented Jul 30, 2022

"No Chat Reports" flatly refuses to comply with even the letter of the Minecraft protocol - it is essentially providing signed messages without the player's public key.

Note that if we ever choose to enforce chat signatures, then the mod will just break again... not our fault if we do that, you get what you pay for.
@C0Nd3Mnd C0Nd3Mnd mentioned this pull request Jul 30, 2022
@BBaoVanC
Copy link

"No Chat Reports" flatly refuses to comply with even the letter of the Minecraft protocol - it is essentially providing signed messages without the player's public key.

Is this something that should be reported as a bug to them?

@Astralchroma
Copy link

If it is behaviour that the Vanilla server allows, there is no reason why Velocity should not allow it as well.

@astei astei merged commit 1a3fba4 into dev/3.0.0 Jul 30, 2022
jbmagination pushed a commit to jbmagination/Velocity that referenced this pull request Aug 13, 2022
* 1.19.1-rc1

* More signature changes

* Further 1.19.1 changes

I also started on the checkstyle update, see the developers notes
for the rest I haven't gotten around to fixing yet.

* Fix checkstyle

* Checkstyle imports

* Fix logic error

* Changes 1.19.1-pre2

* 1.19-pre3

* Progress, some parts still WIP

* Overlooked changes

* Fix ServerData

* Fix ServerLogin send check

* Workaround the broken behavior of "No Chat Reports"

Note that if we ever choose to enforce chat signatures, then the mod will just break again... not our fault if we do that, you get what you pay for.

* more

Co-authored-by: Shane Freeder <theboyetronic@gmail.com>
Co-authored-by: Andrew Steinborn <git@steinborn.me>
ValeraShimchuck pushed a commit to ValeraShimchuck/LollipopVelocity that referenced this pull request Sep 12, 2022
* 1.19.1-rc1

* More signature changes

* Further 1.19.1 changes

I also started on the checkstyle update, see the developers notes
for the rest I haven't gotten around to fixing yet.

* Fix checkstyle

* Checkstyle imports

* Fix logic error

* Changes 1.19.1-pre2

* 1.19-pre3

* Progress, some parts still WIP

* Overlooked changes

* Fix ServerData

* Fix ServerLogin send check

* Workaround the broken behavior of "No Chat Reports"

Note that if we ever choose to enforce chat signatures, then the mod will just break again... not our fault if we do that, you get what you pay for.

* more

Co-authored-by: Shane Freeder <theboyetronic@gmail.com>
Co-authored-by: Andrew Steinborn <git@steinborn.me>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet