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:
+18
-26
@@ -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
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user