Skip to content

Commit 1c5d6c8

Browse files
authored
fix(proxy): forward backend register/unregister packets to client (minekube#672)
1 parent 2f540cd commit 1c5d6c8

2 files changed

Lines changed: 97 additions & 4 deletions

File tree

pkg/edition/java/proxy/session_backend_play.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,9 @@ func (b *backendPlaySessionHandler) handlePluginMessage(packet *plugin.Message,
190190
return
191191
}
192192

193-
// Register and unregister packets are simply forwarded to the server as-is.
193+
// Register and unregister packets from the backend must be forwarded to the client as-is.
194194
if plugin.IsRegister(packet) || plugin.IsUnregister(packet) {
195-
if serverMc, ok := b.serverConn.ensureConnected(); ok {
196-
_ = serverMc.WritePacket(packet)
197-
}
195+
b.forwardToPlayer(pc, packet)
198196
return
199197
}
200198

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package proxy
2+
3+
import (
4+
"context"
5+
"net"
6+
"testing"
7+
8+
"github.com/go-logr/logr"
9+
"go.minekube.com/gate/pkg/edition/java/netmc"
10+
"go.minekube.com/gate/pkg/edition/java/proto/packet/plugin"
11+
"go.minekube.com/gate/pkg/edition/java/proto/state"
12+
"go.minekube.com/gate/pkg/edition/java/proto/version"
13+
"go.minekube.com/gate/pkg/edition/java/proxy/bungeecord"
14+
"go.minekube.com/gate/pkg/edition/java/proxy/phase"
15+
"go.minekube.com/gate/pkg/gate/proto"
16+
)
17+
18+
func TestBackendPlayRegisterForwardsToPlayer(t *testing.T) {
19+
playerConn := &testMinecraftConn{}
20+
player := &connectedPlayer{
21+
MinecraftConn: playerConn,
22+
log: logr.Discard(),
23+
}
24+
serverConn := &serverConnection{
25+
player: player,
26+
log: logr.Discard(),
27+
}
28+
handler := &backendPlaySessionHandler{
29+
serverConn: serverConn,
30+
bungeeCordMessageResponder: bungeecord.NopMessageResponder,
31+
log: logr.Discard(),
32+
}
33+
34+
register := &plugin.Message{
35+
Channel: plugin.RegisterChannel,
36+
Data: []byte("axiom:hello"),
37+
}
38+
handler.handlePluginMessage(register, nil)
39+
40+
if len(playerConn.writtenPackets) != 1 {
41+
t.Fatalf("expected register packet to be written to player once, got %d", len(playerConn.writtenPackets))
42+
}
43+
got, ok := playerConn.writtenPackets[0].(*plugin.Message)
44+
if !ok {
45+
t.Fatalf("expected plugin message, got %T", playerConn.writtenPackets[0])
46+
}
47+
if got.Channel != register.Channel {
48+
t.Fatalf("expected channel %q, got %q", register.Channel, got.Channel)
49+
}
50+
if string(got.Data) != string(register.Data) {
51+
t.Fatalf("expected payload %q, got %q", string(register.Data), string(got.Data))
52+
}
53+
}
54+
55+
type testMinecraftConn struct {
56+
writtenPackets []proto.Packet
57+
}
58+
59+
func (t *testMinecraftConn) Context() context.Context { return context.Background() }
60+
func (t *testMinecraftConn) Close() error { return nil }
61+
func (t *testMinecraftConn) State() *state.Registry { return state.Play }
62+
func (t *testMinecraftConn) Protocol() proto.Protocol { return version.Minecraft_1_20_3.Protocol }
63+
func (t *testMinecraftConn) RemoteAddr() net.Addr { return &net.TCPAddr{} }
64+
func (t *testMinecraftConn) LocalAddr() net.Addr { return &net.TCPAddr{} }
65+
func (t *testMinecraftConn) Type() phase.ConnectionType {
66+
return phase.Vanilla
67+
}
68+
func (t *testMinecraftConn) SetType(phase.ConnectionType) {}
69+
func (t *testMinecraftConn) ActiveSessionHandler() netmc.SessionHandler { return nil }
70+
func (t *testMinecraftConn) SetActiveSessionHandler(*state.Registry, netmc.SessionHandler) {
71+
}
72+
func (t *testMinecraftConn) SwitchSessionHandler(*state.Registry) bool { return true }
73+
func (t *testMinecraftConn) AddSessionHandler(*state.Registry, netmc.SessionHandler) {
74+
}
75+
func (t *testMinecraftConn) SetAutoReading(bool) {}
76+
func (t *testMinecraftConn) SetProtocol(proto.Protocol) {}
77+
func (t *testMinecraftConn) SetState(*state.Registry) {}
78+
func (t *testMinecraftConn) SetCompressionThreshold(int) error { return nil }
79+
func (t *testMinecraftConn) EnableEncryption([]byte) error { return nil }
80+
func (t *testMinecraftConn) WritePacket(packet proto.Packet) error {
81+
t.writtenPackets = append(t.writtenPackets, packet)
82+
return nil
83+
}
84+
func (t *testMinecraftConn) Write([]byte) error { return nil }
85+
func (t *testMinecraftConn) BufferPacket(packet proto.Packet) error {
86+
t.writtenPackets = append(t.writtenPackets, packet)
87+
return nil
88+
}
89+
func (t *testMinecraftConn) BufferPayload([]byte) error { return nil }
90+
func (t *testMinecraftConn) Flush() error { return nil }
91+
func (t *testMinecraftConn) Reader() netmc.Reader { return nil }
92+
func (t *testMinecraftConn) Writer() netmc.Writer { return nil }
93+
func (t *testMinecraftConn) EnablePlayPacketQueue() {}
94+
95+
var _ netmc.MinecraftConn = (*testMinecraftConn)(nil)

0 commit comments

Comments
 (0)