Fix 26.2 login_success protocol handling and add convertibility tests
- Server sends v26_2 login_success with SessionId for protocol >= 776 - Client adds v26_2 login_success handler and scopes v1_21_8 handler to <= 26.1 - Fix WithOtherAccount guard in login server - Add smart-convert assumption tests for login server/client - Improve translatePacketVersion error messages
This commit is contained in:
@@ -12,10 +12,12 @@ import (
|
||||
|
||||
api2 "github.com/admin-else/strom/mc/api"
|
||||
"github.com/admin-else/strom/mc/crypto"
|
||||
"github.com/admin-else/strom/mc/data"
|
||||
"github.com/admin-else/strom/mc/event"
|
||||
"github.com/admin-else/strom/mc/proto"
|
||||
"github.com/admin-else/strom/mc/proto_base"
|
||||
"github.com/admin-else/strom/mc/proto_generated/v1_21_8"
|
||||
"github.com/admin-else/strom/mc/proto_generated/v26_2"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
@@ -183,11 +185,20 @@ func (l *LoginServer) FinishLogin() (err error) {
|
||||
if l.Given == nil {
|
||||
l.Given = &l.Requested
|
||||
}
|
||||
err = l.Send(&v1_21_8.LoginToClientPacketSuccess{
|
||||
Uuid: l.Given.UUID,
|
||||
Username: l.Given.Name,
|
||||
Properties: nil,
|
||||
})
|
||||
if l.ProtocolVersion >= data.MustLookupProtocolVersion("26.2") {
|
||||
err = l.Send(&v26_2.LoginToClientPacketSuccess{
|
||||
Uuid: l.Given.UUID,
|
||||
Username: l.Given.Name,
|
||||
Properties: nil,
|
||||
SessionId: uuid.New(),
|
||||
})
|
||||
} else {
|
||||
err = l.Send(&v1_21_8.LoginToClientPacketSuccess{
|
||||
Uuid: l.Given.UUID,
|
||||
Username: l.Given.Name,
|
||||
Properties: nil,
|
||||
})
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -195,9 +206,6 @@ type LoginServerSetting func(*LoginServer)
|
||||
|
||||
func WithOtherAccount(a *api2.Account) LoginServerSetting {
|
||||
return func(s *LoginServer) {
|
||||
if s.Given == nil {
|
||||
return
|
||||
}
|
||||
s.Given = &NameAndUUID{
|
||||
Name: a.Name,
|
||||
UUID: a.Uuid,
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
package server_test
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/admin-else/strom/mc/data"
|
||||
"github.com/admin-else/strom/mc/proto"
|
||||
"github.com/admin-else/strom/mc/proto_base"
|
||||
"github.com/admin-else/strom/mc/proto_generated/v1_21_8"
|
||||
)
|
||||
|
||||
func assertSendConvertible(t *testing.T, srcType reflect.Type, name string, state proto_base.State, direction proto_base.Direction, targetVersion int32) {
|
||||
t.Helper()
|
||||
targetInfo, ok := proto.LookupPacketInfoByNameProtocolVersionStateAndDirection(name, targetVersion, state, direction)
|
||||
if !ok {
|
||||
t.Fatalf("packet %s not found for version %d", name, targetVersion)
|
||||
}
|
||||
targetType := reflect.TypeOf(targetInfo.Type)
|
||||
if !proto.SmartConvertibleTo(srcType, targetType) {
|
||||
t.Fatalf("%s is not smart-convertible from v1_21_8 to version %d", name, targetVersion)
|
||||
}
|
||||
}
|
||||
|
||||
func assertReceiveConvertible(t *testing.T, dstType reflect.Type, name string, state proto_base.State, direction proto_base.Direction, targetVersion int32) {
|
||||
t.Helper()
|
||||
targetInfo, ok := proto.LookupPacketInfoByNameProtocolVersionStateAndDirection(name, targetVersion, state, direction)
|
||||
if !ok {
|
||||
t.Fatalf("packet %s not found for version %d", name, targetVersion)
|
||||
}
|
||||
targetType := reflect.TypeOf(targetInfo.Type)
|
||||
if !proto.SmartConvertibleTo(targetType, dstType) {
|
||||
t.Fatalf("%s is not smart-convertible from version %d to v1_21_8", name, targetVersion)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoginServerSendAssumptions(t *testing.T) {
|
||||
v26_1Version := data.MustLookupProtocolVersion("26.1")
|
||||
|
||||
// Packets sent by LoginServer as v1_21_8 must be convertible to every version
|
||||
// they are actually sent to. login_success is excluded because it is not
|
||||
// convertible across the 26.2 boundary; it has dedicated version-gated send code.
|
||||
assertSendConvertible(t, reflect.TypeFor[*v1_21_8.StatusToClientPacketServerInfo](), "server_info", proto_base.Status, proto_base.ToClient, v26_1Version)
|
||||
assertSendConvertible(t, reflect.TypeFor[*v1_21_8.StatusToClientPacketPing](), "ping", proto_base.Status, proto_base.ToClient, v26_1Version)
|
||||
assertSendConvertible(t, reflect.TypeFor[*v1_21_8.LoginToClientPacketCompress](), "compress", proto_base.Login, proto_base.ToClient, v26_1Version)
|
||||
assertSendConvertible(t, reflect.TypeFor[*v1_21_8.LoginToClientPacketEncryptionBegin](), "encryption_begin", proto_base.Login, proto_base.ToClient, v26_1Version)
|
||||
}
|
||||
|
||||
func TestLoginServerReceiveAssumptions(t *testing.T) {
|
||||
v26_1Version := data.MustLookupProtocolVersion("26.1")
|
||||
|
||||
// Packets received by LoginServer via RegisterCriticalUntilLatest must be
|
||||
// convertible from each later version back to v1_21_8.
|
||||
assertReceiveConvertible(t, reflect.TypeFor[*v1_21_8.HandshakingToServerPacketSetProtocol](), "set_protocol", proto_base.Handshaking, proto_base.ToServer, v26_1Version)
|
||||
assertReceiveConvertible(t, reflect.TypeFor[*v1_21_8.StatusToServerPacketPingStart](), "ping_start", proto_base.Status, proto_base.ToServer, v26_1Version)
|
||||
assertReceiveConvertible(t, reflect.TypeFor[*v1_21_8.StatusToServerPacketPing](), "ping", proto_base.Status, proto_base.ToServer, v26_1Version)
|
||||
assertReceiveConvertible(t, reflect.TypeFor[*v1_21_8.LoginToServerPacketLoginStart](), "login_start", proto_base.Login, proto_base.ToServer, v26_1Version)
|
||||
assertReceiveConvertible(t, reflect.TypeFor[*v1_21_8.LoginToServerPacketEncryptionBegin](), "encryption_begin", proto_base.Login, proto_base.ToServer, v26_1Version)
|
||||
assertReceiveConvertible(t, reflect.TypeFor[*v1_21_8.LoginToServerPacketLoginAcknowledged](), "login_acknowledged", proto_base.Login, proto_base.ToServer, v26_1Version)
|
||||
}
|
||||
Reference in New Issue
Block a user