From f645f3d78d436b8ad7557b5b1f4cb675510ebc63 Mon Sep 17 00:00:00 2001 From: Admin Else <74665496+admin-else@users.noreply.github.com> Date: Tue, 4 Aug 2026 22:31:06 +0200 Subject: [PATCH] strom: consolidate identical handlers to single v1_8-based versions For types identical across all versions (Compress, Disconnect, Status, Pong), use a single handler at v1_8 registered to 26.2 instead of per-version duplicates. For types that differ (Encrypt has extra ShouldAuthenticate field in newer versions, Success has different Uuid type), keep dual-range registrations. --- mc/client/login.go | 44 ++++++++++++++++++-------------------------- mc/client/status.go | 22 ++-------------------- 2 files changed, 20 insertions(+), 46 deletions(-) diff --git a/mc/client/login.go b/mc/client/login.go index 4d367c9..c624cca 100644 --- a/mc/client/login.go +++ b/mc/client/login.go @@ -56,28 +56,36 @@ func (s *LoginClient) OnClose(_ event.Close) (err error) { return } -func (s *LoginClient) OnCompress(compress *v1_21_8.LoginToClientPacketCompress) (err error) { - s.SetCompressionThreshold(compress.Threshold) +func (s *LoginClient) OnCompress(packet *v1_8.LoginToClientPacketCompress) (err error) { + s.SetCompressionThreshold(packet.Threshold) return } +func (s *LoginClient) OnEncryptV1_8(packet *v1_8.LoginToClientPacketEncryptionBegin) (err error) { + return s.doEncrypt(packet.ServerId, packet.PublicKey, packet.VerifyToken, true) +} + func (s *LoginClient) OnEncrypt(packet *v1_21_8.LoginToClientPacketEncryptionBegin) (err error) { + return s.doEncrypt(packet.ServerId, packet.PublicKey, packet.VerifyToken, packet.ShouldAuthenticate) +} + +func (s *LoginClient) doEncrypt(serverId string, publicKey []byte, verifyToken []byte, shouldAuthenticate bool) (err error) { sharedSecret := make([]byte, 16) _, _ = rand.Read(sharedSecret) //never fails - if packet.ShouldAuthenticate { + if shouldAuthenticate { if s.Account.Ygg == "" { err = NoTokenErr return } - serverId := crypto.AuthDigest([]byte(packet.ServerId), sharedSecret, packet.PublicKey) - err = s.Account.JoinServer(serverId) + hash := crypto.AuthDigest([]byte(serverId), sharedSecret, publicKey) + err = s.Account.JoinServer(hash) if err != nil { return } } - pubAny, err := x509.ParsePKIXPublicKey(packet.PublicKey) + pubAny, err := x509.ParsePKIXPublicKey(publicKey) if err != nil { return } @@ -86,7 +94,7 @@ func (s *LoginClient) OnEncrypt(packet *v1_21_8.LoginToClientPacketEncryptionBeg err = BadPublicKeyTypeErr return } - verifyTokenEnc, err := rsa.EncryptPKCS1v15(rand.Reader, pub, packet.VerifyToken) + verifyTokenEnc, err := rsa.EncryptPKCS1v15(rand.Reader, pub, verifyToken) if err != nil { return } @@ -101,10 +109,9 @@ func (s *LoginClient) OnEncrypt(packet *v1_21_8.LoginToClientPacketEncryptionBeg } err = s.SetSecret(sharedSecret) return - } -func (s *LoginClient) OnDisconnect(packet *v1_21_8.LoginToClientPacketDisconnect) (err error) { +func (s *LoginClient) OnDisconnect(packet *v1_8.LoginToClientPacketDisconnect) (err error) { var reason text.Component err = json.Unmarshal([]byte(packet.Reason), &reason) if err != nil { @@ -114,21 +121,6 @@ func (s *LoginClient) OnDisconnect(packet *v1_21_8.LoginToClientPacketDisconnect return } -func (s *LoginClient) OnDisconnectV1_8(packet *v1_8.LoginToClientPacketDisconnect) (err error) { - var reason text.Component - err = json.Unmarshal([]byte(packet.Reason), &reason) - if err != nil { - return - } - err = KickedDuringLoginErr{reason} - return -} - -func (s *LoginClient) OnCompressV1_8(packet *v1_8.LoginToClientPacketCompress) (err error) { - s.SetCompressionThreshold(packet.Threshold) - return -} - func (s *LoginClient) OnSuccessV1_8(success *v1_8.LoginToClientPacketSuccess) (err error) { s.GivenAccount = &v1_21_8.LoginToClientPacketSuccess{ Uuid: uuid.MustParse(success.Uuid), @@ -181,10 +173,10 @@ func LoginRawAddr(c *proto.Conn, account *api.Account, hostAddr string) (err err } lc.RegisterCritical(lc.OnDefault) lc.RegisterCritical(lc.OnClose) - lc.RegisterUntil("26.2", lc.OnCompress, lc.OnEncrypt, lc.OnDisconnect) + lc.RegisterUntil("26.2", lc.OnCompress, lc.OnDisconnect, lc.OnEncrypt) lc.RegisterUntil("26.1", lc.OnSuccess) lc.RegisterUntilLatest(lc.OnSuccess26_2) - lc.RegisterUntil("1.12.2", lc.OnCompressV1_8, lc.OnDisconnectV1_8, lc.OnSuccessV1_8) + lc.RegisterUntil("1.12.2", lc.OnEncryptV1_8, lc.OnSuccessV1_8) var p proto_base.EncodeDecodeAble if hostAddr != "" { diff --git a/mc/client/status.go b/mc/client/status.go index 144aed1..1f575a5 100644 --- a/mc/client/status.go +++ b/mc/client/status.go @@ -20,7 +20,7 @@ type StatusClient struct { DoPingRoundTripTime bool } -func (s *StatusClient) OnStatus(p *v1_21_8.StatusToClientPacketServerInfo) (err error) { +func (s *StatusClient) OnStatus(p *v1_8.StatusToClientPacketServerInfo) (err error) { s.Status = p.Response s.PingSendTime = time.Now() if s.DoPingRoundTripTime { @@ -31,24 +31,7 @@ func (s *StatusClient) OnStatus(p *v1_21_8.StatusToClientPacketServerInfo) (err return } -func (s *StatusClient) OnPong(p *v1_21_8.StatusToClientPacketPing) (err error) { - s.PingReceiveTime = time.Now() - err = event.HandlerDoneErr{} - return -} - -func (s *StatusClient) OnStatusV1_8(p *v1_8.StatusToClientPacketServerInfo) (err error) { - s.Status = p.Response - s.PingSendTime = time.Now() - if s.DoPingRoundTripTime { - err = s.Send(&v1_21_8.StatusToServerPacketPing{Time: s.PingSendTime.UnixMilli()}) - } else { - err = event.HandlerDoneErr{} - } - return -} - -func (s *StatusClient) OnPongV1_8(p *v1_8.StatusToClientPacketPing) (err error) { +func (s *StatusClient) OnPong(p *v1_8.StatusToClientPacketPing) (err error) { s.PingReceiveTime = time.Now() err = event.HandlerDoneErr{} return @@ -76,7 +59,6 @@ func StatusRawWithVersion(ctx context.Context, addr, version string) (s *StatusC Conn: c, } s.RegisterUntil("26.2", s.OnStatus, s.OnPong) - s.RegisterUntil("1.12.2", s.OnStatusV1_8, s.OnPongV1_8) p, err := MakeHandshakePacketAddr(s.Conn, proto_base.Status, addr) if err != nil {