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.
This commit is contained in:
Admin Else
2026-08-04 22:31:06 +02:00
parent 1001c809e5
commit f645f3d78d
2 changed files with 20 additions and 46 deletions
+18 -26
View File
@@ -56,28 +56,36 @@ func (s *LoginClient) OnClose(_ event.Close) (err error) {
return return
} }
func (s *LoginClient) OnCompress(compress *v1_21_8.LoginToClientPacketCompress) (err error) { func (s *LoginClient) OnCompress(packet *v1_8.LoginToClientPacketCompress) (err error) {
s.SetCompressionThreshold(compress.Threshold) s.SetCompressionThreshold(packet.Threshold)
return 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) { 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) sharedSecret := make([]byte, 16)
_, _ = rand.Read(sharedSecret) //never fails _, _ = rand.Read(sharedSecret) //never fails
if packet.ShouldAuthenticate { if shouldAuthenticate {
if s.Account.Ygg == "" { if s.Account.Ygg == "" {
err = NoTokenErr err = NoTokenErr
return return
} }
serverId := crypto.AuthDigest([]byte(packet.ServerId), sharedSecret, packet.PublicKey) hash := crypto.AuthDigest([]byte(serverId), sharedSecret, publicKey)
err = s.Account.JoinServer(serverId) err = s.Account.JoinServer(hash)
if err != nil { if err != nil {
return return
} }
} }
pubAny, err := x509.ParsePKIXPublicKey(packet.PublicKey) pubAny, err := x509.ParsePKIXPublicKey(publicKey)
if err != nil { if err != nil {
return return
} }
@@ -86,7 +94,7 @@ func (s *LoginClient) OnEncrypt(packet *v1_21_8.LoginToClientPacketEncryptionBeg
err = BadPublicKeyTypeErr err = BadPublicKeyTypeErr
return return
} }
verifyTokenEnc, err := rsa.EncryptPKCS1v15(rand.Reader, pub, packet.VerifyToken) verifyTokenEnc, err := rsa.EncryptPKCS1v15(rand.Reader, pub, verifyToken)
if err != nil { if err != nil {
return return
} }
@@ -101,10 +109,9 @@ func (s *LoginClient) OnEncrypt(packet *v1_21_8.LoginToClientPacketEncryptionBeg
} }
err = s.SetSecret(sharedSecret) err = s.SetSecret(sharedSecret)
return 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 var reason text.Component
err = json.Unmarshal([]byte(packet.Reason), &reason) err = json.Unmarshal([]byte(packet.Reason), &reason)
if err != nil { if err != nil {
@@ -114,21 +121,6 @@ func (s *LoginClient) OnDisconnect(packet *v1_21_8.LoginToClientPacketDisconnect
return 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) { func (s *LoginClient) OnSuccessV1_8(success *v1_8.LoginToClientPacketSuccess) (err error) {
s.GivenAccount = &v1_21_8.LoginToClientPacketSuccess{ s.GivenAccount = &v1_21_8.LoginToClientPacketSuccess{
Uuid: uuid.MustParse(success.Uuid), 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.OnDefault)
lc.RegisterCritical(lc.OnClose) 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.RegisterUntil("26.1", lc.OnSuccess)
lc.RegisterUntilLatest(lc.OnSuccess26_2) 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 var p proto_base.EncodeDecodeAble
if hostAddr != "" { if hostAddr != "" {
+2 -20
View File
@@ -20,7 +20,7 @@ type StatusClient struct {
DoPingRoundTripTime bool 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.Status = p.Response
s.PingSendTime = time.Now() s.PingSendTime = time.Now()
if s.DoPingRoundTripTime { if s.DoPingRoundTripTime {
@@ -31,24 +31,7 @@ func (s *StatusClient) OnStatus(p *v1_21_8.StatusToClientPacketServerInfo) (err
return return
} }
func (s *StatusClient) OnPong(p *v1_21_8.StatusToClientPacketPing) (err error) { func (s *StatusClient) OnPong(p *v1_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) {
s.PingReceiveTime = time.Now() s.PingReceiveTime = time.Now()
err = event.HandlerDoneErr{} err = event.HandlerDoneErr{}
return return
@@ -76,7 +59,6 @@ func StatusRawWithVersion(ctx context.Context, addr, version string) (s *StatusC
Conn: c, Conn: c,
} }
s.RegisterUntil("26.2", s.OnStatus, s.OnPong) 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) p, err := MakeHandshakePacketAddr(s.Conn, proto_base.Status, addr)
if err != nil { if err != nil {